Files
AgentCompany/src/preload/index.ts
T

49 lines
1.6 KiB
TypeScript

import { contextBridge, ipcRenderer } from "electron";
import {
IPC_CHANNELS,
PRELOAD_FORWARDERS,
mapPreloadInvokeArgs,
type DesktopApi,
type PreloadForwardedApi,
} from "@shared/contracts";
import type { DesktopEvent } from "@shared/types";
function createForwardedApi(): PreloadForwardedApi {
const forwardedEntries = PRELOAD_FORWARDERS.map(({ api, channel, payload }) => [
api,
(...args: unknown[]) => ipcRenderer.invoke(
IPC_CHANNELS[channel],
...mapPreloadInvokeArgs(payload, args),
),
]);
return Object.fromEntries(forwardedEntries) as PreloadForwardedApi;
}
const api: DesktopApi = {
...createForwardedApi(),
subscribe: (callback: (event: DesktopEvent) => void) => {
const listener = (_event: Electron.IpcRendererEvent, payload: DesktopEvent) => callback(payload);
ipcRenderer.on(IPC_CHANNELS.rendererEvent, listener);
return () => {
ipcRenderer.removeListener(IPC_CHANNELS.rendererEvent, listener);
};
},
platform: process.platform as "win32" | "darwin" | "linux",
windowMinimize: async () => {
await ipcRenderer.invoke(IPC_CHANNELS.windowMinimize);
},
windowMaximize: async () => {
await ipcRenderer.invoke(IPC_CHANNELS.windowMaximize);
},
windowClose: async () => {
await ipcRenderer.invoke(IPC_CHANNELS.windowClose);
},
windowIsMaximized: async () => {
const result = (await ipcRenderer.invoke(IPC_CHANNELS.windowIsMaximized)) as { ok: true; data: boolean } | { ok: false };
return result.ok ? result.data : false;
},
};
contextBridge.exposeInMainWorld("agentCompany", api);