diff --git a/src/lang/globals.js b/src/lang/globals.js index 2fb56bf..1bf94f8 100644 --- a/src/lang/globals.js +++ b/src/lang/globals.js @@ -36,29 +36,40 @@ import * as TAURI_API_EVENT from "@tauri-apps/api/event"; * }} */ function __makeEvents__(mappings) { + const eventsProxies = Object.fromEntries( + Object.keys(mappings).map((event) => { + const name = mappings[event]; + + const proxyHandlerGet = { + listen: (arg) => TAURI_API_EVENT.listen(name, arg), + once: (arg) => TAURI_API_EVENT.once(name, arg), + emit: (arg) => TAURI_API_EVENT.emit(name, arg), + }; + + const proxy = new Proxy( + (() => {}), + { + apply: (_, __, [window]) => ({ + listen: (arg) => window.listen(name, arg), + once: (arg) => window.once(name, arg), + emit: (arg) => window.emit(name, arg), + }), + get: (_, command) => proxyHandlerGet[command], + }, + ); + + return [event, proxy]; + }) + ); + return new Proxy( {}, { get: (_, event) => { - const name = mappings[event]; - - new Proxy(() => {}, { - apply: (_, __, [window]) => ({ - listen: (arg) => window.listen(name, arg), - once: (arg) => window.once(name, arg), - emit: (arg) => window.emit(name, arg), - }), - get: (_, command) => { - switch (command) { - case "listen": - return (arg) => TAURI_API_EVENT.listen(name, arg); - case "once": - return (arg) => TAURI_API_EVENT.once(name, arg); - case "emit": - return (arg) => TAURI_API_EVENT.emit(name, arg); - } - }, - }); + if (typeof event === "string") { + return eventsProxies[event]; + } + return undefined; }, }, ); diff --git a/src/lang/globals.ts b/src/lang/globals.ts index a100a27..86f94b0 100644 --- a/src/lang/globals.ts +++ b/src/lang/globals.ts @@ -1,29 +1,31 @@ import { - invoke as TAURI_INVOKE, - Channel as TAURI_CHANNEL, + invoke as TAURI_INVOKE, + Channel as TAURI_CHANNEL, } from "@tauri-apps/api/core"; import * as TAURI_API_EVENT from "@tauri-apps/api/event"; import { type WebviewWindow as __WebviewWindow__ } from "@tauri-apps/api/webviewWindow"; type __EventObj__ = { - listen: ( - cb: TAURI_API_EVENT.EventCallback, - ) => ReturnType>; - once: ( - cb: TAURI_API_EVENT.EventCallback, - ) => ReturnType>; - emit: null extends T - ? (payload?: T) => ReturnType - : (payload: T) => ReturnType; + listen: ( + cb: TAURI_API_EVENT.EventCallback + ) => ReturnType>; + once: ( + cb: TAURI_API_EVENT.EventCallback + ) => ReturnType>; + emit: null extends T + ? (payload?: T) => ReturnType + : (payload: T) => ReturnType; }; export type Result = - | { status: "ok"; data: T } - | { status: "error"; error: E }; + | { status: "ok"; data: T } + | { status: "error"; error: E }; function __makeEvents__>( mappings: Record, ) { + const eventObjects: Record = {}; + return new Proxy( {} as unknown as { [K in keyof T]: __EventObj__ & { @@ -34,23 +36,30 @@ function __makeEvents__>( get: (_, event) => { const name = mappings[event as keyof T]; - return new Proxy((() => {}) as any, { - apply: (_, __, [window]: [__WebviewWindow__]) => ({ - listen: (arg: any) => window.listen(name, arg), - once: (arg: any) => window.once(name, arg), - emit: (arg: any) => window.emit(name, arg), - }), - get: (_, command: keyof __EventObj__) => { - switch (command) { - case "listen": - return (arg: any) => TAURI_API_EVENT.listen(name, arg); - case "once": - return (arg: any) => TAURI_API_EVENT.once(name, arg); - case "emit": - return (arg: any) => TAURI_API_EVENT.emit(name, arg); - } - }, - }); + let eventObject = eventObjects[name]; + if (!eventObject) { + eventObject = new Proxy((() => {}) as any, { + apply: (_, __, [window]: [__WebviewWindow__]) => ({ + listen: (arg: any) => window.listen(name, arg), + once: (arg: any) => window.once(name, arg), + emit: (arg: any) => window.emit(name, arg), + }), + get: (_, command: keyof __EventObj__) => { + switch (command) { + case "listen": + return (arg: any) => TAURI_API_EVENT.listen(name, arg); + case "once": + return (arg: any) => TAURI_API_EVENT.once(name, arg); + case "emit": + return (arg: any) => TAURI_API_EVENT.emit(name, arg); + } + }, + }); + + eventObjects[name] = eventObject; + } + + return eventObject; }, }, );