diff --git a/src/pages/StudentsPage.tsx b/src/pages/StudentsPage.tsx index 02a3b875..6f89a202 100644 --- a/src/pages/StudentsPage.tsx +++ b/src/pages/StudentsPage.tsx @@ -27,7 +27,7 @@ import type { EventData } from 'react-joyride'; import { DragDropContext, Droppable, Draggable, type DropResult } from '@hello-pangea/dnd'; import { getStudentsTourSteps } from '../data/TutorialSteps'; import Topbar from '../components/Layout/Topbar'; -import { useAssessment, useAuthoring, useClasses, useGrading, useSettings, useStudents } from '../context/AppContext'; +import { useStoreActions, useStoreSelector } from '../context/useStore'; import { useDbStatus } from '../hooks/useDbStatus'; import { useToast } from '../hooks/useToast'; import Papa from 'papaparse'; @@ -277,13 +277,45 @@ const derivedByStudentCache = new Map ({ + students: s.students, + classes: s.classes, + studentRubrics: s.studentRubrics, + rubrics: s.rubrics, + gradeScales: s.gradeScales, + selfAssessments: s.selfAssessments, + analysisResults: s.analysisResults, + tests: s.tests, + studentTests: s.studentTests, + settings: s.settings, + })); + // The roster domain hooks filtered soft-deleted rows; keep that behavior here. + // (DELETE_STUDENT soft-deletes via archivedAt — without this filter the student + // row would remain visible after deletion.) + const students = useMemo(() => allStudents.filter((s) => !s.archivedAt), [allStudents]); + const studentRubrics = useMemo(() => allStudentRubrics.filter((sr) => !sr.deletedAt), [allStudentRubrics]); + const { + addStudent, + updateStudent, + deleteStudent, + setStudentPassword, + addClass, + updateClass, + deleteClass, + mergeClasses, + updateSettings, + } = useStoreActions(); const dbStatus = useDbStatus(); const { showToast } = useToast(); diff --git a/src/pages/__tests__/StudentsPage.test.tsx b/src/pages/__tests__/StudentsPage.test.tsx index 2a935347..e4a089f0 100644 --- a/src/pages/__tests__/StudentsPage.test.tsx +++ b/src/pages/__tests__/StudentsPage.test.tsx @@ -126,6 +126,11 @@ vi.mock('../../context/AppContext', () => ({ usePlatform: () => mockAppValue, })); +vi.mock('../../context/useStore', () => ({ + useStoreSelector: (selector: (state: any) => any) => selector(mockAppValue), + useStoreActions: () => mockAppValue, +})); + vi.mock('../../utils/cefrStudentAggregator', () => ({ getCefrStudentOverview: vi.fn( () =>