diff --git a/.github/scripts/auto-sign.sh b/.github/scripts/auto-sign.sh index a2130e791..e7ea49d40 100755 --- a/.github/scripts/auto-sign.sh +++ b/.github/scripts/auto-sign.sh @@ -7,6 +7,6 @@ if [[ -z "$APP_PATH" ]] || [[ -z "$DEVELOPER_ID" ]]; then fi # If both variables are set, execute the following commands -find "$APP_PATH" \( -type f -perm +111 -o -name "*.node" \) -exec codesign -s "$DEVELOPER_ID" --options=runtime {} \; +find "$APP_PATH" \( -type f -perm +111 -o -name "*.node" \) -exec codesign --force -s "$DEVELOPER_ID" --options=runtime {} \; -find "$APP_PATH" -type f -name "*.o" -exec codesign -s "$DEVELOPER_ID" --options=runtime {} \; +find "$APP_PATH" -type f -name "*.o" -exec codesign --force -s "$DEVELOPER_ID" --options=runtime {} \; diff --git a/README.md b/README.md index 8a4c03098..f847d63d2 100644 --- a/README.md +++ b/README.md @@ -43,31 +43,31 @@ Jan is an open-source ChatGPT alternative that runs 100% offline on your compute
jan.exe
Intel
M1/M2
jan.deb
jan.AppImage
@@ -76,31 +76,31 @@ Jan is an open-source ChatGPT alternative that runs 100% offline on your compute
jan.exe
Intel
M1/M2
jan.deb
jan.AppImage
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)
+}