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 && ( {selectedPoll.title} {startPollMutation.isPending && ( )} {completionMessage && ( {completionMessage.message} {completionMessage.reward && ( +{completionMessage.reward} {t('polls.reward')} )} {t('common.close')} )} {currentQuestion && !completionMessage && ( {t('polls.question')} {questionIndex + 1} {t('polls.of')} {totalQuestions} {currentQuestion.text} {currentQuestion.options.map((option) => ( handleAnswer(option.id)} disabled={answerMutation.isPending} className="w-full rounded-lg bg-dark-700 p-4 text-left transition-colors hover:bg-dark-600 disabled:opacity-50" > {option.text} ))} {answerMutation.isPending && ( )} )} )} {/* Polls List */} {polls && polls.length > 0 ? ( {polls.map((poll) => ( {poll.title} {poll.description && ( {poll.description} )} {poll.answered_questions}/ {t('polls.questions', { count: poll.total_questions })} {poll.reward_amount && ( +{poll.reward_amount} )} {poll.is_completed ? ( {t('polls.completed')} ) : ( handleStartPoll(poll)} className="btn-primary w-full"> {poll.answered_questions > 0 ? t('polls.continue') : t('polls.start')} )} ))} ) : ( {t('polls.noPolls')} )} ); }
{t('polls.error')}
{completionMessage.message}
+{completionMessage.reward} {t('polls.reward')}
{currentQuestion.text}
{poll.description}
{t('polls.noPolls')}