-
Notifications
You must be signed in to change notification settings - Fork 13
/
webviewInstance.ts
84 lines (74 loc) · 2.51 KB
/
webviewInstance.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
* Copyright (c) 2021, salesforce.com, inc.
* All rights reserved.
* Licensed under the BSD 3-Clause license.
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
*/
import * as vscode from 'vscode';
import * as fs from 'fs';
import * as path from 'path';
import { HTML_FILE, LWC_BUILDER_UI_PATH } from './constants';
import { HtmlUtils } from './htmlUtils';
import { LWCBuilderEvent } from './lwcBuilderEvent';
import { createLwcFolder } from './lwcBuilderHandler';
export class WebviewInstance {
public subscriptions: vscode.Disposable[] = [];
private webviewPanel: vscode.WebviewPanel;
private lwcFolderUri: vscode.Uri;
constructor(context: vscode.ExtensionContext, uri: vscode.Uri) {
// Create webview panel
this.webviewPanel = vscode.window.createWebviewPanel(
'lwcBuilder',
'LWC Builder',
vscode.ViewColumn.One,
{
// Enable scripts in the webview
enableScripts: true,
retainContextWhenHidden: true,
}
);
// Set webview panel content
this.webviewPanel.webview.html = this.getWebviewContent(
context,
this.webviewPanel.webview
);
// Define handler for received messages
this.webviewPanel.webview.onDidReceiveMessage(
this.onDidReceiveMessageHandler,
this,
this.subscriptions
);
// Make sure we get rid of the event listeners when our editor is closed
this.webviewPanel.onDidDispose(this.dispose, this, this.subscriptions);
this.lwcFolderUri = uri;
}
private getWebviewContent(
context: vscode.ExtensionContext,
webview: vscode.Webview
) {
const pathToLwcDist = path.join(context.extensionPath, LWC_BUILDER_UI_PATH);
const pathToHtml = path.join(pathToLwcDist, HTML_FILE);
let html = fs.readFileSync(pathToHtml).toString();
html = HtmlUtils.transformHtml(html, pathToLwcDist, webview);
return html;
}
protected async onDidReceiveMessageHandler(
event: LWCBuilderEvent
): Promise<void> {
// Handle messages from the webview
switch (event.type) {
case 'create_button_clicked':
await createLwcFolder(event.payload, this.lwcFolderUri);
this.webviewPanel.dispose();
return;
case 'error':
vscode.window.showErrorMessage(event.error);
return;
default:
vscode.window.showInformationMessage(`Unknown event: ${event.type}`);
}
}
protected dispose(): void {
this.subscriptions.forEach((disposable) => disposable.dispose());
}
}