function injectUsbMenu() { if (document.getElementById("usbControlItem")) return; const menu = document.querySelector('.dropdown-menu'); if (!menu) return; const anchor = document.querySelector('#dashboard-menu-item'); const li = document.createElement("li"); li.id = "usbControlItem"; li.className = "context-menu"; li.innerHTML = ` USB Control ... `; if (anchor && anchor.parentNode) { anchor.parentNode.insertBefore(li, anchor.nextSibling); } else { menu.appendChild(li); } } document.addEventListener("DOMContentLoaded", injectUsbMenu); setTimeout(injectUsbMenu, 1000); document.addEventListener('DOMContentLoaded', function() { const item = document.getElementById('usbControlItem'); const dot = document.getElementById('usbControlDot'); const label = document.getElementById('usbControlLabel'); const link = document.getElementById('usbControlLink'); if (!item || !dot || !label || !link) return; let isOn = false; let locked = false; // --- Fonction utilitaire : met à jour la pastille function updateUI() { dot.style.background = isOn ? '#2b2' : '#b22'; label.textContent = isOn ? 'ON' : 'OFF'; } // --- Fonction pour changer l’état function toggleUSB() { event.stopPropagation(); if (locked) return; locked = true; label.textContent = '...'; fetch(`/usb-toggle.php?action=${isOn ? 'unbind' : 'bind'}`) .then(res => res.json()) .then(data => { if (data.status === 'ok') { isOn = !isOn; updateUI(); } else { alert('Erreur: ' + data.msg); } }) .catch(err => alert('Erreur réseau: ' + err)) .finally(() => { locked = false; }); } // --- Lecture de l’état au démarrage fetch('/usb-toggle.php?action=status') .then(res => res.json()) .then(data => { if (data.status === 'ok') { isOn = (data.state === 'bound'); updateUI(); } }) .catch(() => { label.textContent = '?'; }); function mouseLeave() { link.blur(); } item.addEventListener('click', toggleUSB); link.addEventListener('mouseleave', mouseLeave); });