import React from 'react' import type { PresetNode } from './types.js' interface PresetAssetTreeProps { assignedNodeId?: string nodes: PresetNode[] selectedNodeId?: string onSelect: (node: PresetNode) => void } interface TreeItem { node: PresetNode children: TreeItem[] } function compareNodes(left: PresetNode, right: PresetNode) { return left.sort_order - right.sort_order || left.name.localeCompare(right.name) } function buildTree(nodes: PresetNode[]) { const byParent = new Map() for (const node of nodes) { const siblings = byParent.get(node.parent_id) ?? [] siblings.push(node) byParent.set(node.parent_id, siblings) } function build(parentId: string | null): TreeItem[] { return (byParent.get(parentId) ?? []) .sort(compareNodes) .map((node) => ({ node, children: build(node.id) })) } return build(null) } export function PresetAssetTree({ assignedNodeId, nodes, selectedNodeId, onSelect }: PresetAssetTreeProps) { const tree = React.useMemo(() => buildTree(nodes), [nodes]) if (tree.length === 0) return

This CA library has no presets.

return (
{tree.map((item) => ( ))}
) } function AssetTreeItem({ assignedNodeId, item, selectedNodeId, onSelect }: { assignedNodeId?: string item: TreeItem selectedNodeId?: string onSelect: (node: PresetNode) => void }) { const [open, setOpen] = React.useState(true) const selected = item.node.id === selectedNodeId const assigned = item.node.id === assignedNodeId return (
{open && item.children.length ? (
{item.children.map((child) => ( ))}
) : null}
) }