Skip to content

Commit 064e02d

Browse files
committed
refactor to remove code duplication when setting context
1 parent 3374772 commit 064e02d

4 files changed

Lines changed: 77 additions & 49 deletions

File tree

src/features/views/envManagersView.ts

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525

2626
const COPIED_STATE = 'copied';
2727
const SELECTED_STATE = 'selected';
28+
const ENV_STATE_KEYS = [COPIED_STATE, SELECTED_STATE];
2829

2930
export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable {
3031
private treeView: TreeView<EnvTreeItem>;
@@ -92,27 +93,12 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable
9293
getTreeItem(element: EnvTreeItem): TreeItem | Thenable<TreeItem> {
9394
if (element.kind === EnvTreeItemKind.environment && element instanceof PythonEnvTreeItem) {
9495
const itemId = element.environment.envId.id;
95-
let currentContext = element.treeItem.contextValue ?? '';
96-
97-
// Handle copied state
98-
if (this.stateManager.hasState(itemId, COPIED_STATE)) {
99-
if (!currentContext.includes(COPIED_STATE)) {
100-
currentContext = currentContext + COPIED_STATE + ';';
101-
}
102-
} else if (currentContext.includes(COPIED_STATE)) {
103-
currentContext = currentContext.replace(COPIED_STATE + ';', '');
104-
}
105-
106-
// Handle selected state
107-
if (this.stateManager.hasState(itemId, SELECTED_STATE)) {
108-
if (!currentContext.includes(SELECTED_STATE)) {
109-
currentContext = currentContext + SELECTED_STATE + ';';
110-
}
111-
} else if (currentContext.includes(SELECTED_STATE)) {
112-
currentContext = currentContext.replace(SELECTED_STATE + ';', '');
113-
}
114-
115-
element.treeItem.contextValue = currentContext;
96+
const currentContext = element.treeItem.contextValue ?? '';
97+
element.treeItem.contextValue = this.stateManager.updateContextValue(
98+
itemId,
99+
currentContext,
100+
ENV_STATE_KEYS,
101+
);
116102
}
117103
return element.treeItem;
118104
}

src/features/views/projectView.ts

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828

2929
const COPIED_STATE = 'copied';
3030
const SELECTED_STATE = 'selected';
31+
const ENV_STATE_KEYS = [COPIED_STATE, SELECTED_STATE];
3132

3233
export class ProjectView implements TreeDataProvider<ProjectTreeItem> {
3334
private treeView: TreeView<ProjectTreeItem>;
@@ -146,36 +147,17 @@ export class ProjectView implements TreeDataProvider<ProjectTreeItem> {
146147
if (element.kind === ProjectTreeItemKind.project && element instanceof ProjectItem) {
147148
const itemId = element.project.uri.fsPath;
148149
const currentContext = element.treeItem.contextValue ?? '';
149-
if (this.stateManager.hasState(itemId, COPIED_STATE)) {
150-
if (!currentContext.includes(COPIED_STATE)) {
151-
element.treeItem.contextValue = currentContext + ';' + COPIED_STATE;
152-
}
153-
} else if (currentContext.includes(COPIED_STATE)) {
154-
element.treeItem.contextValue = currentContext.replace(';' + COPIED_STATE, '');
155-
}
150+
element.treeItem.contextValue = this.stateManager.updateContextValue(itemId, currentContext, [
151+
COPIED_STATE,
152+
]);
156153
} else if (element.kind === ProjectTreeItemKind.environment && element instanceof ProjectEnvironment) {
157154
const itemId = element.environment.envId.id;
158-
let currentContext = element.treeItem.contextValue ?? '';
159-
160-
// Handle copied state
161-
if (this.stateManager.hasState(itemId, COPIED_STATE)) {
162-
if (!currentContext.includes(COPIED_STATE)) {
163-
currentContext = currentContext + ';' + COPIED_STATE;
164-
}
165-
} else if (currentContext.includes(COPIED_STATE)) {
166-
currentContext = currentContext.replace(';' + COPIED_STATE, '');
167-
}
168-
169-
// Handle selected state
170-
if (this.stateManager.hasState(itemId, SELECTED_STATE)) {
171-
if (!currentContext.includes(SELECTED_STATE)) {
172-
currentContext = currentContext + ';' + SELECTED_STATE;
173-
}
174-
} else if (currentContext.includes(SELECTED_STATE)) {
175-
currentContext = currentContext.replace(';' + SELECTED_STATE, '');
176-
}
177-
178-
element.treeItem.contextValue = currentContext;
155+
const currentContext = element.treeItem.contextValue ?? '';
156+
element.treeItem.contextValue = this.stateManager.updateContextValue(
157+
itemId,
158+
currentContext,
159+
ENV_STATE_KEYS,
160+
);
179161
}
180162
return element.treeItem;
181163
}

src/features/views/temporaryStateManager.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,34 @@ export class TemporaryStateManager implements Disposable {
6565
return this.activeItems.get(itemId)?.has(stateKey) ?? false;
6666
}
6767

68+
/**
69+
* Updates a contextValue string by adding or removing state keys based on current state.
70+
* @param itemId The item ID to check states for
71+
* @param currentContext The current contextValue string
72+
* @param stateKeys The state keys to check and update
73+
* @param separator The separator to use when adding states (default: ';')
74+
* @returns The updated contextValue string
75+
*/
76+
public updateContextValue(
77+
itemId: string,
78+
currentContext: string,
79+
stateKeys: string[],
80+
separator: string = ';',
81+
): string {
82+
let result = currentContext;
83+
for (const stateKey of stateKeys) {
84+
const stateWithSeparator = separator + stateKey;
85+
if (this.hasState(itemId, stateKey)) {
86+
if (!result.includes(stateKey)) {
87+
result = result + stateWithSeparator;
88+
}
89+
} else if (result.includes(stateKey)) {
90+
result = result.replace(stateWithSeparator, '');
91+
}
92+
}
93+
return result;
94+
}
95+
6896
public dispose(): void {
6997
this.timeouts.forEach((timeout) => clearTimeout(timeout));
7098
this.timeouts.clear();

src/test/features/views/temporaryStateManager.unit.test.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,36 @@ suite('TemporaryStateManager', () => {
7171
manager.setState('item-2', 'selected');
7272
manager.dispose();
7373
});
74+
75+
suite('updateContextValue', () => {
76+
test('adds state key when state is set', () => {
77+
manager.setState('item-1', 'copied');
78+
const result = manager.updateContextValue('item-1', 'pythonEnvironment', ['copied']);
79+
assert.strictEqual(result, 'pythonEnvironment;copied');
80+
});
81+
82+
test('removes state key when state is not set', () => {
83+
const result = manager.updateContextValue('item-1', 'pythonEnvironment;copied', ['copied']);
84+
assert.strictEqual(result, 'pythonEnvironment');
85+
});
86+
87+
test('handles multiple state keys', () => {
88+
manager.setState('item-1', 'copied');
89+
manager.setState('item-1', 'selected');
90+
const result = manager.updateContextValue('item-1', 'pythonEnvironment', ['copied', 'selected']);
91+
assert.strictEqual(result, 'pythonEnvironment;copied;selected');
92+
});
93+
94+
test('only adds states that are set', () => {
95+
manager.setState('item-1', 'selected');
96+
const result = manager.updateContextValue('item-1', 'pythonEnvironment', ['copied', 'selected']);
97+
assert.strictEqual(result, 'pythonEnvironment;selected');
98+
});
99+
100+
test('does not duplicate existing state', () => {
101+
manager.setState('item-1', 'copied');
102+
const result = manager.updateContextValue('item-1', 'pythonEnvironment;copied', ['copied']);
103+
assert.strictEqual(result, 'pythonEnvironment;copied');
104+
});
105+
});
74106
});

0 commit comments

Comments
 (0)