From 1c031ce24e857677a0544156373279d75fe7fef2 Mon Sep 17 00:00:00 2001 From: cfngc4594 Date: Wed, 14 May 2025 17:04:03 +0800 Subject: [PATCH] refactor(judge-button): migrate run code button to standalone component - Replace RunCodeButton with new JudgeButton component - Use problem-specific stores instead of playground stores - Implement new judge toast notification system - Simplify authentication check logic - Utilize new TooltipButton component --- src/components/run-code.tsx | 97 ------------------- .../problems/components/judge-button.tsx | 63 ++++++++++++ 2 files changed, 63 insertions(+), 97 deletions(-) delete mode 100644 src/components/run-code.tsx create mode 100644 src/features/problems/components/judge-button.tsx diff --git a/src/components/run-code.tsx b/src/components/run-code.tsx deleted file mode 100644 index b8da82a..0000000 --- a/src/components/run-code.tsx +++ /dev/null @@ -1,97 +0,0 @@ -"use client"; - -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from "@/components/ui/tooltip"; -import { cn } from "@/lib/utils"; -import { useState } from "react"; -import { Session } from "next-auth"; -import { judge } from "@/actions/judge"; -import { useTranslations } from "next-intl"; -import { Button } from "@/components/ui/button"; -import { useProblem } from "@/hooks/use-problem"; -import { useDockviewStore } from "@/stores/dockview"; -import { LoaderCircleIcon, PlayIcon } from "lucide-react"; -import { showStatusToast } from "@/hooks/show-status-toast"; -import { usePathname, useRouter, useSearchParams } from "next/navigation"; - -interface RunCodeButtonProps { - className?: string; - session: Session | null; -} - -export function RunCodeButton({ - className, - session, -}: RunCodeButtonProps) { - const router = useRouter(); - const pathname = usePathname(); - const searchParams = useSearchParams(); - const { api } = useDockviewStore(); - const { currentLang, editor, problemId } = useProblem(); - const [isLoading, setIsLoading] = useState(false); - const t = useTranslations("PlaygroundHeader.RunCodeButton"); - - const handleJudge = async () => { - if (!editor) return; - - const code = editor.getValue() || ""; - setIsLoading(true); - - if (!session) { - const params = new URLSearchParams(searchParams.toString()); - params.set("redirectTo", pathname); - router.push(`/sign-in?${params.toString()}`); - } else { - try { - const result = await judge(currentLang, code, problemId); - showStatusToast({ status: result.status }); - const panel = api?.getPanel("Submissions"); - if (panel && !panel.api.isActive) { - panel.api.setActive(); - } - } catch (error) { - console.error("Error occurred while judging the code:"); - console.error(error); - } finally { - setIsLoading(false); - } - } - }; - - return ( - - - - - - - {t("TooltipContent")} - - - - ); -} diff --git a/src/features/problems/components/judge-button.tsx b/src/features/problems/components/judge-button.tsx new file mode 100644 index 0000000..e5c9dae --- /dev/null +++ b/src/features/problems/components/judge-button.tsx @@ -0,0 +1,63 @@ +"use client"; + +import { toast } from "sonner"; +import { cn } from "@/lib/utils"; +import { useState } from "react"; +import { judge } from "@/app/actions/judge"; +import { useTranslations } from "next-intl"; +import { LoaderCircleIcon, PlayIcon } from "lucide-react"; +import { TooltipButton } from "@/components/tooltip-button"; +import { useProblemEditorStore } from "@/stores/problem-editor"; +import { useProblemDockviewStore } from "@/stores/problem-dockview"; +import { JudgeToast } from "@/features/problems/components/judge-toast"; + +interface JudgeButtonProps { + className?: string; +} + +export const JudgeButton = ({ className }: JudgeButtonProps) => { + const { api } = useProblemDockviewStore(); + const { problem, language, value } = useProblemEditorStore(); + const [isLoading, setIsLoading] = useState(false); + const t = useTranslations("PlaygroundHeader.RunCodeButton"); + + const handleJudge = async () => { + if (!problem?.problemId) return; + setIsLoading(true); + + const status = await judge(problem.problemId, language, value); + toast.custom((t) => ); + + const panel = api?.getPanel("submission"); + if (panel && !panel.api.isActive) { + panel.api.setActive(); + } + setIsLoading(false); + }; + + return ( + + {isLoading ? ( + + ); +};