// 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}
)}
{src.you_answer || Ответ не сохранён}
{D.partner.initial}
партнёр
{src.partner_answer || Ответ не сохранён}
{favorite ? 'Сохранено в капсуле 💕' : 'Сохранить в капсулу?'}
Избранные вопросы появляются на вкладке «Наша капсула» и остаются навсегда.
);
};