import React, { useMemo } from 'react'; import DesktopPreviewCard from './DesktopPreviewCard'; import { resolveCorrespondents } from '../../documents/correspondents'; import type { Document } from '../../types/documents'; import { LayoutCard } from '../logic/LayoutSystem'; import { useCardPointer } from '../interactions/useCardPointer'; import DocumentTags from '../../documents/components/DocumentTags'; import { TagInteractionHandlers } from '../../documents/interactions/useTagInteractions'; import { useDocumentsAssetContext } from '../../documents/context/DocumentsAssetContext'; import { useDocumentsViewStateContext } from '../../documents/context/DocumentsViewStateContext'; const preventAll = (event?: React.SyntheticEvent | Event | null) => { if (!event) return; if (typeof event.preventDefault === 'function') event.preventDefault(); if (typeof event.stopPropagation === 'function') event.stopPropagation(); }; interface DesktopDocumentCardProps { doc: Document; style?: React.CSSProperties; shouldLoad?: boolean; matchesFilter?: boolean; selected?: boolean; docTagTokens?: string; ensureAssetUrl?: (...args: any[]) => Promise; getDocumentAsset?: (...args: any[]) => unknown; onDocumentActivate?: (id: string, event?: any) => void; onSelect: (ids: string[], extend?: boolean) => void; onDeselect: (ids: string[]) => void; selection: string[]; requestCanvasFocus?: () => void; tagHandlers?: TagInteractionHandlers; layoutCard: LayoutCard; } const DesktopDocumentCard: React.FC = ({ doc, style, shouldLoad = false, matchesFilter = true, selected = false, docTagTokens, onDocumentActivate, onSelect, onDeselect, selection, requestCanvasFocus, tagHandlers, layoutCard, }) => { const { ensureAssetUrl, getDocumentAsset } = useDocumentsAssetContext(); const { tagLookupById, correspondentLookupById } = useDocumentsViewStateContext(); const cardPointerHandlers = useCardPointer( layoutCard, !!selected, selection, onSelect, onDeselect, onDocumentActivate, requestCanvasFocus ); const correspondents = useMemo(() => resolveCorrespondents(doc, correspondentLookupById), [doc, correspondentLookupById]); const tags = Array.isArray(doc?.tags) ? doc.tags : []; const itemClasses = ['desk-item']; if (!matchesFilter) itemClasses.push('is-filtered-out'); if (selected) itemClasses.push('is-selected'); const ariaHidden = matchesFilter ? undefined : 'true'; const dataTagIds = docTagTokens || undefined; return (
layoutCard?.setRef(node)} {...cardPointerHandlers} onDragEnter={(event) => tagHandlers?.onTagDragEnter(event, doc.id!)} onDragOver={(event) => tagHandlers?.onTagDragOver(event, doc)} onDragLeave={(event) => tagHandlers?.onTagDragLeave(event, doc.id!)} onDrop={(event) => tagHandlers?.onTagDrop(event, doc)} onKeyDown={(event) => { if (event.key === 'Enter' || event.key === ' ') { preventAll(event); onDocumentActivate?.(doc.id, event); } }} >
{correspondents.length > 0 && ( )} {tags.length > 0 && ( )}
); }; export default React.memo(DesktopDocumentCard);