"use client"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, CardFooter, } from "@/components/ui/card"; import { toast } from "sonner"; import { Skeleton } from "@/components/ui/skeleton"; import { getAnalysis } from "@/app/actions/analyze"; import { Loader2Icon, TerminalIcon } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { ChartDataPoint, CodeAnalysisRadarChart, } from "@/features/problems/analysis/components/radar-chart"; import type { AnalysisStatus, CodeAnalysis } from "@/generated/client"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; interface AnalysisCardProps { submissionId: string; } const ACTIVE_STATUSES: AnalysisStatus[] = ["PENDING", "QUEUED", "PROCESSING"]; const FINAL_STATUSES: AnalysisStatus[] = ["COMPLETED", "FAILED"]; export const AnalysisCard = ({ submissionId }: AnalysisCardProps) => { const [analysis, setAnalysis] = useState(null); const fetchAnalysis = useCallback(() => { getAnalysis(submissionId) .then((analysis) => { setAnalysis(analysis); }) .catch((error) => { toast.error("Analysis Update Failed", { description: error.message || "Failed to fetch analysis data.", }); }); }, [submissionId]); useEffect(() => { if (!analysis) { fetchAnalysis(); } const interval = setInterval(() => { if (!analysis || ACTIVE_STATUSES.includes(analysis.status)) { fetchAnalysis(); } else if (FINAL_STATUSES.includes(analysis.status)) { clearInterval(interval); } }, 5000); return () => clearInterval(interval); }, [analysis, fetchAnalysis]); if (!analysis) { return (

Analyzing your code...

); } if (analysis.status === "FAILED") { return ( Code Analysis Analysis Failed We couldn't analyze your code. Please try again later. ); } if (analysis.status !== "COMPLETED") { return ( Code Analysis Preparing your detailed evaluation

Processing your submission

This may take a few moments...

); } // Transform the data into a format suitable for the RadarChart const chartData: ChartDataPoint[] = [ { kind: "overall", score: analysis.overallScore ?? 0, fullMark: 100, }, { kind: "style", score: analysis.styleScore ?? 0, fullMark: 100, }, { kind: "readability", score: analysis.readabilityScore ?? 0, fullMark: 100, }, { kind: "efficiency", score: analysis.efficiencyScore ?? 0, fullMark: 100, }, { kind: "correctness", score: analysis.correctnessScore ?? 0, fullMark: 100, }, ]; return ( Code Analysis Detailed evaluation of your code submission
Overall Score {analysis.overallScore ?? "N/A"} /100

Feedback

{analysis.feedback}

); };