diff --git a/src/pages/TestListPage.tsx b/src/pages/TestListPage.tsx index 6e4a1121..65564661 100644 --- a/src/pages/TestListPage.tsx +++ b/src/pages/TestListPage.tsx @@ -19,7 +19,7 @@ import { import { DragDropContext, Droppable, Draggable, type DropResult } from '@hello-pangea/dnd'; import { useTranslation } from 'react-i18next'; import Topbar from '../components/Layout/Topbar'; -import { useAssessment, useAuthoring, useClasses, useSettings, useStudents } from '../context/AppContext'; +import { useStoreActions, useStoreSelector } from '../context/useStore'; import { useToast } from '../hooks/useToast'; import { logAuditEvent } from '../services/database/AuditLogger'; import { nanoid } from '../utils/nanoid'; @@ -40,12 +40,25 @@ import { calcClassAveragePercentage } from '../utils/testCalc'; export default function TestListPage() { const { t } = useTranslation(); const navigate = useNavigate(); - const { students } = useStudents(); - const { classes } = useClasses(); - - const { exportTemplates } = useAuthoring(); - const { tests, addTest, updateTest, deleteTest, studentTests, saveStudentTest } = useAssessment(); - const { settings } = useSettings(); + const { + students: allStudents, + classes, + exportTemplates, + tests, + studentTests, + settings, + } = useStoreSelector((s) => ({ + students: s.students, + classes: s.classes, + exportTemplates: s.exportTemplates, + tests: s.tests, + studentTests: s.studentTests, + settings: s.settings, + })); + // The roster domain hooks filtered soft-deleted rows; archived students must not + // appear in cohort filters or per-student statistics. + const students = React.useMemo(() => allStudents.filter((s) => !s.archivedAt), [allStudents]); + const { addTest, updateTest, deleteTest, saveStudentTest } = useStoreActions(); const activeStyleTemplate = exportTemplates.find((t) => t.kind === 'style' && t.id === settings.styleTemplateId); const [cohortFilter, setCohortFilter] = useState(ALL_COHORTS); diff --git a/src/pages/__tests__/TestListPage.test.tsx b/src/pages/__tests__/TestListPage.test.tsx index 40c117f6..1800cdb4 100644 --- a/src/pages/__tests__/TestListPage.test.tsx +++ b/src/pages/__tests__/TestListPage.test.tsx @@ -4,6 +4,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { MemoryRouter } from 'react-router-dom'; import { DEFAULT_FORMAT } from '../../types'; import type { AppSettings, Class, GradeScale, Student, Test as RmTest, StudentTest } from '../../types'; +import type { StoreData } from '../../store/storage'; const mockSettings: AppSettings = { defaultGradeScaleId: 'gs1', @@ -92,6 +93,11 @@ vi.mock('../../context/AppContext', () => ({ usePlatform: () => mockUseApp, })); +vi.mock('../../context/useStore', () => ({ + useStoreSelector: (selector: (state: StoreData) => T): T => selector(mockUseApp as unknown as StoreData), + useStoreActions: () => mockUseApp, +})); + vi.mock('react-i18next', () => ({ useTranslation: () => ({ t: (key: string, params?: Record) => {