/* Main app — screen switcher (prototype navigator) + tweaks + routing */ const { useState: useStateApp, useEffect: useEffectApp } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accent": "orange", "formLayout": "stepped", "invitedCompany": "Imprimerie Lemercier", "showProtoNav": true }/*EDITMODE-END*/; function App() { const [tweaks, setTweaks, setTweak] = window.useTweaks(TWEAK_DEFAULTS); const [screen, setScreen] = useStateApp("welcome"); // adherent screen const [adminArea, setAdminArea] = useStateApp("survey"); const [adminTab, setAdminTab] = useStateApp("campaigns"); const [campaignId, setCampaignId] = useStateApp("ia-2026"); const [respondentId, setRespondentId] = useStateApp(null); const [authed, setAuthed] = useStateApp(false); const [submission, setSubmission] = useStateApp(null); const data = window.FESPA_DATA; // Apply accent override useEffectApp(() => { const r = document.documentElement; if (tweaks.accent === "red") { r.style.setProperty("--brand", "#0F1822"); r.style.setProperty("--brand-strong", "#000000"); r.style.setProperty("--accent", "#D8232A"); r.style.setProperty("--accent-strong", "#A8161D"); r.style.setProperty("--accent-soft", "#FCE3E5"); r.style.setProperty("--link-hover", "#D8232A"); } else if (tweaks.accent === "navy") { r.style.setProperty("--brand", "var(--byi-navy-800)"); r.style.setProperty("--brand-strong", "var(--byi-navy-900)"); r.style.setProperty("--accent", "var(--byi-cyan-500)"); r.style.setProperty("--accent-strong", "#0098D1"); r.style.setProperty("--accent-soft", "var(--byi-cyan-100)"); r.style.setProperty("--link-hover", "var(--byi-cyan-500)"); } else { r.style.removeProperty("--brand"); r.style.removeProperty("--brand-strong"); r.style.removeProperty("--accent"); r.style.removeProperty("--accent-strong"); r.style.removeProperty("--accent-soft"); r.style.removeProperty("--link-hover"); } }, [tweaks.accent]); const openRespondent = (id) => { setRespondentId(id); setAdminTab("detail"); }; const adjacent = (delta) => { const idx = data.respondents.findIndex(r => r.id === respondentId); const next = data.respondents[(idx + delta + data.respondents.length) % data.respondents.length]; setRespondentId(next.id); }; // Render const isAdmin = screen.startsWith("admin"); return ( <> {tweaks.showProtoNav && ( )}
{screen === "welcome" && ( setScreen("form")} /> )} {screen === "form" && ( { setSubmission(a); setScreen("thanks"); }} onBackHome={() => setScreen("welcome")} /> )} {screen === "thanks" && ( setScreen("welcome")} /> )} {screen === "admin" && !authed && ( { setAuthed(true); }} /> )} {screen === "admin" && authed && ( { setAdminArea(a); const first = window.ADMIN_AREAS.find(x => x.id === a).tabs[0][0]; setAdminTab(first); }} onTab={(t) => setAdminTab(t)} onLogout={() => { setAuthed(false); }} campaignId={campaignId} onCampaignChange={(id) => setCampaignId(id)} > {(() => { const camp = window.FESPA_CAMPAIGNS.find(c => c.id === campaignId); const isPrimary = camp && camp.isPrimary; const surveyContent = () => { // For non-primary campaigns, only show a closed-notice on dashboard if (!isPrimary && adminTab === "dashboard") { return ; } if (adminTab === "campaigns") { return { setCampaignId(id); const camp = window.FESPA_CAMPAIGNS.find(c => c.id === id); if (camp.status === "draft") { setAdminTab("invitations"); } else { setAdminTab("dashboard"); } }}/>; } if (adminTab === "dashboard") { return ; } if (adminTab === "respondents") { return ; } if (adminTab === "detail" && respondentId) { return setAdminTab("respondents")} onNext={() => adjacent(1)} onPrev={() => adjacent(-1)} />; } if (adminTab === "invitations") { return ; } return null; }; return ( <> {adminArea === "survey" && surveyContent()} {adminArea === "training" && adminTab === "sessions" && ( )} {adminArea === "training" && adminTab === "enrollments" && ( )} {adminArea === "training" && adminTab === "catalog" && ( )} {adminArea === "planning" && adminTab === "gantt" && ( )} {adminArea === "planning" && adminTab === "milestones" && ( )} ); })()} )}
{/* Tweaks panel */} setTweak("accent", v)} options={[ { value: "orange", label: "BYI orange" }, { value: "navy", label: "Cyan/navy" }, { value: "red", label: "FESPA rouge" } ]} /> setTweak("invitedCompany", v)} /> setTweak("showProtoNav", v)} /> ); } /* ---------- Prototype navigator ---------- */ function ProtoNav({ screen, setScreen, adminTab, setAdminTab, authed }) { const isAdmin = screen === "admin"; return (
Adhérent
Admin FESPA {authed && "·"}{authed && connecté}
); } const root = ReactDOM.createRoot(document.getElementById("app")); root.render();