import { type AnyNodeId, type GuideNode, GuideNode as GuideNodeSchema, type LevelNode, type ScanNode, ScanNode as ScanNodeSchema, saveAsset, useScene, } from '@pascal-app/core' import { Box, Image, Pencil, Plus, Trash2 } from 'lucide-react' import { useCallback, useRef } from 'react' import useEditor from '@/store/use-editor' import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/primitives/dialog' import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/primitives/popover' interface ReferencesDialogProps { levelId: string open: boolean onOpenChange: (open: boolean) => void } export function ReferencesDialog({ levelId, open, onOpenChange }: ReferencesDialogProps) { const nodes = useScene((s) => s.nodes) const createNode = useScene((s) => s.createNode) const deleteNode = useScene((s) => s.deleteNode) const setSelectedReferenceId = useEditor((s) => s.setSelectedReferenceId) const scanInputRef = useRef(null) const guideInputRef = useRef(null) const level = nodes[levelId as AnyNodeId] as LevelNode | undefined if (!level) return null // Find all scan and guide children of this level const references = Object.values(nodes).filter( (node): node is ScanNode | GuideNode => (node.type === 'scan' || node.type === 'guide') && node.parentId === levelId, ) const handleAddScan = useCallback( async (e: React.ChangeEvent) => { const file = e.target.files?.[0] if (!file) return const url = await saveAsset(file) const node = ScanNodeSchema.parse({ url, name: file.name, parentId: levelId, }) createNode(node, levelId as AnyNodeId) e.target.value = '' // Auto-select and close dialog setSelectedReferenceId(node.id) onOpenChange(false) }, [levelId, createNode, setSelectedReferenceId, onOpenChange], ) const handleAddGuide = useCallback( async (e: React.ChangeEvent) => { const file = e.target.files?.[0] if (!file) return const url = await saveAsset(file) const node = GuideNodeSchema.parse({ url, name: file.name, parentId: levelId, }) createNode(node, levelId as AnyNodeId) e.target.value = '' // Auto-select and close dialog setSelectedReferenceId(node.id) onOpenChange(false) }, [levelId, createNode, setSelectedReferenceId, onOpenChange], ) const handleEdit = useCallback( (nodeId: string) => { setSelectedReferenceId(nodeId) onOpenChange(false) }, [setSelectedReferenceId, onOpenChange], ) const handleDelete = useCallback( (nodeId: string) => { deleteNode(nodeId as AnyNodeId) }, [deleteNode], ) return ( References — {level.name || `Level ${level.level}`}
{references.length === 0 && (

No references yet. Add a 3D scan or guide image.

)} {references.map((ref) => (
{ref.type === 'scan' ? ( ) : ( )} {ref.name || (ref.type === 'scan' ? '3D Scan' : 'Guide Image')}
))}
) }