in src/webview.ts [113:179]
openAPIPreviewTab(extensionUri: vscode.Uri, apiMeta, filePath) {
const panelKey = filePath;
const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined;
let webview = AlicloudAPIWebview.webviewPanels[panelKey];
// If we already have a panel, show it.
if (webview) {
webview.reveal(column);
return;
}
// Otherwise, create a new panel.
AlicloudAPIWebview.webviewPanels[panelKey] = vscode.window.createWebviewPanel(
AlicloudAPIWebview.viewType,
apiMeta.name,
vscode.ViewColumn.Beside,
{
// Enable javascript in the webview
enableScripts: true,
retainContextWhenHidden: true,
},
);
const filewatcher = vscode.workspace.createFileSystemWatcher(filePath, true, false, true);
filewatcher.onDidChange(async (e) => {
const newFileContent = await fs.readFile(filePath, "utf8");
try {
const meta = JSON.parse(newFileContent);
webview.webview.postMessage({
type: "updateItemMeta",
data: meta,
});
} catch (e) {}
});
webview = AlicloudAPIWebview.webviewPanels[panelKey];
webview.onDidDispose(() => {
filewatcher.dispose();
webview.dispose();
webview = null;
delete AlicloudAPIWebview.webviewPanels[panelKey];
});
webview.title = apiMeta.name;
const iconPath = vscode.Uri.joinPath(extensionUri, "resources/api-outline.svg");
webview.iconPath = iconPath;
webview.webview.html = htmlTemplate(
{
getUri: (assetUri) => webview.webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, assetUri)),
cspSource: webview.webview.cspSource,
},
{
specName: "",
modName: "",
name: apiMeta.name,
spec: apiMeta,
pageType: "document",
schemaType: "api",
displayLanguage: getCurrentLang(),
},
);
webview.webview.onDidReceiveMessage((message) => {
if (message.type && message.requestId) {
alicloudAPIMessageService.exectService(message).then((result) => {
webview.webview.postMessage(result);
});
}
});
}