diff --git a/packages/app/src/components/directory-picker-domain.test.ts b/packages/app/src/components/directory-picker-domain.test.ts index aeaaafde3ed1..242b9d60f61c 100644 --- a/packages/app/src/components/directory-picker-domain.test.ts +++ b/packages/app/src/components/directory-picker-domain.test.ts @@ -237,6 +237,47 @@ test("searches from an absolute root without a default base", async () => { expect(directories).toEqual(["/"]) }) +test("retries a failed directory listing without reopening the picker", async () => { + let attempts = 0 + const sdk = { + api: { + file: { + list: () => { + attempts++ + if (attempts === 1) return Promise.reject(new Error("Permission denied")) + return Promise.resolve({ data: [{ path: "My project 日本語/", type: "directory" }] }) + }, + }, + }, + } as unknown as Parameters[0]["sdk"] + const search = createDirectorySearch({ sdk, home: () => "/home/luke", base: () => "/home/luke" }) + + expect(await search("~/")).toEqual(["/home/luke"]) + expect(await search("~/")).toEqual(["/home/luke", "/home/luke/My project 日本語"]) + expect(await search("~/My")).toEqual(["/home/luke/My project 日本語"]) + expect(attempts).toBe(2) +}) + +test("does not replace newer results when an earlier directory listing fails", async () => { + const pending = Promise.withResolvers<{ data: { path: string; type: string }[] }>() + const sdk = { + api: { + file: { + list: (input: { location?: { directory?: string } }) => + input.location?.directory === "/home/luke" + ? pending.promise + : Promise.resolve({ data: [{ path: "project/", type: "directory" }] }), + }, + }, + } as unknown as Parameters[0]["sdk"] + const search = createDirectorySearch({ sdk, home: () => "/home/luke", base: () => "/home/luke" }) + + const previous = search("~/") + expect(await search("/project")).toEqual(["/project", "/project/project"]) + pending.reject(new Error("Disconnected")) + expect(await previous).toEqual([]) +}) + test("identifies the next directory level to preload", () => { expect( preloadTreeDirectories("src/", [ diff --git a/packages/app/src/components/directory-picker-domain.ts b/packages/app/src/components/directory-picker-domain.ts index dfd8ee74addc..628c20f75375 100644 --- a/packages/app/src/components/directory-picker-domain.ts +++ b/packages/app/src/components/directory-picker-domain.ts @@ -345,7 +345,10 @@ export function createDirectorySearch(args: { sdk: ServerSDK; base: () => string const request = args.sdk.api.file .list({ location: { directory: key } }) .then((result) => result.data) - .catch(() => []) + .catch(() => { + cache.delete(key) + return [] + }) .then((nodes) => nodes .filter((node) => node.type === "directory")