Skip to content

Commit bf530d0

Browse files
committed
store: add url based routing
1 parent 078268c commit bf530d0

File tree

15 files changed

+195
-111
lines changed

15 files changed

+195
-111
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>
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
});

app/src/components/Pages.tsx

Lines changed: 0 additions & 25 deletions
This file was deleted.

app/src/components/auth/AuthPage.tsx

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { observer } from 'mobx-react-lite';
33
import { ReactComponent as LogoImage } from 'assets/images/logo.svg';
44
import { usePrefixedTranslation } from 'hooks';
55
import { useStore } from 'store';
6-
import { Button, HeaderOne, Input } from 'components/base';
6+
import { Background, Button, HeaderOne, Input } from 'components/base';
77
import { styled } from 'components/theme';
88

99
const Styled = {
@@ -79,20 +79,28 @@ const AuthPage: React.FC = () => {
7979

8080
const { Wrapper, Logo, Title, Subtitle, Form, Label, ErrMessage, Submit } = Styled;
8181
return (
82-
<Wrapper>
83-
<Logo />
84-
<Title>{l('title')}</Title>
85-
<Subtitle>{l('subtitle')}</Subtitle>
86-
<Form onSubmit={handleSubmit}>
87-
<Input id="auth" type="password" autoFocus value={pass} onChange={handleChange} />
88-
{error ? (
89-
<ErrMessage>{error}</ErrMessage>
90-
) : (
91-
<Label htmlFor="auth">{l('passLabel')}</Label>
92-
)}
93-
<Submit>{l('submitBtn')}</Submit>
94-
</Form>
95-
</Wrapper>
82+
<Background gradient>
83+
<Wrapper>
84+
<Logo />
85+
<Title>{l('title')}</Title>
86+
<Subtitle>{l('subtitle')}</Subtitle>
87+
<Form onSubmit={handleSubmit}>
88+
<Input
89+
id="auth"
90+
type="password"
91+
autoFocus
92+
value={pass}
93+
onChange={handleChange}
94+
/>
95+
{error ? (
96+
<ErrMessage>{error}</ErrMessage>
97+
) : (
98+
<Label htmlFor="auth">{l('passLabel')}</Label>
99+
)}
100+
<Submit>{l('submitBtn')}</Submit>
101+
</Form>
102+
</Wrapper>
103+
</Background>
96104
);
97105
};
98106

0 commit comments

Comments
 (0)