fix breadcrumbs

This commit is contained in:
2025-10-11 22:47:31 +02:00
parent 3a5d7607e3
commit 1b950a8f9a
+60 -13
View File
@@ -1151,6 +1151,7 @@ function App({ routeFolderId = null, routeDocumentId = null, navigate }) {
const documentDetailsRef = useRef(documentDetails); const documentDetailsRef = useRef(documentDetails);
const tokenRef = useRef(token); const tokenRef = useRef(token);
const refreshPromiseRef = useRef(null); const refreshPromiseRef = useRef(null);
const breadcrumbFetchRef = useRef(new Set());
const refreshAccessToken = useCallback(async () => { const refreshAccessToken = useCallback(async () => {
console.log('[Auth] Attempting to refresh access token…'); console.log('[Auth] Attempting to refresh access token…');
try { try {
@@ -3226,39 +3227,85 @@ const handleDownload = useCallback(
}); });
}, [selectionOrder, selectedDocumentIds, ensureDocumentDetail]); }, [selectionOrder, selectedDocumentIds, ensureDocumentDetail]);
const breadcrumbs = useMemo(() => { const { breadcrumbs, missingBreadcrumbAncestors } = useMemo(() => {
const chain = []; const chain = [];
const seen = new Set(); const seen = new Set();
const pending = new Set();
let currentId = selectedFolder || 'root'; let currentId = selectedFolder || 'root';
let guard = 0;
while (currentId && !seen.has(currentId)) { while (currentId && !seen.has(currentId) && guard < 32) {
guard += 1;
seen.add(currentId); seen.add(currentId);
if (currentId === 'root') { if (currentId === 'root') {
chain.push({ id: 'root', name: DEFAULT_FOLDER_NAME }); chain.push({ id: 'root', name: DEFAULT_FOLDER_NAME });
currentId = null;
break; break;
} }
const node = folderNodes.get(currentId); const node = folderNodes.get(currentId);
if (node) { if (node) {
chain.push({ id: currentId, name: node.name || DEFAULT_FOLDER_NAME }); chain.push({ id: currentId, name: node.name || 'Folder' });
currentId = node.parentId ?? 'root'; currentId = node.parentId ?? 'root';
} else { continue;
chain.push({ id: currentId, name: currentFolderName });
currentId = 'root';
}
} }
if (chain[chain.length - 1]?.id !== 'root') { let fallbackName = '…';
let parentId = null;
if (currentFolder && currentFolder.id === currentId) {
fallbackName = currentFolder.name;
parentId = currentFolder.parent_id ?? 'root';
}
chain.push({ id: currentId, name: fallbackName });
pending.add(currentId);
currentId = parentId;
}
if (!chain.some((crumb) => crumb.id === 'root')) {
chain.push({ id: 'root', name: DEFAULT_FOLDER_NAME }); chain.push({ id: 'root', name: DEFAULT_FOLDER_NAME });
} }
return chain.reverse(); const ordered = [];
}, [selectedFolder, folderNodes, currentFolderName]); const seenOrdered = new Set();
chain
.slice()
.reverse()
.forEach((crumb) => {
if (!seenOrdered.has(crumb.id)) {
seenOrdered.add(crumb.id);
ordered.push(crumb);
}
});
return { breadcrumbs: ordered, missingBreadcrumbAncestors: Array.from(pending) };
}, [selectedFolder, folderNodes, currentFolder]);
useEffect(() => { useEffect(() => {
if (!selectedDocument) return; if (!missingBreadcrumbAncestors.length) {
ensurePreviewUrl(selectedDocument.id).catch(() => {}); return;
}, [selectedDocument, ensurePreviewUrl]); }
missingBreadcrumbAncestors.forEach((folderId) => {
if (!folderId || folderId === 'root') {
return;
}
if (breadcrumbFetchRef.current.has(folderId)) {
return;
}
breadcrumbFetchRef.current.add(folderId);
ensureFolderData(folderId, { force: false })
.catch((error) => {
console.warn('Failed to preload breadcrumb ancestor', folderId, error);
})
.finally(() => {
breadcrumbFetchRef.current.delete(folderId);
});
});
}, [missingBreadcrumbAncestors, ensureFolderData]);
const selectedPreviewEntry = useMemo(() => { const selectedPreviewEntry = useMemo(() => {
if (!selectedDocument) { if (!selectedDocument) {