This commit is contained in:
2025-11-12 02:24:46 +01:00
parent 5653828ff3
commit 06683e2a07
4 changed files with 80 additions and 14 deletions
+66 -7
View File
@@ -4,7 +4,6 @@ const useDocumentPreview = ({
routeDocumentId, routeDocumentId,
documents, documents,
searchResults, searchResults,
setDocuments,
selectedFolder, selectedFolder,
assetManager, assetManager,
api, api,
@@ -17,6 +16,7 @@ const useDocumentPreview = ({
setActivePreviewId, setActivePreviewId,
}) => { }) => {
const [previewEntries, setPreviewEntries] = useState(() => new Map()); const [previewEntries, setPreviewEntries] = useState(() => new Map());
const [previewDocuments, setPreviewDocuments] = useState(() => new Map());
const previewInflightRef = useRef(new Map()); const previewInflightRef = useRef(new Map());
const previewReturnPathRef = useRef(null); const previewReturnPathRef = useRef(null);
@@ -46,6 +46,35 @@ const useDocumentPreview = ({
}); });
}, []); }, []);
const cachePreviewDocument = useCallback((doc) => {
if (!doc?.id) {
return;
}
setPreviewDocuments((prev) => {
const existing = prev.get(doc.id);
if (existing === doc) {
return prev;
}
const next = new Map(prev);
next.set(doc.id, doc);
return next;
});
}, []);
const removeCachedPreviewDocument = useCallback((documentId) => {
if (!documentId) {
return;
}
setPreviewDocuments((prev) => {
if (!prev.has(documentId)) {
return prev;
}
const next = new Map(prev);
next.delete(documentId);
return next;
});
}, []);
const ensurePreviewUrl = useCallback( const ensurePreviewUrl = useCallback(
async (documentId, { force = false } = {}) => { async (documentId, { force = false } = {}) => {
if (!documentId) return null; if (!documentId) return null;
@@ -116,12 +145,16 @@ const useDocumentPreview = ({
throw new Error('Document metadata unavailable.'); throw new Error('Document metadata unavailable.');
} }
setDocuments((prev) => { const existsInDocuments = documents.some((item) => item.id === doc.id);
if (prev.some((item) => item.id === doc.id)) { const existsInSearch = Array.isArray(searchResults)
return prev; ? searchResults.some((item) => item.id === doc.id)
: false;
if (existsInDocuments || existsInSearch) {
removeCachedPreviewDocument(doc.id);
} else {
cachePreviewDocument(doc);
} }
return [doc, ...prev];
});
} }
if (!previewReturnPathRef.current) { if (!previewReturnPathRef.current) {
@@ -138,10 +171,11 @@ const useDocumentPreview = ({
searchResults, searchResults,
documents, documents,
assetManager, assetManager,
setDocuments,
ensurePreviewUrl, ensurePreviewUrl,
setActivePreviewId, setActivePreviewId,
api, api,
cachePreviewDocument,
removeCachedPreviewDocument,
], ],
); );
@@ -207,8 +241,33 @@ const useDocumentPreview = ({
}; };
}, [routeDocumentId, ensurePreviewData, notifyApiError, closeDocumentPreview]); }, [routeDocumentId, ensurePreviewData, notifyApiError, closeDocumentPreview]);
useEffect(() => {
setPreviewDocuments((prev) => {
if (!prev.size) {
return prev;
}
const next = new Map(prev);
let changed = false;
const prune = (list) => {
if (!Array.isArray(list)) {
return;
}
list.forEach((doc) => {
if (doc?.id && next.has(doc.id)) {
next.delete(doc.id);
changed = true;
}
});
};
prune(documents);
prune(searchResults);
return changed ? next : prev;
});
}, [documents, searchResults]);
return { return {
previewEntries, previewEntries,
previewDocuments,
ensurePreviewUrl, ensurePreviewUrl,
ensurePreviewData, ensurePreviewData,
openDocumentPreview, openDocumentPreview,
+5 -2
View File
@@ -10,6 +10,7 @@ import {
const useDetailWorkspace = ({ const useDetailWorkspace = ({
documents, documents,
searchResults, searchResults,
previewDocuments,
selectionOrder, selectionOrder,
selectedDocumentIds, selectedDocumentIds,
documentLookup, documentLookup,
@@ -195,8 +196,10 @@ const useDetailWorkspace = ({
return null; return null;
} }
const pool = searchResults ?? documents; const pool = searchResults ?? documents;
return pool.find((doc) => doc.id === previewDocumentId) || null; return pool.find((doc) => doc.id === previewDocumentId)
}, [previewDocumentId, searchResults, documents]); || previewDocuments?.get?.(previewDocumentId)
|| null;
}, [previewDocumentId, searchResults, documents, previewDocuments]);
const previewActive = Boolean(previewDocumentId && previewWorkspaceDocument); const previewActive = Boolean(previewDocumentId && previewWorkspaceDocument);
@@ -328,6 +328,7 @@ const useDocumentsWorkspace = ({
const { const {
previewEntries, previewEntries,
previewDocuments,
ensurePreviewData, ensurePreviewData,
openDocumentPreview, openDocumentPreview,
closeDocumentPreview, closeDocumentPreview,
@@ -337,7 +338,6 @@ const useDocumentsWorkspace = ({
routeDocumentId: previewDocumentId, routeDocumentId: previewDocumentId,
documents, documents,
searchResults, searchResults,
setDocuments,
selectedFolder, selectedFolder,
assetManager, assetManager,
api, api,
@@ -410,8 +410,13 @@ const useDocumentsWorkspace = ({
if (Array.isArray(searchResults)) { if (Array.isArray(searchResults)) {
push(searchResults); push(searchResults);
} }
previewDocuments.forEach((doc, id) => {
if (doc && id && !map.has(id)) {
map.set(id, doc);
}
});
return map; return map;
}, [documents, searchResults]); }, [documents, searchResults, previewDocuments]);
const { const {
tags, tags,
@@ -1158,6 +1163,7 @@ const useDocumentsWorkspace = ({
} = useDetailWorkspace({ } = useDetailWorkspace({
documents, documents,
searchResults, searchResults,
previewDocuments,
focusedDocumentId, focusedDocumentId,
selectionOrder, selectionOrder,
selectedDocumentIds, selectedDocumentIds,
-2
View File
@@ -53,13 +53,11 @@
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
flex: 2 2 auto;
max-height: calc(var(--document-viewer-portrait-height-ratio) * 100vh); max-height: calc(var(--document-viewer-portrait-height-ratio) * 100vh);
order: -1; order: -1;
} }
.document-viewer--stacked .document-viewer__details-pane { .document-viewer--stacked .document-viewer__details-pane {
flex: 1 1 auto;
overflow: visible; overflow: visible;
order: 0; order: 0;
} }