);
}
/* ---------- Top bar ---------- */
function TopBar({ screen, onHome, textScale, setTextScale, companyName, onHelp, onBilling, onLogout }) {
const showCtx = screen !== "login";
const { t } = useLang();
// La barre est montée AVANT la connexion : interroger `me` une seule fois
// au montage renvoyait toujours vide (aucun jeton encore). On redemande
// quand le jeton apparaît ou change — sinon l'avatar reste anonyme et le
// nom d'entreprise ne s'affiche jamais.
const [session] = useG4M(() => G4M.me(), null, [showCtx, G4M.token]);
const [menu, setMenu] = useStateA(false);
// Fermer au clic ailleurs et à Échap : un menu qu'on ne peut pas refermer
// est plus agaçant que pas de menu du tout.
useEffectA(() => {
if (!menu) return;
const fermer = () => setMenu(false);
const parEchap = (e) => e.key === "Escape" && setMenu(false);
window.addEventListener("click", fermer);
window.addEventListener("keydown", parEchap);
return () => { window.removeEventListener("click", fermer); window.removeEventListener("keydown", parEchap); };
}, [menu]);
const nom = companyName || (session && session.companyName) || "";
// Initiales de la personne connectée. « GL » était celles de la dirigeante
// fictive du prototype — afficher les initiales de quelqu'un d'autre en haut
// de chaque écran, c'est le genre de détail qu'on finit par ne plus voir.
const initiales = ((session && (session.fullName || session.email)) || "")
.split(/[\s.@_-]+/).filter(Boolean).slice(0, 2).map((m) => m[0].toUpperCase()).join("");
return (
{showCtx && nom && (
{nom}
)}
{!showCtx && (
)}
{showCtx && (
{t("Texte")}
{/* Le « i » n'était branché sur rien — un bouton mort au sommet de
chaque écran. Il ouvre l'aide : FAQ + tutoriel. */}
e.stopPropagation()}>
{menu && (
{session && (session.fullName || session.email) && {session.fullName || session.email}
{session.email && {session.email}}
{session.role === "admin" && {t("Administrateur")}}
}
)}