'use client'; import { useState } from 'react'; import { ChevronRight, Folder, FolderOpen, FolderTree, Inbox, Lock } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from '@/components/ui/sheet'; import { cn } from '@/lib/utils'; import { useDocumentFolders, type FolderNode } from '@/hooks/use-document-folders'; interface FolderTreeSidebarProps { /** Currently-selected folder id, or `null` for root, or `undefined` * for "All documents" (no folder filter). */ selectedFolderId: string | null | undefined; onSelect: (folderId: string | null | undefined) => void; /** Slot below the tree for a "New folder" affordance from the parent. */ footer?: React.ReactNode; } /** * Collapsed-by-default tree. Each row shows a chevron that toggles its * children; clicking the row label selects the folder. The "All * documents" + "Root" pseudo-rows at the top let reps filter to the * full set or to docs without a folder. * * Designed for unlimited depth — only the top level renders by default * so deep trees don't blow out the page; reps drill in by expanding. * * On mobile (< sm) the sidebar collapses into a Sheet drawer triggered by * a "Show folders" button so the main listing isn't pushed below a * full-width folder stack. */ export function FolderTreeSidebar({ selectedFolderId, onSelect, footer }: FolderTreeSidebarProps) { const [mobileOpen, setMobileOpen] = useState(false); const handleMobileSelect = (id: string | null | undefined) => { onSelect(id); setMobileOpen(false); }; return ( <> {/* Mobile-only trigger that opens the drawer; hidden at sm+. */}
Loading...
) : isError ? (Failed to load folders.
) : tree.length === 0 ? (No folders yet.
) : ( tree.map((node) => (