/* ============================================================ app.jsx — root: state, routing, onboarding gate ============================================================ */ const { useState: useStateA, useEffect: useEffectA } = React; function persistState(key, def) { const [v, setV] = useStateA(() => { try { const s = localStorage.getItem(key); return s !== null ? JSON.parse(s) : def; } catch { return def; } }); useEffectA(() => { try { localStorage.setItem(key, JSON.stringify(v)); } catch {} }, [v]); return [v, setV]; } function Splash({ onDone, lang }) { const [leaving, setLeaving] = useStateA(false); useEffectA(() => { const a = setTimeout(() => setLeaving(true), 2000); const b = setTimeout(onDone, 2520); return () => { clearTimeout(a); clearTimeout(b); }; }, []); return (
{/* ambient aura */} {/* logo lockup */}
{BRAND.name}
{tr(BRAND.tagline, lang || 'ru')}
{/* load bar */}
); } function App() { const [lang, setLang] = persistState('hh_lang', 'ru'); const [theme, setTheme] = persistState('hh_theme', 'light'); const [onboarded, setOnboarded] = persistState('hh_onboarded', false); const [route, setRoute] = persistState('hh_route', 'stories'); const [status, setStatus] = persistState('hh_status', 'open'); const [advisorKey, setAdvisorKey] = useStateA(0); const [booting, setBooting] = useStateA(true); const t = UI[lang]; const go = (r) => { if (r === 'advisor') setAdvisorKey(k => k + 1); setRoute(r); }; const finishOnboarding = () => { setOnboarded(true); setRoute('stories'); }; const shared = { lang, theme, setLang, setTheme, t }; let screen = null; if (route === 'stories') screen = ; else if (route === 'jobs') screen = ; else if (route === 'growth') screen = ; else if (route === 'profile') screen = ; else if (route === 'advisor') screen = go('profile')} />; return ( setBooting(false)} lang={lang} /> : null}> {!onboarded ? ( ) : ( <>
{screen}
)}
); } ReactDOM.createRoot(document.getElementById('root')).render();