import { useState } from "react"; import { useParams, Link, useNavigate } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { ArrowLeft, Clock, Trophy, BookOpen, AlertCircle, BarChart2 } from "lucide-react"; import ReactMarkdown from "react-markdown"; import { useQuery, useMutation } from "@tanstack/react-query"; import { getCompetition, startCompetition, getCompetitionResults } from "@/shared/api/competitions"; import { getCompetitionTasks } from "@/shared/api/session"; import { Loading } from "@/components/ui/loading"; import { CompetitionType } from "@/shared/types/competition"; import remarkMath from "remark-math"; import remarkGfm from "remark-gfm"; import rehypeKatex from "rehype-katex"; import { CompetitionResultsModal } from "./components/CompetitionResultModal"; const CompetitionPage = () => { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const competitionId = id || ""; const [isResultsModalOpen, setIsResultsModalOpen] = useState(false); const competitionQuery = useQuery({ queryKey: ["competition", competitionId], queryFn: () => getCompetition(competitionId), enabled: !!competitionId, }); const resultsQuery = useQuery({ queryKey: ["competitionResults", competitionId], queryFn: () => getCompetitionResults(competitionId), enabled: !!competitionId, }); const startMutation = useMutation({ mutationFn: () => startCompetition(competitionId), onSuccess: async () => { try { const tasks = await getCompetitionTasks(competitionId); if (tasks && tasks.length > 0) { const sortedTasks = [...tasks].sort((a, b) => { return a.in_competition_position - b.in_competition_position; }); navigate(`/competition/${competitionId}/tasks/${sortedTasks[0].id}`); } else { navigate(`/competition/${competitionId}/tasks`); } } catch (error) { console.error("Failed to fetch tasks:", error); navigate(`/competition/${competitionId}/tasks`); } }, onError: (error) => { console.error("Failed to start competition:", error); } }); const formatDate = (date?: Date | string) => { if (!date) return ""; const dateObj = typeof date === 'string' ? new Date(date) : date; return dateObj.toLocaleString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', }); }; const handleStart = () => { startMutation.mutate(); }; const hasResults = resultsQuery.data && resultsQuery.data.length > 0 && resultsQuery.data.some(result => result.result !== -2); if (competitionQuery.isLoading) { return ; } if (!competitionId || !competitionQuery.data) { return <>; } const competition = competitionQuery.data; const isCompetitionNotStarted = () => { if (!competition?.start_date) return false; const startDate = new Date(competition.start_date); const now = new Date(); return now < startDate; }; const isCompetitionEnded = () => { if (!competition?.end_date) return false; const endDate = new Date(competition.end_date); const now = new Date(); return now > endDate; }; const competitionNotStarted = isCompetitionNotStarted(); const competitionEnded = isCompetitionEnded(); return (
Назад к соревнованиям
{competition.title}
{competition.type === CompetitionType.COMPETITIVE ? ( <> Соревнование ) : ( <> Тренировка )}
{competitionNotStarted && competition.type === CompetitionType.COMPETITIVE && (
Скоро начнется
)} {competitionEnded && competition.type === CompetitionType.COMPETITIVE && (
Завершено
)}

{competition.title}

{competition.type === CompetitionType.COMPETITIVE && (
{competition.start_date && (
Начало: {formatDate(competition.start_date)}
)} {competition.end_date && (
Окончание: {formatDate(competition.end_date)}
)}
)}
{competition.description || ""}
{competitionNotStarted && competition.type === CompetitionType.COMPETITIVE ? ( ) : !competitionEnded ? ( ) : null} {hasResults && ( )} {competitionEnded && !hasResults && competition.type === CompetitionType.COMPETITIVE && !resultsQuery.isLoading && (

Соревнование завершено. Увы

)}
); }; export default CompetitionPage;