"use client" import { useState } from "react" import { Card, CardContent } from "@/components/ui/card" import { Flame } from "lucide-react" import Link from "next/link" import ReactMarkdown from 'react-markdown' import remarkMath from 'remark-math' import rehypeKatex from 'rehype-katex' import 'katex/dist/katex.min.css' export interface MistakePayload { mistake: { id: string user_id: string question_id: string error_type: string topic: string subtopic: string review_count: number consecutive_correct: number is_mastered: boolean } question: { id: string subject: string question_text: string options: Record correct_answer: { correct: string } solution_text: string } } interface MistakeReviewCardProps { data: MistakePayload onNext: () => void onSubmitReview: (mistakeId: string, selectedAnswer: string) => Promise<{is_correct: boolean, correct_answer: string}> } export function MistakeReviewCard({ data, onNext, onSubmitReview }: MistakeReviewCardProps) { const [selected, setSelected] = useState(null) const [result, setResult] = useState<'success' | 'error' | null>(null) const [correctAnswer, setCorrectAnswer] = useState(null) const [isSubmitting, setIsSubmitting] = useState(false) const handleCheck = async () => { if (!selected) return; setIsSubmitting(true) try { const res = await onSubmitReview(data.mistake.id, selected) setResult(res.is_correct ? 'success' : 'error') setCorrectAnswer(res.correct_answer) } catch (err) { console.error(err) } finally { setIsSubmitting(false) } } const handleNext = () => { setSelected(null) setResult(null) setCorrectAnswer(null) onNext() } const { mistake, question } = data; return (

♻️ Spaced Repetition Queue

{/* Spaced Repetition Timeline */}
Attempt 1 10 Jul
Attempt 2 14 Jul
Today 19 Jul
Mastery 26 Jul
{/* Mistake Card */}
{mistake.topic} {mistake.error_type}
{question.question_text}
{Object.entries(question.options).map(([letter, text]) => { const isSelected = selected === letter let btnClass = "border-border bg-white/5 hover:bg-white/10 hover:border-border text-muted-foreground" if (result) { if (letter === correctAnswer) { btnClass = "border-green-500 bg-green-500/10 text-green-500 shadow-[0_0_15px_rgba(34,197,94,0.15)]" } else if (isSelected && letter !== correctAnswer) { btnClass = "border-red-500 bg-red-500/10 text-red-500" } } else if (isSelected) { btnClass = "border-[#00F0FF] bg-[#00F0FF]/10 text-[#00F0FF] shadow-[0_0_15px_rgba(0,240,255,0.15)]" } return ( ) })}
{/* Action Button */} {!result ? (
) : ( <> {/* Solution Block */}

AI Coach Explanation

{question.solution_text}
)}
) }