cleanup
This commit is contained in:
@@ -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;
|
||||||
return [doc, ...prev];
|
|
||||||
});
|
if (existsInDocuments || existsInSearch) {
|
||||||
|
removeCachedPreviewDocument(doc.id);
|
||||||
|
} else {
|
||||||
|
cachePreviewDocument(doc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user