'use client'; import { useEffect } from 'react'; import { useDrop } from 'react-dnd'; import { Transition } from '@headlessui/react'; import type { DocumentListDocument, Folder, IconSize, } from '@/types/documents'; import { Button } from '@headlessui/react'; import { DocumentTile } from './DocumentTile'; import { FolderIcon } from '../window/finderIcons'; import { useDocumentSelection } from '../dnd/DocumentSelectionContext'; import { DND_DOCUMENT, type DocumentDragItem } from '../dnd/dndTypes'; interface IconsViewProps { folders: Folder[]; unfolderedDocs: DocumentListDocument[]; iconSize: IconSize; collapsedFolders: Set; onToggleCollapse: (folderId: string) => void; onDeleteFolder: (folderId: string) => void; onDeleteDoc: (doc: DocumentListDocument) => void; onDropOnFolder: (folderId: string, item: DocumentDragItem) => void; onMergeIntoFolder: (sources: DocumentListDocument[], target: DocumentListDocument) => void; } const COLS: Record = { sm: 'grid-cols-3 sm:grid-cols-5 md:grid-cols-7 lg:grid-cols-8', md: 'grid-cols-2 sm:grid-cols-4 md:grid-cols-5 lg:grid-cols-6', lg: 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5', xl: 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4', }; function FolderGridRow({ folder, collapsed, onToggleCollapse, onDelete, iconSize, onDropOnFolder, onDeleteDoc, onMergeIntoFolder, }: { folder: Folder; collapsed: boolean; onToggleCollapse: () => void; onDelete: () => void; iconSize: IconSize; onDropOnFolder: (folderId: string, item: DocumentDragItem) => void; onDeleteDoc: (doc: DocumentListDocument) => void; onMergeIntoFolder: (sources: DocumentListDocument[], target: DocumentListDocument) => void; }) { const [{ isOver, canDrop }, dropRef] = useDrop< DocumentDragItem, void, { isOver: boolean; canDrop: boolean } >(() => ({ accept: DND_DOCUMENT, canDrop: (item) => item.docs.some((d) => d.folderId !== folder.id), drop: (item) => onDropOnFolder(folder.id, item), collect: (m) => ({ isOver: m.isOver({ shallow: true }), canDrop: m.canDrop() }), }), [folder.id, onDropOnFolder]); const totalSize = folder.documents.reduce((acc, d) => acc + d.size, 0); const isTarget = isOver && canDrop; return (
} className={ 'col-span-full rounded-md border border-offbase overflow-hidden bg-base ' + (isTarget ? 'ring-1 ring-accent' : '') } >
{folder.documents.map((doc) => ( ))}
); } export function IconsView({ folders, unfolderedDocs, iconSize, collapsedFolders, onToggleCollapse, onDeleteFolder, onDeleteDoc, onDropOnFolder, onMergeIntoFolder, }: IconsViewProps) { const { setVisibleOrder, clear } = useDocumentSelection(); useEffect(() => { const all: DocumentListDocument[] = [ ...folders.flatMap((f) => f.documents), ...unfolderedDocs, ]; setVisibleOrder(all); }, [folders, unfolderedDocs, setVisibleOrder]); const handleBackgroundClick: React.MouseEventHandler = (e) => { if ((e.target as HTMLElement).closest('[data-doc-tile]')) return; clear(); }; return (
{folders.map((folder) => ( onToggleCollapse(folder.id)} onDelete={() => onDeleteFolder(folder.id)} iconSize={iconSize} onDropOnFolder={onDropOnFolder} onDeleteDoc={onDeleteDoc} onMergeIntoFolder={onMergeIntoFolder} /> ))} {unfolderedDocs.map((doc) => ( ))}
); }