From 8bad772d55755fbeae04d3a7ebc7230165a4135c Mon Sep 17 00:00:00 2001 From: Arthur Dufour Date: Wed, 17 Apr 2024 16:52:16 +0200 Subject: [PATCH 1/4] feat: keyboard shortcut to open app (with setting to disable) --- main.js | 16 ++++++++++- src/__mocks__/mock-state.ts | 2 ++ src/context/App.test.tsx | 4 +++ src/context/App.tsx | 15 ++++++++++- src/routes/Settings.tsx | 8 ++++++ .../__snapshots__/Settings.test.tsx.snap | 27 +++++++++++++++++++ src/types.ts | 2 ++ src/utils/comms.ts | 4 +++ 8 files changed, 76 insertions(+), 2 deletions(-) diff --git a/main.js b/main.js index ddf8ab0b7..23b982308 100644 --- a/main.js +++ b/main.js @@ -1,4 +1,4 @@ -const { ipcMain, app, nativeTheme } = require('electron'); +const { ipcMain, app, nativeTheme, globalShortcut } = require('electron'); const { menubar } = require('menubar'); const { autoUpdater } = require('electron-updater'); const { onFirstRunMaybe } = require('./first-run'); @@ -80,6 +80,20 @@ menubarApp.on('ready', () => { menubarApp.tray.setTitle(title); } }); + ipcMain.on('update-kbd-shortcut', (_, { enabled, kbdShortcut }) => { + if (!enabled) { + globalShortcut.unregister(kbdShortcut); + return; + } + + globalShortcut.register(kbdShortcut, () => { + if (menubarApp.window.isVisible()) { + menubarApp.hideWindow(); + } else { + menubarApp.showWindow(); + } + }); + }); ipcMain.on('set-login-item-settings', (event, settings) => { app.setLoginItemSettings(settings); }); diff --git a/src/__mocks__/mock-state.ts b/src/__mocks__/mock-state.ts index 01cb113a3..43cddbbb2 100644 --- a/src/__mocks__/mock-state.ts +++ b/src/__mocks__/mock-state.ts @@ -18,4 +18,6 @@ export const mockSettings: SettingsState = { detailedNotifications: false, markAsDoneOnOpen: false, showAccountHostname: false, + kbdShortcut: 'CmdOrCtrl+Alt+G', + kbdShortcutEnabled: false, }; diff --git a/src/context/App.test.tsx b/src/context/App.test.tsx index dde505054..9169f3561 100644 --- a/src/context/App.test.tsx +++ b/src/context/App.test.tsx @@ -291,6 +291,8 @@ describe('context/App.tsx', () => { detailedNotifications: false, markAsDoneOnOpen: false, showAccountHostname: false, + kbdShortcut: 'CmdOrCtrl+Alt+G', + kbdShortcutEnabled: false, }, ); }); @@ -335,6 +337,8 @@ describe('context/App.tsx', () => { detailedNotifications: false, markAsDoneOnOpen: false, showAccountHostname: false, + kbdShortcut: 'CmdOrCtrl+Alt+G', + kbdShortcutEnabled: false, }, ); }); diff --git a/src/context/App.tsx b/src/context/App.tsx index 48d811a2d..ec61c873a 100644 --- a/src/context/App.tsx +++ b/src/context/App.tsx @@ -19,7 +19,7 @@ import { } from '../types'; import { apiRequestAuth } from '../utils/api-requests'; import { addAccount, authGitHub, getToken, getUserData } from '../utils/auth'; -import { setAutoLaunch, updateTrayTitle } from '../utils/comms'; +import { setAutoLaunch, setKbdShortcut, updateTrayTitle } from '../utils/comms'; import Constants from '../utils/constants'; import { generateGitHubAPIUrl } from '../utils/helpers'; import { getNotificationCount } from '../utils/notifications'; @@ -43,6 +43,8 @@ export const defaultSettings: SettingsState = { detailedNotifications: false, markAsDoneOnOpen: false, showAccountHostname: false, + kbdShortcut: 'CmdOrCtrl+Alt+G', + kbdShortcutEnabled: false, }; interface AppContextState { @@ -121,6 +123,10 @@ export const AppProvider = ({ children }: { children: ReactNode }) => { } }, [settings.showNotificationsCountInTray, notifications]); + useEffect(() => { + setKbdShortcut(settings.kbdShortcutEnabled, settings.kbdShortcut); + }, [settings.kbdShortcutEnabled]); + const updateSetting = useCallback( (name: keyof SettingsState, value: boolean | Theme) => { if (name === 'openAtStartup') { @@ -186,6 +192,13 @@ export const AppProvider = ({ children }: { children: ReactNode }) => { setAccounts({ ...defaultAccounts, ...existing.accounts }); } + if (existing.settings?.kbdShortcutEnabled) { + setKbdShortcut( + existing.settings.kbdShortcutEnabled, + existing.settings.kbdShortcut, + ); + } + if (existing.settings) { setSettings({ ...defaultSettings, ...existing.settings }); return existing.settings; diff --git a/src/routes/Settings.tsx b/src/routes/Settings.tsx index 0e0de767d..117d7ac4f 100644 --- a/src/routes/Settings.tsx +++ b/src/routes/Settings.tsx @@ -240,6 +240,14 @@ export const SettingsRoute: FC = () => { System + + updateSetting('kbdShortcutEnabled', evt.target.checked) + } + /> System +
+
+
+ +
+
+ +
+
+
diff --git a/src/types.ts b/src/types.ts index 36bb2e01e..6ba0580c6 100644 --- a/src/types.ts +++ b/src/types.ts @@ -27,6 +27,8 @@ interface SystemSettingsState { playSound: boolean; openAtStartup: boolean; showNotificationsCountInTray: boolean; + kbdShortcut: string; + kbdShortcutEnabled: boolean; } export enum Theme { diff --git a/src/utils/comms.ts b/src/utils/comms.ts index 3bfa09643..c7d9b22d8 100644 --- a/src/utils/comms.ts +++ b/src/utils/comms.ts @@ -13,6 +13,10 @@ export function setAutoLaunch(value: boolean): void { }); } +export function setKbdShortcut(enabled: boolean, kbdShortcut: string): void { + ipcRenderer.send('update-kbd-shortcut', { enabled, kbdShortcut }); +} + export function updateTrayIcon(notificationsLength = 0): void { if (notificationsLength > 0) { ipcRenderer.send('update-icon', 'TrayActive'); From 81ad51f74e0274b72531dba10450d316626b56b8 Mon Sep 17 00:00:00 2001 From: Arthur Dufour Date: Wed, 17 Apr 2024 17:20:11 +0200 Subject: [PATCH 2/4] refactor: create a `KBD_SHORTCUT_DEFAULT` constant --- src/__mocks__/mock-state.ts | 3 ++- src/context/App.test.tsx | 5 +++-- src/context/App.tsx | 2 +- src/utils/constants.ts | 2 ++ 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/__mocks__/mock-state.ts b/src/__mocks__/mock-state.ts index 43cddbbb2..918dbb06b 100644 --- a/src/__mocks__/mock-state.ts +++ b/src/__mocks__/mock-state.ts @@ -1,4 +1,5 @@ import { type AuthState, type SettingsState, Theme } from '../types'; +import Constants from '../utils/constants'; import { mockedEnterpriseAccounts, mockedUser } from './mockedData'; export const mockAccounts: AuthState = { @@ -18,6 +19,6 @@ export const mockSettings: SettingsState = { detailedNotifications: false, markAsDoneOnOpen: false, showAccountHostname: false, - kbdShortcut: 'CmdOrCtrl+Alt+G', + kbdShortcut: Constants.KBD_SHORTCUT_DEFAULT, kbdShortcutEnabled: false, }; diff --git a/src/context/App.test.tsx b/src/context/App.test.tsx index 9169f3561..85e40895b 100644 --- a/src/context/App.test.tsx +++ b/src/context/App.test.tsx @@ -6,6 +6,7 @@ import { useNotifications } from '../hooks/useNotifications'; import type { AuthState, SettingsState } from '../types'; import * as apiRequests from '../utils/api-requests'; import * as comms from '../utils/comms'; +import Constants from '../utils/constants'; import * as notifications from '../utils/notifications'; import * as storage from '../utils/storage'; import { AppContext, AppProvider } from './App'; @@ -291,7 +292,7 @@ describe('context/App.tsx', () => { detailedNotifications: false, markAsDoneOnOpen: false, showAccountHostname: false, - kbdShortcut: 'CmdOrCtrl+Alt+G', + kbdShortcut: Constants.KBD_SHORTCUT_DEFAULT, kbdShortcutEnabled: false, }, ); @@ -337,7 +338,7 @@ describe('context/App.tsx', () => { detailedNotifications: false, markAsDoneOnOpen: false, showAccountHostname: false, - kbdShortcut: 'CmdOrCtrl+Alt+G', + kbdShortcut: Constants.KBD_SHORTCUT_DEFAULT, kbdShortcutEnabled: false, }, ); diff --git a/src/context/App.tsx b/src/context/App.tsx index ec61c873a..089587b18 100644 --- a/src/context/App.tsx +++ b/src/context/App.tsx @@ -43,7 +43,7 @@ export const defaultSettings: SettingsState = { detailedNotifications: false, markAsDoneOnOpen: false, showAccountHostname: false, - kbdShortcut: 'CmdOrCtrl+Alt+G', + kbdShortcut: Constants.KBD_SHORTCUT_DEFAULT, kbdShortcutEnabled: false, }; diff --git a/src/utils/constants.ts b/src/utils/constants.ts index ded5e63c9..83b61116f 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -18,6 +18,8 @@ export const Constants = { ALLREAD_EMOJIS: ['😉', '🎉', '🐯', '🙈', '🎈', '🎊', '👏', '🎪', '🍝'], FETCH_INTERVAL: 60000, + + KBD_SHORTCUT_DEFAULT: 'CmdOrCtrl+Alt+G', }; export const Errors: Record = { From 21a5f99076dc35ed32989ee3695f2ebc8527e601 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Mon, 17 Jun 2024 18:08:11 -0400 Subject: [PATCH 3/4] emphasize hotkeys --- src/routes/Settings.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/routes/Settings.tsx b/src/routes/Settings.tsx index 258400297..282b99999 100644 --- a/src/routes/Settings.tsx +++ b/src/routes/Settings.tsx @@ -232,7 +232,10 @@ export const SettingsRoute: FC = () => { tooltip={
When enabled you can choose to use the hotkeys{' '} - {Constants.DEFAULT_KEYBOARD_SHORTCUT} to show or hide Gitify. + + {Constants.DEFAULT_KEYBOARD_SHORTCUT}' + {' '} + to show or hide Gitify.
} /> From a1e8ece686ded22ce6f507ebab2d36df6e14dbe7 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Mon, 17 Jun 2024 21:48:58 -0400 Subject: [PATCH 4/4] Update Settings.tsx --- src/routes/Settings.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Settings.tsx b/src/routes/Settings.tsx index 282b99999..2ae06c275 100644 --- a/src/routes/Settings.tsx +++ b/src/routes/Settings.tsx @@ -233,7 +233,7 @@ export const SettingsRoute: FC = () => {
When enabled you can choose to use the hotkeys{' '} - {Constants.DEFAULT_KEYBOARD_SHORTCUT}' + {Constants.DEFAULT_KEYBOARD_SHORTCUT} {' '} to show or hide Gitify.