import { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; import * as api from "../api/client"; import { Layout } from "../components/Layout"; import { Card, CenterSpinner } from "../components/ui"; import { RadarBlock } from "../components/RadarBlock"; import { IconCheckCircle, IconRadioUnchecked } from "../components/icons"; interface State { response: api.ResponseDetail; poll: api.Poll; hasRadar: boolean; } export function ResponsePage() { const { responseId = "" } = useParams(); const [state, setState] = useState(null); const [error, setError] = useState(""); useEffect(() => { let cancelled = false; (async () => { const response = await api.getResponse(responseId); if (cancelled) return; if (!response) { setError("Результат не найден"); return; } const poll = await api.getPoll(response.poll_id); if (cancelled) return; if (!poll) { setError("Тест не найден"); return; } const radar = await api.getRadarResult(responseId); if (cancelled) return; setState({ response, poll, hasRadar: !!radar?.image_url }); })(); return () => { cancelled = true; }; }, [responseId]); return ( {error ? (

{error}

) : !state ? ( ) : ( )}
); } function ResultBody({ response, poll, hasRadar, responseId }: State & { responseId: string }) { const questions = new Map(poll.questions?.map((q) => [q.id, q]) ?? []); const submittedAt = response.submitted_at.slice(0, 19).replace("T", " "); return (
{poll.title} Пройден: {submittedAt}
{hasRadar && (
Результат
)} Ответы {response.answers.map((ans, i) => { const q = questions.get(ans.question_id); if (!q) return null; return (
{q.text} {q.choices.map((c) => { const selected = c.id === ans.choice_id; return (
{selected ? : } {c.text}
); })}
); })}
); }