import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { contestsApi, ContestInfo, ContestGameData } from '../api/contests'; import { GamepadIcon, TrophyIcon, XIcon } from '@/components/icons'; export default function Contests() { const { t } = useTranslation(); const queryClient = useQueryClient(); const [selectedContest, setSelectedContest] = useState(null); const [gameData, setGameData] = useState(null); const [result, setResult] = useState<{ is_winner: boolean; message: string } | null>(null); const { data: contests, isLoading, error, } = useQuery({ queryKey: ['contests'], queryFn: contestsApi.getContests, }); const getGameMutation = useMutation({ mutationFn: contestsApi.getContestGame, onSuccess: (data) => { setGameData(data); setResult(null); }, }); const submitAnswerMutation = useMutation({ mutationFn: ({ roundId, answer }: { roundId: number; answer: string }) => contestsApi.submitAnswer(roundId, answer), onSuccess: (data) => { setResult(data); queryClient.invalidateQueries({ queryKey: ['contests'] }); }, }); const handlePlayContest = async (contest: ContestInfo) => { setSelectedContest(contest); getGameMutation.mutate(contest.id); }; const handleSubmitAnswer = (answer: string) => { if (gameData) { submitAnswerMutation.mutate({ roundId: gameData.round_id, answer }); } }; const handleCloseGame = () => { setSelectedContest(null); setGameData(null); setResult(null); }; if (isLoading) { return (
); } if (error) { return (

{t('contests.error')}

); } return (

{t('contests.title')}

{/* Game Modal */} {selectedContest && (
e.stopPropagation()} >

{selectedContest.name}

{getGameMutation.isPending && (
)} {result && (

{result.message}

)} {gameData && !result && (

{gameData.instructions}

{/* Render game based on type */} {(gameData.game_type === 'quest' || gameData.game_type === 'locks') && (
{Array.from({ length: gameData.game_data.total || gameData.game_data.grid_size || 9, }).map((_, i) => ( ))}
)} {gameData.game_type === 'server' && (
{gameData.game_data.flags?.map((flag: string, i: number) => ( ))}
)} {gameData.game_type === 'blitz' && ( )} {['cipher', 'emoji', 'anagram'].includes(gameData.game_type) && (
{ e.preventDefault(); const input = e.currentTarget.elements.namedItem( 'answer', ) as HTMLInputElement; handleSubmitAnswer(input.value); }} className="space-y-3" >
{gameData.game_data.question || gameData.game_data.letters}
)}
)} {result && ( )}
)} {/* Contests List */} {contests && contests.length > 0 ? (
{contests.map((contest) => (

{contest.name}

{contest.description && (

{contest.description}

)}
+{t('contests.days', { count: contest.prize_days })}
{contest.already_played ? ( ) : ( )}
))}
) : (

{t('contests.noContests')}

)}
); }