forked from FroSteel/Planification
Version 2026.5.23 — Reset bulleState.pinned + iv._reloading
[code interpolé v2026.5.22 → v2026.5.35]
This commit is contained in:
@@ -240,6 +240,7 @@ async function init() {
|
||||
initModalScrollLock(); // v4.2.9 : bloquer le scroll arrière quand modal
|
||||
initAppFooter(); // v4.2.9 : pied de page discret bas-droite
|
||||
initAppClock(); // v5.0.0 : horloge HH:MM au milieu topbar
|
||||
_applyViewMode(); // v2026.5.32 : appliquer la vue sauvegardée
|
||||
initAdminMenu(); // v5.0.0 : menu admin caché (5 clics sur titre)
|
||||
initSessionTimer(); // v5.0.9 : compteur de session EV (tick 1s)
|
||||
initDateCustomPicker(); // v2026.5.17 : faux input date avec jour
|
||||
@@ -325,26 +326,120 @@ function markSessionActivity() {
|
||||
}
|
||||
|
||||
// v4.2 : fetche l'utilisateur EasyVista connecté (via background.js) et
|
||||
// l'affiche dans la topbar. En cas d'échec ou si aucun nom n'est trouvé,
|
||||
// le badge reste caché.
|
||||
// l'affiche dans la topbar.
|
||||
// v2026.5.26 : en cas d'échec, affiche un rond gris "?" + retry 60s (max 10 essais).
|
||||
// v2026.5.34 : le badge est maintenant TOUJOURS visible (état "?" par défaut
|
||||
// dans le HTML). Cette fonction met à jour le contenu (initiales
|
||||
// quand succès, "?" quand échec). Logs abondants pour debug.
|
||||
//
|
||||
// État initial (HTML) : <button class="user-badge user-badge-unknown">?</button>
|
||||
// État succès : initiales calculées + couleur dérivée du nom
|
||||
// État échec : "?" + couleur grise (classe user-badge-unknown)
|
||||
//
|
||||
// Retry : 10 tentatives espacées de 60s (10 min max), arrêt au 1er succès.
|
||||
let _currentUserRetryCount = 0;
|
||||
const _CURRENT_USER_MAX_RETRIES = 10;
|
||||
const _CURRENT_USER_RETRY_DELAY_MS = 60 * 1000;
|
||||
|
||||
async function fetchAndShowCurrentUser() {
|
||||
const attemptId = _currentUserRetryCount + 1;
|
||||
console.log(`[currentUser] tentative ${attemptId}/${_CURRENT_USER_MAX_RETRIES + 1} de fetchCurrentUser`);
|
||||
|
||||
const badge = document.getElementById("user-badge");
|
||||
if (!badge) {
|
||||
// Fallback défensif : pas de badge dans le DOM ? On log et on abandonne.
|
||||
console.warn("[currentUser] badge DOM introuvable — abandon");
|
||||
return;
|
||||
}
|
||||
|
||||
let success = false;
|
||||
let errorReason = null;
|
||||
|
||||
try {
|
||||
const resp = await sendMessage({ type: "fetchCurrentUser" });
|
||||
if (!resp || !resp.ok || !resp.user) return;
|
||||
const badge = document.getElementById("user-badge");
|
||||
if (!badge) return;
|
||||
const fullName = resp.user.name || resp.user.login || null;
|
||||
if (!fullName) return;
|
||||
const initials = computeUserInitials(fullName);
|
||||
badge.textContent = initials;
|
||||
badge.title = fullName;
|
||||
// v4.2.3 : couleur unique dérivée du nom, dans la palette neutre du thème
|
||||
badge.style.setProperty("--user-badge-color", colorFromName(fullName));
|
||||
badge.classList.remove("hidden");
|
||||
state.currentUser = resp.user;
|
||||
console.log("[currentUser] réponse reçue :", resp ? JSON.stringify(resp).substring(0, 200) : "(null)");
|
||||
|
||||
if (!resp) {
|
||||
errorReason = "response_null";
|
||||
} else if (!resp.ok) {
|
||||
errorReason = resp.error || "ok_false";
|
||||
} else if (!resp.user) {
|
||||
errorReason = "user_null";
|
||||
} else {
|
||||
const fullName = resp.user.name || resp.user.login || null;
|
||||
if (!fullName) {
|
||||
errorReason = "name_empty";
|
||||
} else {
|
||||
// ✅ Succès : mise à jour du badge
|
||||
const initials = computeUserInitials(fullName);
|
||||
console.log(`[currentUser] SUCCÈS : "${fullName}" → initiales "${initials}"`);
|
||||
badge.textContent = initials;
|
||||
badge.title = fullName;
|
||||
badge.style.setProperty("--user-badge-color", colorFromName(fullName));
|
||||
badge.classList.remove("user-badge-unknown");
|
||||
// On retire aussi "hidden" au cas où (compat ancienne version)
|
||||
badge.classList.remove("hidden");
|
||||
state.currentUser = resp.user;
|
||||
success = true;
|
||||
_currentUserRetryCount = 0; // reset compteur au succès
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.warn("[currentUser] fetch failed:", err);
|
||||
errorReason = "exception: " + String(err);
|
||||
console.warn("[currentUser] exception durant sendMessage :", err);
|
||||
}
|
||||
|
||||
if (success) return;
|
||||
|
||||
// ❌ Échec : on laisse le badge en état "inconnu" (déjà le cas par défaut)
|
||||
// et on schedule un retry.
|
||||
console.warn(`[currentUser] échec (raison: ${errorReason}) — badge reste en état "?"`);
|
||||
|
||||
// Défense : s'assurer que le badge est bien en état inconnu (au cas où
|
||||
// une mise à jour partielle a eu lieu puis échoué).
|
||||
badge.textContent = "?";
|
||||
badge.title = "Utilisateur — cliquer pour accéder aux paramètres";
|
||||
badge.style.setProperty("--user-badge-color", "#6b7280");
|
||||
badge.classList.add("user-badge-unknown");
|
||||
badge.classList.remove("hidden");
|
||||
|
||||
// Schedule retry si pas trop d'essais
|
||||
if (_currentUserRetryCount < _CURRENT_USER_MAX_RETRIES) {
|
||||
_currentUserRetryCount++;
|
||||
console.log(`[currentUser] retry programmé : ${_currentUserRetryCount}/${_CURRENT_USER_MAX_RETRIES} dans ${_CURRENT_USER_RETRY_DELAY_MS / 1000}s`);
|
||||
setTimeout(() => {
|
||||
fetchAndShowCurrentUser();
|
||||
}, _CURRENT_USER_RETRY_DELAY_MS);
|
||||
} else {
|
||||
console.warn("[currentUser] max retries atteint, arrêt du retry automatique. Le badge reste cliquable (⚙ Paramètres accessible).");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* v2026.5.34 : déclenche un fetchAndShowCurrentUser() SI le user n'est pas
|
||||
* encore connu (badge en état "?"). Appelée après chaque succès de planning
|
||||
* pour profiter d'une session EV valide sans attendre le retry de 60s.
|
||||
*
|
||||
* Sans effet si :
|
||||
* - state.currentUser est déjà renseigné (pas besoin de re-fetcher)
|
||||
* - un retry est déjà en cours (évite les doublons)
|
||||
*
|
||||
* @param {string} reason - contexte pour les logs (ex: "after_load_success")
|
||||
*/
|
||||
function _maybeRetryFetchUser(reason) {
|
||||
if (state.currentUser && state.currentUser.name) {
|
||||
// User déjà connu, rien à faire
|
||||
return;
|
||||
}
|
||||
const badge = document.getElementById("user-badge");
|
||||
if (badge && !badge.classList.contains("user-badge-unknown")) {
|
||||
// Badge n'est pas en état inconnu → user probablement connu par un autre chemin
|
||||
return;
|
||||
}
|
||||
console.log(`[currentUser] relance opportuniste (raison: ${reason}) — user encore inconnu`);
|
||||
// Reset le compteur puisqu'on a un nouveau contexte (session fraîche)
|
||||
_currentUserRetryCount = 0;
|
||||
fetchAndShowCurrentUser();
|
||||
}
|
||||
|
||||
// v4.2.3 : calcule les initiales depuis un nom au format "Nom, Prénom" ou
|
||||
@@ -400,10 +495,10 @@ function toggleUserNamePopup() {
|
||||
hideUserNamePopup();
|
||||
return;
|
||||
}
|
||||
if (!state.currentUser || !state.currentUser.name) return;
|
||||
|
||||
// v2026.5.17 : afficher aussi le temps restant de la session (MM:SS) avec
|
||||
// une couleur qui dépend du seuil (vert/jaune/rouge).
|
||||
// v2026.5.26 : si user inconnu, afficher "Utilisateur inconnu" + retry + réglages
|
||||
popup.innerHTML = "";
|
||||
const nameEl = document.createElement("div");
|
||||
nameEl.className = "user-name-popup-name";
|
||||
|
||||
Reference in New Issue
Block a user