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
+67 -8
View File
@@ -4,7 +4,6 @@ const useDocumentPreview = ({
routeDocumentId,
documents,
searchResults,
setDocuments,
selectedFolder,
assetManager,
api,
@@ -17,6 +16,7 @@ const useDocumentPreview = ({
setActivePreviewId,
}) => {
const [previewEntries, setPreviewEntries] = useState(() => new Map());
const [previewDocuments, setPreviewDocuments] = useState(() => new Map());
const previewInflightRef = useRef(new Map());
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(
async (documentId, { force = false } = {}) => {
if (!documentId) return null;
@@ -116,12 +145,16 @@ const useDocumentPreview = ({
throw new Error('Document metadata unavailable.');
}
setDocuments((prev) => {
if (prev.some((item) => item.id === doc.id)) {
return prev;
}
return [doc, ...prev];
});
const existsInDocuments = documents.some((item) => item.id === doc.id);
const existsInSearch = Array.isArray(searchResults)
? searchResults.some((item) => item.id === doc.id)
: false;
if (existsInDocuments || existsInSearch) {
removeCachedPreviewDocument(doc.id);
} else {
cachePreviewDocument(doc);
}
}
if (!previewReturnPathRef.current) {
@@ -138,10 +171,11 @@ const useDocumentPreview = ({
searchResults,
documents,
assetManager,
setDocuments,
ensurePreviewUrl,
setActivePreviewId,
api,
cachePreviewDocument,
removeCachedPreviewDocument,
],
);
@@ -207,8 +241,33 @@ const useDocumentPreview = ({
};
}, [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 {
previewEntries,
previewDocuments,
ensurePreviewUrl,
ensurePreviewData,
openDocumentPreview,