Files
Alfredv2/alfred/app/static/js/alfred-name-dynamic.js
T

94 lines
6.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ALFRED_IDENTITY_GLASS_V1 — dynamic user-facing assistant branding.
Technical keys, service names, tool IDs and logs remain unchanged. */
(() => {
'use strict';
let active='',activeWake='';
const replace=(el,oldName,newName)=>{
if(!el || !el.firstChild || el.firstChild.nodeType!==3)return;
const value=el.firstChild.nodeValue||'';
const next=value.replace(/\bAlfred\b/g,newName);
if(next!==value)el.firstChild.nodeValue=next;
};
function apply(n,wake){
if(typeof n!=='string' || n.trim().length<2 || n.length>30)return;
active=n.trim();
if(typeof wake==='string'&&wake.trim())activeWake=wake.trim();
const letter=Array.from(active)[0]?.toLocaleUpperCase('fr-FR')||'A';
const main=document.getElementById('alfredMainV1');
if(main){
const logo=main.querySelector('.av-logo');
if(logo)logo.textContent=letter;
const title=document.getElementById('avName');
if(title)title.textContent=active;
const info=document.getElementById('avVoiceSubtitle');
if(info&&/Dites\s+[«"]/.test(info.textContent||''))info.textContent=`Dites « ${activeWake||active} » puis votre demande`;
const system=main.querySelector('.av-circle.system')?.parentElement?.querySelector('small');
if(system)system.textContent='Mini-PC '+active;
replace(document.querySelector('#avMoreDialog h2'),'',active);
const moreTitle=document.querySelector('#avMoreDialog h2');if(moreTitle)moreTitle.textContent='Outils '+active;
const comfyDesc=document.querySelector('#avComfyDialog p');if(comfyDesc)comfyDesc.textContent='Décris l’image à générer. '+active+' transmettra ta demande à Hermes.';
const submit=document.getElementById('avComfySubmit');if(submit)submit.textContent='Envoyer à '+active;
const hero=main.querySelector('.av-voice-hero');if(hero)hero.setAttribute('aria-label','Commande vocale '+active);
const oldConfig=main.querySelector('a[href="/config"][aria-label^="Configuration d"]');if(oldConfig)oldConfig.setAttribute('aria-label','Configuration de '+active);
const nav=document.querySelector('#avMoreDialog .av-more-grid');
if(nav && !nav.querySelector('a[href="/identity"]')){
const link=document.createElement('a');link.href='/identity';link.textContent='Identité de '+active;nav.append(link);
}else if(nav){const link=nav.querySelector('a[href="/identity"]');if(link)link.textContent='Identité de '+active;}
const legacyStage=document.getElementById('stage');if(legacyStage)legacyStage.setAttribute('aria-label','Réponse de '+active);
const legacyCamera=document.getElementById('cameraFeed');if(legacyCamera)legacyCamera.alt='Vidéo en direct de la caméra de '+active;
document.title=active+' · Accueil';
}
const brand=document.querySelector('.admin-header .brand');
if(brand){
const b=brand.querySelector('strong'),o=brand.querySelector('.brand-orb');
if(b)b.textContent=active;if(o)o.textContent=letter;
const loginOrb=document.querySelector('.auth-box .brand-orb');if(loginOrb)loginOrb.textContent=letter;
const authIntro=document.querySelector('.auth-box p');if(authIntro)authIntro.textContent=document.body.dataset.page==='surveillance'?('Connecte-toi pour consulter l’état de '+active+'.'):('Connecte-toi pour modifier la configuration de '+active+'.');
const help=document.querySelector('.ag-help');if(help)help.textContent=help.textContent.replace(/redémarrer Alfred/g,'redémarrer '+active);
const restartInfo=document.querySelector('.restart-panel p');if(restartInfo)restartInfo.textContent='Redémarrer '+active+' pour appliquer les paramètres enregistrés. Action protégée par mot de passe administrateur.';
const configLabel=document.getElementById('ALFRED_NAME');if(configLabel)configLabel.placeholder=active;
const hint=document.getElementById('pendingNotice');
if(hint){const strong=hint.querySelector('strong');if(strong)strong.textContent='Redémarre '+active;}
const restartButton=document.getElementById('restartButton');if(restartButton)restartButton.textContent='Redémarrer '+active;
document.title=active+' · '+(document.body.dataset.page==='surveillance'?'Surveillance':'Configuration');
const nav=brand.closest('.admin-header')?.querySelector('nav');
if(nav && !nav.querySelector('a[href="/identity"]')){
const a=document.createElement('a');a.href='/identity';a.textContent='Identité';
const logout=nav.querySelector('button');if(logout)nav.insertBefore(a,logout);else nav.append(a);
}
const rail=document.querySelector('.ag-rail');
if(rail && !rail.querySelector('a[href="/identity"]')){
const a=document.createElement('a');a.href='/identity';a.innerHTML='<span>✎</span>Identité';rail.append(a);
}
}
const legacyAudio=document.querySelector('body > main .subtitle');
if(legacyAudio){legacyAudio.textContent=active+' · Paramètres audio';document.title=active+' — Configuration audio';
const hints=document.querySelectorAll('body > main p.hint');if(hints[0])hints[0].textContent='Désactive les réponses vocales de '+active+'.';if(hints[1])hints[1].textContent='Suspend l’écoute et la détection du mot « '+(activeWake||active)+' ».';}
const logsTitle=document.getElementById('lgName');
if(logsTitle){
logsTitle.textContent=active;
const letterEl=document.getElementById('lgLetter');if(letterEl)letterEl.textContent=letter;
const eyebrow=document.querySelector('.lg-eyebrow');if(eyebrow)eyebrow.textContent='OBSERVABILITÉ · '+active.toLocaleUpperCase('fr-FR');
const nav=document.querySelector('.lg-nav');
if(nav&&!nav.querySelector('a[href="/identity"]')){const a=document.createElement('a');a.href='/identity';a.textContent='Identité';nav.append(a);}
document.title='Journaux · '+active;
}
}
async function refresh(){
try{const r=await fetch('/api/alfred/identity/name',{cache:'no-store'});if(!r.ok)return;const d=await r.json();apply(d.name,d.wake_word);}catch(_){}
}
const subtitle=document.getElementById('avVoiceSubtitle');
if(subtitle){
const observer=new MutationObserver(()=>{
if(active&&/Dites\s+[«"]/.test(subtitle.textContent||'')){
const desired=`Dites « ${activeWake||active} » puis votre demande`;
if(subtitle.textContent!==desired)subtitle.textContent=desired;
}
});
observer.observe(subtitle,{childList:true,characterData:true,subtree:true});
}
refresh();window.addEventListener('focus',refresh);
document.addEventListener('visibilitychange',()=>{if(!document.hidden)refresh();});
setInterval(()=>{if(!document.hidden)refresh();},10000);
})();