/* ============================================================ resume_viewer.jsx — полноэкранный просмотр готового резюме. Лист целиком, переключатель языка документа и нижняя панель с файлами. PDF и Word действительно скачиваются (см. resume_files.jsx), Telegram — имитация. ============================================================ */ /* ---------- тост «файл сохранён» ---------- */ function SaveToast({ text }) { return (
{text}
); } /* ---------- кнопка файла ---------- */ function FileBtn({ icon, label, sub, primary, busy, onClick }) { return ( ); } /* ---------- сам просмотр ---------- */ function ResumeViewer({ profile, lang, rt, onClose }) { const [docLang, setDocLang] = useState('en'); const [busy, setBusy] = useState(null); // 'pdf' | 'doc' | 'tg' const [toast, setToast] = useState(null); const cv = useMemo(() => buildCV(profile, docLang), [profile, docLang]); const S = docLang === 'en' ? CV_EN : { summary: rt.cv_summary, exp: rt.cv_exp, skills: rt.cv_skills, certs: rt.cv_certs, langs: rt.cv_langs, present: rt.cv_present }; const flash = (msg) => { setToast(msg); setTimeout(() => setToast(null), 2600); }; const download = async (kind) => { setBusy(kind); try { if (kind === 'pdf') { // PDF всегда на английском: базовые шрифты PDF не знают кириллицу, // да и работодателю нужна именно английская версия const blob = await buildResumePdf(buildCV(profile, 'en')); saveBlob(blob, cvFileName(cv, 'pdf')); flash(rt.savedPdf); } else if (kind === 'doc') { const blob = await buildResumeDoc(cv, S); saveBlob(blob, cvFileName(cv, 'doc')); flash(rt.savedDoc); } else { await new Promise(r => setTimeout(r, 900)); flash(rt.sentTg); } } catch (e) { flash(rt.saveFailed); } setBusy(null); }; // лист вписываем по ширине телефона с полями const SCALE = (430 - 44) / PAPER_W; return (
{/* шапка */}
{cvFileName(cv, docLang === 'en' ? 'pdf' : 'doc')}
{rt.onePage} · {rt.atsOk}
ATS
{/* переключатель языка документа */}
{[['en', rt.viewEn], ['ru', rt.viewRu]].map(([code, label]) => { const on = docLang === code; return ( ); })}
{/* лист */}
{rt.pdfNote}
{toast && } {/* панель файлов */}
download('pdf')} /> download('doc')} /> download('tg')} />
); } /* ---------- аккуратное превью-карточка (профиль, чат) ---------- */ function ResumePreviewCard({ profile, lang, rt, sv, onOpen, delay = 0 }) { const cv = useMemo(() => buildCV(profile, 'en'), [profile]); return ( ); } Object.assign(window, { ResumeViewer, ResumePreviewCard });