From 1fac400d70400dc7aea60491b259298b308f2f30 Mon Sep 17 00:00:00 2001 From: Louis Date: Mon, 11 Mar 2024 20:30:32 +0700 Subject: [PATCH] fix: replace robotjs by nutjs (#2295) (#2302) * fix: replace robotjs by nutjs (#2295) * fix: do not create quick ask window on test --- electron/main.ts | 24 +++-------------------- electron/package.json | 3 +-- electron/utils/selectedText.ts | 35 +++++++++++++++++++--------------- electron/utils/tray.ts | 24 +++++++++++++++++++++++ 4 files changed, 48 insertions(+), 38 deletions(-) create mode 100644 electron/utils/tray.ts diff --git a/electron/main.ts b/electron/main.ts index 21f95cd00..8fe4247d6 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -27,6 +27,7 @@ import { setupReactDevTool } from './utils/dev' import { cleanLogs } from './utils/log' import { registerShortcut } from './utils/selectedText' +import { createSystemTray } from './utils/tray' const preloadPath = join(__dirname, 'preload.js') const rendererPath = join(__dirname, '..', 'renderer') @@ -48,33 +49,14 @@ app .then(setupMenu) .then(handleIPCs) .then(handleAppUpdates) - .then(createQuickAskWindow) + .then(() => process.env.CI !== 'e2e' && createQuickAskWindow()) .then(createMainWindow) .then(() => { if (!app.isPackaged) { windowManager.mainWindow?.webContents.openDevTools() } }) - .then(() => { - const iconPath = join(app.getAppPath(), 'icons', 'icon-tray.png') - const tray = new Tray(iconPath) - tray.setToolTip(app.getName()) - - const contextMenu = Menu.buildFromTemplate([ - { - label: 'Open Jan', - type: 'normal', - click: () => windowManager.showMainWindow(), - }, - { - label: 'Open Quick Ask', - type: 'normal', - click: () => windowManager.showQuickAskWindow(), - }, - { label: 'Quit', type: 'normal', click: () => app.quit() }, - ]) - tray.setContextMenu(contextMenu) - }) + .then(() => process.env.CI !== 'e2e' && createSystemTray()) .then(() => { log(`Version: ${app.getVersion()}`) }) diff --git a/electron/package.json b/electron/package.json index 93c30682c..e09e0daf2 100644 --- a/electron/package.json +++ b/electron/package.json @@ -41,7 +41,6 @@ "notarize": { "teamId": "F8AH6NHVY5" }, - "icon": "icons/icon.png" }, "linux": { @@ -92,7 +91,7 @@ "request": "^2.88.2", "request-progress": "^3.0.0", "ulid": "^2.3.0", - "@hurdlegroup/robotjs": "^0.11.4" + "@nut-tree/nut-js": "^4.0.0" }, "devDependencies": { "@electron/notarize": "^2.1.0", diff --git a/electron/utils/selectedText.ts b/electron/utils/selectedText.ts index 6b2349725..a39e331a9 100644 --- a/electron/utils/selectedText.ts +++ b/electron/utils/selectedText.ts @@ -1,19 +1,24 @@ -import { clipboard, globalShortcut } from "electron"; -import { keyTap, keys } from "@hurdlegroup/robotjs"; +import { clipboard, globalShortcut } from 'electron' +import { keyboard, Key } from '@nut-tree/nut-js' /** * Gets selected text by synthesizing the keyboard shortcut * "CommandOrControl+c" then reading text from the clipboard */ export const getSelectedText = async () => { - const currentClipboardContent = clipboard.readText(); // preserve clipboard content - clipboard.clear(); - keyTap("c" as keys, process.platform === "darwin" ? "command" : "control"); - await new Promise((resolve) => setTimeout(resolve, 200)); // add a delay before checking clipboard - const selectedText = clipboard.readText(); - clipboard.writeText(currentClipboardContent); - return selectedText; -}; + const currentClipboardContent = clipboard.readText() // preserve clipboard content + clipboard.clear() + const hotkeys: Key[] = [ + process.platform === 'darwin' ? Key.LeftCmd : Key.LeftControl, + Key.C, + ] + await keyboard.pressKey(...hotkeys) + await keyboard.releaseKey(...hotkeys) + await new Promise((resolve) => setTimeout(resolve, 200)) // add a delay before checking clipboard + const selectedText = clipboard.readText() + clipboard.writeText(currentClipboardContent) + return selectedText +} /** * Registers a global shortcut of `accelerator`. The `callback` is called @@ -26,14 +31,14 @@ export const registerShortcut = ( callback: (selectedText: string) => void ) => { return globalShortcut.register(accelerator, async () => { - callback(await getSelectedText()); - }); -}; + callback(await getSelectedText()) + }) +} /** * Unregisters a global shortcut of `accelerator` and * is equivalent to electron.globalShortcut.unregister */ export const unregisterShortcut = (accelerator: Electron.Accelerator) => { - globalShortcut.unregister(accelerator); -}; \ No newline at end of file + globalShortcut.unregister(accelerator) +} diff --git a/electron/utils/tray.ts b/electron/utils/tray.ts new file mode 100644 index 000000000..2ab3e6dcc --- /dev/null +++ b/electron/utils/tray.ts @@ -0,0 +1,24 @@ +import { join } from 'path' +import { Tray, app, Menu } from 'electron' +import { windowManager } from '../managers/window' + +export const createSystemTray = () => { + const iconPath = join(app.getAppPath(), 'icons', 'icon-tray.png') + const tray = new Tray(iconPath) + tray.setToolTip(app.getName()) + + const contextMenu = Menu.buildFromTemplate([ + { + label: 'Open Jan', + type: 'normal', + click: () => windowManager.showMainWindow(), + }, + { + label: 'Open Quick Ask', + type: 'normal', + click: () => windowManager.showQuickAskWindow(), + }, + { label: 'Quit', type: 'normal', click: () => app.quit() }, + ]) + tray.setContextMenu(contextMenu) +}