From 5d0ab1464c56a48e4b7e1dd47cb68255b893fb14 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Sun, 18 Jan 2026 00:28:28 +0000 Subject: [PATCH] Refactor component tree builder --- src/components/ComponentTreeBuilder.tsx | 268 +++--------------- .../ComponentInspector.tsx | 105 +++++++ .../ComponentTreeToolbar.tsx | 34 +++ .../ComponentTreeView.tsx | 76 +++++ .../component-tree-builder/tree-utils.ts | 56 ++++ src/data/component-tree-builder.json | 27 ++ 6 files changed, 339 insertions(+), 227 deletions(-) create mode 100644 src/components/component-tree-builder/ComponentInspector.tsx create mode 100644 src/components/component-tree-builder/ComponentTreeToolbar.tsx create mode 100644 src/components/component-tree-builder/ComponentTreeView.tsx create mode 100644 src/components/component-tree-builder/tree-utils.ts create mode 100644 src/data/component-tree-builder.json diff --git a/src/components/ComponentTreeBuilder.tsx b/src/components/ComponentTreeBuilder.tsx index e4ede32..347da3c 100644 --- a/src/components/ComponentTreeBuilder.tsx +++ b/src/components/ComponentTreeBuilder.tsx @@ -1,43 +1,25 @@ import { useState } from 'react' import { ComponentNode } from '@/types/project' -import { Card } from '@/components/ui/card' -import { Button } from '@/components/ui/button' -import { Input } from '@/components/ui/input' -import { Label } from '@/components/ui/label' -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' -import { ScrollArea } from '@/components/ui/scroll-area' -import { Plus, Trash, Tree, CaretRight, CaretDown, Sparkle } from '@phosphor-icons/react' -import { Textarea } from '@/components/ui/textarea' import { AIService } from '@/lib/ai-service' import { toast } from 'sonner' +import componentTreeBuilderData from '@/data/component-tree-builder.json' +import { ComponentInspector } from '@/components/component-tree-builder/ComponentInspector' +import { ComponentTreeToolbar } from '@/components/component-tree-builder/ComponentTreeToolbar' +import { ComponentTreeView } from '@/components/component-tree-builder/ComponentTreeView' +import { + addChildNode, + createComponentNode, + deleteNodeFromTree, + findNodeById, + updateNodeInTree, +} from '@/components/component-tree-builder/tree-utils' interface ComponentTreeBuilderProps { components: ComponentNode[] onComponentsChange: (components: ComponentNode[]) => void } -const MUI_COMPONENTS = [ - 'Box', - 'Container', - 'Grid', - 'Stack', - 'Paper', - 'Card', - 'CardContent', - 'CardActions', - 'Button', - 'TextField', - 'Typography', - 'AppBar', - 'Toolbar', - 'List', - 'ListItem', - 'ListItemText', - 'Divider', - 'Avatar', - 'Chip', - 'IconButton', -] +const { muiComponents, prompts } = componentTreeBuilderData export function ComponentTreeBuilder({ components, @@ -46,79 +28,34 @@ export function ComponentTreeBuilder({ const [selectedNodeId, setSelectedNodeId] = useState(null) const [expandedNodes, setExpandedNodes] = useState>(new Set()) - const findNodeById = ( - nodes: ComponentNode[], - id: string - ): ComponentNode | null => { - for (const node of nodes) { - if (node.id === id) return node - const found = findNodeById(node.children, id) - if (found) return found - } - return null - } - - const selectedNode = selectedNodeId ? findNodeById(components, selectedNodeId) : null + const selectedNode = selectedNodeId + ? findNodeById(components, selectedNodeId) + : null const addRootComponent = () => { - const newNode: ComponentNode = { - id: `node-${Date.now()}`, - type: 'Box', + const newNode = createComponentNode({ name: `Component${components.length + 1}`, - props: {}, - children: [], - } + }) onComponentsChange([...components, newNode]) setSelectedNodeId(newNode.id) } const addChildComponent = (parentId: string) => { - const newNode: ComponentNode = { - id: `node-${Date.now()}`, - type: 'Box', - name: 'NewComponent', - props: {}, - children: [], - } - - const addChild = (nodes: ComponentNode[]): ComponentNode[] => { - return nodes.map((node) => { - if (node.id === parentId) { - return { ...node, children: [...node.children, newNode] } - } - return { ...node, children: addChild(node.children) } - }) - } - - onComponentsChange(addChild(components)) + const newNode = createComponentNode() + onComponentsChange(addChildNode(components, parentId, newNode)) setExpandedNodes(new Set([...expandedNodes, parentId])) setSelectedNodeId(newNode.id) } const deleteNode = (nodeId: string) => { - const deleteFromTree = (nodes: ComponentNode[]): ComponentNode[] => { - return nodes - .filter((node) => node.id !== nodeId) - .map((node) => ({ ...node, children: deleteFromTree(node.children) })) - } - - onComponentsChange(deleteFromTree(components)) + onComponentsChange(deleteNodeFromTree(components, nodeId)) if (selectedNodeId === nodeId) { setSelectedNodeId(null) } } const updateNode = (nodeId: string, updates: Partial) => { - const updateInTree = (nodes: ComponentNode[]): ComponentNode[] => { - return nodes.map((node) => { - if (node.id === nodeId) { - return { ...node, ...updates } - } - return { ...node, children: updateInTree(node.children) } - }) - } - - onComponentsChange(updateInTree(components)) + onComponentsChange(updateNodeInTree(components, nodeId, updates)) } const toggleExpand = (nodeId: string) => { @@ -132,13 +69,13 @@ export function ComponentTreeBuilder({ } const generateComponentWithAI = async () => { - const description = prompt('Describe the component you want to create:') + const description = prompt(prompts.generateComponentDescription) if (!description) return try { toast.info('Generating component with AI...') const component = await AIService.generateComponent(description) - + if (component) { onComponentsChange([...components, component]) setSelectedNodeId(component.id) @@ -153,151 +90,28 @@ export function ComponentTreeBuilder({ } } - const renderTreeNode = (node: ComponentNode, level: number = 0) => { - const isExpanded = expandedNodes.has(node.id) - const isSelected = selectedNodeId === node.id - const hasChildren = node.children.length > 0 - - return ( -
- - )} - {!hasChildren &&
} - - {node.name} - {node.type} - - {isExpanded && - node.children.map((child) => renderTreeNode(child, level + 1))} -
- ) - } - return (
-
-

- Component Tree -

-
- - -
-
- -
- {components.map((node) => renderTreeNode(node))} -
-
+ +
- - - {selectedNode ? ( -
-
-

Component Properties

- -
- -
-
- - - updateNode(selectedNode.id, { name: e.target.value }) - } - /> -
- -
- - -
- -
- -