From 63cf407cac7641d1bb54da89ce9fea47befb3569 Mon Sep 17 00:00:00 2001 From: wass08 Date: Tue, 24 Feb 2026 16:13:37 +0900 Subject: [PATCH] persist viewer preferences --- packages/viewer/src/store/use-viewer.ts | 111 ++++++++++++++---------- 1 file changed, 63 insertions(+), 48 deletions(-) diff --git a/packages/viewer/src/store/use-viewer.ts b/packages/viewer/src/store/use-viewer.ts index d87dc117..49feaeb0 100644 --- a/packages/viewer/src/store/use-viewer.ts +++ b/packages/viewer/src/store/use-viewer.ts @@ -10,6 +10,7 @@ import type { import type { Object3D } from "three"; import { create } from "zustand"; +import { persist } from "zustand/middleware"; type SelectionPath = { buildingId: BuildingNode["id"] | null; @@ -57,62 +58,76 @@ type ViewerState = { setCameraDragging: (dragging: boolean) => void } -const useViewer = create()((set, get) => ({ - selection: { buildingId: null, levelId: null, zoneId: null, selectedIds: [] }, - hoveredId: null, - setHoveredId: (id) => set({ hoveredId: id }), +const useViewer = create()( + persist( + (set) => ({ + selection: { buildingId: null, levelId: null, zoneId: null, selectedIds: [] }, + hoveredId: null, + setHoveredId: (id) => set({ hoveredId: id }), - cameraMode: "perspective", - setCameraMode: (mode) => set({ cameraMode: mode }), + cameraMode: "perspective", + setCameraMode: (mode) => set({ cameraMode: mode }), - levelMode: "stacked", - setLevelMode: (mode) => set({ levelMode: mode }), + levelMode: "stacked", + setLevelMode: (mode) => set({ levelMode: mode }), - wallMode: 'cutaway', - setWallMode: (mode) => set({ wallMode: mode }), + wallMode: 'cutaway', + setWallMode: (mode) => set({ wallMode: mode }), - showScans: true, - setShowScans: (show) => set({ showScans: show }), + showScans: true, + setShowScans: (show) => set({ showScans: show }), - showGuides: true, - setShowGuides: (show) => set({ showGuides: show }), + showGuides: true, + setShowGuides: (show) => set({ showGuides: show }), - setSelection: (updates) => - set((state) => { - const newSelection = { ...state.selection, ...updates }; + setSelection: (updates) => + set((state) => { + const newSelection = { ...state.selection, ...updates }; - // Hierarchy Guard: If we change a high-level parent, reset the children - if (updates.buildingId !== undefined) { - newSelection.levelId = null; - newSelection.zoneId = null; - newSelection.selectedIds = []; - } else if (updates.levelId !== undefined) { - newSelection.zoneId = null; - newSelection.selectedIds = []; - } else if (updates.zoneId !== undefined) { - newSelection.selectedIds = []; - } + // Hierarchy Guard: If we change a high-level parent, reset the children + if (updates.buildingId !== undefined) { + newSelection.levelId = null; + newSelection.zoneId = null; + newSelection.selectedIds = []; + } else if (updates.levelId !== undefined) { + newSelection.zoneId = null; + newSelection.selectedIds = []; + } else if (updates.zoneId !== undefined) { + newSelection.selectedIds = []; + } - return { selection: newSelection }; + return { selection: newSelection }; + }), + + resetSelection: () => + set({ + selection: { + buildingId: null, + levelId: null, + zoneId: null, + selectedIds: [], + }, + }), + + outliner: { selectedObjects: [], hoveredObjects: [] }, + + exportScene: null, + setExportScene: (fn) => set({ exportScene: fn }), + + cameraDragging: false, + setCameraDragging: (dragging) => set({ cameraDragging: dragging }), }), - - resetSelection: () => - set({ - selection: { - buildingId: null, - levelId: null, - zoneId: null, - selectedIds: [], - }, - }), - - outliner: { selectedObjects: [], hoveredObjects: [] }, - - exportScene: null, - setExportScene: (fn) => set({ exportScene: fn }), - - cameraDragging: false, - setCameraDragging: (dragging) => set({ cameraDragging: dragging }), -})); + { + name: 'viewer-preferences', + partialize: (state) => ({ + cameraMode: state.cameraMode, + levelMode: state.levelMode, + wallMode: state.wallMode, + showScans: state.showScans, + showGuides: state.showGuides, + }), + }, + ), +); export default useViewer;