63 lines
2.7 KiB
JavaScript
63 lines
2.7 KiB
JavaScript
/* DONA_REPLY_AUTO_CLOSE_V1 — Ferme uniquement la réponse, jamais Hermes/Piper. */
|
||
(() => {
|
||
'use strict';
|
||
if (window.__donaReplyAutoCloseV1) return;
|
||
window.__donaReplyAutoCloseV1 = true;
|
||
const interval = Number(window.DONA_REPLY_CLOSE_SECONDS || 60);
|
||
const delay = Math.min(600, Math.max(10, Number.isFinite(interval) ? interval : 60)) * 1000;
|
||
let task = 0;
|
||
let speaking = false;
|
||
let focused = false;
|
||
const $ = (id) => document.getElementById(id);
|
||
const isFocused = () => Boolean($('alfredMainV1')?.classList.contains('is-focused'));
|
||
const clear = () => { if (task) window.clearTimeout(task); task=0; };
|
||
const canClose = () => isFocused() && !speaking && !document.querySelector('dialog[open], [role="dialog"][aria-modal="true"]');
|
||
const close = () => {
|
||
task = 0;
|
||
if (!canClose()) { schedule(); return; }
|
||
const back = $('avBack');
|
||
if (back) back.click();
|
||
};
|
||
function schedule() {
|
||
clear();
|
||
if (canClose()) task = window.setTimeout(close,delay);
|
||
}
|
||
function stateChanged() {
|
||
const now=isFocused();
|
||
if (!now) { clear(); focused=false; return; }
|
||
if (!focused) { focused=true; schedule(); }
|
||
}
|
||
function init() {
|
||
const main=$('alfredMainV1');
|
||
if (!main) { window.setTimeout(init,600); return; }
|
||
new MutationObserver(stateChanged).observe(main,{attributes:true,attributeFilter:['class']});
|
||
const content=$('content');
|
||
if (content) new MutationObserver(() => {if (isFocused()) schedule();})
|
||
.observe(content,{childList:true,subtree:true,characterData:true});
|
||
const socket=window.alfredSocket;
|
||
if (socket?.on) {
|
||
socket.on('alfred_state', (state) => {
|
||
const mode=String(state?.mode || '').toLowerCase();
|
||
const wasSpeaking=speaking;
|
||
speaking=(mode==='speaking' || mode==='thinking' || mode==='listening');
|
||
if (speaking) clear();
|
||
else if (wasSpeaking || isFocused()) schedule();
|
||
});
|
||
socket.on('alfred_render', () => window.setTimeout(() => {stateChanged();schedule();},0));
|
||
}
|
||
document.addEventListener('pointerdown',(ev)=>{
|
||
if (isFocused() && ev.target?.closest('#stage')) schedule();
|
||
},{passive:true});
|
||
document.addEventListener('keydown',(ev)=>{
|
||
if (isFocused() && ['ArrowUp','ArrowDown','PageUp','PageDown'].includes(ev.key)) schedule();
|
||
});
|
||
document.addEventListener('visibilitychange',()=>{
|
||
if (document.hidden) clear(); else schedule();
|
||
});
|
||
stateChanged();
|
||
console.info('[Dona] Retour automatique à l’accueil activé après',delay/1000,'secondes (hors lecture vocale).');
|
||
}
|
||
if (document.readyState==='loading') document.addEventListener('DOMContentLoaded',init,{once:true});
|
||
else init();
|
||
})();
|