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:
@@ -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'), {
|
||||
|
||||
@@ -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',
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user