';
return true;
}
return false;
}
// Décision immédiate avec le cache si dispo + récent (<60 s)
if (cached && cached._fetchedAt && (Date.now() - cached._fetchedAt) < 60000) {
if (applyConfig(cached)) return;
}
// Fetch en arrière-plan pour mettre à jour le cache (ne bloque pas
// le rendu actuel · si maintenance vient d'être activée, le
// prochain visiteur la verra ; le user actuel reload au besoin).
fetch("https://jocvsxwefjybyoimagqk.supabase.co/rest/v1/site_config?select=*&id=eq.1", {
headers: {
apikey: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpvY3ZzeHdlZmp5YnlvaW1hZ3FrIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzY3MDk3MTAsImV4cCI6MjA5MjI4NTcxMH0.btFNbc_W5W1Lxq5ciIAkW4TGupHMwKA3CnFtvGknvzA",
},
})
.then(function (r) { return r.json(); })
.then(function (rows) {
var cfg = (rows && rows[0]) || {};
cfg._fetchedAt = Date.now();
try { localStorage.setItem(CACHE_KEY, JSON.stringify(cfg)); } catch (e) {}
/* La configuration ne sert plus qu'à la maintenance : depuis le
6 août 2026, elle porte aussi la date de fin de l'offre de
lancement (`offre_lancement_jusqua`), lue par `cbOffreLancement()`
dans shared.jsx. On la publie donc au reste de l'application
plutôt que de la refaire chercher, c'est la même requête, déjà
partie, et surtout la même valeur que celle appliquée en base.
L'événement réveille les composants déjà rendus : au premier
chargement, React a fini son travail avant cette réponse. */
window.cbConfig = cfg;
try { window.dispatchEvent(new Event("cb-config")); } catch (e) {}
// Si la maintenance vient d'être activée, l'applique tout de suite
// (on n'aura peut-être pas encore rendu React, ou si oui, le replace
// de document.documentElement re-render proprement).
if (cfg.maintenance_mode === true) {
applyConfig(cfg);
}
})
.catch(function () { /* offline, on continue avec le rendu normal */ });
} catch (e) {}
})();
RGPD pour indépendants : les 5 obligations · ClientBase