Skip to content

Commit 6584e0f

Browse files
authored
Merge pull request #65 from lightninglabs/routing
Add url based routing
2 parents 1e0d03c + 948b01d commit 6584e0f

26 files changed

+263
-152
lines changed

app/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@
3434
"lottie-web": "5.6.8",
3535
"mobx": "5.15.4",
3636
"mobx-react-lite": "2.0.6",
37+
"mobx-react-router": "4.1.0",
3738
"mobx-utils": "5.5.7",
3839
"rc-tooltip": "4.2.0",
3940
"react": "^16.13.1",
4041
"react-dom": "^16.13.1",
4142
"react-i18next": "11.4.0",
43+
"react-router": "5.2.0",
4244
"react-scripts": "3.4.1",
4345
"react-toastify": "6.0.5",
4446
"react-virtualized": "^9.21.2"
@@ -55,11 +57,13 @@
5557
"@testing-library/user-event": "^10.1.0",
5658
"@types/debug": "4.1.5",
5759
"@types/google-protobuf": "3.7.2",
60+
"@types/history": "4.7.6",
5861
"@types/jest": "^25.2.1",
5962
"@types/lodash": "4.14.155",
6063
"@types/node": "^13.13.5",
6164
"@types/react": "^16.9.34",
6265
"@types/react-dom": "^16.9.7",
66+
"@types/react-router": "5.1.7",
6367
"@typescript-eslint/eslint-plugin": "^2.31.0",
6468
"@typescript-eslint/parser": "^2.31.0",
6569
"bootstrap": "4.4.1",

app/src/App.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,16 @@ import React from 'react';
22
import './App.scss';
33
import { createStore, StoreProvider } from 'store';
44
import AlertContainer from 'components/common/AlertContainer';
5-
import { Layout } from 'components/layout';
6-
import Pages from 'components/Pages';
75
import { ThemeProvider } from 'components/theme';
6+
import Routes from './Routes';
87

98
const App = () => {
109
const store = createStore();
1110

1211
return (
1312
<StoreProvider store={store}>
1413
<ThemeProvider>
15-
<Layout>
16-
<Pages />
17-
</Layout>
14+
<Routes />
1815
<AlertContainer />
1916
</ThemeProvider>
2017
</StoreProvider>

app/src/Routes.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import React from 'react';
2+
import { Route, Router, Switch } from 'react-router';
3+
import { useStore } from 'store';
4+
import AuthPage from 'components/auth/AuthPage';
5+
import HistoryPage from 'components/history/HistoryPage';
6+
import { Layout } from 'components/layout';
7+
import LoopPage from 'components/loop/LoopPage';
8+
import SettingsPage from 'components/settings/SettingsPage';
9+
10+
const Routes: React.FC = () => {
11+
const { router } = useStore();
12+
13+
return (
14+
<Router history={router.history}>
15+
<Switch>
16+
<Route path="/" exact component={AuthPage} />
17+
<Route>
18+
<Layout>
19+
<Switch>
20+
<Route path="/loop" component={LoopPage} />
21+
<Route path="/history" component={HistoryPage} />
22+
<Route path="/settings" component={SettingsPage} />
23+
</Switch>
24+
</Layout>
25+
</Route>
26+
</Switch>
27+
</Router>
28+
);
29+
};
30+
31+
export default Routes;
Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
import React from 'react';
22
import AuthPage from 'components/auth/AuthPage';
3-
import { Layout } from 'components/layout';
43

54
export default {
65
title: 'Pages/Auth',
76
component: AuthPage,
87
};
98

109
export const Default = () => {
11-
return (
12-
<Layout>
13-
<AuthPage />
14-
</Layout>
15-
);
10+
return <AuthPage />;
1611
};

app/src/__stories__/HistoryPage.stories.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ export const Default = () => {
2929

3030
export const InsideLayout = () => {
3131
const store = useStore();
32-
store.uiStore.page = 'history';
3332
updateSwapsStatus(store.swapStore.sortedSwaps);
3433
return (
3534
<Layout>

app/src/__stories__/SettingsPage.stories.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,20 @@ export default {
1010
};
1111

1212
export const Default = () => {
13+
const { uiStore } = useStore();
14+
uiStore.showSettings('');
1315
return <SettingsPage />;
1416
};
1517

1618
export const BitcoinUnit = () => {
1719
const { uiStore } = useStore();
18-
uiStore.selectedSetting = 'unit';
20+
uiStore.showSettings('unit');
1921
return <SettingsPage />;
2022
};
2123

2224
export const BalanceMode = () => {
2325
const { uiStore } = useStore();
24-
uiStore.selectedSetting = 'balance';
26+
uiStore.showSettings('balance');
2527
return <SettingsPage />;
2628
};
2729

app/src/__stories__/StoryWrapper.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { CSSProperties, useMemo } from 'react';
2+
import { Router } from 'react-router';
23
import { observer } from 'mobx-react-lite';
34
import { BalanceMode, Unit } from 'util/constants';
45
import { AuthenticationError } from 'util/errors';
@@ -67,11 +68,13 @@ const StoryWrapper: React.FC<{
6768
return (
6869
<StoreProvider store={store}>
6970
<ThemeProvider>
70-
{/* modify the bg styles so it isn't too big in docs mode */}
71-
<Background style={{ minHeight: 'inherit', height: '100%' }}>
72-
{/* render the Story after the store has been initialized */}
73-
{store.initialized ? <div style={style}>{children}</div> : null}
74-
</Background>
71+
<Router history={store.router.history}>
72+
{/* modify the bg styles so it isn't too big in docs mode */}
73+
<Background style={{ minHeight: 'inherit', height: '100%' }}>
74+
{/* render the Story after the store has been initialized */}
75+
{store.initialized ? <div style={style}>{children}</div> : null}
76+
</Background>
77+
</Router>
7578
</ThemeProvider>
7679
</StoreProvider>
7780
);
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,39 @@
11
import React from 'react';
2+
import Routes from 'Routes';
23
import { renderWithProviders } from 'util/tests';
34
import { createStore } from 'store';
4-
import Pages from 'components/Pages';
55

6-
describe('Pages Component', () => {
6+
describe('Routes Component', () => {
77
const render = async () => {
88
const store = createStore();
99
await store.init();
10-
return renderWithProviders(<Pages />, store);
10+
return renderWithProviders(<Routes />, store);
1111
};
1212

1313
it('should display the Auth page by default', async () => {
1414
const { getByText, store } = await render();
1515
expect(getByText('Shushtar')).toBeInTheDocument();
16-
expect(store.uiStore.page).toBe('auth');
16+
expect(store.router.location.pathname).toBe('/');
1717
});
1818

1919
it('should display the Loop page', async () => {
20-
const { getByText, store } = await render();
20+
const { getAllByText, store } = await render();
2121
store.uiStore.goToLoop();
22-
expect(getByText('Lightning Loop')).toBeInTheDocument();
23-
expect(store.uiStore.page).toBe('loop');
22+
expect(getAllByText('Lightning Loop')).toHaveLength(2);
23+
expect(store.router.location.pathname).toBe('/loop');
2424
});
2525

2626
it('should display the History page', async () => {
2727
const { getByText, store } = await render();
2828
store.uiStore.goToHistory();
2929
expect(getByText('Loop History')).toBeInTheDocument();
30-
expect(store.uiStore.page).toBe('history');
30+
expect(store.router.location.pathname).toBe('/history');
3131
});
3232

3333
it('should display the Settings page', async () => {
34-
const { getByText, store } = await render();
34+
const { getAllByText, store } = await render();
3535
store.uiStore.goToSettings();
36-
expect(getByText('Settings')).toBeInTheDocument();
37-
expect(store.uiStore.page).toBe('settings');
36+
expect(getAllByText('Settings')).toHaveLength(2);
37+
expect(store.router.location.pathname).toBe('/settings');
3838
});
3939
});

app/src/__tests__/components/history/HistoryPage.spec.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ describe('HistoryPage', () => {
1010

1111
beforeEach(() => {
1212
store = createStore();
13-
store.uiStore.goToHistory();
1413
});
1514

1615
const render = () => {
@@ -49,7 +48,7 @@ describe('HistoryPage', () => {
4948
it('should navigate back to the Loop Page', () => {
5049
const { getByText } = render();
5150
fireEvent.click(getByText('arrow-left.svg'));
52-
expect(store.uiStore.page).toEqual('loop');
51+
expect(store.router.location.pathname).toBe('/loop');
5352
});
5453

5554
it('should export channels', () => {

app/src/__tests__/components/layout/Layout.spec.tsx

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Layout from 'components/layout/Layout';
77
describe('Layout component', () => {
88
const render = () => {
99
const store = createStore();
10-
store.uiStore.page = 'loop';
10+
store.uiStore.goToLoop();
1111
return renderWithProviders(<Layout />, store);
1212
};
1313

@@ -27,38 +27,31 @@ describe('Layout component', () => {
2727

2828
it('should navigate to the History page', () => {
2929
const { getByText, store } = render();
30-
expect(store.uiStore.page).toBe('loop');
30+
expect(store.router.location.pathname).toBe('/loop');
3131
fireEvent.click(getByText('History'));
32-
expect(store.uiStore.page).toBe('history');
32+
expect(store.router.location.pathname).toBe('/history');
3333
expect(getByText('History').parentElement).toHaveClass('active');
3434
});
3535

3636
it('should navigate back to the Loop page', () => {
3737
const { getByText, store } = render();
38-
expect(store.uiStore.page).toBe('loop');
38+
expect(store.router.location.pathname).toBe('/loop');
3939
fireEvent.click(getByText('History'));
40-
expect(store.uiStore.page).toBe('history');
40+
expect(store.router.location.pathname).toBe('/history');
4141
expect(getByText('History').parentElement).toHaveClass('active');
4242
fireEvent.click(getByText('Lightning Loop'));
43-
expect(store.uiStore.page).toBe('loop');
43+
expect(store.router.location.pathname).toBe('/loop');
4444
expect(getByText('Lightning Loop').parentElement).toHaveClass('active');
4545
});
4646

4747
it('should navigate to the Settings page', () => {
4848
const { getByText, store } = render();
49-
expect(store.uiStore.page).toBe('loop');
49+
expect(store.router.location.pathname).toBe('/loop');
5050
fireEvent.click(getByText('Settings'));
51-
expect(store.uiStore.page).toBe('settings');
51+
expect(store.router.location.pathname).toBe('/settings');
5252
expect(getByText('Settings').parentElement).toHaveClass('active');
5353
fireEvent.click(getByText('Lightning Loop'));
54-
expect(store.uiStore.page).toBe('loop');
54+
expect(store.router.location.pathname).toBe('/loop');
5555
expect(getByText('Lightning Loop').parentElement).toHaveClass('active');
5656
});
57-
58-
it('should not display the sidebar on the auth page', () => {
59-
const { getByText, queryByText, store } = render();
60-
expect(getByText('menu.svg')).toBeInTheDocument();
61-
store.uiStore.page = 'auth';
62-
expect(queryByText('menu.svg')).not.toBeInTheDocument();
63-
});
6457
});

0 commit comments

Comments
 (0)