import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { pollsApi, PollInfo, PollQuestion } from '../api/polls'; import { useFocusTrap } from '../hooks/useFocusTrap'; const ClipboardIcon = () => ( ); const GiftIcon = () => ( ); const CheckIcon = () => ( ); export default function Polls() { const { t } = useTranslation(); const queryClient = useQueryClient(); const [selectedPoll, setSelectedPoll] = useState(null); const [currentQuestion, setCurrentQuestion] = useState(null); const [questionIndex, setQuestionIndex] = useState(0); const [totalQuestions, setTotalQuestions] = useState(0); const [completionMessage, setCompletionMessage] = useState<{ reward: number | null; message: string; } | null>(null); const { data: polls, isLoading, error, } = useQuery({ queryKey: ['polls'], queryFn: pollsApi.getPolls, }); const startPollMutation = useMutation({ mutationFn: pollsApi.startPoll, onSuccess: (data) => { setCurrentQuestion(data.question); setQuestionIndex(data.current_question_index); setTotalQuestions(data.total_questions); setCompletionMessage(null); }, }); const answerMutation = useMutation({ mutationFn: ({ responseId, questionId, optionId, }: { responseId: number; questionId: number; optionId: number; }) => pollsApi.answerQuestion(responseId, questionId, optionId), onSuccess: (data) => { if (data.is_completed) { setCurrentQuestion(null); setCompletionMessage({ reward: data.reward_granted, message: data.message || t('polls.completed'), }); queryClient.invalidateQueries({ queryKey: ['polls'] }); } else if (data.next_question) { setCurrentQuestion(data.next_question); setQuestionIndex(data.current_question_index || 0); setTotalQuestions(data.total_questions); } }, }); const handleStartPoll = (poll: PollInfo) => { setSelectedPoll(poll); startPollMutation.mutate(poll.response_id); }; const handleAnswer = (optionId: number) => { if (selectedPoll && currentQuestion) { answerMutation.mutate({ responseId: selectedPoll.response_id, questionId: currentQuestion.id, optionId, }); } }; const handleClosePoll = () => { setSelectedPoll(null); setCurrentQuestion(null); setCompletionMessage(null); }; const pollDialogRef = useFocusTrap(!!selectedPoll, { onEscape: handleClosePoll, }); if (isLoading) { return (
); } if (error) { return (

{t('polls.error')}

); } return (

{t('polls.title')}

{/* Poll Modal */} {selectedPoll && (