import { useEffect, useState } from 'react'; import type { AnswerType, QuestionType } from '@sauci/shared'; import { Badge } from '@/components/ui/badge'; import { Skeleton } from '@/components/ui/skeleton'; import { Image as ImageIcon, Music2 } from 'lucide-react'; import { getAdminResponseMedia } from '@/lib/adminApi'; import { formatAdminResponse, QUESTION_TYPE_LABELS, type AdminResponseData } from '@/lib/questionResponses'; interface ResponseAnswerProps { answer: AnswerType; responseId?: string; questionType?: QuestionType | null; responseData?: AdminResponseData; responderId?: string; responderName?: string | null; } export function ResponseAnswer({ answer, responseId, questionType, responseData = null, responderId, responderName, }: ResponseAnswerProps) { const formatted = formatAdminResponse(questionType, answer, responseData, { responderId, responderName }); const resolvedType = questionType ?? 'swipe'; return (
{formatted.label} {resolvedType !== 'swipe' && ( {QUESTION_TYPE_LABELS[resolvedType]} )}
{formatted.detail && (

{formatted.detail}

)} {(resolvedType === 'photo' || resolvedType === 'audio') && responseId && ( )}
); } function ProtectedResponseMedia({ responseId, mediaType, label, }: { responseId: string; mediaType: 'photo' | 'audio'; label: string; }) { const [url, setUrl] = useState(null); const [error, setError] = useState(null); useEffect(() => { let cancelled = false; let objectUrl: string | null = null; const load = async () => { try { setError(null); objectUrl = URL.createObjectURL(await getAdminResponseMedia(responseId)); if (!cancelled) setUrl(objectUrl); } catch (loadError) { if (!cancelled) { setError(loadError instanceof Error ? loadError.message : 'Failed to load media'); } } }; load(); return () => { cancelled = true; if (objectUrl) URL.revokeObjectURL(objectUrl); }; }, [responseId]); if (error) { return (

{mediaType === 'photo' ? : } {error}

); } if (!url) { return ; } if (mediaType === 'photo') { return ( ); } return (