// Today screen — current question + real answer composer // Now fully functional: // - Textarea + submit that POSTs to /api/couple/answer // - Edit-before-reveal (resubmitting overwrites your previous answer) // - Skip button (both-must-agree logic; backend tracks skip_requested_by) // - Partner-answered hint when backend reports partner_answered=true window.TodayScreen = function TodayScreen({ state, setScreen, data, reload }) { const { useState } = React; const D = data; const t = D.today; const WD = ['Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота']; const M = ['января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря']; const now = new Date(); const todayLabel = `${WD[now.getDay()]}, ${now.getDate()} ${M[now.getMonth()]} · ${D.pair.question_time}`; const cat = t ? t.cat_meta : null; const isAnswered = state === 'answered' || state === 'reveal-ready'; const isRevealReady = state === 'reveal-ready'; const hasQuestion = !!t; const [answerText, setAnswerText] = useState(t && t.you_answer ? t.you_answer : ''); const [editing, setEditing] = useState(false); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); const [skipMsg, setSkipMsg] = useState(null); const showComposer = hasQuestion && (!isAnswered || editing); const canSubmit = answerText.trim().length >= 3 && answerText.trim().length <= 2000 && !submitting; async function handleSubmit() { if (!canSubmit || !t) return; setSubmitting(true); setError(null); try { const res = await window.API.submitAnswer(t.question_id, answerText.trim()); setEditing(false); if (res.revealed) { // Jump straight to reveal await reload(); setScreen('reveal'); } else { await reload(); } } catch (e) { setError(e.message || 'Не удалось отправить ответ'); } finally { setSubmitting(false); } } async function handleSkip() { if (!t) return; if (!confirm('Пропустить этот вопрос? Если партнёр согласится — вопрос исчезнет, серия сбросится.')) return; setSubmitting(true); setError(null); setSkipMsg(null); try { const res = await window.API.skipQuestion(t.question_id); if (res.skipped) { setSkipMsg('Вопрос пропущен обоими.'); } else if (res.waiting_partner) { setSkipMsg('Запрос на пропуск отправлен. Ждём партнёра.'); } await reload(); } catch (e) { setError(e.message || 'Не удалось запросить пропуск'); } finally { setSubmitting(false); } } const botUrl = 'https://t.me/' + D.botUsername; // Humanize "waiting" state when there's no current question let waitingNote = null; if (!hasQuestion && D.waiting_meta) { const wm = D.waiting_meta; if (wm.reason === 'before_question_time') { waitingNote = `Следующий вопрос придёт сегодня в ${wm.next_question_time}`; } else if (wm.reason === 'already_sent_today') { waitingNote = `Сегодняшний вопрос уже был — ждите завтра в ${wm.next_question_time}`; } else if (wm.reason === 'paused') { waitingNote = 'Пара на паузе. Включить можно в настройках.'; } else if (wm.reason === 'pair_not_active') { waitingNote = 'Пара ещё не активирована.'; } else { waitingNote = `Следующий вопрос в ${wm.next_question_time}`; } } return (