1- import React , { useEffect } from "react" ;
1+ import React , { lazy , Suspense } from "react" ;
22
3- import { Container } from "react-bootstrap" ;
3+ import { Container , Spinner } from "react-bootstrap" ;
44import { BrowserRouter , Route , Routes } from "react-router" ;
55import { Flip , ToastContainer } from "react-toastify" ;
66
77import Footer from "../components/Footer" ;
88import Header from "../components/Header" ;
9- import useStore from "../modules/store" ;
109import paths from "../paths" ;
1110import PageNotFound from "../routes/404/PageNotFound" ;
12- import AdminEventsList from "../routes/AdminEventsList" ;
13- import AdminUsersList from "../routes/AdminUsers" ;
14- import AuditLog from "../routes/AuditLog" ;
15- import Editor from "../routes/Editor" ;
16- import EditSignup from "../routes/EditSignup" ;
17- import EventList from "../routes/EventList" ;
18- import InitialSetup from "../routes/InitialSetup" ;
19- import Login from "../routes/Login" ;
20- import SingleEvent from "../routes/SingleEvent" ;
2111
2212import "react-toastify/dist/ReactToastify.css" ;
2313import "../styles/app.scss" ;
2414
25- const LOGIN_RENEW_INTERVAL = 60 * 1000 ;
15+ // Code-split route components.
16+ const AdminEventsList = lazy ( ( ) => import ( "../routes/AdminEventsList" ) ) ;
17+ const AdminUsersList = lazy ( ( ) => import ( "../routes/AdminUsers" ) ) ;
18+ const AuditLog = lazy ( ( ) => import ( "../routes/AuditLog" ) ) ;
19+ const Editor = lazy ( ( ) => import ( "../routes/Editor" ) ) ;
20+ const EditSignup = lazy ( ( ) => import ( "../routes/EditSignup" ) ) ;
21+ const EventList = lazy ( ( ) => import ( "../routes/EventList" ) ) ;
22+ const InitialSetup = lazy ( ( ) => import ( "../routes/InitialSetup" ) ) ;
23+ const Login = lazy ( ( ) => import ( "../routes/Login" ) ) ;
24+ const SingleEvent = lazy ( ( ) => import ( "../routes/SingleEvent" ) ) ;
2625
27- const AppContainer = ( ) => {
28- const renewLogin = useStore ( ( state ) => state . auth . renewLogin ) ;
29- useEffect ( ( ) => {
30- // Renew login immediately on page load if necessary.
31- renewLogin ( ) ;
32- // Then, check every minute and renew if necessary.
33- const timer = window . setInterval ( ( ) => renewLogin ( ) , LOGIN_RENEW_INTERVAL ) ;
34- return ( ) => window . clearTimeout ( timer ) ;
35- } , [ renewLogin ] ) ;
26+ // Also code-split RenewLogin to avoid strong dependency on the store.
27+ const RenewLogin = lazy ( ( ) => import ( "./RenewLogin" ) ) ;
3628
37- return (
38- < BrowserRouter >
39- < div className = "layout-wrapper" >
40- < Header />
29+ const loadingFallback = (
30+ < div className = "ilmo--loading-container" >
31+ < Spinner animation = "border" />
32+ </ div >
33+ ) ;
34+
35+ const AppContainer = ( ) => (
36+ < BrowserRouter >
37+ < Suspense >
38+ < RenewLogin />
39+ </ Suspense >
40+ < div className = "layout-wrapper" >
41+ < Header />
42+ < Suspense fallback = { loadingFallback } >
4143 < Container >
4244 < Routes >
4345 < Route path = { paths . eventsList } element = { < EventList /> } />
@@ -53,22 +55,22 @@ const AppContainer = () => {
5355 < Route path = "*" element = { < PageNotFound /> } />
5456 </ Routes >
5557 </ Container >
56- < Footer / >
57- < ToastContainer
58- position = "top-right"
59- autoClose = { 5000 }
60- hideProgressBar = { false }
61- newestOnTop = { false }
62- closeOnClick
63- rtl = { false }
64- pauseOnFocusLoss
65- draggable
66- pauseOnHover
67- transition = { Flip }
68- />
69- </ div >
70- </ BrowserRouter >
71- ) ;
72- } ;
58+ </ Suspense >
59+ < Footer />
60+ < ToastContainer
61+ position = "top-right"
62+ autoClose = { 5000 }
63+ hideProgressBar = { false }
64+ newestOnTop = { false }
65+ closeOnClick
66+ rtl = { false }
67+ pauseOnFocusLoss
68+ draggable
69+ pauseOnHover
70+ transition = { Flip }
71+ / >
72+ </ div >
73+ </ BrowserRouter >
74+ ) ;
7375
7476export default AppContainer ;
0 commit comments