Skip to content

Commit 4c853db

Browse files
author
Jovert Lota Palonpon
committed
wip
1 parent ad983c7 commit 4c853db

File tree

2 files changed

+87
-23
lines changed

2 files changed

+87
-23
lines changed

resources/js/Backoffice.js renamed to resources/js/App.js

Lines changed: 77 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,65 @@
11
import React, { Component } from 'react';
22
import { HashRouter as Router } from 'react-router-dom';
3+
import PropTypes from 'prop-types';
4+
35
import { withWidth, CssBaseline, MuiThemeProvider } from '@material-ui/core';
46

57
import { Navigator } from './core';
68
import { ROUTES } from './config';
7-
import { dark as darkTheme, light as lightTheme } from './themes/backoffice';
89
import { Loading } from './views';
910

10-
class Backoffice extends Component {
11+
class App extends Component {
1112
state = {
1213
loading: true,
1314
authenticated: false,
1415
nightMode: false,
1516
token: {},
1617
user: {},
1718
username: '',
19+
20+
errorResponse: {},
21+
successfulResponse: {},
22+
responseInterceptor: null,
23+
};
24+
25+
/**
26+
* Remove the response interceptor.
27+
*
28+
* @param {any} interceptor
29+
*
30+
* @param {undefined}
31+
*/
32+
removeResponseInterceptor = interceptor => {
33+
axios.interceptors.response.eject(interceptor);
34+
};
35+
36+
/**
37+
* Record API responses & do something.
38+
*
39+
* @param {any} interceptor
40+
*
41+
* @param {undefined}
42+
*/
43+
addResponseInterceptor = () => {
44+
const responseInterceptor = axios.interceptors.response.use(
45+
response => {
46+
return response;
47+
},
48+
49+
error => {
50+
// In occasions of Unauthorized requests (401),
51+
// Remove the stored tokens.
52+
if (error.response.status === 401) {
53+
this.removeToken();
54+
}
55+
56+
return Promise.reject(error);
57+
},
58+
);
59+
60+
this.setState({
61+
responseInterceptor,
62+
});
1863
};
1964

2065
/**
@@ -48,8 +93,7 @@ class Backoffice extends Component {
4893
const response = await axios.post('/api/v1/auth/signout');
4994

5095
if (response.status === 200) {
51-
// remove token data stored in localStorage.
52-
await localStorage.removeItem('token');
96+
this.removeToken();
5397

5498
this.setState({
5599
loading: false,
@@ -151,17 +195,19 @@ class Backoffice extends Component {
151195
token.auth_token
152196
}`;
153197

154-
// Add an expired_at timestamp based in the expired_in property in the token.
155-
// A client defined expiry time makes sense here since a server time is
156-
// not what we should depend on.
157-
token.expired_at = moment()
158-
.add(token.expires_in, 'seconds')
159-
.format('YYYY-MM-DD hh:mm:ss');
160-
161198
// Store it locally for the authentication token to persist.
162199
window.localStorage.setItem('token', JSON.stringify(token));
163200
};
164201

202+
/**
203+
* Remove token data stored in persistent storage.
204+
*
205+
* @return {undefined}
206+
*/
207+
removeToken = () => {
208+
localStorage.removeItem('token');
209+
};
210+
165211
/**
166212
* Fetch the authenticated user.
167213
*
@@ -188,26 +234,30 @@ class Backoffice extends Component {
188234
};
189235

190236
async componentDidMount() {
237+
// Listen for all API responses.
238+
this.addResponseInterceptor();
239+
191240
// Setup Night Mode via Persistent Storage.
192241
this.setNightMode();
193242

194243
// Authenticate via Persistent Storage.
195244
const token = this.token();
196-
let expired = true;
197245

198-
if (token.hasOwnProperty('expired_at')) {
199-
expired = moment(token.expired_at).unix() > moment().unix();
246+
if (Object.keys(token).length > 0) {
247+
await this.authenticate(JSON.stringify(token));
200248
}
201249

202-
// if (!expired) {
203-
await this.authenticate(JSON.stringify(token));
204-
// }
205-
206250
this.setState({ loading: false });
207251
}
208252

253+
componentWillUnmount() {
254+
const { responseInterceptor } = this.state;
255+
256+
this.removeResponseInterceptor(responseInterceptor);
257+
}
258+
209259
render() {
210-
const { width } = this.props;
260+
const { width, environment, darkTheme, lightTheme } = this.props;
211261
const { loading, nightMode } = this.state;
212262

213263
return (
@@ -226,7 +276,7 @@ class Backoffice extends Component {
226276
pageProps={{
227277
...this.state,
228278
width,
229-
environment: 'backoffice',
279+
environment: environment,
230280
routes: ROUTES,
231281
handleNightmodeToggled: this
232282
.handleNightmodeToggled,
@@ -242,4 +292,10 @@ class Backoffice extends Component {
242292
}
243293
}
244294

245-
export default withWidth()(Backoffice);
295+
App.propTypes = {
296+
environment: PropTypes.oneOf(['backoffice']).isRequired,
297+
darkTheme: PropTypes.object.isRequired,
298+
lightTheme: PropTypes.object.isRequired,
299+
};
300+
301+
export default withWidth()(App);

resources/js/index.backoffice.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,22 @@ import React from 'react';
44
import ReactDOM from 'react-dom';
55

66
import { _register as registerServiceWorker } from './utils/ServiceWorker';
7-
import Backoffice from './Backoffice';
7+
import App from './App';
8+
import { dark as darkTheme, light as lightTheme } from './themes/backoffice';
89

910
if (document.querySelector('#initial-content')) {
1011
document.querySelector('#initial-content').outerHTML = '';
1112
}
1213

1314
if (document.querySelector('#root')) {
14-
ReactDOM.render(<Backoffice />, document.querySelector('#root'));
15+
ReactDOM.render(
16+
<App
17+
environment="backoffice"
18+
darkTheme={darkTheme}
19+
lightTheme={lightTheme}
20+
/>,
21+
document.querySelector('#root'),
22+
);
1523
}
1624

1725
const swFilepath = document.querySelector('meta[name=sw-filepath]');

0 commit comments

Comments
 (0)