diff --git a/app/dashboard/folders/page.tsx b/app/dashboard/folders/page.tsx index 5579f72..65373d3 100644 --- a/app/dashboard/folders/page.tsx +++ b/app/dashboard/folders/page.tsx @@ -63,7 +63,7 @@ export default function FoldersPage() { } // Function to fetch folder private data - const fetchFolderPrivateData = async (processId: string, stateId: string) => { + const fetchFolderPrivateData = useCallback(async (processId: string, stateId: string) => { if (!myFolderProcesses.includes(processId)) return; try { const messageBus = MessageBus.getInstance(iframeUrl); @@ -73,7 +73,7 @@ export default function FoldersPage() { } catch (err) { console.error('Error fetching folder private data:', err); } - }; + }, [myFolderProcesses]); // Function to load folders from 4NK processes (adapted to new FolderData model) const loadFoldersFrom4NK = useCallback(() => { @@ -82,6 +82,7 @@ export default function FoldersPage() { const folderData: FolderData[] = []; let hasAllPrivateData = true; let hasFoldersToLoad = false; + const missingPrivateData: Array<{processId: string, stateId: string}> = []; Object.entries(folderProcesses).forEach(([processId, process]: [string, any]) => { // Only include processes that belong to the user (myFolderProcesses) @@ -99,10 +100,10 @@ export default function FoldersPage() { // Get private data for this state if available const privateData = folderPrivateData[latestState.state_id]; - // If we don't have private data yet, trigger fetch and mark as incomplete + // If we don't have private data yet, mark as incomplete and collect missing data if (!privateData) { hasAllPrivateData = false; - setTimeout(() => fetchFolderPrivateData(processId, latestState.state_id), 0); + missingPrivateData.push({processId, stateId: latestState.state_id}); return; // Skip creating folder until we have private data } @@ -122,6 +123,12 @@ export default function FoldersPage() { // Manage loading state if (hasFoldersToLoad && !hasAllPrivateData) { setLoadingFolders(true); + // Fetch missing private data (but only once per missing item) + missingPrivateData.forEach(({processId, stateId}) => { + if (!folderPrivateData[stateId]) { + fetchFolderPrivateData(processId, stateId); + } + }); } else if (hasAllPrivateData) { setLoadingFolders(false); setFolders(folderData); @@ -193,13 +200,6 @@ export default function FoldersPage() { } }, [folderProcesses, myFolderProcesses, loadFoldersFrom4NK]); - // Update folders when private data changes - useEffect(() => { - if (folderProcesses && Object.keys(folderPrivateData).length > 0) { - loadFoldersFrom4NK(); - } - }, [folderPrivateData, loadFoldersFrom4NK, folderProcesses]); - // Filter and sort folders const filteredFolders = folders.filter(folder => { const matchesSearch = folder.name.toLowerCase().includes(searchTerm.toLowerCase()) || @@ -291,7 +291,7 @@ export default function FoldersPage() { showNotification("error", "Erreur lors de la création du dossier"); }); }, - [isConnected, userPairingId, loadFoldersFrom4NK] + [isConnected, userPairingId] ); // Auth connection handler