From da2145ae25b3bafbc663dbc1ff082753d78f006d Mon Sep 17 00:00:00 2001 From: Isaac Sanchez-Hawkins <266845420+isanchez404@users.noreply.github.com> Date: Fri, 8 May 2026 08:41:23 -0400 Subject: [PATCH] fix(files): ignore stale directory refreshes (#1148) Co-authored-by: Isaac Sanchez --- .../ui/src/components/views/FilesView.tsx | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/ui/src/components/views/FilesView.tsx b/packages/ui/src/components/views/FilesView.tsx index b3aea205..9cde855a 100644 --- a/packages/ui/src/components/views/FilesView.tsx +++ b/packages/ui/src/components/views/FilesView.tsx @@ -648,6 +648,8 @@ export const FilesView: React.FC = ({ mode = 'full' }) => { const [childrenByDir, setChildrenByDir] = React.useState>({}); const loadedDirsRef = React.useRef>(new Set()); const inFlightDirsRef = React.useRef>(new Set()); + const activeDirectoryLoadIdsRef = React.useRef>(new Map()); + const nextDirectoryLoadIdRef = React.useRef(0); const [searchResults, setSearchResults] = React.useState([]); const [searching, setSearching] = React.useState(false); @@ -900,6 +902,12 @@ export const FilesView: React.FC = ({ mode = 'full' }) => { inFlightDirsRef.current = new Set(inFlightDirsRef.current); inFlightDirsRef.current.add(normalizedDir); + const requestId = nextDirectoryLoadIdRef.current + 1; + nextDirectoryLoadIdRef.current = requestId; + activeDirectoryLoadIdsRef.current = new Map(activeDirectoryLoadIdsRef.current); + activeDirectoryLoadIdsRef.current.set(normalizedDir, requestId); + + const isCurrentRequest = () => activeDirectoryLoadIdsRef.current.get(normalizedDir) === requestId; const respectGitignore = !showGitignored; const listPromise = runtime.isDesktop @@ -916,6 +924,10 @@ export const FilesView: React.FC = ({ mode = 'full' }) => { await listPromise .then((entries) => { + if (!isCurrentRequest()) { + return; + } + const mapped = mapDirectoryEntries(normalizedDir, entries); loadedDirsRef.current = new Set(loadedDirsRef.current); @@ -923,12 +935,22 @@ export const FilesView: React.FC = ({ mode = 'full' }) => { setChildrenByDir((prev) => ({ ...prev, [normalizedDir]: mapped })); }) .catch(() => { + if (!isCurrentRequest()) { + return; + } + setChildrenByDir((prev) => ({ ...prev, [normalizedDir]: prev[normalizedDir] ?? [], })); }) .finally(() => { + if (!isCurrentRequest()) { + return; + } + + activeDirectoryLoadIdsRef.current = new Map(activeDirectoryLoadIdsRef.current); + activeDirectoryLoadIdsRef.current.delete(normalizedDir); inFlightDirsRef.current = new Set(inFlightDirsRef.current); inFlightDirsRef.current.delete(normalizedDir); }); @@ -941,6 +963,7 @@ export const FilesView: React.FC = ({ mode = 'full' }) => { loadedDirsRef.current = new Set(); inFlightDirsRef.current = new Set(); + activeDirectoryLoadIdsRef.current = new Map(); setChildrenByDir((prev) => (Object.keys(prev).length === 0 ? prev : {})); await loadDirectory(root); @@ -996,6 +1019,7 @@ export const FilesView: React.FC = ({ mode = 'full' }) => { lastFilesViewTreeKeyRef.current = treeKey; loadedDirsRef.current = new Set(); inFlightDirsRef.current = new Set(); + activeDirectoryLoadIdsRef.current = new Map(); setChildrenByDir((prev) => (Object.keys(prev).length === 0 ? prev : {})); void loadDirectory(root); }