From 5c01b5df5c4a36097682220b53ad686966dd5077 Mon Sep 17 00:00:00 2001 From: Afonso Jorge Ramos Date: Tue, 30 Dec 2025 04:21:55 +0100 Subject: [PATCH 1/9] feat: add 'Show read notifications' setting (#708) --- src/renderer/__mocks__/state-mocks.ts | 1 + .../settings/NotificationSettings.test.tsx | 16 +++++ .../settings/NotificationSettings.tsx | 21 +++++++ src/renderer/context/defaults.ts | 1 + .../__snapshots__/Settings.test.tsx.snap | 61 +++++++++++++++++-- src/renderer/types.ts | 1 + .../notifications/filters/filter.test.ts | 28 +++++++++ .../utils/notifications/filters/filter.ts | 5 ++ 8 files changed, 128 insertions(+), 6 deletions(-) diff --git a/src/renderer/__mocks__/state-mocks.ts b/src/renderer/__mocks__/state-mocks.ts index 63ad1f1c0..9d05eff33 100644 --- a/src/renderer/__mocks__/state-mocks.ts +++ b/src/renderer/__mocks__/state-mocks.ts @@ -43,6 +43,7 @@ const mockNotificationSettings: NotificationSettingsState = { showPills: true, showNumber: true, participating: false, + showReadNotifications: true, markAsDoneOnOpen: false, markAsDoneOnUnsubscribe: false, delayNotificationState: false, diff --git a/src/renderer/components/settings/NotificationSettings.test.tsx b/src/renderer/components/settings/NotificationSettings.test.tsx index 648bf8c76..3fc3650a3 100644 --- a/src/renderer/components/settings/NotificationSettings.test.tsx +++ b/src/renderer/components/settings/NotificationSettings.test.tsx @@ -271,6 +271,22 @@ describe('renderer/components/settings/NotificationSettings.tsx', () => { ); }); + it('should toggle the showReadNotifications checkbox', async () => { + await act(async () => { + renderWithAppContext(, { + updateSetting: updateSettingMock, + }); + }); + + await userEvent.click(screen.getByTestId('checkbox-showReadNotifications')); + + expect(updateSettingMock).toHaveBeenCalledTimes(1); + expect(updateSettingMock).toHaveBeenCalledWith( + 'showReadNotifications', + false, + ); + }); + it('should toggle the markAsDoneOnOpen checkbox', async () => { await act(async () => { renderWithAppContext(, { diff --git a/src/renderer/components/settings/NotificationSettings.tsx b/src/renderer/components/settings/NotificationSettings.tsx index 66bb02de7..7e1c170c1 100644 --- a/src/renderer/components/settings/NotificationSettings.tsx +++ b/src/renderer/components/settings/NotificationSettings.tsx @@ -328,6 +328,27 @@ export const NotificationSettings: FC = () => { } /> + + updateSetting('showReadNotifications', evt.target.checked) + } + tooltip={ + + + When checked, {APPLICATION.NAME} will + display both read and unread notifications. + + + When unchecked, {APPLICATION.NAME} will only + display unread notifications. + + + } + /> + +
+ + + +
- - @@ -732,20 +732,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its data-wrap="nowrap" > @@ -1147,20 +1147,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its data-wrap="nowrap" > @@ -1505,20 +1505,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its data-wrap="nowrap" > @@ -1920,20 +1920,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its data-wrap="nowrap" > @@ -2278,20 +2278,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its data-wrap="nowrap" > diff --git a/src/renderer/components/settings/NotificationSettings.tsx b/src/renderer/components/settings/NotificationSettings.tsx index a042e08fd..7f2e52a7d 100644 --- a/src/renderer/components/settings/NotificationSettings.tsx +++ b/src/renderer/components/settings/NotificationSettings.tsx @@ -330,7 +330,7 @@ export const NotificationSettings: FC = () => { updateSetting('showReadNotifications', evt.target.checked) diff --git a/src/renderer/routes/__snapshots__/Settings.test.tsx.snap b/src/renderer/routes/__snapshots__/Settings.test.tsx.snap index 4a486e97b..3af260936 100644 --- a/src/renderer/routes/__snapshots__/Settings.test.tsx.snap +++ b/src/renderer/routes/__snapshots__/Settings.test.tsx.snap @@ -1117,7 +1117,7 @@ exports[`renderer/routes/Settings.tsx should render itself & its children 1`] = class="font-medium text-gitify-font cursor-pointer" for="showReadNotifications" > - Show read notifications + Fetch read notifications
diff --git a/src/renderer/components/notifications/__snapshots__/AccountNotifications.test.tsx.snap b/src/renderer/components/notifications/__snapshots__/AccountNotifications.test.tsx.snap index 920504776..2e932725f 100644 --- a/src/renderer/components/notifications/__snapshots__/AccountNotifications.test.tsx.snap +++ b/src/renderer/components/notifications/__snapshots__/AccountNotifications.test.tsx.snap @@ -1588,20 +1588,20 @@ exports[`renderer/components/notifications/AccountNotifications.tsx should rende data-wrap="nowrap" > @@ -1878,20 +1878,20 @@ exports[`renderer/components/notifications/AccountNotifications.tsx should rende data-wrap="nowrap" > @@ -2468,20 +2468,20 @@ exports[`renderer/components/notifications/AccountNotifications.tsx should rende data-wrap="nowrap" > @@ -2758,20 +2758,20 @@ exports[`renderer/components/notifications/AccountNotifications.tsx should rende data-wrap="nowrap" > diff --git a/src/renderer/components/notifications/__snapshots__/NotificationRow.test.tsx.snap b/src/renderer/components/notifications/__snapshots__/NotificationRow.test.tsx.snap index cf0f804e6..f73d7918d 100644 --- a/src/renderer/components/notifications/__snapshots__/NotificationRow.test.tsx.snap +++ b/src/renderer/components/notifications/__snapshots__/NotificationRow.test.tsx.snap @@ -351,20 +351,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its @@ -761,20 +761,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its @@ -1176,20 +1176,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its @@ -1534,20 +1534,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its @@ -1949,20 +1949,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its @@ -2307,20 +2307,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its @@ -2693,20 +2693,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its data-wrap="nowrap" > @@ -3022,20 +3022,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its data-wrap="nowrap" > From 3b5bfc63f48d4b6d160036789b83deb906cfdf93 Mon Sep 17 00:00:00 2001 From: Afonso Jorge Ramos Date: Thu, 1 Jan 2026 19:57:58 +0100 Subject: [PATCH 7/9] refactor: address PR review feedback from setchy --- src/renderer/__mocks__/state-mocks.ts | 2 +- src/renderer/components/Sidebar.tsx | 4 +- .../RepositoryNotifications.test.tsx | 7 + .../notifications/RepositoryNotifications.tsx | 21 +- .../RepositoryNotifications.test.tsx.snap | 318 +++++++----------- .../settings/NotificationSettings.test.tsx | 6 +- .../settings/NotificationSettings.tsx | 6 +- src/renderer/context/App.tsx | 2 +- src/renderer/context/defaults.ts | 2 +- src/renderer/hooks/useNotifications.test.ts | 14 +- .../__snapshots__/Settings.test.tsx.snap | 12 +- src/renderer/types.ts | 2 +- src/renderer/utils/api/client.test.ts | 16 +- src/renderer/utils/api/client.ts | 5 +- 14 files changed, 183 insertions(+), 234 deletions(-) diff --git a/src/renderer/__mocks__/state-mocks.ts b/src/renderer/__mocks__/state-mocks.ts index 15f057f96..529aa94c5 100644 --- a/src/renderer/__mocks__/state-mocks.ts +++ b/src/renderer/__mocks__/state-mocks.ts @@ -43,7 +43,7 @@ const mockNotificationSettings: NotificationSettingsState = { showPills: true, showNumber: true, participating: false, - showReadNotifications: false, + fetchReadNotifications: false, markAsDoneOnOpen: false, markAsDoneOnUnsubscribe: false, delayNotificationState: false, diff --git a/src/renderer/components/Sidebar.tsx b/src/renderer/components/Sidebar.tsx index 9a1543862..2925ddee8 100644 --- a/src/renderer/components/Sidebar.tsx +++ b/src/renderer/components/Sidebar.tsx @@ -35,7 +35,7 @@ export const Sidebar: FC = () => { status, settings, auth, - unreadNotificationCount, + notificationCount, hasUnreadNotifications, } = useAppContext(); @@ -91,7 +91,7 @@ export const Sidebar: FC = () => { openGitHubNotifications(primaryAccountHostname)} size="small" diff --git a/src/renderer/components/notifications/RepositoryNotifications.test.tsx b/src/renderer/components/notifications/RepositoryNotifications.test.tsx index fc0a2220b..bfe3538dc 100644 --- a/src/renderer/components/notifications/RepositoryNotifications.test.tsx +++ b/src/renderer/components/notifications/RepositoryNotifications.test.tsx @@ -23,6 +23,13 @@ describe('renderer/components/notifications/RepositoryNotifications.tsx', () => repoNotifications: mockGitHubNotifications, }; + beforeEach(() => { + // Reset mock notification state between tests since it's mutated + for (const n of mockGitHubNotifications) { + n.unread = true; + } + }); + afterEach(() => { jest.clearAllMocks(); }); diff --git a/src/renderer/components/notifications/RepositoryNotifications.tsx b/src/renderer/components/notifications/RepositoryNotifications.tsx index 7f2f3ce0d..f1266f453 100644 --- a/src/renderer/components/notifications/RepositoryNotifications.tsx +++ b/src/renderer/components/notifications/RepositoryNotifications.tsx @@ -91,18 +91,9 @@ export const RepositoryNotifications: FC = ({ {!animateExit && ( - - = ({ label={Chevron.label} testid="repository-toggle" /> + + )} diff --git a/src/renderer/components/notifications/__snapshots__/RepositoryNotifications.test.tsx.snap b/src/renderer/components/notifications/__snapshots__/RepositoryNotifications.test.tsx.snap index ccebe1f4b..d5ba93f08 100644 --- a/src/renderer/components/notifications/__snapshots__/RepositoryNotifications.test.tsx.snap +++ b/src/renderer/components/notifications/__snapshots__/RepositoryNotifications.test.tsx.snap @@ -103,49 +103,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should re data-wrap="nowrap" > - @@ -300,49 +271,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should re data-wrap="nowrap" > - @@ -554,20 +496,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should re data-wrap="nowrap" > @@ -751,20 +693,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should re data-wrap="nowrap" > @@ -917,7 +859,7 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should to data-portal-root="true" >
@@ -1114,7 +1056,7 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should to data-portal-root="true" >
@@ -1318,7 +1260,7 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should to data-portal-root="true" >
@@ -1579,7 +1521,7 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should us data-portal-root="true" >
@@ -1783,7 +1725,7 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should us data-portal-root="true" >
diff --git a/src/renderer/components/settings/NotificationSettings.test.tsx b/src/renderer/components/settings/NotificationSettings.test.tsx index c50c65f9d..12742e136 100644 --- a/src/renderer/components/settings/NotificationSettings.test.tsx +++ b/src/renderer/components/settings/NotificationSettings.test.tsx @@ -271,18 +271,18 @@ describe('renderer/components/settings/NotificationSettings.tsx', () => { ); }); - it('should toggle the showReadNotifications checkbox', async () => { + it('should toggle the fetchReadNotifications checkbox', async () => { await act(async () => { renderWithAppContext(, { updateSetting: updateSettingMock, }); }); - await userEvent.click(screen.getByTestId('checkbox-showReadNotifications')); + await userEvent.click(screen.getByTestId('checkbox-fetchReadNotifications')); expect(updateSettingMock).toHaveBeenCalledTimes(1); expect(updateSettingMock).toHaveBeenCalledWith( - 'showReadNotifications', + 'fetchReadNotifications', true, ); }); diff --git a/src/renderer/components/settings/NotificationSettings.tsx b/src/renderer/components/settings/NotificationSettings.tsx index 7f2e52a7d..102e53843 100644 --- a/src/renderer/components/settings/NotificationSettings.tsx +++ b/src/renderer/components/settings/NotificationSettings.tsx @@ -329,11 +329,11 @@ export const NotificationSettings: FC = () => { /> - updateSetting('showReadNotifications', evt.target.checked) + updateSetting('fetchReadNotifications', evt.target.checked) } tooltip={ diff --git a/src/renderer/context/App.tsx b/src/renderer/context/App.tsx index 4ca7a5f40..6b5e2f03f 100644 --- a/src/renderer/context/App.tsx +++ b/src/renderer/context/App.tsx @@ -291,7 +291,7 @@ export const AppProvider = ({ children }: { children: ReactNode }) => { setUseUnreadActiveIcon(settings.useUnreadActiveIcon); setUseAlternateIdleIcon(settings.useAlternateIdleIcon); - const trayCount = status === 'error' ? -1 : unreadNotificationCount; + const trayCount = status === 'error' ? -1 : notificationCount; setTrayIconColorAndTitle(trayCount, settings); }, [ settings.showNotificationsCountInTray, diff --git a/src/renderer/context/defaults.ts b/src/renderer/context/defaults.ts index 6b615a99d..e26199f98 100644 --- a/src/renderer/context/defaults.ts +++ b/src/renderer/context/defaults.ts @@ -36,7 +36,7 @@ const defaultNotificationSettings: NotificationSettingsState = { showPills: true, showNumber: true, participating: false, - showReadNotifications: false, + fetchReadNotifications: false, markAsDoneOnOpen: false, markAsDoneOnUnsubscribe: false, delayNotificationState: false, diff --git a/src/renderer/hooks/useNotifications.test.ts b/src/renderer/hooks/useNotifications.test.ts index e99f84bdc..8b7cb706f 100644 --- a/src/renderer/hooks/useNotifications.test.ts +++ b/src/renderer/hooks/useNotifications.test.ts @@ -88,11 +88,11 @@ describe('renderer/hooks/useNotifications.ts', () => { ]; nock('https://api.github.com') - .get('/notifications?participating=false') + .get('/notifications?participating=false&all=false') .reply(200, notifications); nock('https://github.gitify.io/api/v3') - .get('/notifications?participating=false') + .get('/notifications?participating=false&all=false') .reply(200, notifications); const { result } = renderHook(() => useNotifications()); @@ -214,7 +214,7 @@ describe('renderer/hooks/useNotifications.ts', () => { ]; nock('https://api.github.com') - .get('/notifications?participating=false') + .get('/notifications?participating=false&all=false') .reply(200, mockNotifications); nock('https://api.github.com') @@ -322,7 +322,7 @@ describe('renderer/hooks/useNotifications.ts', () => { const message = 'Bad credentials'; nock('https://api.github.com/') - .get('/notifications?participating=false') + .get('/notifications?participating=false&all=false') .replyWithError({ code, response: { @@ -334,7 +334,7 @@ describe('renderer/hooks/useNotifications.ts', () => { }); nock('https://github.gitify.io/api/v3/') - .get('/notifications?participating=false') + .get('/notifications?participating=false&all=false') .replyWithError({ code, response: { @@ -365,7 +365,7 @@ describe('renderer/hooks/useNotifications.ts', () => { const code = AxiosError.ERR_BAD_REQUEST; nock('https://api.github.com/') - .get('/notifications?participating=false') + .get('/notifications?participating=false&all=false') .replyWithError({ code, response: { @@ -377,7 +377,7 @@ describe('renderer/hooks/useNotifications.ts', () => { }); nock('https://github.gitify.io/api/v3/') - .get('/notifications?participating=false') + .get('/notifications?participating=false&all=false') .replyWithError({ code, response: { diff --git a/src/renderer/routes/__snapshots__/Settings.test.tsx.snap b/src/renderer/routes/__snapshots__/Settings.test.tsx.snap index 3af260936..f0f90e965 100644 --- a/src/renderer/routes/__snapshots__/Settings.test.tsx.snap +++ b/src/renderer/routes/__snapshots__/Settings.test.tsx.snap @@ -1109,22 +1109,22 @@ exports[`renderer/routes/Settings.tsx should render itself & its children 1`] = >
diff --git a/src/renderer/components/notifications/RepositoryNotifications.tsx b/src/renderer/components/notifications/RepositoryNotifications.tsx index f1266f453..a0e2a363f 100644 --- a/src/renderer/components/notifications/RepositoryNotifications.tsx +++ b/src/renderer/components/notifications/RepositoryNotifications.tsx @@ -99,13 +99,6 @@ export const RepositoryNotifications: FC = ({ testid="repository-mark-as-read" /> - - = ({ label="Mark repository as done" testid="repository-mark-as-done" /> + + )} diff --git a/src/renderer/components/notifications/__snapshots__/AccountNotifications.test.tsx.snap b/src/renderer/components/notifications/__snapshots__/AccountNotifications.test.tsx.snap index 2e932725f..e49f20bc6 100644 --- a/src/renderer/components/notifications/__snapshots__/AccountNotifications.test.tsx.snap +++ b/src/renderer/components/notifications/__snapshots__/AccountNotifications.test.tsx.snap @@ -1617,20 +1617,20 @@ exports[`renderer/components/notifications/AccountNotifications.tsx should rende @@ -1907,20 +1907,20 @@ exports[`renderer/components/notifications/AccountNotifications.tsx should rende @@ -2497,20 +2497,20 @@ exports[`renderer/components/notifications/AccountNotifications.tsx should rende @@ -2787,20 +2787,20 @@ exports[`renderer/components/notifications/AccountNotifications.tsx should rende diff --git a/src/renderer/components/notifications/__snapshots__/NotificationRow.test.tsx.snap b/src/renderer/components/notifications/__snapshots__/NotificationRow.test.tsx.snap index f73d7918d..cf0f804e6 100644 --- a/src/renderer/components/notifications/__snapshots__/NotificationRow.test.tsx.snap +++ b/src/renderer/components/notifications/__snapshots__/NotificationRow.test.tsx.snap @@ -351,20 +351,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its @@ -761,20 +761,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its @@ -1176,20 +1176,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its @@ -1534,20 +1534,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its @@ -1949,20 +1949,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its @@ -2307,20 +2307,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its @@ -2693,20 +2693,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its data-wrap="nowrap" > @@ -3022,20 +3022,20 @@ exports[`renderer/components/notifications/NotificationRow.tsx should render its data-wrap="nowrap" > diff --git a/src/renderer/components/notifications/__snapshots__/RepositoryNotifications.test.tsx.snap b/src/renderer/components/notifications/__snapshots__/RepositoryNotifications.test.tsx.snap index d5ba93f08..e70eee124 100644 --- a/src/renderer/components/notifications/__snapshots__/RepositoryNotifications.test.tsx.snap +++ b/src/renderer/components/notifications/__snapshots__/RepositoryNotifications.test.tsx.snap @@ -103,20 +103,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should re data-wrap="nowrap" > @@ -271,20 +271,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should re data-wrap="nowrap" > @@ -525,20 +525,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should re @@ -722,20 +722,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should re @@ -983,20 +983,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should to @@ -1180,20 +1180,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should to @@ -1384,20 +1384,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should to @@ -1645,20 +1645,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should us @@ -1849,20 +1849,20 @@ exports[`renderer/components/notifications/RepositoryNotifications.tsx should us