// Reveal — both answers side by side, with working reactions & favorite // Changes from v1: // - Reactions POST /api/couple/reaction, clicking same emoji clears it // - Favorite is a real toggle (/api/couple/favorite) — no bot link needed // - Optimistic UI: we update the clicked state immediately, rollback on error window.RevealScreen = function RevealScreen({ setScreen, state, data, reload }) { const { useState } = React; const D = data; // Primary source: D.today (populated when state === 'reveal-ready' or recent reveal) // Fallback: latest revealed item from history let src = D.today; let isToday = state === 'reveal-ready'; let historyMode = false; if (!src || !src.partner_answer) { const h = D.history && D.history[0]; if (h) { src = { question_id: h.db_id, number: h.number, text: h.text, category: h.category, cat_meta: h.cat_meta, you_answer: h.you, partner_answer: h.partner, you_reaction: h.you_reaction, partner_reaction: h.partner_reaction, date: h.date, favorite: h.favorite }; isToday = false; historyMode = true; } } const [myReaction, setMyReaction] = useState(src ? (src.you_reaction || null) : null); const [favorite, setFavorite] = useState(src ? !!src.favorite : false); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); if (!src) { return (

Раскрытие ответов

Пока нет раскрытых вопросов
🌱
Как только вы оба ответите на сегодняшний вопрос — он появится здесь.
); } const cat = src.cat_meta; const partnerReacted = src.partner_reaction; async function onReact(r) { if (busy) return; const prev = myReaction; const next = r === myReaction ? null : r; setMyReaction(next); setBusy(true); setError(null); try { await window.API.setReaction(src.question_id, next); // Gently refresh once so history updates if (reload) reload(); } catch (e) { setMyReaction(prev); setError(e.message || 'Не удалось сохранить реакцию'); } finally { setBusy(false); } } async function onFavorite() { if (busy) return; const prev = favorite; const next = !favorite; setFavorite(next); setBusy(true); setError(null); try { await window.API.setFavorite(src.question_id, next); if (reload) reload(); } catch (e) { setFavorite(prev); setError(e.message || 'Не удалось сохранить'); } finally { setBusy(false); } } return (

Раскрытие ответов

Вопрос #{src.number} · {isToday ? 'сегодня' : (src.date || 'последний раскрытый')}
💕 ОТВЕТЫ ОТКРЫТЫ

«{src.text}»

{cat.emoji} {cat.ru} · оба ответили
{error && (
{error}
)}
{D.me.initial}
{D.me.name}
ты
ты
{src.you_answer || Ответ не сохранён}
{partnerReacted ? <> Реакция от {D.partner.name}: {partnerReacted} : Без реакции}
{D.partner.initial}
{D.partner.name}
партнёр
партнёр
{src.partner_answer || Ответ не сохранён}
{D.reactions.map(r => ( ))}
{favorite ? 'Сохранено в капсуле 💕' : 'Сохранить в капсулу?'}
Избранные вопросы появляются на вкладке «Наша капсула» и остаются навсегда.
); };