feat: Centralize document preview logic into useDocumentPreview and add correspondentLookupByName to useCorrespondents

This commit is contained in:
2025-12-10 02:33:22 +01:00
parent ed8450c0e2
commit b9f0278329
8 changed files with 69 additions and 125 deletions
@@ -1,4 +1,4 @@
import { useCallback, useEffect, useMemo } from 'react';
import { useCallback, useEffect } from 'react';
import type { MutableRefObject } from 'react';
import { resolveDocumentAssetUrl } from '../../lib/assets/AssetManager';
import { useDetailPanel } from '../../app/useDetailPanel';
@@ -6,7 +6,6 @@ import type { DocumentInfoPanelProps } from '../components/DocumentInfoPanel';
import type { EnsureAssetUrl, GetAsset } from '../../lib/assets/AssetManager';
import type { Identifier } from '../../types/identifiers';
import type { Document } from '../../types/documents';
import { resolveBreadcrumbs } from '../../documents/logic/breadcrumbs';
import type { Tag, Correspondent } from '../../types/documents';
import { listFolderContents } from '../../lib/api/apiClient';
import { useStatusToast } from '../../lib/context/StatusToastContext';
@@ -19,13 +18,10 @@ interface FolderNode {
}
interface UseDetailWorkspaceArgs {
documents: Document[];
documentLookup: Map<Identifier, Document>;
folderNodes: Map<Identifier | 'root', FolderNode>;
detailPanelControlRef: MutableRefObject<{ open?: (documentId: Identifier) => void; close?: () => void } | null>;
detailFolderFetchRef: MutableRefObject<Set<Identifier | 'root'>>;
previewDocumentId?: Identifier | null;
activePreviewId?: Identifier | null;
openDocumentPreview?: (args: { documentIds: Identifier[] }) => void;
handleDocumentTitleUpdate?: (docId: Identifier, title: string) => Promise<boolean> | boolean;
handleDocumentIssuedUpdate?: (docId: Identifier, issued: number | null) => Promise<boolean> | boolean;
@@ -40,6 +36,7 @@ interface UseDetailWorkspaceArgs {
tags?: unknown[];
tagLookupById?: Map<Identifier, Tag> | null;
correspondentLookupById?: Map<Identifier, Correspondent> | null;
resolveFolderPath?: (folderId?: Identifier | 'root') => Array<{ id: Identifier | 'root'; name: string }>;
}
interface UseDetailWorkspaceResult {
@@ -49,20 +46,15 @@ interface UseDetailWorkspaceResult {
closeDetailPanel: ReturnType<typeof useDetailPanel>['closeDetailPanel'];
handleDetailPanelClose: () => void;
inspectDocument: (docId: Identifier | null) => void;
previewActive: boolean;
previewWorkspaceDocument: Document | null;
resolveThumbnailUrlForDoc: (doc: Document | null) => string | null;
resolveFolderPath: (folderId?: Identifier | 'root') => Array<{ id: Identifier | 'root'; name: string }>;
}
const useDetailWorkspace = ({
documents,
documentLookup,
folderNodes,
detailPanelControlRef,
detailFolderFetchRef,
previewDocumentId,
activePreviewId,
openDocumentPreview,
handleDocumentTitleUpdate,
handleDocumentIssuedUpdate,
@@ -77,6 +69,7 @@ const useDetailWorkspace = ({
tags,
tagLookupById,
correspondentLookupById,
resolveFolderPath,
}: UseDetailWorkspaceArgs): UseDetailWorkspaceResult => {
const { showToast } = useStatusToast();
const notifyApiError = useNotifyApiError();
@@ -97,12 +90,6 @@ const useDetailWorkspace = ({
};
}, [detailPanelControlRef, openDetailPanel, closeDetailPanel]);
useEffect(() => {
if (detailPanelOpen && activePreviewId) {
openDetailPanel(activePreviewId);
}
}, [detailPanelOpen, activePreviewId, openDetailPanel]);
// Prefetch folder ancestors for breadcrumb display
useEffect(() => {
const folderId = detailPanelDocument?.folder_id;
@@ -144,24 +131,6 @@ const useDetailWorkspace = ({
}
}, [detailPanelDocument, folderNodes, detailFolderFetchRef]);
const resolveFolderPath = useCallback(
(folderId) => {
return resolveBreadcrumbs(folderId || 'root', folderNodes as any);
},
[folderNodes],
);
const previewWorkspaceDocument = useMemo(() => {
if (!previewDocumentId) {
return null;
}
return documentLookup.get(previewDocumentId)
|| documents.find((doc) => doc.id === previewDocumentId)
|| null;
}, [previewDocumentId, documentLookup, documents]);
const previewActive = Boolean(previewDocumentId && previewWorkspaceDocument);
const resolveThumbnailUrlForDoc = useCallback(
(doc) =>
resolveDocumentAssetUrl(doc, 'thumbnail', {
@@ -219,7 +188,6 @@ const useDetailWorkspace = ({
onTagAdd: handleDetailTagAdd,
onTagRemove: handleDetailTagRemove,
onOpenPreview: openDocumentPreview,
activePreviewId,
onUpdateTitle: handleDocumentTitleUpdate,
onUpdateIssued: handleDocumentIssuedUpdate,
ensureAssetUrl,
@@ -240,8 +208,6 @@ const useDetailWorkspace = ({
closeDetailPanel,
handleDetailPanelClose,
inspectDocument,
previewActive,
previewWorkspaceDocument,
resolveThumbnailUrlForDoc,
resolveFolderPath,
};