import React, { useCallback, useEffect, useMemo, useRef } from 'react'; import { resolveDocumentAssetUrl } from '../asset_manager'; import { getTagColorStyle } from '../utils/colors'; import { DownloadIcon, FolderIcon, EditIcon } from '../ui/icons'; const TAG_MIME_TYPES = ['application/x-papercrate-tag', 'text/papercrate-tag']; const DocumentThumbnailImage = ({ document, ensureAssetUrl, getDocumentAsset, alt }) => { const url = useMemo( () => resolveDocumentAssetUrl(document, 'thumbnail', { ensureAssetUrl, getAsset: getDocumentAsset, }), [document, ensureAssetUrl, getDocumentAsset], ); return (
| Preview | Name | Type | Updated | Actions |
|---|---|---|---|---|
|
|
{folder.name}
{folder.id !== 'root' && (
)}
|
Folder | — | |
|
|
{doc.title || doc.original_name}
{(doc.tags || []).length > 0 && (
{(doc.tags || []).map((tag) => {
const colorSource = tag?.color || tagLookupById?.get(tag.id)?.color;
const style = getTagColorStyle(colorSource);
return (
{
event.stopPropagation();
if (onTagClick) {
onTagClick(tag.id);
}
}}
role="button"
tabIndex={0}
draggable
onDragStart={(event) => {
event.stopPropagation();
try {
if (event.dataTransfer) {
event.dataTransfer.effectAllowed = 'copyMove';
}
const payload = JSON.stringify({
id: tag.id,
label: tag.label,
sourceDocId: doc.id,
});
event.dataTransfer?.setData('application/x-papercrate-tag', payload);
event.dataTransfer?.setData('text/papercrate-tag', payload);
event.dataTransfer?.setData('text/plain', tag.label || 'Tag');
} catch (
// eslint-disable-next-line no-empty
error
) {}
}}
onDragEnd={(event) => {
event.stopPropagation();
}}
onKeyDown={(event) => {
if (event.key === 'Enter' || event.key === ' ') {
event.preventDefault();
event.stopPropagation();
if (onTagClick) {
onTagClick(tag.id);
}
}
}}
>
{tag.label}
);
})}
)}
|
{doc.content_type || 'Document'} | {doc.updated_at ? new Date(doc.updated_at).toLocaleString() : '—'} |
{downloadHref ? (
event.stopPropagation()}
onAuxClick={(event) => event.stopPropagation()}
onContextMenu={(event) => event.stopPropagation()}
>
|