'use client' import { type AnyNode, type AnyNodeId, type WallNode, useScene } from '@pascal-app/core' import { useViewer } from '@pascal-app/viewer' import { useCallback } from 'react' import { PanelWrapper } from './panel-wrapper' import { PanelSection } from '../controls/panel-section' import { SliderControl } from '../controls/slider-control' export function WallPanel() { const selectedIds = useViewer((s) => s.selection.selectedIds) const setSelection = useViewer((s) => s.setSelection) const nodes = useScene((s) => s.nodes) const updateNode = useScene((s) => s.updateNode) const selectedId = selectedIds[0] const node = selectedId ? (nodes[selectedId as AnyNode['id']] as WallNode | undefined) : undefined const handleUpdate = useCallback( (updates: Partial) => { if (!selectedId) return updateNode(selectedId as AnyNode['id'], updates) useScene.getState().dirtyNodes.add(selectedId as AnyNodeId) }, [selectedId, updateNode], ) const handleClose = useCallback(() => { setSelection({ selectedIds: [] }) }, [setSelection]) if (!node || node.type !== 'wall' || selectedIds.length !== 1) return null const dx = node.end[0] - node.start[0] const dz = node.end[1] - node.start[1] const length = Math.sqrt(dx * dx + dz * dz) const height = node.height ?? 2.5 const thickness = node.thickness ?? 0.1 return ( handleUpdate({ height: Math.max(0.1, v) })} min={0.1} max={6} precision={2} step={0.1} unit="m" /> handleUpdate({ thickness: Math.max(0.05, v) })} min={0.05} max={1} precision={3} step={0.01} unit="m" />
Length {length.toFixed(2)} m
) }