import { SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable"; import SortableSection from "../../Shared/SortableSection"; import getReadingQuestions from '../SectionExercises/reading'; import { Exercise, LevelPart, ReadingPart, SpeakingExercise, WritingExercise } from "@/interfaces/exam"; import { ReadingExercise } from "./types"; import Dropdown from "@/components/Dropdown"; import useExamEditorStore from "@/stores/examEditor"; import Writing from "../../Exercises/Writing"; import Speaking from "../../Exercises/Speaking"; import { ReactNode, useEffect, useState } from "react"; import { DndContext, PointerSensor, useSensor, useSensors, DragEndEvent, closestCenter, } from '@dnd-kit/core'; import GenLoader from "../../Exercises/Shared/GenLoader"; import { ExamPart } from "@/stores/examEditor/types"; import getListeningItems from "./listening"; import getLevelQuestionItems from "./level"; export interface Props { sectionId: number; } const SectionExercises: React.FC<{ sectionId: number; }> = ({ sectionId }) => { const { currentModule, dispatch } = useExamEditorStore(); const { sections, expandedSections } = useExamEditorStore( (state) => state.modules[currentModule] ); const { genResult, generating, state } = useExamEditorStore( (state) => state.modules[currentModule].sections.find((section) => section.sectionId === sectionId)! ); useEffect(() => { if (genResult !== undefined && generating === "exercises") { const newExercises = genResult[0].exercises; dispatch({ type: "UPDATE_SECTION_STATE", payload: { sectionId, update: { exercises: [...(state as ExamPart).exercises, ...newExercises] } } }) dispatch({ type: "UPDATE_SECTION_SINGLE_FIELD", payload: { sectionId, module: currentModule, field: "genResult", value: undefined } }) } // eslint-disable-next-line react-hooks/exhaustive-deps }, [genResult, dispatch, sectionId, currentModule]); const currentSection = sections.find((s) => s.sectionId === sectionId)!; const sensors = useSensors( useSensor(PointerSensor), ); const questionItems = () => { let ids, items; switch (currentModule) { case "reading": items = getReadingQuestions((currentSection.state as ReadingPart).exercises as ReadingExercise[], sectionId); ids = items.map(q => q.id.toString()); break; case "listening": items = getListeningItems((currentSection.state as ReadingPart).exercises as ReadingExercise[], sectionId); ids = items.map(q => q?.id.toString()); break; case "level": items = getLevelQuestionItems((currentSection.state as LevelPart).exercises as Exercise[], sectionId); ids = items.map(q => q.id.toString()); break; } return { ids, items } } const questions = questionItems(); const background = (component: ReactNode) => { return (
{component}
); } if (currentModule == "writing") return background(); if (currentModule == "speaking") return background(); return ( dispatch({ type: "REORDER_EXERCISES", payload: { event: e, sectionId } })} > {(currentModule === "level" && questions.ids?.length === 0) ? ( background(Generated exercises will appear here!) ) : ( expandedSections.includes(sectionId) && questions.items && questions.items.length > 0 && questions.ids && questions.ids.length > 0 && (
{questions.items.map(item => (
{item.content}
))}
) )} {generating === "exercises" && }
); } export default SectionExercises;