diff --git a/package.json b/package.json index 48bbe35aa..c368f1c58 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "prepare": "husky" }, "dependencies": { + "@egoist/tipc": "0.3.1", "@electron-toolkit/preload": "^3.0.0", "@electron-toolkit/utils": "^3.0.0", "@fontsource/sn-pro": "5.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0898dd08..6faf5c678 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@egoist/tipc': + specifier: 0.3.1 + version: 0.3.1(electron@30.0.3)(react@18.3.1) '@electron-toolkit/preload': specifier: ^3.0.0 version: 3.0.1(electron@30.0.3) @@ -375,6 +378,11 @@ packages: peerDependencies: tailwindcss: '*' + '@egoist/tipc@0.3.1': + resolution: {integrity: sha512-jnolALBsPffkUUoBMYNX3/ONX019D94KR/cQwPDF7Ns7eHwbHhormAFr445BjFbtxEifAlt/KWwehrE+0HS5Zg==} + peerDependencies: + electron: '>=26.0.0' + '@electron-toolkit/eslint-config-prettier@2.0.0': resolution: {integrity: sha512-L+uG1FvJcAZkPZpSi6B1pmdpyJFyOxWDTjr1Vs47vSryxv/EX1Ch6o4HVsachlDq3fMEkDgojuP2F3ZvVZMoLw==} peerDependencies: @@ -4575,6 +4583,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@egoist/tipc@0.3.1(electron@30.0.3)(react@18.3.1)': + dependencies: + electron: 30.0.3 + optionalDependencies: + '@tanstack/react-query': 5.36.0(react@18.3.1) + transitivePeerDependencies: + - react + '@electron-toolkit/eslint-config-prettier@2.0.0(eslint@9.2.0)(prettier@3.2.5)': dependencies: eslint: 9.2.0 diff --git a/src/main/index.ts b/src/main/index.ts index dcf9b884f..ea000b10f 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -3,6 +3,10 @@ import { app, BrowserWindow, ipcMain, ShareMenu } from "electron" import path from "path" import { electronApp, optimizer } from "@electron-toolkit/utils" import { createWindow } from "./window" +import { registerIpcMain } from "@egoist/tipc/main" +import { router } from "./tipc" + +registerIpcMain(router) if (process.defaultApp) { if (process.argv.length >= 2) { diff --git a/src/main/tipc.ts b/src/main/tipc.ts new file mode 100644 index 000000000..0a8c02935 --- /dev/null +++ b/src/main/tipc.ts @@ -0,0 +1,46 @@ +import { tipc } from "@egoist/tipc/main" +import { Menu } from "electron" + +const t = tipc.create() + +export const router = { + sum: t.procedure + .input<{ a: number; b: number }>() + .action(async ({ input }) => { + return input.a + input.b + }), + inspectElement: t.procedure + .input<{ x: number; y: number }>() + .action(async ({ input, context }) => { + context.sender.inspectElement(input.x, input.y) + }), + showContextMenu: t.procedure + .input<{ + items: Array<{ type: "text"; label: string } | { type: "separator" }> + }>() + .action(async ({ input, context }) => { + const menu = Menu.buildFromTemplate( + input.items.map((item, index) => { + if (item.type === "separator") { + return { + type: "separator" as const, + } + } + return { + label: item.label, + click() { + context.sender.send("menu-click", index) + }, + } + }), + ) + + menu.popup({ + callback: () => { + context.sender.send("menu-closed") + }, + }) + }), +} + +export type Router = typeof router diff --git a/src/renderer/src/lib/client.ts b/src/renderer/src/lib/client.ts new file mode 100644 index 000000000..98681ff21 --- /dev/null +++ b/src/renderer/src/lib/client.ts @@ -0,0 +1,6 @@ +import { createClient } from "@egoist/tipc/renderer" +import type { Router } from "@main/tipc" + +export const client = createClient({ + ipcInvoke: window.electron.ipcRenderer.invoke, +}) diff --git a/tsconfig.web.json b/tsconfig.web.json index 9c16b661b..dc162c987 100644 --- a/tsconfig.web.json +++ b/tsconfig.web.json @@ -4,7 +4,8 @@ "src/renderer/src/env.d.ts", "src/renderer/src/**/*", "src/renderer/src/**/*.tsx", - "src/preload/*.d.ts" + "src/preload/*.d.ts", + "src/main/*.ts", ], "compilerOptions": { "composite": true, @@ -13,7 +14,10 @@ "paths": { "@renderer/*": [ "src/renderer/src/*" - ] + ], + "@main/*": [ + "src/main/*" + ], } } }