Files
intranet/web/intranet_repo/projects/camera_remote/camera_remote.js
T

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); });
}());