81 lines
2.6 KiB
JavaScript
81 lines
2.6 KiB
JavaScript
(function () {
|
|
'use strict';
|
|
|
|
var configElement = document.getElementById('cameraRemoteConfig');
|
|
if (!configElement) return;
|
|
|
|
var config = JSON.parse(configElement.textContent);
|
|
var presets = Array.from(document.querySelectorAll('.camera-presets [data-camera-action]'));
|
|
var power = document.querySelector('[data-camera-action="power"]');
|
|
var status = document.getElementById('cameraRemoteStatus');
|
|
var busy = false;
|
|
|
|
presets.forEach(function (preset) { preset.setAttribute('aria-pressed', 'false'); });
|
|
|
|
function showError(message) {
|
|
status.textContent = message;
|
|
status.hidden = false;
|
|
}
|
|
|
|
function clearError() {
|
|
status.textContent = '';
|
|
status.hidden = true;
|
|
}
|
|
|
|
function setBusy(active) {
|
|
busy = active;
|
|
presets.forEach(function (preset) { preset.disabled = active || !config.configured; });
|
|
power.disabled = active || !config.configured;
|
|
}
|
|
|
|
function selectPreset(selected) {
|
|
presets.forEach(function (preset) {
|
|
var active = preset === selected;
|
|
preset.classList.toggle('camera-preset-active', active);
|
|
preset.setAttribute('aria-pressed', String(active));
|
|
});
|
|
}
|
|
|
|
async function request(action) {
|
|
var form = new FormData();
|
|
form.append('csrf_token', config.csrfToken);
|
|
form.append('action', action);
|
|
|
|
var response = await fetch('/intranet_repo/projects/camera_remote/api.php', {
|
|
method: 'POST',
|
|
body: form,
|
|
headers: {'Accept': 'application/json'},
|
|
});
|
|
var result;
|
|
try {
|
|
result = await response.json();
|
|
} catch (parseError) {
|
|
throw new Error('Der Server hat unerwartet geantwortet. Bitte laden Sie die Seite neu.');
|
|
}
|
|
if (!response.ok || !result.ok) throw new Error(result.error || 'Der Kamerabefehl ist fehlgeschlagen.');
|
|
}
|
|
|
|
async function runAction(control) {
|
|
if (busy || !config.configured) return;
|
|
clearError();
|
|
if (control === power) selectPreset(null);
|
|
setBusy(true);
|
|
|
|
try {
|
|
await request(control.dataset.cameraAction);
|
|
if (control !== power) {
|
|
selectPreset(control);
|
|
}
|
|
} catch (error) {
|
|
showError(error.message || 'Der Kamerabefehl konnte nicht ausgeführt werden.');
|
|
} finally {
|
|
setBusy(false);
|
|
}
|
|
}
|
|
|
|
presets.forEach(function (preset) {
|
|
preset.addEventListener('click', function () { runAction(preset); });
|
|
});
|
|
power.addEventListener('click', function () { runAction(power); });
|
|
}());
|