import React, { useCallback, useMemo } from 'react'; import { ChevronIcon, TrashIcon, EditIcon, FolderIcon } from '../ui/icons'; import { getTagColorStyle } from '../utils/colors'; const FolderNode = ({ node, depth, isSelected, onToggle, onSelect, onDrop, onDragOver, onDragLeave, onDelete, onRename, renderChildren, onFolderDragStart, onFolderDragEnd, draggingFolderId, }) => { const isRoot = node.id === 'root'; const hasChildren = node.children.length > 0; const canToggle = !isRoot && (hasChildren || !node.loaded); const showChevron = !isRoot && hasChildren; const icon = showChevron ? : null; const canDrag = !isRoot; const isDragging = draggingFolderId === node.id; const isExpanded = isRoot ? true : Boolean(node.expanded); const rowClasses = ['folder-row']; if (isSelected) { rowClasses.push('active'); } const handleToggleClick = (event) => { event.stopPropagation(); if (canToggle) { onToggle(node.id); } }; return (
  • onSelect(node.id)} onDragOver={(event) => onDragOver(event, node.id)} onDragLeave={onDragLeave} onDrop={(event) => onDrop(event, node.id)} onDragStart={(event) => { if (!canDrag || !onFolderDragStart) return; onFolderDragStart(event, node.id); }} onDragEnd={(event) => { if (onFolderDragEnd) { onFolderDragEnd(event); } }} > {!isRoot && ( {icon} )} {node.name} {node.id !== 'root' && (
    )}
    {isExpanded && node.children.length > 0 && ( )}
  • ); }; const Sidebar = ({ folderNodes, onToggle, onSelect, onDrop, onDragOver, onDragLeave, onDeleteFolder, onRenameFolder, selectedFolder, onFolderDragStart, onFolderDragEnd, draggedFolderId, tags = [], activeTagIds = [], onToggleTagFilter, correspondents = [], activeCorrespondentIds = [], onToggleCorrespondentFilter, }) => { const sortedCorrespondents = useMemo( () => [...correspondents].sort((a, b) => (a?.name || '').localeCompare(b?.name || '', undefined, { sensitivity: 'base' }), ), [correspondents], ); const activeCorrespondentSet = useMemo( () => new Set(activeCorrespondentIds || []), [activeCorrespondentIds], ); const handleToggleTag = onToggleTagFilter || (() => {}); const activeTagSet = new Set(activeTagIds); const renderNodes = useCallback( (ids, depth) => ids.map((id) => { const node = folderNodes.get(id); if (!node) return null; return ( onToggle(id)} onSelect={onSelect} onDrop={onDrop} onDragOver={onDragOver} onDragLeave={onDragLeave} onDelete={onDeleteFolder} onRename={onRenameFolder} renderChildren={renderNodes} onFolderDragStart={onFolderDragStart} onFolderDragEnd={onFolderDragEnd} draggingFolderId={draggedFolderId} /> ); }), [ folderNodes, selectedFolder, onToggle, onSelect, onDrop, onDragOver, onDragLeave, onDeleteFolder, onRenameFolder, onFolderDragStart, onFolderDragEnd, draggedFolderId, ], ); const rootNode = folderNodes.get('root'); return ( ); }; export default Sidebar; export { FolderNode };