feat(state): nav panel store and expanded prefs

This commit is contained in:
ginnoir
2026-06-11 21:10:07 -05:00
parent 73d836fe96
commit 9b2793b264
4 changed files with 90 additions and 2 deletions
+20
View File
@@ -16,6 +16,8 @@ export interface StoryLogEntry {
choiceLabel?: string;
}
export type ActivePanel = 'play' | 'story' | 'settings' | 'about';
export interface GameStoreState extends GameView {
log: string[];
storyPanelOpen: boolean;
@@ -23,6 +25,8 @@ export interface GameStoreState extends GameView {
storyLog: StoryLogEntry[];
prefs: GamePrefs;
settingsOpen: boolean;
activePanel: ActivePanel;
selectedStoryNodeId: string | null;
setView: (view: GameView) => void;
appendLog: (line: string) => void;
appendStoryLog: (entry: StoryLogEntry) => void;
@@ -30,6 +34,9 @@ export interface GameStoreState extends GameView {
setStoryHasUnread: (unread: boolean) => void;
setPrefs: (partial: Partial<GamePrefs>) => void;
setSettingsOpen: (open: boolean) => void;
setActivePanel: (panel: ActivePanel) => void;
setSelectedStoryNodeId: (id: string | null) => void;
toggleActionGroupCollapsed: (groupKey: string) => void;
}
export const useGameStore = create<GameStoreState>((set) => ({
@@ -48,6 +55,8 @@ export const useGameStore = create<GameStoreState>((set) => ({
storyLog: [],
prefs: getPrefs(),
settingsOpen: false,
activePanel: 'play',
selectedStoryNodeId: null,
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] })),
@@ -58,4 +67,15 @@ export const useGameStore = create<GameStoreState>((set) => ({
set({ prefs });
},
setSettingsOpen: (open) => set({ settingsOpen: open }),
setActivePanel: (panel) => set({ activePanel: panel }),
setSelectedStoryNodeId: (id) => set({ selectedStoryNodeId: id }),
toggleActionGroupCollapsed: (groupKey) =>
set((state) => {
const nextCollapsed = {
...state.prefs.collapsedActionGroups,
[groupKey]: !state.prefs.collapsedActionGroups[groupKey],
};
const prefs = persistPrefs({ collapsedActionGroups: nextCollapsed });
return { prefs };
}),
}));