feat(state): store story panel and prefs UI state
This commit is contained in:
+31
-1
@@ -1,4 +1,5 @@
|
|||||||
import { create } from 'zustand';
|
import { create } from 'zustand';
|
||||||
|
import { getPrefs, setPrefs as persistPrefs, type GamePrefs } from './prefs';
|
||||||
import type { GameView } from './viewModel';
|
import type { GameView } from './viewModel';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -9,10 +10,26 @@ import type { GameView } from './viewModel';
|
|||||||
|
|
||||||
const MAX_LOG_LINES = 50;
|
const MAX_LOG_LINES = 50;
|
||||||
|
|
||||||
|
export interface StoryLogEntry {
|
||||||
|
nodeId: string;
|
||||||
|
prose: string;
|
||||||
|
choiceLabel?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface GameStoreState extends GameView {
|
export interface GameStoreState extends GameView {
|
||||||
log: string[];
|
log: string[];
|
||||||
|
storyPanelOpen: boolean;
|
||||||
|
storyHasUnread: boolean;
|
||||||
|
storyLog: StoryLogEntry[];
|
||||||
|
prefs: GamePrefs;
|
||||||
|
settingsOpen: boolean;
|
||||||
setView: (view: GameView) => void;
|
setView: (view: GameView) => void;
|
||||||
appendLog: (line: string) => void;
|
appendLog: (line: string) => void;
|
||||||
|
appendStoryLog: (entry: StoryLogEntry) => void;
|
||||||
|
setStoryPanelOpen: (open: boolean) => void;
|
||||||
|
setStoryHasUnread: (unread: boolean) => void;
|
||||||
|
setPrefs: (partial: Partial<GamePrefs>) => void;
|
||||||
|
setSettingsOpen: (open: boolean) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useGameStore = create<GameStoreState>((set) => ({
|
export const useGameStore = create<GameStoreState>((set) => ({
|
||||||
@@ -25,6 +42,19 @@ export const useGameStore = create<GameStoreState>((set) => ({
|
|||||||
actions: [],
|
actions: [],
|
||||||
story: { currentProse: null, choices: [] },
|
story: { currentProse: null, choices: [] },
|
||||||
log: [],
|
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) })),
|
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 }),
|
||||||
}));
|
}));
|
||||||
|
|||||||
Reference in New Issue
Block a user