import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Folder, FolderPlus, MoreHorizontal, Check, X, ChevronRight, ChevronDown } from 'lucide-react'; import { useDraggable, useDroppable } from '@dnd-kit/core'; interface Folder { _id: string; id?: string; name: string; parent_folder_id?: string | null; level: number; created_by?: string; created_at?: string; updated_at?: string; } interface FolderTreeItemProps { folder: Folder; children?: Folder[]; allPersonas: any[]; selectedFolder: string; isExpanded: boolean; folderToRename: Folder | null; renameFolderName: string; onFolderSelect: (folderId: string) => void; onToggleExpansion: (folderId: string) => void; onStartRename: (folder: Folder) => void; onCompleteRename: () => void; onCancelRename: () => void; onStartDelete: (folder: Folder) => void; onStartCreateSubfolder: (parentId: string) => void; onRenameFolderNameChange: (name: string) => void; isDragOverlay?: boolean; currentlyDraggedFolderId?: string | null; } const FolderTreeItem = ({ folder, children = [], allPersonas, selectedFolder, isExpanded, folderToRename, renameFolderName, onFolderSelect, onToggleExpansion, onStartRename, onCompleteRename, onCancelRename, onStartDelete, onStartCreateSubfolder, onRenameFolderNameChange, isDragOverlay = false, currentlyDraggedFolderId = null, }: FolderTreeItemProps) => { const [isHovered, setIsHovered] = useState(false); // Calculate persona count for this folder (explicit membership only) const personaCount = allPersonas.filter(persona => persona.folder_ids && persona.folder_ids.includes(folder._id) ).length; const hasChildren = children.length > 0; const canHaveChildren = folder.level === 0; // Only root folders can have children const isAllPersonasFolder = folder._id === 'all-personas-root'; // Check if this folder is the current parent of the dragged folder const isCurrentParentOfDraggedFolder = currentlyDraggedFolderId && children.some(child => child._id === currentlyDraggedFolderId); // Don't allow dropping into current parent or invalid targets // All Personas folder can always receive drops (special case for root moves) const canReceiveDrop = isAllPersonasFolder || (canHaveChildren && !isCurrentParentOfDraggedFolder); const { attributes, listeners, setNodeRef: setDragRef, isDragging, } = useDraggable({ id: folder._id, data: { type: 'folder', folder, }, }); const { setNodeRef: setDropRef, isOver, } = useDroppable({ id: `drop-${folder._id}`, data: { type: 'folder', folder, }, disabled: !canReceiveDrop, // Only enable drop zone for valid targets }); const setNodeRef = (node: HTMLElement | null) => { setDragRef(node); setDropRef(node); }; return (