import EXERCISES from "./exercises"; import clsx from "clsx"; import { ExerciseGen, GeneratedExercises, GeneratorState } from "./generatedExercises"; import Modal from "@/components/Modal"; import { useState } from "react"; import ExerciseWizard, { ExerciseConfig } from "./ExerciseWizard"; import { generate } from "../../SettingsEditor/Shared/Generate"; import { Module } from "@/interfaces"; import useExamEditorStore from "@/stores/examEditor"; import { ListeningPart, Message, ReadingPart } from "@/interfaces/exam"; import { BsArrowRepeat } from "react-icons/bs"; interface ExercisePickerProps { module: string; sectionId: number; difficulty: string; extraArgs?: Record; } const ExercisePicker: React.FC = ({ module, sectionId, extraArgs = undefined, }) => { const { currentModule, dispatch } = useExamEditorStore(); const { difficulty} = useExamEditorStore((store) => store.modules[currentModule]); const section = useExamEditorStore((store) => store.modules[currentModule].sections.find((s) => s.sectionId == sectionId)!); const { state, selectedExercises } = section; const [pickerOpen, setPickerOpen] = useState(false); const getFullExerciseType = (exercise: ExerciseGen): string => { if (exercise.extra && exercise.extra.length > 0) { const extraValue = exercise.extra.find(e => e.param === 'name')?.value; return extraValue ? `${exercise.type}/?name=${extraValue}` : exercise.type; } return exercise.type; }; const handleChange = (exercise: ExerciseGen) => { const fullType = getFullExerciseType(exercise); const newSelected = selectedExercises.includes(fullType) ? selectedExercises.filter(type => type !== fullType) : [...selectedExercises, fullType]; dispatch({ type: "UPDATE_SECTION_SINGLE_FIELD", payload: { module: currentModule, sectionId, field: "selectedExercises", value: newSelected } }) }; const moduleExercises = module === 'level' ? EXERCISES : (sectionId ? EXERCISES.filter((ex) => ex.module === module && ex.sectionId == sectionId) : EXERCISES.filter((ex) => ex.module === module)); const onModuleSpecific = (configurations: ExerciseConfig[]) => { const exercises = configurations.map(config => { const exerciseType = config.type.split('name=')[1]; return { type: exerciseType, quantity: Number(config.params.quantity || 1), ...(config.params.num_random_words !== undefined && { num_random_words: Number(config.params.num_random_words) }), ...(config.params.max_words !== undefined && { max_words: Number(config.params.max_words) }) }; }); let context, moduleState; switch (module) { case 'reading': moduleState = state as ReadingPart; context = { text: moduleState.text.content } break; case 'listening': moduleState = state as ListeningPart; let script = moduleState.script; let text, dialog; switch (sectionId) { case 1: case 3: dialog = script as Message[]; text = dialog.map((d) => `${d.name}: ${d.text}`).join("\n"); context = { text: text } break; case 2: case 4: text = script as string; context = { text: text } break; } break; default: context = {} } generate( sectionId, module as Module, "exercises", { method: 'POST', body: { ...context, exercises: exercises, difficulty: difficulty } }, (data: any) => [{ exercises: data.exercises }] ); dispatch({ type: "UPDATE_SECTION_SINGLE_FIELD", payload: { sectionId, module: currentModule, field: "selectedExercises", value: [] } }) setPickerOpen(false); }; return ( <> setPickerOpen(false)} title="Exercise Wizard"> setPickerOpen(false)} extraArgs={extraArgs} />
{moduleExercises.map((exercise) => { const fullType = getFullExerciseType(exercise); return ( ); })}
); }; export default ExercisePicker;