diff --git a/src/state/store.ts b/src/state/store.ts index 03015db..9e8547c 100644 --- a/src/state/store.ts +++ b/src/state/store.ts @@ -1,4 +1,5 @@ import { create } from 'zustand'; +import { getPrefs, setPrefs as persistPrefs, type GamePrefs } from './prefs'; import type { GameView } from './viewModel'; /** @@ -9,10 +10,26 @@ import type { GameView } from './viewModel'; const MAX_LOG_LINES = 50; +export interface StoryLogEntry { + nodeId: string; + prose: string; + choiceLabel?: string; +} + export interface GameStoreState extends GameView { log: string[]; + storyPanelOpen: boolean; + storyHasUnread: boolean; + storyLog: StoryLogEntry[]; + prefs: GamePrefs; + settingsOpen: boolean; setView: (view: GameView) => void; appendLog: (line: string) => void; + appendStoryLog: (entry: StoryLogEntry) => void; + setStoryPanelOpen: (open: boolean) => void; + setStoryHasUnread: (unread: boolean) => void; + setPrefs: (partial: Partial) => void; + setSettingsOpen: (open: boolean) => void; } export const useGameStore = create((set) => ({ @@ -25,6 +42,19 @@ export const useGameStore = create((set) => ({ actions: [], story: { currentProse: null, choices: [] }, log: [], - setView: (view) => set(view), + storyPanelOpen: false, + storyHasUnread: false, + storyLog: [], + prefs: getPrefs(), + settingsOpen: false, + setView: (view) => set((state) => ({ ...state, ...view })), appendLog: (line) => set((state) => ({ log: [...state.log, line].slice(-MAX_LOG_LINES) })), + appendStoryLog: (entry) => set((state) => ({ storyLog: [...state.storyLog, entry] })), + setStoryPanelOpen: (open) => set({ storyPanelOpen: open }), + setStoryHasUnread: (unread) => set({ storyHasUnread: unread }), + setPrefs: (partial) => { + const prefs = persistPrefs(partial); + set({ prefs }); + }, + setSettingsOpen: (open) => set({ settingsOpen: open }), }));