import { useState, useCallback, memo } from 'react' import { Folder, FolderOpen, CaretDown, CaretRight, Plus } from '@phosphor-icons/react' import type { FolderNode, SidebarSelection } from '../types' import { cn } from '@/lib/utils' interface FolderTreeProps { folders: FolderNode[] selection: SidebarSelection onSelect: (selection: SidebarSelection) => void } function FolderItem({ node, depth, selection, expanded, onToggle, onSelect, }: { node: FolderNode depth: number selection: SidebarSelection expanded: Record onToggle: (path: string) => void onSelect: (selection: SidebarSelection) => void }) { const isSelected = selection.kind === 'folder' && selection.path === node.path const isExpanded = expanded[node.path] ?? false const hasChildren = node.children.length > 0 const handleClick = () => { onSelect({ kind: 'folder', path: node.path }) if (hasChildren) onToggle(node.path) } return ( <> {isExpanded && hasChildren && (
{node.children.map((child) => ( ))}
)} ) } export const FolderTree = memo(function FolderTree({ folders, selection, onSelect }: FolderTreeProps) { const [sectionCollapsed, setSectionCollapsed] = useState(false) const [expanded, setExpanded] = useState>({}) const toggleFolder = useCallback((path: string) => { setExpanded((prev) => ({ ...prev, [path]: !prev[path] })) }, []) if (folders.length === 0) return null return (
{/* Header */} {/* Tree */} {!sectionCollapsed && (
{folders.map((node) => ( ))}
)}
) })