biome
This commit is contained in:
@@ -1,111 +1,106 @@
|
||||
"use client";
|
||||
'use client'
|
||||
|
||||
import {
|
||||
AssetInput,
|
||||
BuildingNode,
|
||||
LevelNode,
|
||||
useScene,
|
||||
} from "@pascal-app/core";
|
||||
import { useViewer } from "@pascal-app/viewer";
|
||||
import { create } from "zustand";
|
||||
import { Asset } from "../../../packages/core/src/schema/nodes/item";
|
||||
import { type BuildingNode, type LevelNode, useScene } from '@pascal-app/core'
|
||||
import { useViewer } from '@pascal-app/viewer'
|
||||
import { create } from 'zustand'
|
||||
import type { Asset } from '../../../packages/core/src/schema/nodes/item'
|
||||
|
||||
export type Phase = "site" | "structure" | "furnish";
|
||||
export type Phase = 'site' | 'structure' | 'furnish'
|
||||
|
||||
export type Mode = "select" | "edit" | "delete" | "build";
|
||||
export type Mode = 'select' | 'edit' | 'delete' | 'build'
|
||||
|
||||
// Structure mode tools (building elements)
|
||||
export type StructureTool =
|
||||
| "wall"
|
||||
| "room"
|
||||
| "custom-room"
|
||||
| "slab"
|
||||
| "ceiling"
|
||||
| "roof"
|
||||
| "column"
|
||||
| "stair"
|
||||
| "item"
|
||||
| "zone";
|
||||
| 'wall'
|
||||
| 'room'
|
||||
| 'custom-room'
|
||||
| 'slab'
|
||||
| 'ceiling'
|
||||
| 'roof'
|
||||
| 'column'
|
||||
| 'stair'
|
||||
| 'item'
|
||||
| 'zone'
|
||||
|
||||
// Furnish mode tools (items and decoration)
|
||||
export type FurnishTool = "item";
|
||||
export type FurnishTool = 'item'
|
||||
|
||||
// Site mode tools
|
||||
export type SiteTool = "property-line";
|
||||
export type SiteTool = 'property-line'
|
||||
|
||||
// Catalog categories for furnish mode items
|
||||
export type CatalogCategory =
|
||||
| "furniture"
|
||||
| "appliance"
|
||||
| "bathroom"
|
||||
| "kitchen"
|
||||
| "outdoor"
|
||||
| "window"
|
||||
| "door";
|
||||
| 'furniture'
|
||||
| 'appliance'
|
||||
| 'bathroom'
|
||||
| 'kitchen'
|
||||
| 'outdoor'
|
||||
| 'window'
|
||||
| 'door'
|
||||
|
||||
// Combined tool type
|
||||
export type Tool = SiteTool | StructureTool | FurnishTool;
|
||||
export type Tool = SiteTool | StructureTool | FurnishTool
|
||||
|
||||
type EditorState = {
|
||||
phase: Phase;
|
||||
setPhase: (phase: Phase) => void;
|
||||
mode: Mode;
|
||||
setMode: (mode: Mode) => void;
|
||||
tool: Tool | null;
|
||||
setTool: (tool: Tool | null) => void;
|
||||
catalogCategory: CatalogCategory | null;
|
||||
setCatalogCategory: (category: CatalogCategory | null) => void;
|
||||
selectedItem: Asset | null;
|
||||
setSelectedItem: (item: Asset) => void;
|
||||
};
|
||||
phase: Phase
|
||||
setPhase: (phase: Phase) => void
|
||||
mode: Mode
|
||||
setMode: (mode: Mode) => void
|
||||
tool: Tool | null
|
||||
setTool: (tool: Tool | null) => void
|
||||
catalogCategory: CatalogCategory | null
|
||||
setCatalogCategory: (category: CatalogCategory | null) => void
|
||||
selectedItem: Asset | null
|
||||
setSelectedItem: (item: Asset) => void
|
||||
}
|
||||
|
||||
const useEditor = create<EditorState>()((set, get) => ({
|
||||
phase: "site",
|
||||
phase: 'site',
|
||||
setPhase: (phase) => {
|
||||
const currentPhase = get().phase;
|
||||
if (currentPhase === phase) return;
|
||||
const currentPhase = get().phase
|
||||
if (currentPhase === phase) return
|
||||
|
||||
set({ phase });
|
||||
set({ phase })
|
||||
|
||||
const viewer = useViewer.getState();
|
||||
const scene = useScene.getState();
|
||||
const viewer = useViewer.getState()
|
||||
const scene = useScene.getState()
|
||||
|
||||
switch (phase) {
|
||||
case "site":
|
||||
case 'site':
|
||||
// In Site mode, we zoom out and deselect specific levels/buildings
|
||||
viewer.resetSelection();
|
||||
viewer.setLevelMode("stacked");
|
||||
break;
|
||||
viewer.resetSelection()
|
||||
viewer.setLevelMode('stacked')
|
||||
break
|
||||
|
||||
case "structure":
|
||||
case 'structure':
|
||||
// In Structure mode, we often want to focus on a specific building/level
|
||||
// Auto-select the first building if none is selected
|
||||
if (!viewer.selection.buildingId) {
|
||||
const firstBuildingId = scene.rootNodeIds.find((id) => {
|
||||
const node = scene.nodes[id];
|
||||
return node?.type === "building" || null;
|
||||
});
|
||||
const node = scene.nodes[id]
|
||||
return node?.type === 'building' || null
|
||||
})
|
||||
if (firstBuildingId) {
|
||||
viewer.setSelection({
|
||||
buildingId: firstBuildingId as BuildingNode["id"],
|
||||
});
|
||||
const buildingNode = scene.nodes[firstBuildingId] as BuildingNode;
|
||||
const firstLevelId = buildingNode.children[0];
|
||||
buildingId: firstBuildingId as BuildingNode['id'],
|
||||
})
|
||||
const buildingNode = scene.nodes[firstBuildingId] as BuildingNode
|
||||
const firstLevelId = buildingNode.children[0]
|
||||
if (firstLevelId) {
|
||||
viewer.setSelection({ levelId: firstLevelId as LevelNode["id"] });
|
||||
viewer.setSelection({ levelId: firstLevelId as LevelNode['id'] })
|
||||
}
|
||||
}
|
||||
}
|
||||
viewer.setLevelMode("stacked"); // Better for structure editing
|
||||
break;
|
||||
viewer.setLevelMode('stacked') // Better for structure editing
|
||||
break
|
||||
|
||||
case "furnish":
|
||||
case 'furnish':
|
||||
// Maybe in furnish mode we force "solo" level view to see inside rooms
|
||||
viewer.setLevelMode("solo");
|
||||
break;
|
||||
viewer.setLevelMode('solo')
|
||||
break
|
||||
}
|
||||
},
|
||||
mode: "select",
|
||||
mode: 'select',
|
||||
setMode: (mode) => set({ mode }),
|
||||
tool: null,
|
||||
setTool: (tool) => set({ tool }),
|
||||
@@ -113,6 +108,6 @@ const useEditor = create<EditorState>()((set, get) => ({
|
||||
setCatalogCategory: (category) => set({ catalogCategory: category }),
|
||||
selectedItem: null,
|
||||
setSelectedItem: (item) => set({ selectedItem: item }),
|
||||
}));
|
||||
}))
|
||||
|
||||
export default useEditor;
|
||||
export default useEditor
|
||||
|
||||
Reference in New Issue
Block a user