diff --git a/src/App.tsx b/src/App.tsx index b9083ca..37c1ebd 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,8 +2,8 @@ import { useEffect } from "react"; import { FloorPlan } from "./components/FloorPlan"; import { HeaderBar } from "./components/HeaderBar"; import { SidePanel } from "./components/SidePanel"; -import { startRuntime } from "./sim/runtime"; -import { useOfficeStore } from "./store/office-store"; +import { setMode, startRuntime } from "./sim/runtime"; +import { loadPreferredMode, useOfficeStore } from "./store/office-store"; export default function App() { const theme = useOfficeStore((s) => s.theme); @@ -11,6 +11,7 @@ export default function App() { useEffect(() => { startRuntime(); + if (loadPreferredMode() === "live") setMode("live"); }, []); return ( diff --git a/src/store/office-store.ts b/src/store/office-store.ts index ee5075a..648fb83 100644 --- a/src/store/office-store.ts +++ b/src/store/office-store.ts @@ -71,25 +71,60 @@ interface OfficeState { let eventSeq = 0; +/* UI preferences persisted across reloads. */ +function loadPref(key: string): string | null { + try { + return localStorage.getItem(key); + } catch { + return null; + } +} + +function savePref(key: string, value: string) { + try { + localStorage.setItem(key, value); + } catch { + /* ignore */ + } +} + +const savedTheme = loadPref("office-theme"); +const savedPanel = loadPref("office-panel"); + +/** Read the preferred data source ("live" | "sim"); the runtime applies it on boot. */ +export function loadPreferredMode(): "sim" | "live" { + return loadPref("office-mode") === "live" ? "live" : "sim"; +} + export const useOfficeStore = create()((set, get) => ({ agents: new Map(), links: [], meetings: [], events: [], selectedAgentId: null, - theme: "light", + theme: savedTheme === "dark" ? "dark" : "light", paused: false, speed: 1, mode: "sim", - panelOpen: true, + panelOpen: savedPanel !== "0", clock: 0, selectAgent: (id) => set({ selectedAgentId: id }), - setTheme: (t) => set({ theme: t }), + setTheme: (t) => { + savePref("office-theme", t); + set({ theme: t }); + }, setPaused: (p) => set({ paused: p }), setSpeed: (s) => set({ speed: s }), - setMode: (m) => set({ mode: m }), - togglePanel: () => set((state) => ({ panelOpen: !state.panelOpen })), + setMode: (m) => { + savePref("office-mode", m); + set({ mode: m }); + }, + togglePanel: () => + set((state) => { + savePref("office-panel", state.panelOpen ? "0" : "1"); + return { panelOpen: !state.panelOpen }; + }), clearWorld: () => set({ agents: new Map(), links: [], meetings: [], events: [], selectedAgentId: null }),