Exam generation rework, batch user tables, fastapi endpoint switch
This commit is contained in:
107
src/stores/examEditor/reducers/moduleReducer.ts
Normal file
107
src/stores/examEditor/reducers/moduleReducer.ts
Normal file
@@ -0,0 +1,107 @@
|
||||
import { Module } from "@/interfaces";
|
||||
import { defaultSectionSettings } from "../defaults";
|
||||
import { reorderExercises } from "../reorder/global";
|
||||
import ExamEditorStore, { ModuleState } from "../types";
|
||||
|
||||
export type ModuleActions =
|
||||
| { type: 'UPDATE_MODULE'; payload: { updates: Partial<ModuleState>, module?: Module } }
|
||||
| { type: 'TOGGLE_SECTION'; payload: { sectionId: number; } }
|
||||
| { type: 'RESET_FOCUS'; }
|
||||
| { type: 'REORDER_EXERCISES' };
|
||||
|
||||
export const MODULE_ACTIONS = [
|
||||
'UPDATE_MODULE',
|
||||
'TOGGLE_SECTION',
|
||||
'RESET_FOCUS',
|
||||
'REORDER_EXERCISES'
|
||||
];
|
||||
|
||||
export const moduleReducer = (
|
||||
state: ExamEditorStore,
|
||||
action: ModuleActions
|
||||
): Partial<ExamEditorStore> => {
|
||||
const currentModule = state.currentModule;
|
||||
const currentModuleState = state.modules[currentModule];
|
||||
const expandedSections = currentModuleState.expandedSections;
|
||||
|
||||
switch (action.type) {
|
||||
case 'UPDATE_MODULE':
|
||||
const { updates, module } = action.payload;
|
||||
if (module === undefined) {
|
||||
return {
|
||||
modules: {
|
||||
...state.modules,
|
||||
[currentModule]: {
|
||||
...currentModuleState,
|
||||
...updates
|
||||
}
|
||||
}
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
modules: {
|
||||
...state.modules,
|
||||
[module]: {
|
||||
...state.modules[module],
|
||||
...updates
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
case 'TOGGLE_SECTION':
|
||||
const { sectionId } = action.payload;
|
||||
|
||||
const prev = currentModuleState.sections;
|
||||
const updatedSections = prev.some(section => section.sectionId === sectionId)
|
||||
? prev.filter(section => section.sectionId !== sectionId)
|
||||
: [
|
||||
...prev,
|
||||
defaultSectionSettings(currentModule, sectionId)
|
||||
];
|
||||
|
||||
const updatedCheckedSections = expandedSections.includes(sectionId)
|
||||
? expandedSections.filter(i => i !== sectionId)
|
||||
: [...expandedSections, sectionId];
|
||||
|
||||
return {
|
||||
modules: {
|
||||
...state.modules,
|
||||
[currentModule]: {
|
||||
...currentModuleState,
|
||||
sections: updatedSections,
|
||||
expandedSections: updatedCheckedSections
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
case 'RESET_FOCUS': {
|
||||
const currentFocus = currentModuleState.focusedSection;
|
||||
const updatedSections = expandedSections?.filter(id => id != currentFocus);
|
||||
|
||||
return {
|
||||
modules: {
|
||||
...state.modules,
|
||||
[currentModule]: {
|
||||
...currentModuleState,
|
||||
expandedSections: updatedSections,
|
||||
focusedSection: updatedSections[0]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case 'REORDER_EXERCISES': {
|
||||
if (currentModule === "writing" || currentModule === "speaking") return state;
|
||||
return {
|
||||
...state,
|
||||
modules: {
|
||||
...state.modules,
|
||||
[currentModule]: reorderExercises(currentModuleState)
|
||||
}
|
||||
};
|
||||
}
|
||||
default:
|
||||
return {};
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user