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 (
{component}
); } if (currentModule == "writing") return background(); if (currentModule == "speaking") return background(); const questions = questionItems(); const filteredIds = (questions.ids ?? []).filter(Boolean); function isValidItem(item: ExerciseItem | undefined): item is ExerciseItem { return item !== undefined && typeof item.id === 'string' && typeof item.sectionId === 'number' && React.isValidElement(item.label) && React.isValidElement(item.content); } const filteredItems = (questions.items ?? []).filter(isValidItem); 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 && (
{filteredItems.map(item => (
{item.content}
))}
) )} {generating === "exercises" && }
); } export default SectionExercises;