import { useState } from 'react' import toast from 'react-hot-toast' import Save from 'lucide-react/dist/esm/icons/save' import X from 'lucide-react/dist/esm/icons/x' import Spinner from '../shared/Spinner' import { OPTION_LETTERS, optionsFromQuestion } from './questionUtils' export default function QuestionEditForm({ question, onSave, onCancel }) { const [form, setForm] = useState(() => ({ question_type: question.question_type || 'mcq', question_text: question.question_text || '', options: optionsFromQuestion(question.options), correct_answer: question.correct_answer || '', marks: question.marks ?? 1, negative_marks: question.negative_marks ?? 0.33, subject: question.subject || '', topic: question.topic || '', })) const [saving, setSaving] = useState(false) const isNAT = form.question_type === 'nat' const isMSQ = form.question_type === 'msq' const setOption = (idx, value) => { setForm(prev => ({ ...prev, options: prev.options.map((option, optionIdx) => (optionIdx === idx ? value : option)), })) } const setType = (questionType) => { setForm(prev => ({ ...prev, question_type: questionType, correct_answer: '', negative_marks: questionType === 'mcq' ? 0.33 : 0, })) } const submit = async (event) => { event.preventDefault() const marks = Number(form.marks) const negativeMarks = Number(form.negative_marks) if (!form.question_text.trim()) { toast.error('Question text required'); return } if (!isNAT && form.options.some(option => !option.trim())) { toast.error('Fill all 4 options'); return } if (!form.correct_answer.trim()) { toast.error('Correct answer required'); return } if (!Number.isFinite(marks) || marks <= 0) { toast.error('Marks must be greater than 0'); return } if (!Number.isFinite(negativeMarks) || negativeMarks < 0) { toast.error('Negative marks cannot be below 0'); return } const payload = { ...form, question_text: form.question_text.trim(), options: isNAT ? [] : form.options.map(option => option.trim()), correct_answer: form.correct_answer.trim().toUpperCase(), marks, negative_marks: (isMSQ || isNAT) ? 0 : negativeMarks, subject: form.subject.trim() || null, topic: form.topic.trim() || null, } setSaving(true) try { await onSave(payload) toast.success('Question updated') } catch (err) { toast.error(err.response?.data?.detail || 'Failed to update question') } finally { setSaving(false) } } return (
) }