import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { pollsApi, PollInfo, PollQuestion } from '../api/polls'; 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); }; 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')}

)}
)} {currentQuestion && !completionMessage && (
{t('polls.question')} {questionIndex + 1} {t('polls.of')} {totalQuestions}

{currentQuestion.text}

{currentQuestion.options.map((option) => ( ))}
{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.noPolls')}

)}
); }