import { useEffect, useState } from "react" import { Link, useParams } from "react-router-dom" import { ArrowLeft, Plus, Edit, Trash2, X } from "lucide-react" import practiceSrc from "../../assets/Practice.svg" import spinnerSrc from "../../assets/Circular-indeterminate progress indicator.svg" import { Card, CardContent, CardHeader, CardTitle } from "../../components/ui/card" import alertSrc from "../../assets/Alert.svg" import { Badge } from "../../components/ui/badge" import { Button } from "../../components/ui/button" import { getPracticeQuestions, createPracticeQuestion, updatePracticeQuestion, deletePracticeQuestion } from "../../api/courses.api" import { Input } from "../../components/ui/input" import { Select } from "../../components/ui/select" import type { PracticeQuestion } from "../../types/course.types" type QuestionType = "MCQ" | "TRUE_FALSE" | "SHORT" const typeLabels: Record = { MCQ: "Multiple Choice", TRUE_FALSE: "True/False", SHORT: "Short Answer", } const typeColors: Record = { MCQ: "bg-blue-100 text-blue-700", TRUE_FALSE: "bg-purple-100 text-purple-700", SHORT: "bg-green-100 text-green-700", } export function PracticeQuestionsPage() { const { categoryId, courseId, subCourseId, practiceId } = useParams() const [questions, setQuestions] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [showAddModal, setShowAddModal] = useState(false) const [showEditModal, setShowEditModal] = useState(false) const [questionToEdit, setQuestionToEdit] = useState(null) const [showDeleteModal, setShowDeleteModal] = useState(false) const [questionToDelete, setQuestionToDelete] = useState(null) const [deleting, setDeleting] = useState(false) const [questionText, setQuestionText] = useState("") const [questionType, setQuestionType] = useState("MCQ") const [sampleAnswer, setSampleAnswer] = useState("") const [tips, setTips] = useState("") const [questionVoicePrompt, setQuestionVoicePrompt] = useState("") const [sampleAnswerVoicePrompt, setSampleAnswerVoicePrompt] = useState("") const [saving, setSaving] = useState(false) const [saveError, setSaveError] = useState(null) const backLink = `/content/category/${categoryId}/courses/${courseId}/sub-courses/${subCourseId}` const fetchQuestions = async () => { if (!practiceId) return try { const res = await getPracticeQuestions(Number(practiceId)) setQuestions(res.data.data.questions ?? []) } catch (err) { console.error("Failed to fetch questions:", err) setError("Failed to load questions") } finally { setLoading(false) } } useEffect(() => { fetchQuestions() }, [practiceId]) const handleAddQuestion = () => { setQuestionText("") setQuestionType("MCQ") setSampleAnswer("") setTips("") setQuestionVoicePrompt("") setSampleAnswerVoicePrompt("") setSaveError(null) setShowAddModal(true) } const handleSaveNewQuestion = async () => { if (!practiceId) return setSaving(true) setSaveError(null) try { await createPracticeQuestion({ practice_id: Number(practiceId), question: questionText, type: questionType, sample_answer: sampleAnswer, tips, question_voice_prompt: questionVoicePrompt, sample_answer_voice_prompt: sampleAnswerVoicePrompt, }) setShowAddModal(false) resetForm() await fetchQuestions() } catch (err) { console.error("Failed to create question:", err) setSaveError("Failed to create question") } finally { setSaving(false) } } const handleEditClick = (question: PracticeQuestion) => { setQuestionToEdit(question) setQuestionText(question.question) setQuestionType(question.type) setSampleAnswer(question.sample_answer) setTips(question.tips || "") setQuestionVoicePrompt(question.question_voice_prompt || "") setSampleAnswerVoicePrompt(question.sample_answer_voice_prompt || "") setSaveError(null) setShowEditModal(true) } const handleSaveEditQuestion = async () => { if (!questionToEdit) return setSaving(true) setSaveError(null) try { await updatePracticeQuestion(questionToEdit.id, { question: questionText, type: questionType, sample_answer: sampleAnswer, tips, question_voice_prompt: questionVoicePrompt, sample_answer_voice_prompt: sampleAnswerVoicePrompt, }) setShowEditModal(false) setQuestionToEdit(null) resetForm() await fetchQuestions() } catch (err) { console.error("Failed to update question:", err) setSaveError("Failed to update question") } finally { setSaving(false) } } const handleDeleteClick = (question: PracticeQuestion) => { setQuestionToDelete(question) setShowDeleteModal(true) } const handleConfirmDelete = async () => { if (!questionToDelete) return setDeleting(true) try { await deletePracticeQuestion(questionToDelete.id) setShowDeleteModal(false) setQuestionToDelete(null) await fetchQuestions() } catch (err) { console.error("Failed to delete question:", err) } finally { setDeleting(false) } } const resetForm = () => { setQuestionText("") setQuestionType("MCQ") setSampleAnswer("") setTips("") setQuestionVoicePrompt("") setSampleAnswerVoicePrompt("") } if (loading) { return (

Loading questions...

) } if (error) { return (

{error}

) } return (

Practice Questions

{questions.length} questions available

{questions.length === 0 ? (

No questions found for this practice

Get started by adding your first question

) : (
{questions.map((question, index) => (
{index + 1}
{typeLabels[question.type]}
{question.question}

Sample Answer

{question.sample_answer}

{question.tips && (

💡 Tips

{question.tips}

)}
))}
)} {/* Delete Modal */} {showDeleteModal && questionToDelete && (

Delete Question

Are you sure you want to delete this question? This action cannot be undone.

)} {/* Add Modal */} {showAddModal && (

Add New Question