import React, { useMemo } from 'react'; import DesktopPreviewCard from './DesktopPreviewCard'; import { resolveCorrespondents } from '../documents/correspondents'; import { getTagColorStyle } from '../utils/colors'; import { preventAll } from './events'; type DocumentLike = { id?: string | number; title?: string; tags?: Array<{ id?: string | number; label?: string; color?: string | null }>; [key: string]: unknown; }; interface PendingRemovalTag { docId?: string | number; tagId?: string | number; } interface DesktopDocumentCardProps { doc: DocumentLike; style?: React.CSSProperties; shouldLoad?: boolean; dragging?: boolean; matchesFilter?: boolean; tagTargetActive?: boolean; tagTargetPending?: boolean; selected?: boolean; docTagTokens?: string; ensureAssetUrl?: (...args: any[]) => Promise; getDocumentAsset?: (...args: any[]) => unknown; handleNavigatorSnapshot?: (...args: any[]) => void; cardPointerHandlers?: React.HTMLAttributes; onInspectDocument?: (id: string | number) => void; onTagDragEnter?: (event: React.DragEvent, docId: string | number) => void; onTagDragOver?: (event: React.DragEvent, docId: string | number) => void; onTagDragLeave?: (event: React.DragEvent, docId: string | number) => void; onTagDrop?: (event: React.DragEvent, doc: DocumentLike) => void; onDocTagPointerDown?: (event: React.PointerEvent, doc: DocumentLike, tag: any) => void; onDocTagDragStart?: (event: React.DragEvent, doc: DocumentLike, tag: any) => void; onDocTagDrag?: (event: React.DragEvent) => void; onDocTagDragEnd?: (event: React.DragEvent) => void; pendingRemovalTag?: PendingRemovalTag | null; registerNode?: (node: HTMLDivElement | null) => void; } const DesktopDocumentCard: React.FC = ({ doc, style, shouldLoad, dragging, matchesFilter, tagTargetActive, tagTargetPending, selected, docTagTokens, ensureAssetUrl, getDocumentAsset, handleNavigatorSnapshot, cardPointerHandlers, onInspectDocument, onTagDragEnter, onTagDragOver, onTagDragLeave, onTagDrop, onDocTagPointerDown, onDocTagDragStart, onDocTagDrag, onDocTagDragEnd, pendingRemovalTag, registerNode, }) => { const correspondents = useMemo(() => resolveCorrespondents(doc), [doc]); const tags = Array.isArray(doc?.tags) ? doc.tags : []; const itemClasses = ['desk-item']; if (dragging) itemClasses.push('is-dragging'); if (tagTargetActive) itemClasses.push('is-tag-target'); if (tagTargetPending) itemClasses.push('is-tag-pending'); if (!matchesFilter) itemClasses.push('is-filtered-out'); if (selected) itemClasses.push('is-selected'); const ariaHidden = matchesFilter ? undefined : 'true'; const dataTagIds = docTagTokens || undefined; return (
{ if (doc?.id == null) { return; } onTagDragEnter?.(event, doc.id); }} onDragOver={(event) => { if (doc?.id == null) { return; } onTagDragOver?.(event, doc.id); }} onDragLeave={(event) => { if (doc?.id == null) { return; } onTagDragLeave?.(event, doc.id); }} onDrop={(event) => { onTagDrop?.(event, doc); }} onKeyDown={(event) => { if (event.key === 'Enter' || event.key === ' ') { preventAll(event); onInspectDocument?.(doc.id); } }} >
{correspondents.length > 0 && ( )} {tags.length > 0 && ( )}
); }; export default React.memo(DesktopDocumentCard);