summaryrefslogtreecommitdiff
path: root/extension/react-app/src/vscode/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'extension/react-app/src/vscode/index.ts')
-rw-r--r--extension/react-app/src/vscode/index.ts47
1 files changed, 47 insertions, 0 deletions
diff --git a/extension/react-app/src/vscode/index.ts b/extension/react-app/src/vscode/index.ts
new file mode 100644
index 00000000..7e373cd9
--- /dev/null
+++ b/extension/react-app/src/vscode/index.ts
@@ -0,0 +1,47 @@
+import { useEffect, useState } from "react";
+import "vscode-webview";
+
+declare const vscode: any;
+
+export function postVscMessage(type: string, data: any) {
+ if (typeof vscode === "undefined") {
+ return;
+ }
+ vscode.postMessage({
+ type,
+ ...data,
+ });
+}
+
+export async function vscRequest(type: string, data: any): Promise<any> {
+ 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<any>(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<any>) {
+ postVscMessage("withProgress", { title, done: false });
+ return fn().finally(() => {
+ postVscMessage("withProgress", { title, done: true });
+ });
+}