/* ============================================================ screen_onboarding.jsx — первый запуск: выбор языка + опросник Правила для аудитории с низкой цифровой грамотностью: - один вопрос на экран, ответ — крупная карточка (тап) - никакого ввода текста и клавиатуры - всегда видно «Вопрос 2 из 5» и кнопка «Назад» ============================================================ */ /* ---------- шаг 0: язык ---------- */ function LangPick({ setLang, onNext }) { const pick = (l) => { setLang(l); onNext(); }; return (
Tilni tanlang · Выбери язык
{[['uz', 'O‘zbekcha', 'UZ'], ['ru', 'Русский', 'RU']].map(([code, name, short], i) => ( ))}
); } /* ---------- шаг 1: приветствие ---------- */ function Welcome({ t, onNext }) { return (
{t.ob_hello}
{t.ob_helloSub}
{COUNTRY_ORDER.map(c => )}
); } /* ---------- карточка ответа ---------- */ function AnswerCard({ opt, lang, wide, selected, onPick, delay }) { return ( ); } /* ---------- экран вопроса ---------- */ function QuestionStep({ step, index, total, lang, t, answer, onPick, onBack }) { const wide = step.cols === 1; return (
{/* progress */}
{t.ob_step} {index + 1} {t.ob_of} {total}
{Array.from({ length: total }).map((_, k) => (
))}
{/* question */}
{tr(step.q, lang)}
{step.hint &&
{tr(step.hint, lang)}
}
{step.options.map((o, i) => ( onPick(o.id)} delay={0.06 + i * 0.04} /> ))}
); } /* ---------- финальный экран ---------- */ function OnboardDone({ answers, lang, t, onFinish, onRestart }) { const chips = ONBOARD.map(s => { const o = s.options.find(x => x.id === answers[s.key]); return o ? { key: s.key, country: FLAG_SVG[o.id] ? o.id : null, icon: o.icon, label: tr(o.label, lang) } : null; }).filter(Boolean); const dest = answers.dest; const count = dest && dest !== 'any' ? JOBS.filter(j => j.country === dest).length : JOBS.length; return (
{t.ob_doneTitle}
{t.ob_doneSub}
{nVac(count, lang)}
{/* answers recap */}
{t.ob_yourAnswers}
{chips.map(c => ( {c.country ? : c.icon ? : null} {c.label} ))}
); } /* ---------- контейнер онбординга ---------- */ function OnboardingScreen({ lang, setLang, theme, setTheme, t, onFinish }) { // stage: -2 язык · -1 приветствие · 0..N-1 вопросы · N готово const [stage, setStage] = useState(-2); const [answers, setAnswers] = useState({}); const total = ONBOARD.length; const pick = (key, id) => { setAnswers(a => ({ ...a, [key]: id })); setTimeout(() => setStage(s => s + 1), 220); // короткая пауза — видно галочку }; const back = () => setStage(s => Math.max(-1, s - 1)); return (
{/* верхняя строка: язык/тема, кроме экрана выбора языка */} {stage > -2 && (
)} {stage === -2 && setStage(-1)} />} {stage === -1 && setStage(0)} />} {stage >= 0 && stage < total && ( pick(ONBOARD[stage].key, id)} onBack={back} /> )} {stage >= total && ( onFinish(answers)} onRestart={() => { setAnswers({}); setStage(0); }} /> )}
); } Object.assign(window, { OnboardingScreen });