/* global React, ReactDOM */
// FirstSteps — root app with simple state-based router
const { useState, useEffect, useCallback } = React;
const DEFAULT_LANG = (() => {
// Site default is English. We still respect an explicit user choice
// saved in localStorage from a previous visit, but we never auto-pick
// a language from navigator.language.
try {
const saved = localStorage.getItem("fs_lang");
if (saved && ["en", "es", "ru"].includes(saved)) return saved;
return "en";
} catch (e) { return "en"; }
})();
// Every form on the site lives at a single canonical URL: #/apply/form.
// Program / track / form-type context travels in sessionStorage so the URL
// remains identical whether the lead came from a player program, a track,
// or the collaboration page.
const APPLY_CTX_KEY = "fs_apply_ctx";
function writeApplyContext(ctx) {
try { sessionStorage.setItem(APPLY_CTX_KEY, JSON.stringify(ctx || {})); } catch (e) {}
}
function readApplyContext() {
try {
const raw = sessionStorage.getItem(APPLY_CTX_KEY);
return raw ? JSON.parse(raw) : null;
} catch (e) { return null; }
}
// Expose for child components that don't get the helpers as props.
window.FS_APPLY_CTX_KEY = APPLY_CTX_KEY;
window.fsReadApplyContext = readApplyContext;
window.fsWriteApplyContext = writeApplyContext;
function parseHash() {
const h = (window.location.hash || "").replace(/^#\/?/, "");
if (!h) return { name: "home" };
const parts = h.split("/");
if (parts[0] === "program" && parts[1]) return { name: "program", id: parts[1], track: parts[2] || null };
// Canonical form URL — #/apply/form. We still accept legacy #/apply/{id}/{track}
// links (e.g. bookmarks, old emails) and silently migrate their context into
// sessionStorage, then the route resolves to the unified form.
if (parts[0] === "apply") {
if (parts[1] && parts[1] !== "form") {
writeApplyContext({ type: "player", programId: parts[1], trackId: parts[2] || null });
}
return { name: "apply" };
}
if (parts[0] === "thanks") return { name: "thanks", id: parts[1] || null, ref: parts[2] || null };
if (parts[0] === "about") return { name: "about" };
if (parts[0] === "partners") return { name: "partners", id: parts[1] || null };
if (parts[0] === "collaboration") return { name: "collaboration" };
return { name: "home" };
}
function routeToHash(r) {
if (r.name === "home") return "#/";
if (r.name === "program") return "#/program/" + r.id + (r.track ? "/" + r.track : "");
if (r.name === "apply") return "#/apply/form";
if (r.name === "thanks") return "#/thanks/" + (r.id || "_") + (r.ref ? "/" + r.ref : "");
if (r.name === "about") return "#/about";
if (r.name === "partners") return "#/partners" + (r.id ? "/" + r.id : "");
if (r.name === "collaboration") return "#/collaboration";
return "#/";
}
function App() {
const [lang, setLangState] = useState(DEFAULT_LANG);
const [route, setRoute] = useState(parseHash());
const setLang = (l) => {
setLangState(l);
try { localStorage.setItem("fs_lang", l); } catch (e) {}
document.documentElement.setAttribute("lang", l);
};
useEffect(() => {
document.documentElement.setAttribute("lang", lang);
}, [lang]);
const navigate = useCallback((r) => {
// When the destination is the unified form, persist the original context
// (program/track or collaboration intent) BEFORE the hash change, so the
// form has everything it needs without the URL revealing it.
if (r && r.name === "apply") {
const ctx = {
type: r.type || "player",
programId: r.id || null,
trackId: r.track || null,
returnTo: r.returnTo || null,
};
writeApplyContext(ctx);
}
window.location.hash = routeToHash(r);
setRoute(typeof r === "object" && r.name === "apply" ? { name: "apply" } : r);
}, []);
useEffect(() => {
const onHash = () => setRoute(parseHash());
window.addEventListener("hashchange", onHash);
return () => window.removeEventListener("hashchange", onHash);
}, []);
const onDark = route.name === "thanks";
let page;
if (route.name === "program") page = ;
else if (route.name === "apply") page = ;
else if (route.name === "thanks") page = ;
else if (route.name === "about") page = ;
else if (route.name === "partners") page = route.id
?
: ;
else if (route.name === "collaboration") page = ;
else page = ;
return (
{page}
);
}
ReactDOM.createRoot(document.getElementById("root")).render();