1- import React , { Component } from 'react' ;
1+ import React , { useState , useEffect } from 'react' ;
22import { HashRouter as Router } from 'react-router-dom' ;
33import PropTypes from 'prop-types' ;
44
@@ -8,33 +8,29 @@ import { Navigator } from './core';
88import { ROUTES } from './config' ;
99import { Loading } from './views' ;
1010
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 ) ;
2321
2422 /**
2523 * Determine if monitoring is enabled.
2624 *
2725 * @return {undefined }
2826 */
29- monitoringEnabled = ( ) => {
27+ const monitor = ( ) => {
3028 const configItem = document . querySelector (
3129 'meta[name=TELESCOPE_ENABLED]' ,
3230 ) ;
3331
3432 if ( configItem ) {
35- this . setState ( {
36- monitoringEnabled : Boolean ( configItem . content ) ,
37- } ) ;
33+ setMonitoringEnabled ( Boolean ( configItem . content ) ) ;
3834 }
3935 } ;
4036
@@ -45,7 +41,7 @@ class App extends Component {
4541 *
4642 * @param {undefined }
4743 */
48- removeResponseInterceptor = interceptor => {
44+ const removeResponseInterceptor = interceptor => {
4945 axios . interceptors . response . eject ( interceptor ) ;
5046 } ;
5147
@@ -56,7 +52,7 @@ class App extends Component {
5652 *
5753 * @param {undefined }
5854 */
59- addResponseInterceptor = ( ) => {
55+ const addResponseInterceptor = ( ) => {
6056 const responseInterceptor = axios . interceptors . response . use (
6157 response => {
6258 return response ;
@@ -66,16 +62,14 @@ class App extends Component {
6662 // In occasions of Unauthorized requests (401),
6763 // Remove the stored tokens.
6864 if ( error . response . status === 401 ) {
69- this . removeToken ( ) ;
65+ removeToken ( ) ;
7066 }
7167
7268 return Promise . reject ( error ) ;
7369 } ,
7470 ) ;
7571
76- this . setState ( {
77- responseInterceptor,
78- } ) ;
72+ setResponseInterceptor ( responseInterceptor ) ;
7973 } ;
8074
8175 /**
@@ -85,57 +79,49 @@ class App extends Component {
8579 *
8680 * @return {undefined }
8781 */
88- authenticate = async tokenString => {
82+ const authenticate = async tokenString => {
8983 const token = JSON . parse ( tokenString ) ;
9084
9185 if ( token === { } ) {
9286 return ;
9387 }
9488
95- this . setToken ( token ) ;
89+ storeToken ( token ) ;
9690
97- await this . fetchUser ( ) ;
91+ await fetchUser ( ) ;
9892 } ;
9993
10094 /**
10195 * Sign out user.
10296 *
10397 * @return {undefined }
10498 */
105- signout = async ( ) => {
106- this . setState ( { loading : true } ) ;
99+ const signOut = async ( ) => {
100+ setLoading ( true ) ;
107101
108102 try {
109- const response = await axios . post ( '/api/v1/auth/signout' ) ;
103+ await axios . post ( '/api/v1/auth/signout' ) ;
110104
111- if ( response . status === 200 ) {
112- this . removeToken ( ) ;
105+ removeToken ( ) ;
113106
114- this . setState ( {
115- loading : false ,
116- authenticated : false ,
117- user : { } ,
118- } ) ;
119- }
107+ setLoading ( false ) ;
108+ setAuthenticated ( false ) ;
109+ setUser ( { } ) ;
120110 } catch ( error ) {
121111 //
122112 }
123113 } ;
124114
125115 /**
126- * Handle nightmode toggle.
116+ * Handle nightMode toggle.
127117 * Store boolean value in persistent storage.
128118 *
129119 * @return {undefined }
130120 */
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 ) {
139125 window . localStorage . setItem ( 'nightMode' , true ) ;
140126 } else {
141127 window . localStorage . removeItem ( 'nightMode' ) ;
@@ -149,42 +135,38 @@ class App extends Component {
149135 *
150136 * @return {undefined }
151137 */
152- handleLock = async username => {
153- await this . setState ( {
154- username,
155- } ) ;
138+ const handleLock = username => {
139+ setUsername ( username ) ;
156140
157- await this . signout ( ) ;
141+ signOut ( ) ;
158142 } ;
159143
160144 /**
161145 * Sign out user completely.
162146 *
163147 * @return {undefined }
164148 */
165- handleSignout = async ( ) => {
166- await this . signout ( ) ;
149+ const handleSignOut = ( ) => {
150+ signOut ( ) ;
167151 } ;
168152
169153 /**
170- * Set nightmode based on stored value in persistent storage.
154+ * Set nightMode based on stored value in persistent storage.
171155 *
172156 * @return {undefined }
173157 */
174- setNightMode = ( ) => {
158+ const night = ( ) => {
175159 const nightMode = window . localStorage . getItem ( 'nightMode' ) ;
176160
177- this . setState ( {
178- nightMode : nightMode ? true : false ,
179- } ) ;
161+ setNightMode ( nightMode ? true : false ) ;
180162 } ;
181163
182164 /**
183165 * Get the Authentication Data from the persistent storage.
184166 *
185167 * @return {object }
186168 */
187- token = ( ) => {
169+ const getToken = ( ) => {
188170 const tokenString = window . localStorage . getItem ( 'token' ) ;
189171
190172 if ( ! tokenString ) {
@@ -193,7 +175,7 @@ class App extends Component {
193175
194176 const token = JSON . parse ( tokenString ) ;
195177
196- this . setState ( { token } ) ;
178+ setToken ( token ) ;
197179
198180 return token ;
199181 } ;
@@ -205,7 +187,7 @@ class App extends Component {
205187 *
206188 * @return {undefined }
207189 */
208- setToken = token => {
190+ const storeToken = token => {
209191 // We will set a default Authorization header, this will
210192 // eliminate the need to include the Authorization header
211193 // for almost every AJAX requests.
@@ -222,7 +204,7 @@ class App extends Component {
222204 *
223205 * @return {undefined }
224206 */
225- removeToken = ( ) => {
207+ const removeToken = ( ) => {
226208 localStorage . removeItem ( 'token' ) ;
227209 } ;
228210
@@ -231,88 +213,88 @@ class App extends Component {
231213 *
232214 * @return {any }
233215 */
234- fetchUser = async ( ) => {
235- this . setState ( { loading : true } ) ;
216+ const fetchUser = async ( ) => {
217+ setLoading ( true ) ;
236218
237219 try {
238220 const response = await axios . post ( '/api/v1/auth/user' ) ;
239221
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 ) ;
249225
250226 return response . data ;
251227 } catch ( error ) {
252228 //
253229 }
254230 } ;
255231
256- async componentDidMount ( ) {
257- // Toggle monitoring.
258- this . monitoringEnabled ( ) ;
232+ useEffect ( ( ) => {
233+ if ( initialized ) {
234+ return ;
235+ }
236+
237+ monitor ( ) ;
259238
260- // Listen for all API responses.
261- this . addResponseInterceptor ( ) ;
239+ addResponseInterceptor ( ) ;
262240
263- // Setup Night Mode via Persistent Storage.
264- this . setNightMode ( ) ;
241+ night ( ) ;
265242
266- // Authenticate via Persistent Storage.
267- const token = this . token ( ) ;
243+ const token = getToken ( ) ;
268244
269245 if ( Object . keys ( token ) . length > 0 ) {
270- await this . authenticate ( JSON . stringify ( token ) ) ;
246+ authenticate ( JSON . stringify ( token ) ) ;
247+ } else {
248+ setLoading ( false ) ;
271249 }
272250
273- this . setState ( { loading : false } ) ;
274- }
275-
276- componentWillUnmount ( ) {
277- const { responseInterceptor } = this . state ;
251+ if ( responseInterceptor !== null ) {
252+ removeResponseInterceptor ( responseInterceptor ) ;
253+ }
278254
279- this . removeResponseInterceptor ( responseInterceptor ) ;
280- }
255+ setInitialized ( true ) ;
256+ } , [ initialized ] ) ;
281257
282- render ( ) {
283- const { width, environment, darkTheme, lightTheme } = this . props ;
284- const { loading, nightMode } = this . state ;
258+ const { width, environment, darkTheme, lightTheme } = props ;
285259
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+ } ;
289269
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
292283 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 ,
294292 } }
295293 />
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+ ) ;
316298}
317299
318300App . propTypes = {
0 commit comments