diff --git a/app/dashboard/folders/page.tsx b/app/dashboard/folders/page.tsx index 3a833b1..890da13 100644 --- a/app/dashboard/folders/page.tsx +++ b/app/dashboard/folders/page.tsx @@ -181,6 +181,7 @@ export default function FoldersPage() { const [folderProcesses, setFolderProcesses] = useState(null) const [myFolderProcesses, setMyFolderProcesses] = useState([]) const [folderPrivateData, setFolderPrivateData] = useState>>({}) + const [loadingFolders, setLoadingFolders] = useState(false) // Modal states const [inviteMessage, setInviteMessage] = useState("") @@ -418,43 +419,54 @@ export default function FoldersPage() { if (!folderProcesses) return; const folderData: FolderData[] = []; + let hasAllPrivateData = true; + let hasFoldersToLoad = false; Object.entries(folderProcesses).forEach(([processId, process]: [string, any]) => { // Only include processes that belong to the user (myFolderProcesses) if (!myFolderProcesses.includes(processId)) return; // Check if this process has a folderNumber in pcd_commitment - const latestState = process.states[process.states.length - 2]; // -2 because last state is empty + const latestState = process.states[0]; // -2 because last state is empty if (!latestState) return; const folderNumber = latestState.pcd_commitment?.folderNumber; if (!folderNumber) return; // Skip processes without folderNumber + hasFoldersToLoad = true; // We have at least one folder to load + // Get private data for this state if available - const privateData = folderPrivateData[latestState.state_id] || {}; + const privateData = folderPrivateData[latestState.state_id]; - // Create folder data from process data + // If we don't have private data yet, trigger fetch and mark as incomplete + if (!privateData) { + hasAllPrivateData = false; + setTimeout(() => fetchFolderPrivateData(processId, latestState.state_id), 0); + return; // Skip creating folder until we have private data + } + + // Only create folder when we have private data const folder: FolderData = { id: parseInt(folderNumber) || Math.floor(Math.random() * 10000), - name: latestState.public_data?.name || privateData?.name || `Dossier ${folderNumber}`, - description: latestState.public_data?.description || privateData?.description || '', - documentsCount: latestState.public_data?.documentsCount || privateData?.documentsCount || 0, - subfoldersCount: latestState.public_data?.subfoldersCount || privateData?.subfoldersCount || 0, - size: latestState.public_data?.size || privateData?.size || '0 MB', - created: new Date(latestState.public_data?.created || privateData?.created || Date.now()), - modified: new Date(latestState.public_data?.modified || privateData?.modified || Date.now()), - owner: latestState.public_data?.owner || privateData?.owner || 'Propriétaire 4NK', - access: (latestState.public_data?.access || privateData?.access || 'private') as 'shared' | 'private', - members: latestState.public_data?.members || privateData?.members || [], - tags: latestState.public_data?.tags || privateData?.tags || [], - color: latestState.public_data?.color || privateData?.color || 'blue', - favorite: latestState.public_data?.favorite || privateData?.favorite || false, - storageType: (latestState.public_data?.storageType || privateData?.storageType || 'temporary') as 'temporary' | 'permanent', - status: (latestState.public_data?.status || privateData?.status || 'active') as 'active' | 'archived' | 'pending' | 'completed' | 'validated', - type: latestState.public_data?.type || privateData?.type || 'general', - expectedDocuments: latestState.public_data?.expectedDocuments || privateData?.expectedDocuments || [], - activity: latestState.public_data?.activity || privateData?.activity || [], - permissions: latestState.public_data?.permissions || privateData?.permissions || { + name: privateData.name || `Dossier ${folderNumber}`, + description: privateData.description || '', + documentsCount: privateData.documentsCount || 0, + subfoldersCount: privateData.subfoldersCount || 0, + size: privateData.size || '0 MB', + created: new Date(privateData.created || Date.now()), + modified: new Date(privateData.modified || Date.now()), + owner: privateData.owner || 'Propriétaire 4NK', + access: (privateData.access || 'private') as 'shared' | 'private', + members: privateData.members || [], + tags: privateData.tags || [], + color: privateData.color || 'blue', + favorite: privateData.favorite || false, + storageType: (privateData.storageType || 'temporary') as 'temporary' | 'permanent', + status: (privateData.status || 'active') as 'active' | 'archived' | 'pending' | 'completed' | 'validated', + type: privateData.type || 'general', + expectedDocuments: privateData.expectedDocuments || [], + activity: privateData.activity || [], + permissions: privateData.permissions || { canView: true, canEdit: true, // User owns this process canDelete: true, // User owns this process @@ -462,33 +474,45 @@ export default function FoldersPage() { canArchive: true, // User owns this process canAnalyze: true, }, - temporaryStorageConfig: latestState.public_data?.temporaryStorageConfig || privateData?.temporaryStorageConfig, - documents: latestState.public_data?.documents || privateData?.documents || [], + temporaryStorageConfig: privateData.temporaryStorageConfig, + documents: privateData.documents || [], }; folderData.push(folder); - - // Fetch private data if we don't have it yet (we know this is the user's process) - if (!folderPrivateData[latestState.state_id]) { - setTimeout(() => fetchFolderPrivateData(processId, latestState.state_id), 0); - } }); - setFolders(folderData); - - // Update stats - setStats({ - total: folderData.length, - shared: folderData.filter((folder) => folder.access === "shared").length, - private: folderData.filter((folder) => folder.access === "private").length, - thisWeek: folderData.filter((folder) => { - const weekAgo = new Date() - weekAgo.setDate(weekAgo.getDate() - 7) - return folder.modified > weekAgo - }).length, - permanent: folderData.filter((folder) => folder.storageType === "permanent").length, - temporary: folderData.filter((folder) => folder.storageType === "temporary").length, - }); + // Manage loading state + if (hasFoldersToLoad && !hasAllPrivateData) { + setLoadingFolders(true); + } else if (hasAllPrivateData) { + setLoadingFolders(false); + setFolders(folderData); + + // Update stats + setStats({ + total: folderData.length, + shared: folderData.filter((folder) => folder.access === "shared").length, + private: folderData.filter((folder) => folder.access === "private").length, + thisWeek: folderData.filter((folder) => { + const weekAgo = new Date() + weekAgo.setDate(weekAgo.getDate() - 7) + return folder.modified > weekAgo + }).length, + permanent: folderData.filter((folder) => folder.storageType === "permanent").length, + temporary: folderData.filter((folder) => folder.storageType === "temporary").length, + }); + } else if (!hasFoldersToLoad) { + setLoadingFolders(false); + setFolders([]); + setStats({ + total: 0, + shared: 0, + private: 0, + thisWeek: 0, + permanent: 0, + temporary: 0, + }); + } }, [folderProcesses, myFolderProcesses, folderPrivateData, iframeUrl]); useEffect(() => { @@ -539,6 +563,7 @@ export default function FoldersPage() { setMyFolderProcesses([]); setFolderPrivateData({}); setFolders([]); + setLoadingFolders(false); // Émettre un événement pour vider les messages locaux EventBus.getInstance().emit('CLEAR_CONSOLE'); @@ -1766,7 +1791,15 @@ export default function FoldersPage() { )} - {filteredFolders.length === 0 && ( + {loadingFolders && isConnected && ( +
+
+

Chargement des dossiers...

+

Récupération des données privées depuis 4NK

+
+ )} + + {!loadingFolders && filteredFolders.length === 0 && (

Aucun dossier trouvé