/* ============================================================
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) => (
pick(code)} style={{
height: 72, borderRadius: 'var(--r-lg)', display: 'flex', alignItems: 'center', gap: 14, padding: '0 18px',
background: 'var(--surface)', border: '1.5px solid var(--border)', boxShadow: 'var(--shadow-1)',
animation: `fadeUp .5s var(--ease-out) ${0.1 + i * 0.08}s both`,
}}>
{short}
{name}
))}
);
}
/* ---------- шаг 1: приветствие ---------- */
function Welcome({ t, onNext }) {
return (
{t.ob_hello}
{t.ob_helloSub}
{COUNTRY_ORDER.map(c => )}
{t.ob_go}
);
}
/* ---------- карточка ответа ---------- */
function AnswerCard({ opt, lang, wide, selected, onPick, delay }) {
return (
{opt.id && FLAG_SVG[opt.id]
?
: opt.icon
?
: null}
{tr(opt.label, lang)}
{selected && }
);
}
/* ---------- экран вопроса ---------- */
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}
))}
{t.ob_seeJobs}
{t.ob_change}
);
}
/* ---------- контейнер онбординга ---------- */
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 });