'use client'; import { useState, useEffect } from 'react'; import { GeneratedQuestion, QuestionType } from '@/types/quiz'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; export interface QuestionEditModalProps { question: GeneratedQuestion | null; questionTypes: QuestionType[]; isOpen: boolean; onClose: () => void; onSave: (updatedQuestion: GeneratedQuestion) => void; } export default function QuestionEditModal({ question, questionTypes, isOpen, onClose, onSave, }: QuestionEditModalProps) { const [editedQuestion, setEditedQuestion] = useState(null); const [isSaving, setIsSaving] = useState(false); // Initialize form when question changes useEffect(() => { if (question) { setEditedQuestion({ ...question }); } }, [question]); const handleSave = async () => { if (!editedQuestion) return; // Basic validation if (!editedQuestion.stem.trim()) { alert('Please enter a question'); return; } if (!editedQuestion.content.Options.A.trim() || !editedQuestion.content.Options.B.trim() || !editedQuestion.content.Options.C.trim() || !editedQuestion.content.Options.D.trim()) { alert('Please fill in all answer options'); return; } setIsSaving(true); try { // Call the update API const response = await fetch('/api/update-question', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(editedQuestion), }); if (response.ok) { const updatedQuestion = await response.json(); onSave(updatedQuestion); onClose(); } else { const errorData = await response.json(); alert(`Failed to update question: ${errorData.error || 'Unknown error'}`); } } catch (error) { console.error('Error updating question:', error); alert('Failed to update question. Please try again.'); } finally { setIsSaving(false); } }; const handleCancel = () => { setEditedQuestion(question ? { ...question } : null); onClose(); }; const updateQuestionField = (field: string, value: string | number | boolean) => { if (!editedQuestion) return; setEditedQuestion(prev => { if (!prev) return null; if (field === 'stem') { return { ...prev, stem: String(value) }; } else if (field.startsWith('content.Options.')) { const optionKey = field.replace('content.Options.', ''); return { ...prev, content: { ...prev.content, Options: { ...prev.content.Options, [optionKey]: String(value) } } }; } else if (field.startsWith('content.')) { const contentField = field.replace('content.', ''); return { ...prev, content: { ...prev.content, [contentField]: String(value) } }; } return prev; }); }; if (!editedQuestion) return null; return ( Edit Question
{/* Question Type - Read Only */}
{questionTypes.find(t => t.id === editedQuestion.type)?.icon || '📝'} {questionTypes.find(t => t.id === editedQuestion.type)?.name || 'Unknown Type'}
{/* Points - Read Only */}
{editedQuestion.points} pts
{/* Question Stem */}