72 lines
3.3 KiB
JavaScript
72 lines
3.3 KiB
JavaScript
/* ALFRED_GLASS_V2 — mise en page uniquement ; logique V1 et extensions conservees. */
|
|
(() => {
|
|
'use strict';
|
|
const main = document.getElementById('alfredMainV1');
|
|
if (!main || main.dataset.glassV2 === 'ready') return;
|
|
main.dataset.glassV2 = 'ready';
|
|
const logo = main.querySelector('.av-logo');
|
|
const name = document.getElementById('avName');
|
|
const subtitle = document.getElementById('avVoiceSubtitle');
|
|
if (!logo || !name) return;
|
|
let assistantName = String(name.textContent || '').trim() || 'Alfred';
|
|
const cleanName = value => {
|
|
if(typeof value !== 'string')return '';
|
|
const s = value.trim();
|
|
return s.length >= 2 && s.length <= 30 ? s : '';
|
|
};
|
|
function setName(value) {
|
|
const s = cleanName(value);
|
|
if(!s) return;
|
|
assistantName=s;
|
|
name.textContent=s;
|
|
const first=Array.from(s)[0] || 'A';
|
|
logo.textContent=first.toLocaleUpperCase('fr-FR');
|
|
logo.setAttribute('aria-label',`Initiale de ${s}`);
|
|
// La V1 conserve son nom initial dans la phrase de veille : mise a jour apres chaque evenement.
|
|
const title=document.getElementById('avVoiceTitle');
|
|
if(title && subtitle && (title.textContent === 'En veille' || title.textContent === 'En attente')) {
|
|
subtitle.textContent=`Dites « ${s} » puis votre demande`;
|
|
}
|
|
}
|
|
setName(assistantName);
|
|
async function fetchName(){
|
|
try{
|
|
const r=await fetch('/api/state',{cache:'no-store'});
|
|
if(!r.ok)return;
|
|
const d=await r.json();
|
|
setName(d.assistant_name || d.title || '');
|
|
} catch(_){ /* La page reste utilisable si /api/state est indisponible. */ }
|
|
}
|
|
fetchName();
|
|
setInterval(()=>{if(!document.hidden)fetchName();},20000);
|
|
window.addEventListener('focus',fetchName);
|
|
window.alfredSocket?.on('alfred_state',state=>{
|
|
setName(state?.assistant_name || state?.title || assistantName);
|
|
});
|
|
// Le menu ··· ouvre les options de la V1 au lieu de naviguer directement vers /config.
|
|
const oldMenu=main.querySelector('.av-head-actions > a[href="/config"]');
|
|
if(oldMenu){
|
|
const btn=document.createElement('button');
|
|
btn.type='button';btn.id='avTopMenu';btn.className=oldMenu.className;
|
|
btn.setAttribute('data-av-action','more');
|
|
btn.setAttribute('aria-label','Ouvrir le menu principal');
|
|
btn.title='Menu : Configuration, Surveillance, Journaux';
|
|
btn.innerHTML=oldMenu.innerHTML;
|
|
oldMenu.replaceWith(btn);
|
|
}
|
|
const grid=document.querySelector('#avMoreDialog .av-more-grid');
|
|
if(grid&&!grid.querySelector('a[href="/logs"]')){
|
|
const link=document.createElement('a');
|
|
link.href='/logs';link.textContent='Journaux et historiques';
|
|
link.setAttribute('aria-label','Ouvrir les journaux');
|
|
const svg=document.createElementNS('http://www.w3.org/2000/svg','svg');
|
|
svg.setAttribute('viewBox','0 0 24 24');svg.setAttribute('class','a-icon');svg.setAttribute('fill','none');
|
|
svg.setAttribute('stroke','currentColor');svg.setAttribute('stroke-width','1.8');
|
|
const d=document.createElementNS('http://www.w3.org/2000/svg','path');
|
|
d.setAttribute('d','M6 3h9l4 4v14H6a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2zM14 3v5h5M8 12h8M8 16h8');
|
|
svg.appendChild(d);link.prepend(svg);grid.append(link);
|
|
}
|
|
// Rail et historique restes en DOM : les scripts des Listes et de la V1 les utilisent.
|
|
// Ne pas les supprimer au risque de casser les evenements ou le rafraichissement.
|
|
})();
|