Skip to content

Commit b942e4d

Browse files
committed
fix: improve Magento project configuration handling and dispose logic
1 parent 71d5b36 commit b942e4d

File tree

3 files changed

+60
-11
lines changed

3 files changed

+60
-11
lines changed

src/extension.ts

+30-5
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,29 @@ import * as vscode from 'vscode';
22
import { promptMagentoProjectSelection, showErrorMessage, activateExtension, isValidPath, deleteReportFile } from './helpers';
33
import { LogItem, ReportViewerProvider } from './logViewer';
44

5+
let disposables: vscode.Disposable[] = [];
6+
57
export function activate(context: vscode.ExtensionContext): void {
6-
const config = vscode.workspace.getConfiguration();
7-
const isMagentoProject = config.get<string>('magentoLogViewer.isMagentoProject', 'Please select');
8+
// Get workspace folders
9+
const workspaceFolders = vscode.workspace.workspaceFolders;
10+
const workspaceUri = workspaceFolders?.[0]?.uri || null;
11+
12+
// Get configuration with resource scope
13+
const config = vscode.workspace.getConfiguration('magentoLogViewer', workspaceUri);
14+
const isMagentoProject = config.get<string>('isMagentoProject', 'Please select');
815

916
if (isMagentoProject === 'Please select') {
1017
promptMagentoProjectSelection(config, context);
1118
} else if (isMagentoProject === 'Yes') {
12-
const magentoRoot = config.get<string>('magentoLogViewer.magentoRoot', '');
19+
const magentoRoot = config.get<string>('magentoRoot', '');
1320
if (!magentoRoot || !isValidPath(magentoRoot)) {
1421
showErrorMessage('Magento root path is not set or is not a directory.');
1522
return;
1623
}
1724
const reportViewerProvider = new ReportViewerProvider(magentoRoot);
1825
activateExtension(context, magentoRoot, reportViewerProvider);
1926

20-
vscode.commands.registerCommand('magento-log-viewer.deleteReportFile', (logItem: LogItem) => {
27+
const deleteCommand = vscode.commands.registerCommand('magento-log-viewer.deleteReportFile', (logItem: LogItem) => {
2128
if (logItem && logItem.command && logItem.command.arguments && logItem.command.arguments[0]) {
2229
const filePath = logItem.command.arguments[0];
2330
deleteReportFile(filePath);
@@ -26,7 +33,25 @@ export function activate(context: vscode.ExtensionContext): void {
2633
showErrorMessage('Failed to delete report file: Invalid file path.');
2734
}
2835
});
36+
37+
disposables.push(deleteCommand);
38+
context.subscriptions.push(...disposables);
2939
}
3040
}
3141

32-
export function deactivate(): void {}
42+
export function deactivate(): void {
43+
// Clear any context values we set
44+
vscode.commands.executeCommand('setContext', 'magentoLogViewer.hasMagentoRoot', undefined);
45+
46+
// Dispose of all disposables
47+
while (disposables.length) {
48+
const disposable = disposables.pop();
49+
if (disposable) {
50+
try {
51+
disposable.dispose();
52+
} catch (err) {
53+
console.error('Error disposing:', err);
54+
}
55+
}
56+
}
57+
}

src/helpers.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ export function selectMagentoRootFolder(config: vscode.WorkspaceConfiguration, c
2424
const defaultUri = workspaceFolders && workspaceFolders.length > 0 ? workspaceFolders[0].uri : undefined;
2525
vscode.window.showOpenDialog({ defaultUri, canSelectFolders: true, canSelectMany: false, openLabel: 'Select Magento Root Folder' }).then(folderUri => {
2626
if (folderUri?.[0]) {
27-
updateConfig(config, 'magentoLogViewer.magentoRoot', folderUri[0].fsPath).then(() => {
27+
const newConfig = vscode.workspace.getConfiguration('magentoLogViewer', folderUri[0]);
28+
updateConfig(newConfig, 'magentoLogViewer.magentoRoot', folderUri[0].fsPath).then(() => {
2829
showInformationMessage('Magento root folder successfully saved!');
29-
updateConfig(config, 'magentoLogViewer.isMagentoProject', 'Yes');
30+
updateConfig(newConfig, 'magentoLogViewer.isMagentoProject', 'Yes');
3031
activateExtension(context, folderUri[0].fsPath, new ReportViewerProvider(folderUri[0].fsPath));
3132
});
3233
}

src/logViewer.ts

+27-4
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,18 @@ export class LogViewerProvider implements vscode.TreeDataProvider<LogItem>, vsco
88
readonly onDidChangeTreeData: vscode.Event<LogItem | undefined | void> = this._onDidChangeTreeData.event;
99
public static statusBarItem: vscode.StatusBarItem;
1010
private groupByMessage: boolean;
11+
private disposables: vscode.Disposable[] = [];
1112

1213
constructor(private workspaceRoot: string) {
1314
if (!LogViewerProvider.statusBarItem) {
1415
LogViewerProvider.statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100);
1516
LogViewerProvider.statusBarItem.command = 'magento-log-viewer.refreshLogFiles';
1617
LogViewerProvider.statusBarItem.show();
1718
}
18-
this.groupByMessage = vscode.workspace.getConfiguration('magentoLogViewer').get<boolean>('groupByMessage', true);
19+
20+
const workspaceUri = vscode.workspace.workspaceFolders?.[0]?.uri || null;
21+
const config = vscode.workspace.getConfiguration('magentoLogViewer', workspaceUri);
22+
this.groupByMessage = config.get<boolean>('groupByMessage', true);
1923
this.updateBadge();
2024
this.updateRefreshButtonVisibility();
2125
}
@@ -197,17 +201,30 @@ export class LogViewerProvider implements vscode.TreeDataProvider<LogItem>, vsco
197201
}
198202

199203
dispose() {
200-
// Do not dispose the status bar item here to avoid multiple creations
204+
this._onDidChangeTreeData.dispose();
205+
if (LogViewerProvider.statusBarItem) {
206+
LogViewerProvider.statusBarItem.dispose();
207+
LogViewerProvider.statusBarItem = null as any;
208+
}
209+
while (this.disposables.length) {
210+
const disposable = this.disposables.pop();
211+
if (disposable) {
212+
disposable.dispose();
213+
}
214+
}
201215
}
202216
}
203217

204218
export class ReportViewerProvider implements vscode.TreeDataProvider<LogItem>, vscode.Disposable {
205219
private _onDidChangeTreeData: vscode.EventEmitter<LogItem | undefined | void> = new vscode.EventEmitter<LogItem | undefined | void>();
206220
readonly onDidChangeTreeData: vscode.Event<LogItem | undefined | void> = this._onDidChangeTreeData.event;
207221
private groupByMessage: boolean;
222+
private disposables: vscode.Disposable[] = [];
208223

209224
constructor(private workspaceRoot: string) {
210-
this.groupByMessage = vscode.workspace.getConfiguration('magentoLogViewer').get<boolean>('groupByMessage', true);
225+
const workspaceUri = vscode.workspace.workspaceFolders?.[0]?.uri || null;
226+
const config = vscode.workspace.getConfiguration('magentoLogViewer', workspaceUri);
227+
this.groupByMessage = config.get<boolean>('groupByMessage', true);
211228
}
212229

213230
refresh(): void {
@@ -289,7 +306,13 @@ export class ReportViewerProvider implements vscode.TreeDataProvider<LogItem>, v
289306
}
290307

291308
dispose() {
292-
// Implement dispose logic if needed
309+
this._onDidChangeTreeData.dispose();
310+
while (this.disposables.length) {
311+
const disposable = this.disposables.pop();
312+
if (disposable) {
313+
disposable.dispose();
314+
}
315+
}
293316
}
294317
}
295318

0 commit comments

Comments
 (0)