From 72053246cbda476c601131e79d0e666e194868a8 Mon Sep 17 00:00:00 2001 From: Tim <tymmesyde@gmail.com> Date: Thu, 27 Feb 2025 22:55:23 +0100 Subject: [PATCH] fix(useShell): use chrome.webview instead of qt webChannelTransport --- src/common/useShell.ts | 10 ++++++---- src/types/global.d.ts | 11 +++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/common/useShell.ts b/src/common/useShell.ts index 7baab60bc..1a7bcb6ee 100644 --- a/src/common/useShell.ts +++ b/src/common/useShell.ts @@ -2,7 +2,7 @@ import { useEffect } from 'react'; import EventEmitter from 'eventemitter3'; const SHELL_EVENT_OBJECT = 'transport'; -const transport = globalThis?.qt?.webChannelTransport; +const transport = globalThis?.chrome?.webview; const events = new EventEmitter(); enum ShellEventType { @@ -30,7 +30,7 @@ const useShell = () => { const send = (method: string, ...args: (string | number)[]) => { try { - transport?.send(JSON.stringify({ + transport?.postMessage(JSON.stringify({ id: createId(), type: ShellEventType.INVOKE_METHOD, object: SHELL_EVENT_OBJECT, @@ -45,10 +45,9 @@ const useShell = () => { useEffect(() => { if (!transport) return; - transport.onmessage = ({ data }) => { + const onMessage = ({ data }: { data: string }) => { try { const { type, args } = JSON.parse(data) as ShellEvent; - if (type === ShellEventType.SIGNAL) { const [methodName, methodArg] = args; events.emit(methodName, methodArg); @@ -57,6 +56,9 @@ const useShell = () => { console.error('Shell', 'Failed to handle event', e); } }; + + transport.addEventListener('message', onMessage); + return () => transport.removeEventListener('message', onMessage); }, []); return { diff --git a/src/types/global.d.ts b/src/types/global.d.ts index d1d601d5e..3849b8914 100644 --- a/src/types/global.d.ts +++ b/src/types/global.d.ts @@ -13,8 +13,19 @@ interface Qt { webChannelTransport: QtTransport, } +interface ChromeWebView { + addEventListener: (type: 'message', listenenr: (event: any) => void) => void, + removeEventListener: (type: 'message', listenenr: (event: any) => void) => void, + postMessage: (message: string) => void, +} + +interface Chrome { + webview: ChromeWebView, +} + declare global { var qt: Qt | undefined; + var chrome: Chrome | undefined; } export {};