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