diff --git a/services/frontend/src/pages/CompetitionSession/index.tsx b/services/frontend/src/pages/CompetitionSession/index.tsx index fd8ec50..0b4a490 100644 --- a/services/frontend/src/pages/CompetitionSession/index.tsx +++ b/services/frontend/src/pages/CompetitionSession/index.tsx @@ -1,5 +1,5 @@ -import { useState } from "react"; -import { useParams, Navigate } from "react-router-dom"; +import { useState, useEffect } from "react"; +import { useParams, Navigate, useNavigate } from "react-router-dom"; import CompetitionHeader from "./components/CompetitionHeader"; import TaskContent from "./components/TaskContent"; import TaskSolution from "./modules/TaskSolution"; @@ -13,8 +13,10 @@ const CompetitionSession = () => { const { id, taskId } = useParams<{ id: string; taskId?: string }>(); const [answer, setAnswer] = useState(""); const [selectedFile, setSelectedFile] = useState(null); + const [submissionSuccess, setSubmissionSuccess] = useState(false); const competitionId = id || ""; const queryClient = useQueryClient(); + const navigate = useNavigate(); const competitionQuery = useQuery({ queryKey: ["competition", competitionId], @@ -45,14 +47,37 @@ const CompetitionSession = () => { queryKey: ['solutionHistory', competitionId, taskId] }); - setAnswer(""); - setSelectedFile(null); + setSubmissionSuccess(true); // Set flag to trigger the timeout }, onError: (error) => { console.error("Error submitting solution:", error); } }); + // Effect to handle the page reload after successful submission + useEffect(() => { + let timeoutId: number; + + if (submissionSuccess) { + timeoutId = window.setTimeout(() => { + // Reload the current page + window.location.reload(); + + // Alternative: Use React Router's navigate to refresh + // navigate(`/competition/${competitionId}/tasks/${taskId}`, { replace: true }); + + setSubmissionSuccess(false); + }, 5000); // 5 seconds timeout + } + + // Clean up timeout when component unmounts or when submissionSuccess changes + return () => { + if (timeoutId) { + window.clearTimeout(timeoutId); + } + }; + }, [submissionSuccess, competitionId, taskId, navigate]); + const competition = competitionQuery.data; const tasks = tasksQuery.data || []; const isLoading = tasksQuery.isLoading || competitionQuery.isLoading; @@ -125,6 +150,16 @@ const CompetitionSession = () => { onSubmit={handleSubmit} isSubmitting={submitMutation.isPending} /> + {submissionSuccess && ( +
+
+ +

+ Решение отправлено! Страница обновится через несколько секунд... +

+
+
+ )} ) : (
diff --git a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx index cd7906b..8113fba 100644 --- a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx +++ b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx @@ -70,14 +70,6 @@ const TaskSolution: React.FC = ({ } }, [task.id, solutionHistory]); - // useEffect(() => { - // if (solutionHistory.length > 0 && - // (!displayedSolution || - // (solutionHistory[solutionHistory.length - 1].id !== displayedSolution.id))) { - // setDisplayedSolution(solutionHistory[solutionHistory.length - 1]); - // } - // }, [solutionHistory, displayedSolution]); - useEffect(() => { const loadSolutionContent = async () => { if (!displayedSolution || !displayedSolution.content) return; @@ -122,9 +114,6 @@ const TaskSolution: React.FC = ({
{displayedSolution ? ( <> -
- Результат последней посылки: -
) : ( diff --git a/services/frontend/src/pages/Review/modules/review-header.tsx b/services/frontend/src/pages/Review/modules/review-header.tsx index d27e9e8..a7e14c5 100644 --- a/services/frontend/src/pages/Review/modules/review-header.tsx +++ b/services/frontend/src/pages/Review/modules/review-header.tsx @@ -1,13 +1,22 @@ import { buttonVariants } from "@/components/ui/button"; import { DataRushReview } from "@/components/ui/icons/datarush-review"; import { Reviewer } from "@/shared/types/review"; -import { Link } from "react-router"; +import { useUserStore } from "@/shared/stores/user"; +import { useNavigate } from "react-router-dom"; interface ReviewHeaderProps { reviewer: Reviewer; } export const ReviewHeader = ({ reviewer }: ReviewHeaderProps) => { + const clearUser = useUserStore((state) => state.clearUser); + const navigate = useNavigate(); + + const handleLogout = () => { + clearUser(); + navigate("/"); + }; + return (
@@ -15,13 +24,13 @@ export const ReviewHeader = ({ reviewer }: ReviewHeaderProps) => {

{reviewer.name} {reviewer.surname}

- Выйти - +
); -}; +}; \ No newline at end of file