openAPIPreviewTab()

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);
        });
      }
    });
  }