import { useEffect } from "react"; import { useMutation } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; import { Sparkles, Loader2 } from "lucide-react"; import { analyticsService } from "@/services/analytics.service"; import { useToast } from "@/hooks/use-toast"; interface Props { onAccept: (marks: number, feedback: string) => void; submissionId?: number; submissionText?: string; rubricId?: number; } const DEFAULT_TEXT = "Sample submission for AI grading suggestion. Replace by passing submissionText when integrating with real submissions."; export default function AiGradingAssistant({ onAccept, submissionId = 1, submissionText = DEFAULT_TEXT, rubricId, }: Props) { const { toast } = useToast(); const gradeMutation = useMutation({ mutationFn: () => analyticsService.getGradingSuggestion({ submission_id: submissionId, text: submissionText, ...(rubricId !== undefined ? { rubric_id: rubricId } : {}), }), onError: (err: Error) => { toast({ variant: "destructive", title: "Could not load AI grade", description: err.message || "Try again later.", }); }, }); useEffect(() => { gradeMutation.mutate(); // eslint-disable-next-line react-hooks/exhaustive-deps -- refetch when inputs change }, [submissionId, submissionText, rubricId]); const data = gradeMutation.data; const marks = data ? Math.round(data.overall_score) : 0; const feedbackBlock = data ? [ data.feedback, data.suggestions?.length ? `Suggestions:\n${data.suggestions.map((s) => `• ${s}`).join("\n")}` : "", ] .filter(Boolean) .join("\n\n") : ""; return (
Could not load a suggestion. Check the console or try again.
) : data ? ( <>Suggested marks
{marks}/100
Suggested feedback
{feedbackBlock}
Rubric scores