import { useEffect, useState } from "react"; import "vscode-webview"; declare const vscode: any; export function postVscMessage(type: string, data: any) { if (typeof vscode === "undefined") { console.log("Unable to send message: vscode is undefined"); return; } vscode.postMessage({ type, ...data, }); } export async function vscRequest(type: string, data: any): Promise { return new Promise((resolve) => { const handler = (event: any) => { if (event.data.type === type) { window.removeEventListener("message", handler); resolve(event.data); } }; window.addEventListener("message", handler); postVscMessage(type, data); }); } export function useVscMessageValue( messageType: string | string[], initialValue?: any ) { const [value, setValue] = useState(initialValue); window.addEventListener("message", (event) => { if (event.data.type === messageType) { setValue(event.data.value); } }); return [value, setValue]; } export async function withProgress(title: string, fn: () => Promise) { postVscMessage("withProgress", { title, done: false }); return fn().finally(() => { postVscMessage("withProgress", { title, done: true }); }); }