fix(directory-explorer): clear selections on Finder pick; dedup VS Code batch

Two findings from the openchamber-bot review at 478f1e9c:

1. Pending selections silently swallowed the Open-in-Finder pick
   (prev #4). handleOpenInFinder flows into the batch-first branch of
   finalizeSelection, so with checkboxes ticked the OS pick was
   ignored and the selections were added instead. Clear selectedPaths
   before finalizeSelection so the Finder-sourced target is honored.

2. Within-batch dedup was missing in the VS Code branch (nit from
   the previous review). A path repeated within one batch hit
   addWorkspaceFolder twice. Mirror the non-VS Code contract with
   a seen Set; add a regression test asserting the host is called
   once per unique path.
This commit is contained in:
herjarsa
2026-08-28 19:15:39 +02:00
parent 478f1e9c03
commit 23219d4049
3 changed files with 24 additions and 1 deletions
@@ -555,6 +555,9 @@ export const DirectoryExplorerDialog: React.FC<DirectoryExplorerDialogProps> = (
return;
}
// Clear pending selections so the Finder-sourced target is honored
// instead of silently being absorbed by the batch branch.
setSelectedPaths([]);
await finalizeSelection(result.path);
} catch (error) {
toast.error(t('directoryExplorerDialog.toast.failedToSelectDirectory'), {
+5 -1
View File
@@ -658,9 +658,13 @@ export const useProjectsStore = create<ProjectsStore>()(
if (isVSCodeProjectsRuntime) {
// VS Code paths are added via runtimeApis.vscode.addWorkspaceFolder,
// which is reached only by addProject. Iterate so valid selections
// succeed instead of silently returning [].
// succeed instead of silently returning []. Dedupe by path so the
// returned array mirrors the non-VS Code contract.
const added: ProjectEntry[] = [];
const seen = new Set<string>();
for (const path of paths) {
if (seen.has(path)) continue;
seen.add(path);
const project = await get().addProject(path);
if (project) {
added.push(project);
@@ -157,4 +157,20 @@ describe('issue #2582: addProject in the VS Code runtime', () => {
// final projects state (covered by the dedicated addProject tests).
expect(added.length).toBeGreaterThanOrEqual(1);
});
test('addProjects dedupes paths within a single batch in the VS Code runtime', async () => {
// A path repeated within one batch must hit the extension host once,
// not twice — mirrors the non-VS Code contract (seenPaths Set).
addWorkspaceFolderCalls.length = 0;
await useProjectsStore.getState().addProjects([
'/home/user/project-a',
'/home/user/project-a',
'/home/user/project-b',
]);
expect(addWorkspaceFolderCalls).toEqual([
'/home/user/project-a',
'/home/user/project-b',
]);
});
});