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')} )} {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 p-4 text-left bg-dark-700 hover:bg-dark-600 rounded-lg transition-colors 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}/{poll.total_questions} {t('polls.questions')} {poll.reward_amount && ( +{poll.reward_amount} )} {poll.is_completed ? ( {t('polls.completed')} ) : ( handleStartPoll(poll)} className="w-full btn-primary" > {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')}