import { memo, useCallback, } from 'react' import { Plus, } from '@phosphor-icons/react' import { Button } from '@/components/ui/button' import type { FolderNode, SidebarSelection } from '../types' import { FolderContextMenu } from './folder-tree/FolderContextMenu' import { FolderNameInput } from './folder-tree/FolderNameInput' import { FolderTreeRow } from './folder-tree/FolderTreeRow' import { useFolderContextMenu } from './folder-tree/useFolderContextMenu' import { useFolderTreeDisclosure } from './folder-tree/useFolderTreeDisclosure' import { SidebarGroupHeader } from './sidebar/SidebarGroupHeader' interface FolderTreeProps { folders: FolderNode[] selection: SidebarSelection onSelect: (selection: SidebarSelection) => void onCreateFolder?: (name: string) => Promise | boolean onRenameFolder?: (folderPath: string, nextName: string) => Promise | boolean onDeleteFolder?: (folderPath: string) => void renamingFolderPath?: string | null onStartRenameFolder?: (folderPath: string) => void onCancelRenameFolder?: () => void collapsed?: boolean onToggle?: () => void } export const FolderTree = memo(function FolderTree({ folders, selection, onSelect, onCreateFolder, onRenameFolder, onDeleteFolder, renamingFolderPath, onStartRenameFolder, onCancelRenameFolder, collapsed: externalCollapsed, onToggle, }: FolderTreeProps) { const { closeCreateForm, expanded, handleToggleSection, isCreating, openCreateForm, sectionCollapsed, toggleFolder, } = useFolderTreeDisclosure({ collapsed: externalCollapsed, onToggle, renamingFolderPath, selection, }) const { closeContextMenu, contextMenu, handleDeleteFromMenu, handleOpenMenu, handleRenameFromMenu, menuRef, } = useFolderContextMenu({ onDeleteFolder, onStartRenameFolder, }) const handleCreateFolderSubmit = useCallback(async (value: string) => { const nextName = value.trim() if (!nextName || !onCreateFolder) { closeCreateForm() return true } const created = await onCreateFolder(nextName) if (created) closeCreateForm() return created }, [closeCreateForm, onCreateFolder]) if (folders.length === 0 && !isCreating) return null return (
{onCreateFolder && ( )} {!sectionCollapsed && (
{folders.map((node) => ( ))} {isCreating && (
)}
)}
) })