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;
|
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);
|
await finalizeSelection(result.path);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
toast.error(t('directoryExplorerDialog.toast.failedToSelectDirectory'), {
|
toast.error(t('directoryExplorerDialog.toast.failedToSelectDirectory'), {
|
||||||
|
|||||||
@@ -658,9 +658,13 @@ export const useProjectsStore = create<ProjectsStore>()(
|
|||||||
if (isVSCodeProjectsRuntime) {
|
if (isVSCodeProjectsRuntime) {
|
||||||
// VS Code paths are added via runtimeApis.vscode.addWorkspaceFolder,
|
// VS Code paths are added via runtimeApis.vscode.addWorkspaceFolder,
|
||||||
// which is reached only by addProject. Iterate so valid selections
|
// 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 added: ProjectEntry[] = [];
|
||||||
|
const seen = new Set<string>();
|
||||||
for (const path of paths) {
|
for (const path of paths) {
|
||||||
|
if (seen.has(path)) continue;
|
||||||
|
seen.add(path);
|
||||||
const project = await get().addProject(path);
|
const project = await get().addProject(path);
|
||||||
if (project) {
|
if (project) {
|
||||||
added.push(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).
|
// final projects state (covered by the dedicated addProject tests).
|
||||||
expect(added.length).toBeGreaterThanOrEqual(1);
|
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