/* 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();