"use client"; import { cn } from "@/lib/utils"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { Locale } from "@/config/i18n"; import { getLocale } from "@/lib/i18n"; import { useEffect, useState } from "react"; import { useTranslations } from "next-intl"; import { ArrowLeftIcon } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { useProblem } from "@/hooks/use-problem"; import MdxPreview from "@/components/mdx-preview"; import { useDockviewStore } from "@/stores/dockview"; import { Separator } from "@/components/ui/separator"; import { getStatusColorClass, statusMap } from "@/lib/status"; import type { TestcaseResultWithTestcase } from "@/types/prisma"; import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area"; import { formatDistanceToNow, isBefore, subDays, format } from "date-fns"; interface DetailsPageProps { locale: Locale; } export default function DetailsPage({ locale }: DetailsPageProps) { const localeInstance = getLocale(locale); const t = useTranslations("DetailsPage"); const s = useTranslations("StatusMessage"); const { api, submission } = useDockviewStore(); const { editorLanguageConfigs, problemId } = useProblem(); const [lastFailedTestcase, setLastFailedTestcase] = useState(null); useEffect(() => { if (!api || !problemId || !submission?.id) return; if (problemId !== submission.problemId) { const detailsPanel = api.getPanel("Details"); if (detailsPanel) { api.removePanel(detailsPanel); } } }, [api, problemId, submission]); useEffect(() => { if (!submission?.id || !submission.testcaseResults) return; const failedTestcases = submission.testcaseResults.filter( (result) => (submission.status === "WA" && !result.isCorrect) || (submission.status === "TLE" && !result.isCorrect) || (submission.status === "MLE" && !result.isCorrect) || (submission.status === "RE" && !result.isCorrect) ); setLastFailedTestcase(failedTestcases[0]); }, [submission]); if (!api || !problemId || !submission?.id) return null; const createdAt = new Date(submission.createdAt); const submittedDisplay = isBefore(createdAt, subDays(new Date(), 1)) ? format(createdAt, "yyyy-MM-dd") : formatDistanceToNow(createdAt, { addSuffix: true, locale: localeInstance }); const source = `\`\`\`${submission?.language}\n${submission?.code}\n\`\`\``; const handleClick = () => { if (!api) return; const submissionsPanel = api.getPanel("Submissions"); submissionsPanel?.api.setActive(); const detailsPanel = api.getPanel("Details"); if (detailsPanel) { api.removePanel(detailsPanel); } }; return ( <>

{s(`${statusMap.get(submission.status)?.message}`)}

{t("Time")} {submittedDisplay}
{lastFailedTestcase && (

{t("Input")}

{lastFailedTestcase.testcase.data.map((field) => (
))}

{t("ExpectedOutput")}

{submission.status === "WA" && (

{t("ActualOutput")}

)}
)} {(submission.status === "CE" || submission.status === "SE") && ( )}
{t("Code")} { editorLanguageConfigs.find( (config) => config.language === submission.language )?.label }
); }