import React from 'react'; import { getArchivedScopeKey, resolveArchivedFolderName, } from '../utils'; import type { SessionOwnershipIndex } from '../sessionOwnership'; type ProjectForArchivedFolders = { id: string; normalizedPath: string; }; type FolderEntry = { id: string; name: string; sessionIds: string[]; }; type Args = { enabled?: boolean; normalizedProjects: ProjectForArchivedFolders[]; ownership: SessionOwnershipIndex; isSessionsLoading: boolean; hasAuthoritativeGlobalSessions: boolean; isWorktreeTopologyLoading: boolean; unresolvedWorktreeProjectPaths: ReadonlySet; foldersMap: Record; createFolder: (scopeKey: string, name: string, parentId?: string | null) => FolderEntry; addSessionToFolder: (scopeKey: string, folderId: string, sessionId: string) => void; }; export const useArchivedAutoFolders = (args: Args): void => { const { normalizedProjects, enabled = true, ownership, isSessionsLoading, hasAuthoritativeGlobalSessions, isWorktreeTopologyLoading, unresolvedWorktreeProjectPaths, foldersMap, createFolder, addSessionToFolder, } = args; React.useEffect(() => { if (!enabled || isSessionsLoading || !hasAuthoritativeGlobalSessions || isWorktreeTopologyLoading) { return; } normalizedProjects.forEach((project) => { if (unresolvedWorktreeProjectPaths.has(project.normalizedPath)) { return; } const scopeKey = getArchivedScopeKey(project.normalizedPath); const projectArchivedSessions = ownership.archivedSessionsByProject.get(project.id) ?? []; const existingFolders = foldersMap[scopeKey] ?? []; const folderByName = new Map(existingFolders.map((folder) => [folder.name.toLowerCase(), folder])); projectArchivedSessions.forEach((session) => { const folderName = resolveArchivedFolderName(session, project.normalizedPath); const key = folderName.toLowerCase(); let folder = folderByName.get(key); if (!folder) { folder = createFolder(scopeKey, folderName); folderByName.set(key, folder); } if (!folder.sessionIds.includes(session.id)) { addSessionToFolder(scopeKey, folder.id, session.id); } }); }); }, [ normalizedProjects, enabled, ownership, isSessionsLoading, hasAuthoritativeGlobalSessions, isWorktreeTopologyLoading, unresolvedWorktreeProjectPaths, foldersMap, createFolder, addSessionToFolder, ]); };