feat(targeted): add targeted practice functionality

feat(analytics); add analytics page
This commit is contained in:
shafin-r
2026-02-05 15:07:24 +06:00
parent 2ac88835f9
commit 903653a212
20 changed files with 2018 additions and 35 deletions

View File

@ -0,0 +1,79 @@
// stores/useExamConfigStore.ts
import { create } from "zustand";
import { persist } from "zustand/middleware";
import type { StartExamPayload, ExamMode } from "../types/test";
interface ExamConfigState {
payload: StartExamPayload | null;
setSheetId: (id: string) => void;
storeTopics: (ids: string[]) => void;
setDifficulty: (difficulty: StartExamPayload["difficulty"]) => void;
setQuestionCount: (count: number) => void;
storeDuration: (minutes: number) => void;
setMode: (mode: ExamMode) => void;
clearPayload: () => void;
}
export const useExamConfigStore = create<ExamConfigState>()(
persist(
(set, get) => ({
payload: null,
setSheetId: (sheet_id) =>
set({
payload: {
...(get().payload ?? {}),
sheet_id,
} as StartExamPayload,
}),
storeTopics: (topic_ids) =>
set({
payload: {
...(get().payload ?? {}),
topic_ids,
} as StartExamPayload,
}),
setDifficulty: (difficulty) =>
set({
payload: {
...(get().payload ?? {}),
difficulty,
} as StartExamPayload,
}),
setQuestionCount: (question_count) =>
set({
payload: {
...(get().payload ?? {}),
question_count,
} as StartExamPayload,
}),
storeDuration: (time_limit_minutes) =>
set({
payload: {
...(get().payload ?? {}),
time_limit_minutes,
} as StartExamPayload,
}),
setMode: (mode) =>
set({
payload: {
...(get().payload ?? {}),
mode,
} as StartExamPayload,
}),
clearPayload: () => set({ payload: null }),
}),
{
name: "exam-config-storage",
},
),
);