Skip to content

Commit e700b8b

Browse files
setchyafonsojramos
andauthored
feat: fetch notifications on navigation (#1305)
Co-authored-by: Afonso Jorge Ramos <[email protected]>
1 parent fabbf8e commit e700b8b

File tree

7 files changed

+53
-14
lines changed

7 files changed

+53
-14
lines changed

src/components/Header.test.tsx

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { fireEvent, render, screen } from '@testing-library/react';
2+
import { AppContext } from '../context/App';
23
import { Header } from './Header';
34

45
const mockNavigate = jest.fn();
@@ -8,6 +9,12 @@ jest.mock('react-router-dom', () => ({
89
}));
910

1011
describe('components/Header.tsx', () => {
12+
const fetchNotifications = jest.fn();
13+
14+
afterEach(() => {
15+
jest.resetAllMocks();
16+
});
17+
1118
it('should render itself & its children', () => {
1219
const tree = render(<Header>Test Header</Header>);
1320

@@ -18,9 +25,26 @@ describe('components/Header.tsx', () => {
1825
render(<Header>Test Header</Header>);
1926

2027
fireEvent.click(screen.getByLabelText('Go Back'));
21-
expect(mockNavigate).toHaveBeenNthCalledWith(1, -1);
2228

2329
expect(mockNavigate).toHaveBeenCalledTimes(1);
2430
expect(mockNavigate).toHaveBeenCalledWith(-1);
2531
});
32+
33+
it('should navigate back and fetch notifications', () => {
34+
render(
35+
<AppContext.Provider
36+
value={{
37+
fetchNotifications,
38+
}}
39+
>
40+
<Header fetchOnBack={true}>Test Header</Header>
41+
</AppContext.Provider>,
42+
);
43+
44+
fireEvent.click(screen.getByLabelText('Go Back'));
45+
46+
expect(mockNavigate).toHaveBeenCalledTimes(1);
47+
expect(mockNavigate).toHaveBeenCalledWith(-1);
48+
expect(fetchNotifications).toHaveBeenCalledTimes(1);
49+
});
2650
});

src/components/Header.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,34 @@
11
import { ArrowLeftIcon } from '@primer/octicons-react';
2-
import type { FC, ReactNode } from 'react';
2+
import { type FC, type ReactNode, useContext } from 'react';
33
import { useNavigate } from 'react-router-dom';
4+
import { AppContext } from '../context/App';
45
import { Size } from '../types';
56

67
interface IHeader {
78
children: ReactNode;
9+
fetchOnBack?: boolean;
810
}
911

10-
export const Header: FC<IHeader> = ({ children }: IHeader) => {
12+
export const Header: FC<IHeader> = ({
13+
children,
14+
fetchOnBack = false,
15+
}: IHeader) => {
1116
const navigate = useNavigate();
17+
18+
const { fetchNotifications } = useContext(AppContext);
19+
1220
return (
1321
<div className="mx-8 mt-2 flex items-center justify-between py-2">
1422
<button
1523
type="button"
1624
className="focus:outline-none"
1725
title="Go Back"
18-
onClick={() => navigate(-1)}
26+
onClick={() => {
27+
navigate(-1);
28+
if (fetchOnBack) {
29+
fetchNotifications();
30+
}
31+
}}
1932
>
2033
<ArrowLeftIcon
2134
size={Size.XLARGE}

src/components/Sidebar.test.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ jest.mock('react-router-dom', () => ({
1515

1616
describe('components/Sidebar.tsx', () => {
1717
const fetchNotifications = jest.fn();
18+
1819
const openExternalLinkMock = jest.spyOn(comms, 'openExternalLink');
1920

2021
afterEach(() => {
@@ -230,7 +231,9 @@ describe('components/Sidebar.tsx', () => {
230231

231232
it('go to the home if settings path already shown', () => {
232233
render(
233-
<AppContext.Provider value={{ isLoggedIn: true, notifications: [] }}>
234+
<AppContext.Provider
235+
value={{ isLoggedIn: true, notifications: [], fetchNotifications }}
236+
>
234237
<MemoryRouter initialEntries={['/settings']}>
235238
<Sidebar />
236239
</MemoryRouter>
@@ -239,6 +242,7 @@ describe('components/Sidebar.tsx', () => {
239242

240243
fireEvent.click(screen.getByTitle('Settings'));
241244

245+
expect(fetchNotifications).toHaveBeenCalledTimes(1);
242246
expect(mockNavigate).toHaveBeenCalledWith('/', { replace: true });
243247
});
244248
});

src/components/Sidebar.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export const Sidebar: FC = () => {
3131
const toggleSettings = () => {
3232
if (location.pathname.startsWith('/settings')) {
3333
navigate('/', { replace: true });
34+
fetchNotifications();
3435
} else {
3536
navigate('/settings');
3637
}

src/context/App.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,16 +122,10 @@ export const AppProvider = ({ children }: { children: ReactNode }) => {
122122
setTheme(settings.theme);
123123
}, [settings.theme]);
124124

125-
// biome-ignore lint/correctness/useExhaustiveDependencies: We only want fetchNotifications to be called for certain account or setting changes.
125+
// biome-ignore lint/correctness/useExhaustiveDependencies: We only want fetchNotifications to be called for account changes
126126
useEffect(() => {
127127
fetchNotifications({ auth, settings });
128-
}, [
129-
settings.participating,
130-
settings.showBots,
131-
settings.detailedNotifications,
132-
settings.delayNotificationState,
133-
auth.accounts.length,
134-
]);
128+
}, [auth.accounts]);
135129

136130
useInterval(() => {
137131
fetchNotifications({ auth, settings });

src/routes/Settings.test.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ jest.mock('react-router-dom', () => ({
1515
describe('routes/Settings.tsx', () => {
1616
let originalPlatform: NodeJS.Platform;
1717
const updateSetting = jest.fn();
18+
const fetchNotifications = jest.fn();
1819

1920
beforeAll(() => {
2021
// Save the original platform value
@@ -62,6 +63,7 @@ describe('routes/Settings.tsx', () => {
6263
value={{
6364
auth: mockAuth,
6465
settings: mockSettings,
66+
fetchNotifications,
6567
}}
6668
>
6769
<MemoryRouter>
@@ -72,6 +74,7 @@ describe('routes/Settings.tsx', () => {
7274
});
7375

7476
fireEvent.click(screen.getByLabelText('Go Back'));
77+
expect(fetchNotifications).toHaveBeenCalledTimes(1);
7578
expect(mockNavigate).toHaveBeenNthCalledWith(1, -1);
7679
});
7780
});

src/routes/Settings.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export const SettingsRoute: FC = () => {
5656

5757
return (
5858
<div className="flex h-screen flex-col" data-testid="settings">
59-
<Header>Settings</Header>
59+
<Header fetchOnBack={true}>Settings</Header>
6060
<div className="flex-grow overflow-x-auto px-8">
6161
<fieldset className="mb-3">
6262
<legend id="appearance" className="mb-1 mt-2 font-semibold">

0 commit comments

Comments
 (0)