'use client';
import { GeneratedQuestion, QuestionType } from '@/types/quiz';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { cn } from '@/lib/utils';
export interface QuestionPreviewProps {
question: GeneratedQuestion;
questionType?: QuestionType;
showActions?: boolean;
onEdit?: (question: GeneratedQuestion) => void;
onDuplicate?: (question: GeneratedQuestion) => void;
onRemove?: (questionId: string) => void;
className?: string;
}
export default function QuestionPreview({
question,
questionType,
showActions = true,
onEdit,
onDuplicate,
onRemove,
className = '',
}: QuestionPreviewProps) {
const renderQuestionContent = () => {
switch (question.type) {
case 'multiple-choice':
return (
);
case 'cloze':
return (
);
case 'grammar':
return (
);
case 'reading-comp':
return (
);
case 'essay':
return (
);
default:
return (
);
}
};
return (
{questionType?.name || 'Question'}
{question.points} points
Created: {new Date(question.createdAt).toLocaleString()}
{showActions && (
{onEdit && (
)}
{onDuplicate && (
)}
{onRemove && (
)}
)}
{/* Content */}
{renderQuestionContent()}
);
}
// Individual question type preview components
function MultipleChoicePreview({ question, options, correctAnswer, explanation }: {
question: string;
options: { A: string; B: string; C: string; D: string };
correctAnswer: string;
explanation?: string;
}) {
return (
Options:
{Object.entries(options).map(([key, value]) => (
{key}.
{value}
{key === correctAnswer && (
✓ Correct
)}
))}
{explanation && (
Explanation:
{explanation}
)}
);
}
function ClozePreview({ question, blanks, explanation }: {
question: string;
blanks: { text: string; answer?: string }[];
explanation?: string;
}) {
return (
{blanks.length > 0 && (
Answers:
{blanks.map((blank: { text: string; answer?: string }, index: number) => (
Blank {index + 1}: {blank.answer}
))}
)}
{explanation && (
Explanation:
{explanation}
)}
);
}
function GrammarPreview({ question, errors, explanation }: {
question: string;
errors: { text: string; correction?: string }[];
explanation?: string;
}) {
return (
Sentence to Correct:
{question}
{errors.length > 0 && (
Errors & Corrections:
{errors.map((error: { text: string; correction?: string }, index: number) => (
Error: {error.text}
Correction: {error.correction}
))}
)}
{explanation && (
Explanation:
{explanation}
)}
);
}
function ReadingCompPreview({ passage, question, answer, explanation }: {
passage: string;
question: string;
answer: string;
explanation?: string;
}) {
return (
{answer && (
)}
{explanation && (
Explanation:
{explanation}
)}
);
}
function EssayPreview({ prompt, guidelines, rubric }: {
prompt: string;
guidelines: string[];
rubric: { criteria: string; points: number }[];
}) {
return (
{guidelines.length > 0 && (
Guidelines:
{guidelines.map((guideline: string, index: number) => (
-
•
{guideline}
))}
)}
{rubric && rubric.length > 0 && (
Grading Rubric:
{rubric.map((item, index) => (
{item.criteria}
{item.points} points
))}
)}
);
}