1
- import React , { Component } from 'react' ;
1
+ import React , { useState , useEffect } from 'react' ;
2
2
import { HashRouter as Router } from 'react-router-dom' ;
3
3
import PropTypes from 'prop-types' ;
4
4
@@ -8,33 +8,29 @@ import { Navigator } from './core';
8
8
import { ROUTES } from './config' ;
9
9
import { Loading } from './views' ;
10
10
11
- class App extends Component {
12
- state = {
13
- loading : true ,
14
- authenticated : false ,
15
- nightMode : false ,
16
- token : { } ,
17
- user : { } ,
18
- username : '' ,
19
-
20
- monitoringEnabled : false ,
21
- responseInterceptor : null ,
22
- } ;
11
+ function App ( props ) {
12
+ const [ initialized , setInitialized ] = useState ( false ) ;
13
+ const [ loading , setLoading ] = useState ( true ) ;
14
+ const [ authenticated , setAuthenticated ] = useState ( false ) ;
15
+ const [ nightMode , setNightMode ] = useState ( false ) ;
16
+ const [ token , setToken ] = useState ( { } ) ;
17
+ const [ user , setUser ] = useState ( { } ) ;
18
+ const [ username , setUsername ] = useState ( '' ) ;
19
+ const [ monitoringEnabled , setMonitoringEnabled ] = useState ( false ) ;
20
+ const [ responseInterceptor , setResponseInterceptor ] = useState ( null ) ;
23
21
24
22
/**
25
23
* Determine if monitoring is enabled.
26
24
*
27
25
* @return {undefined }
28
26
*/
29
- monitoringEnabled = ( ) => {
27
+ const monitor = ( ) => {
30
28
const configItem = document . querySelector (
31
29
'meta[name=TELESCOPE_ENABLED]' ,
32
30
) ;
33
31
34
32
if ( configItem ) {
35
- this . setState ( {
36
- monitoringEnabled : Boolean ( configItem . content ) ,
37
- } ) ;
33
+ setMonitoringEnabled ( Boolean ( configItem . content ) ) ;
38
34
}
39
35
} ;
40
36
@@ -45,7 +41,7 @@ class App extends Component {
45
41
*
46
42
* @param {undefined }
47
43
*/
48
- removeResponseInterceptor = interceptor => {
44
+ const removeResponseInterceptor = interceptor => {
49
45
axios . interceptors . response . eject ( interceptor ) ;
50
46
} ;
51
47
@@ -56,7 +52,7 @@ class App extends Component {
56
52
*
57
53
* @param {undefined }
58
54
*/
59
- addResponseInterceptor = ( ) => {
55
+ const addResponseInterceptor = ( ) => {
60
56
const responseInterceptor = axios . interceptors . response . use (
61
57
response => {
62
58
return response ;
@@ -66,16 +62,14 @@ class App extends Component {
66
62
// In occasions of Unauthorized requests (401),
67
63
// Remove the stored tokens.
68
64
if ( error . response . status === 401 ) {
69
- this . removeToken ( ) ;
65
+ removeToken ( ) ;
70
66
}
71
67
72
68
return Promise . reject ( error ) ;
73
69
} ,
74
70
) ;
75
71
76
- this . setState ( {
77
- responseInterceptor,
78
- } ) ;
72
+ setResponseInterceptor ( responseInterceptor ) ;
79
73
} ;
80
74
81
75
/**
@@ -85,57 +79,49 @@ class App extends Component {
85
79
*
86
80
* @return {undefined }
87
81
*/
88
- authenticate = async tokenString => {
82
+ const authenticate = async tokenString => {
89
83
const token = JSON . parse ( tokenString ) ;
90
84
91
85
if ( token === { } ) {
92
86
return ;
93
87
}
94
88
95
- this . setToken ( token ) ;
89
+ storeToken ( token ) ;
96
90
97
- await this . fetchUser ( ) ;
91
+ await fetchUser ( ) ;
98
92
} ;
99
93
100
94
/**
101
95
* Sign out user.
102
96
*
103
97
* @return {undefined }
104
98
*/
105
- signout = async ( ) => {
106
- this . setState ( { loading : true } ) ;
99
+ const signOut = async ( ) => {
100
+ setLoading ( true ) ;
107
101
108
102
try {
109
- const response = await axios . post ( '/api/v1/auth/signout' ) ;
103
+ await axios . post ( '/api/v1/auth/signout' ) ;
110
104
111
- if ( response . status === 200 ) {
112
- this . removeToken ( ) ;
105
+ removeToken ( ) ;
113
106
114
- this . setState ( {
115
- loading : false ,
116
- authenticated : false ,
117
- user : { } ,
118
- } ) ;
119
- }
107
+ setLoading ( false ) ;
108
+ setAuthenticated ( false ) ;
109
+ setUser ( { } ) ;
120
110
} catch ( error ) {
121
111
//
122
112
}
123
113
} ;
124
114
125
115
/**
126
- * Handle nightmode toggle.
116
+ * Handle nightMode toggle.
127
117
* Store boolean value in persistent storage.
128
118
*
129
119
* @return {undefined }
130
120
*/
131
- handleNightmodeToggled = ( ) => {
132
- this . setState ( prevState => {
133
- return {
134
- nightMode : ! prevState . nightMode ,
135
- } ;
136
- } ) ;
137
-
138
- if ( ! this . state . nightMode ) {
121
+ const handleNightModeToggled = ( ) => {
122
+ setNightMode ( ! nightMode ) ;
123
+
124
+ if ( ! nightMode ) {
139
125
window . localStorage . setItem ( 'nightMode' , true ) ;
140
126
} else {
141
127
window . localStorage . removeItem ( 'nightMode' ) ;
@@ -149,42 +135,38 @@ class App extends Component {
149
135
*
150
136
* @return {undefined }
151
137
*/
152
- handleLock = async username => {
153
- await this . setState ( {
154
- username,
155
- } ) ;
138
+ const handleLock = username => {
139
+ setUsername ( username ) ;
156
140
157
- await this . signout ( ) ;
141
+ signOut ( ) ;
158
142
} ;
159
143
160
144
/**
161
145
* Sign out user completely.
162
146
*
163
147
* @return {undefined }
164
148
*/
165
- handleSignout = async ( ) => {
166
- await this . signout ( ) ;
149
+ const handleSignOut = ( ) => {
150
+ signOut ( ) ;
167
151
} ;
168
152
169
153
/**
170
- * Set nightmode based on stored value in persistent storage.
154
+ * Set nightMode based on stored value in persistent storage.
171
155
*
172
156
* @return {undefined }
173
157
*/
174
- setNightMode = ( ) => {
158
+ const night = ( ) => {
175
159
const nightMode = window . localStorage . getItem ( 'nightMode' ) ;
176
160
177
- this . setState ( {
178
- nightMode : nightMode ? true : false ,
179
- } ) ;
161
+ setNightMode ( nightMode ? true : false ) ;
180
162
} ;
181
163
182
164
/**
183
165
* Get the Authentication Data from the persistent storage.
184
166
*
185
167
* @return {object }
186
168
*/
187
- token = ( ) => {
169
+ const getToken = ( ) => {
188
170
const tokenString = window . localStorage . getItem ( 'token' ) ;
189
171
190
172
if ( ! tokenString ) {
@@ -193,7 +175,7 @@ class App extends Component {
193
175
194
176
const token = JSON . parse ( tokenString ) ;
195
177
196
- this . setState ( { token } ) ;
178
+ setToken ( token ) ;
197
179
198
180
return token ;
199
181
} ;
@@ -205,7 +187,7 @@ class App extends Component {
205
187
*
206
188
* @return {undefined }
207
189
*/
208
- setToken = token => {
190
+ const storeToken = token => {
209
191
// We will set a default Authorization header, this will
210
192
// eliminate the need to include the Authorization header
211
193
// for almost every AJAX requests.
@@ -222,7 +204,7 @@ class App extends Component {
222
204
*
223
205
* @return {undefined }
224
206
*/
225
- removeToken = ( ) => {
207
+ const removeToken = ( ) => {
226
208
localStorage . removeItem ( 'token' ) ;
227
209
} ;
228
210
@@ -231,88 +213,88 @@ class App extends Component {
231
213
*
232
214
* @return {any }
233
215
*/
234
- fetchUser = async ( ) => {
235
- this . setState ( { loading : true } ) ;
216
+ const fetchUser = async ( ) => {
217
+ setLoading ( true ) ;
236
218
237
219
try {
238
220
const response = await axios . post ( '/api/v1/auth/user' ) ;
239
221
240
- if ( response . status !== 200 ) {
241
- return ;
242
- }
243
-
244
- this . setState ( {
245
- loading : false ,
246
- authenticated : true ,
247
- user : response . data ,
248
- } ) ;
222
+ setAuthenticated ( true ) ;
223
+ setUser ( response . data ) ;
224
+ setLoading ( false ) ;
249
225
250
226
return response . data ;
251
227
} catch ( error ) {
252
228
//
253
229
}
254
230
} ;
255
231
256
- async componentDidMount ( ) {
257
- // Toggle monitoring.
258
- this . monitoringEnabled ( ) ;
232
+ useEffect ( ( ) => {
233
+ if ( initialized ) {
234
+ return ;
235
+ }
236
+
237
+ monitor ( ) ;
259
238
260
- // Listen for all API responses.
261
- this . addResponseInterceptor ( ) ;
239
+ addResponseInterceptor ( ) ;
262
240
263
- // Setup Night Mode via Persistent Storage.
264
- this . setNightMode ( ) ;
241
+ night ( ) ;
265
242
266
- // Authenticate via Persistent Storage.
267
- const token = this . token ( ) ;
243
+ const token = getToken ( ) ;
268
244
269
245
if ( Object . keys ( token ) . length > 0 ) {
270
- await this . authenticate ( JSON . stringify ( token ) ) ;
246
+ authenticate ( JSON . stringify ( token ) ) ;
247
+ } else {
248
+ setLoading ( false ) ;
271
249
}
272
250
273
- this . setState ( { loading : false } ) ;
274
- }
275
-
276
- componentWillUnmount ( ) {
277
- const { responseInterceptor } = this . state ;
251
+ if ( responseInterceptor !== null ) {
252
+ removeResponseInterceptor ( responseInterceptor ) ;
253
+ }
278
254
279
- this . removeResponseInterceptor ( responseInterceptor ) ;
280
- }
255
+ setInitialized ( true ) ;
256
+ } , [ initialized ] ) ;
281
257
282
- render ( ) {
283
- const { width, environment, darkTheme, lightTheme } = this . props ;
284
- const { loading, nightMode } = this . state ;
258
+ const { width, environment, darkTheme, lightTheme } = props ;
285
259
286
- return (
287
- < MuiThemeProvider theme = { nightMode ? darkTheme : lightTheme } >
288
- < CssBaseline />
260
+ const pageProps = {
261
+ loading,
262
+ authenticated,
263
+ nightMode,
264
+ user,
265
+ token,
266
+ username,
267
+ monitoringEnabled,
268
+ } ;
289
269
290
- { loading ? (
291
- < Loading
270
+ return (
271
+ < MuiThemeProvider theme = { nightMode ? darkTheme : lightTheme } >
272
+ < CssBaseline />
273
+
274
+ { loading ? (
275
+ < Loading
276
+ pageProps = { {
277
+ ...pageProps ,
278
+ } }
279
+ />
280
+ ) : (
281
+ < Router >
282
+ < Navigator
292
283
pageProps = { {
293
- ...this . state ,
284
+ ...pageProps ,
285
+ width,
286
+ environment : environment ,
287
+ routes : ROUTES ,
288
+ handleNightModeToggled : handleNightModeToggled ,
289
+ authenticate : authenticate ,
290
+ handleLock : handleLock ,
291
+ handleSignOut : handleSignOut ,
294
292
} }
295
293
/>
296
- ) : (
297
- < Router >
298
- < Navigator
299
- pageProps = { {
300
- ...this . state ,
301
- width,
302
- environment : environment ,
303
- routes : ROUTES ,
304
- handleNightmodeToggled : this
305
- . handleNightmodeToggled ,
306
- authenticate : this . authenticate ,
307
- handleLock : this . handleLock ,
308
- handleSignout : this . handleSignout ,
309
- } }
310
- />
311
- </ Router >
312
- ) }
313
- </ MuiThemeProvider >
314
- ) ;
315
- }
294
+ </ Router >
295
+ ) }
296
+ </ MuiThemeProvider >
297
+ ) ;
316
298
}
317
299
318
300
App . propTypes = {
0 commit comments