// This store combines session state management and initial values for the home page
// It tracks whether this is a new session and manages default values for reading level, difficulty level, model choice, and question quantities
// States are default or whichever the user has saved as preferences
// It also sets the default values for content preview
import { create } from 'zustand';
import { DEFAULT_MODEL } from '@/components/UserProfile/UserPreferences/ModelChoice/ModelChoiceContent';
// Content types for preview
interface Essay {
_id: string;
title: string;
author: string;
type: 'essay';
}
interface BookChapter {
_id: string;
bookId: string;
bookTitle: string;
author: string;
chapterTitle: string;
type: 'bookChapter';
}
export type ContentItem = Essay | BookChapter;
interface NewSessionStore {
// New session state
newSession: boolean;
setNewSession: (value: boolean) => void;
// Default values
defaultReadingLevel: string;
defaultDifficultyLevel: string;
defaultModelChoice: string;
defaultQuestionQuantities: {
MCQ: number;
FRQ: number;
};
setDefaultReadingLevel: (level: string) => void;
setDefaultDifficultyLevel: (level: string) => void;
setDefaultModelChoice: (choice: string) => void;
setDefaultQuestionQuantities: (quantities: { MCQ: number; FRQ: number }) => void;
// Current values
currentReadingLevel: string;
currentDifficultyLevel: string;
currentModelChoice: string;
currentQuestionQuantities: {
MCQ: number;
FRQ: number;
};
// Content preview state
displayedContent: ContentItem[];
hasContentBeenRandomized: boolean;
setCurrentReadingLevel: (level: string) => void;
setCurrentDifficultyLevel: (level: string) => void;
setCurrentModelChoice: (choice: string) => void;
setCurrentQuestionQuantities: (quantities: { MCQ: number; FRQ: number }) => void;
// Content preview actions
setDisplayedContent: (content: ContentItem[]) => void;
setHasContentBeenRandomized: (value: boolean) => void;
resetDisplayedContent: () => void;
resetCurrentValues: () => void;
}
const initialState = {
// New session state
newSession: true,
// Default values
defaultReadingLevel: 'generalReader',
defaultDifficultyLevel: 'variety',
defaultModelChoice: DEFAULT_MODEL, // Uses the default model defined in ModelChoiceContent
defaultQuestionQuantities: {
MCQ: 6,
FRQ: 6,
},
// Current values
currentReadingLevel: 'generalReader',
currentDifficultyLevel: 'variety',
currentModelChoice: DEFAULT_MODEL,
currentQuestionQuantities: {
MCQ: 6,
FRQ: 6,
},
// Initial content preview state
displayedContent: [],
hasContentBeenRandomized: false,
};
const useNewSessionStore = create((set) => ({
...initialState,
// New session actions
setNewSession: (value: boolean) => set(() => ({ newSession: value })),
// Default value setters
setDefaultReadingLevel: (level: string) => set(() => ({ defaultReadingLevel: level })),
setDefaultDifficultyLevel: (level: string) => set(() => ({ defaultDifficultyLevel: level })),
setDefaultModelChoice: (choice: string) => set(() => ({ defaultModelChoice: choice })),
setDefaultQuestionQuantities: (quantities: { MCQ: number; FRQ: number }) =>
set(() => ({ defaultQuestionQuantities: quantities })),
// Current value setters
setCurrentReadingLevel: (level: string) => set(() => ({ currentReadingLevel: level })),
setCurrentDifficultyLevel: (level: string) => set(() => ({ currentDifficultyLevel: level })),
setCurrentModelChoice: (choice: string) => set(() => ({ currentModelChoice: choice })),
setCurrentQuestionQuantities: (quantities: { MCQ: number; FRQ: number }) =>
set(() => ({ currentQuestionQuantities: quantities })),
// Content preview actions
setDisplayedContent: (content: ContentItem[]) =>
set(() => ({ displayedContent: content })),
setHasContentBeenRandomized: (value: boolean) =>
set(() => ({ hasContentBeenRandomized: value })),
resetDisplayedContent: () =>
set(() => ({ displayedContent: [], hasContentBeenRandomized: false })),
resetCurrentValues: () => set((state) => ({
currentQuestionQuantities: state.defaultQuestionQuantities,
currentDifficultyLevel: state.defaultDifficultyLevel,
currentReadingLevel: state.defaultReadingLevel,
currentModelChoice: state.defaultModelChoice,
})),
}));
export default useNewSessionStore;