App.Root = function Root() { const [page, setPage] = React.useState(null); const [params, setParams] = React.useState({}); const [user, setUser] = React.useState(null); const [showWelcome, setShowWelcome] = React.useState(false); // Expose setUser globally so Nav can update after nickname change window._setUser = setUser; // Fetch user identity on mount React.useEffect(() => { App.API.get('user?fingerprint=' + App.fingerprint) .then(data => { setUser(data); if (data.isNew) setShowWelcome(true); }) .catch(() => {}); }, []); React.useEffect(() => { App.Router.addRoute('/', () => { setPage('dashboard'); setParams({}); }); App.Router.addRoute('/combos', () => { setPage('combo-library'); setParams({}); }); App.Router.addRoute('/cars', () => { setPage('cars'); setParams({}); }); App.Router.addRoute('/tracks', () => { setPage('tracks'); setParams({}); }); App.Router.addRoute('/create-combo', () => { setPage('create-combo'); setParams({}); }); App.Router.addRoute('/polls', () => { setPage('poll-list'); setParams({}); }); App.Router.addRoute('/create-poll', () => { setPage('create-poll'); setParams({}); }); App.Router.addRoute('/poll/:code', (p) => { setPage('vote-poll'); setParams(p); }); App.Router.addRoute('/results/:code', (p) => { setPage('poll-results'); setParams(p); }); App.Router.setNotFound(() => { setPage('not-found'); setParams({}); }); App.Router.resolve(); }, []); let content; switch (page) { case 'dashboard': content = ; break; case 'combo-library': content = ; break; case 'cars': content = ; break; case 'tracks': content = ; break; case 'create-combo': content = ; break; case 'poll-list': content = ; break; case 'create-poll': content = ; break; case 'vote-poll': content = ; break; case 'poll-results': content = ; break; case 'not-found': content =

Page Not Found

Go Home
; break; default: content = ; } return (
{content}
{showWelcome && user && ( { setUser(data); setShowWelcome(false); }} onSkip={() => setShowWelcome(false)} /> )}
); }; // Mount the app const root = ReactDOM.createRoot(document.getElementById('root')); root.render();