feat: Centralize document preview logic into useDocumentPreview and add correspondentLookupByName to useCorrespondents
This commit is contained in:
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user