typescript - Trimiterea unui mesaj de la webview la extensie


Am un webview (SidebarProvider) care îi permite utilizatorului să introducă un input și să îl trimită. Vreau să trimit un astfel de input către o extensie SearchedWordPanel.

Pași :

  1. În vizualizarea mea Sidebar (html, js și css), utilizatorul tastează un cuvânt și apasă „căutare”. (Funcționează)
  2. Cuvântul este trimis către SidebarProvider, care primește mesajul folosind onDidReceiveMessage și rulează comanda pentru a afișa SearchedWordPanel. (Funcționează)
  3. SearchedWordPanel se deschide și afișează cuvântul introdus de utilizator. (Întrebare)

Pot să fac punctele 1 și 2, dar nu să trimit cuvântul căutat către SearchedWordPanel.

extensii.ts

const sidebarProvider = new SidebarProvider(context.extensionUri);
  context.subscriptions.push(
    vscode.window.registerWebviewViewProvider(
      "vsmyapp-sidebar",
      sidebarProvider
    )
  );

context.subscriptions.push(
  vscode.commands.registerCommand('vsmyapp.showSearched', () => {
    SearchedWordPanel.kill();
    SearchedWordPanel.createOrShow(context.extensionUri);
  })
);

VizualizareBaraLaterală

<button on:click={() =>
  tsvscode.postMessage({
    type: 'onSearch',
    value: searchedText
  })
}>Search</button>

FurnizorSidebar

webviewView.webview.onDidReceiveMessage(async (data) => {
  switch (data.type) {
    case "onSearch" : {
      if (!data.value) {
        return;
      }
      vscode.window.showInformationMessage(data.value); <-- WORKS
      vscode.commands.executeCommand( <--WORKS, the command is run. BUT How do I send data.value to SearchedWordPanel?
        "vsmyapp.showSearched",
      );
      COMMAND_THAT_SENDS_(data.value)_TO_SearchedWordPanel // Pseudocode
      break;
    }

Întrebare: cum pot trimite data.value către SearchedWordPanel atunci când execut vscode.commands.executeCommand("vsmyapp.showSearched"); în SidebarProvider?

Răspuns #1

Webview are postMessage - https://code.visualstudio.com/api/extension-guides/webview#passing-messages-from-an-extension-to-a-webview.

Nu sunt sigur ce este SearchedWordPanel (nu este un WebviewPanel), probabil un înveliș.

Să spunem că SearchedWordPanel are ca prop panel WebviewPanel nativ. Pentru a-i trimite un mesaj, poți face:

SearchedWordPanel.panel.postMessage()