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' import { translate, type AppLocale } from '../lib/i18n' import type { FolderFileActions } from '../hooks/useFileActions' 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 folderFileActions?: FolderFileActions renamingFolderPath?: string | null onStartRenameFolder?: (folderPath: string) => void onCancelRenameFolder?: () => void collapsed?: boolean locale?: AppLocale onToggle?: () => void } export const FolderTree = memo(function FolderTree({ folders, selection, onSelect, onCreateFolder, onRenameFolder, onDeleteFolder, folderFileActions, renamingFolderPath, onStartRenameFolder, onCancelRenameFolder, collapsed: externalCollapsed, locale = 'en', onToggle, }: FolderTreeProps) { const { closeCreateForm, expanded, handleToggleSection, isCreating, openCreateForm, sectionCollapsed, toggleFolder, } = useFolderTreeDisclosure({ collapsed: externalCollapsed, onToggle, renamingFolderPath, selection, }) const { closeContextMenu, contextMenu, handleCopyPathFromMenu, handleDeleteFromMenu, handleOpenMenu, handleRevealFromMenu, handleRenameFromMenu, menuRef, } = useFolderContextMenu({ onDeleteFolder, folderFileActions, 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]) const handleCreateFolderClick = useCallback(() => { closeContextMenu() openCreateForm() }, [closeContextMenu, openCreateForm]) if (folders.length === 0 && !isCreating) return null return (
{onCreateFolder && ( )} {!sectionCollapsed && (
{folders.map((node) => ( ))} {isCreating && (
)}
)}
) }) function CreateFolderButton({ locale, onCreate, }: { locale: AppLocale onCreate: () => void }) { return ( ) }