import { SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable"; import SortableSection from "../../Shared/SortableSection"; import getReadingQuestions from '../SectionExercises/reading'; import { Exercise, LevelPart, ListeningPart, ReadingPart, SpeakingExercise, WritingExercise } from "@/interfaces/exam"; import ExerciseItem, { ReadingExercise } from "./types"; import Dropdown from "@/components/Dropdown"; import useExamEditorStore from "@/stores/examEditor"; import Writing from "../../Exercises/Writing"; import Speaking from "../../Exercises/Speaking"; import { ReactElement, ReactNode, useEffect, useState } from "react"; import { DndContext, PointerSensor, useSensor, useSensors, DragEndEvent, closestCenter, UniqueIdentifier, } from '@dnd-kit/core'; import GenLoader from "../../Exercises/Shared/GenLoader"; import { ExamPart } from "@/stores/examEditor/types"; import getListeningItems from "./listening"; import getLevelQuestionItems from "./level"; import React from "react"; interface QuestionItemsResult { ids: string[]; items: ExerciseItem[]; } 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 = (): QuestionItemsResult => { let result: QuestionItemsResult = { ids: [], items: [] }; switch (currentModule) { case "reading": { const items = getReadingQuestions( (currentSection.state as ReadingPart).exercises as ReadingExercise[], sectionId ); result.items = items.filter((item): item is ExerciseItem => item !== undefined); result.ids = result.items.map(item => item.id); break; } case "listening": { const items = getListeningItems( (currentSection.state as ListeningPart).exercises as Exercise[], sectionId ); result.items = items.filter((item): item is ExerciseItem => item !== undefined); result.ids = result.items.map(item => item.id); break; } case "level": { const items = getLevelQuestionItems( (currentSection.state as LevelPart).exercises as Exercise[], sectionId ); result.items = items.filter((item): item is ExerciseItem => item !== undefined); result.ids = result.items.map(item => item.id); break; } } return result; }; const background = (component: ReactNode) => { return (