diff --git a/src/contexts/FileContext.tsx b/src/contexts/FileContext.tsx index 8ddf8ae..1128287 100644 --- a/src/contexts/FileContext.tsx +++ b/src/contexts/FileContext.tsx @@ -89,6 +89,8 @@ export function FileProvider({ children }: { children: React.ReactNode }) { useEffect(() => { setExpandedFolderIds(_loadExpanded(storageKey)); + setTreeFilesMap(new Map()); + setFolders([]); }, [storageKey]); // ── Folder state ────────────────────────────────────────────────────── @@ -108,7 +110,7 @@ export function FileProvider({ children }: { children: React.ReactNode }) { } }, []); - useEffect(() => { refreshFolders(); }, [refreshFolders]); + useEffect(() => { refreshFolders(); }, [refreshFolders, storageKey]); // ── Tree files: lazy-loaded per expanded folder ─────────────────────── const [treeFilesMap, setTreeFilesMap] = useState>(new Map()); @@ -158,19 +160,18 @@ export function FileProvider({ children }: { children: React.ReactNode }) { ); }, [treeFilesMap, loadTreeFiles]); - // Load root files on mount - useEffect(() => { loadTreeFiles(''); }, [loadTreeFiles]); + // Load root files on mount and on context change + useEffect(() => { loadTreeFiles(''); }, [loadTreeFiles, storageKey]); - // Load files for initially expanded folders + // Load files for expanded folders on mount and context change useEffect(() => { expandedFolderIds.forEach(id => { if (!treeFilesMap.has(id)) { loadTreeFiles(id); } }); - // Only on mount – don't re-run when treeFilesMap changes // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + }, [storageKey]); const treeFileNodes: FileNode[] = useMemo(() => { const result: FileNode[] = []; diff --git a/src/pages/basedata/FilesPage.tsx b/src/pages/basedata/FilesPage.tsx index d3bb5dc..446539c 100644 --- a/src/pages/basedata/FilesPage.tsx +++ b/src/pages/basedata/FilesPage.tsx @@ -120,6 +120,24 @@ export const FilesPage: React.FC = () => { await Promise.all([_tableRefetch(), refreshTreeFiles(), refreshFolders()]); }, [_tableRefetch, refreshTreeFiles, refreshFolders]); + const _handleScopeChange = useCallback(async (fileId: string, newScope: string) => { + try { + await api.patch(`/api/files/${fileId}/scope`, { scope: newScope }); + await Promise.all([refreshTreeFiles(), _tableRefetch()]); + } catch (err) { + console.error('Failed to update scope:', err); + } + }, [refreshTreeFiles, _tableRefetch]); + + const _handleNeutralizeToggle = useCallback(async (fileId: string, newValue: boolean) => { + try { + await api.patch(`/api/files/${fileId}/neutralize`, { neutralize: newValue }); + await Promise.all([refreshTreeFiles(), _tableRefetch()]); + } catch (err) { + console.error('Failed to toggle neutralize:', err); + } + }, [refreshTreeFiles, _tableRefetch]); + // ── Folder nodes for tree (real folders only) ──────────────────────── const folderNodes = useMemo(() => { return folders.map(f => ({ @@ -386,6 +404,8 @@ export const FilesPage: React.FC = () => { onDeleteFiles={_handleDeleteTreeFiles} onDeleteFolders={_handleDeleteTreeFolders} onDownloadFolder={handleDownloadFolder} + onScopeChange={_handleScopeChange} + onNeutralizeToggle={_handleNeutralizeToggle} />