// 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 (

Сегодня

{todayLabel}
{hasQuestion ? (
Вопрос #{t.number}
{cat.emoji} {cat.ru}

«{t.text}»

{t.follow_up &&
💡 {t.follow_up}
} {t.partner_answered && !isAnswered && (
💌 {D.partner.name} уже ответил(а). Ваш ответ откроет оба.
)}
) : (
🌙

{waitingNote || `Следующий вопрос придёт в\u00a0${D.pair.question_time}`}

А пока можно пересмотреть архив или почитать статистику.
)} {/* ── Composer: real textarea ── */} {showComposer && (
Ваш ответ — видит только {D.partner.name} после того, как ответит тоже 2000 ? 'var(--warm)' : 'var(--text-4)'}}> {answerText.length} / 2000