0f6860f1ae
- new src/hooks/ui/useIsMobile.ts (matchMedia + useSyncExternalStore) replacing the resize-handler hook inlined inside pages/site/page.tsx - new src/hooks/ui/usePrefersReducedMotion.ts - new src/data/site/dialogueIds.ts so site and intro components stop carrying hard-coded narrator IDs - siteConfig: add SITE_BACKGROUND_STYLE shared by SiteLayout and SiteMobileBlocker, rename forcedName to presetPlayerName, fix the swapped id/label pairing on situation cards - useSiteStore: rename selectedExperience/Situation to *Index so the stored value (an array index) is obvious in callers - audioConfig: drop dead AUDIO_PATHS placeholders - propagate the renames and SITE_BACKGROUND_STYLE through SiteLayout, SiteWelcomeScreen, SiteSituationScreen and pages/site/page.tsx
33 lines
916 B
TypeScript
33 lines
916 B
TypeScript
import { create } from "zustand";
|
|
import type { SiteStep } from "@/types/game";
|
|
|
|
interface SiteState {
|
|
currentStep: SiteStep;
|
|
selectedExperienceIndex: number | null;
|
|
selectedSituationIndex: number | null;
|
|
}
|
|
|
|
interface SiteActions {
|
|
setStep: (step: SiteStep) => void;
|
|
setSelectedExperienceIndex: (index: number) => void;
|
|
setSelectedSituationIndex: (index: number) => void;
|
|
reset: () => void;
|
|
}
|
|
|
|
type SiteStore = SiteState & SiteActions;
|
|
|
|
const initialState: SiteState = {
|
|
currentStep: "disclaimer",
|
|
selectedExperienceIndex: null,
|
|
selectedSituationIndex: null,
|
|
};
|
|
|
|
export const useSiteStore = create<SiteStore>()((set) => ({
|
|
...initialState,
|
|
setStep: (step) => set({ currentStep: step }),
|
|
setSelectedExperienceIndex: (index) =>
|
|
set({ selectedExperienceIndex: index }),
|
|
setSelectedSituationIndex: (index) => set({ selectedSituationIndex: index }),
|
|
reset: () => set(initialState),
|
|
}));
|