11import { BrowserRouter , Routes , Route , Navigate , useNavigate , useLocation , useSearchParams } from 'react-router-dom' ;
2- import { useState , useEffect } from 'react' ;
2+ import { useState , useEffect , lazy , Suspense } from 'react' ;
33import { ObjectForm } from '@object-ui/plugin-form' ;
44import { Dialog , DialogContent , DialogHeader , DialogTitle , DialogDescription , Empty , EmptyTitle } from '@object-ui/components' ;
55import { toast } from 'sonner' ;
@@ -9,35 +9,37 @@ import type { ConnectionState } from './dataSource';
99import appConfig from '../objectstack.shared' ;
1010import { AuthGuard , useAuth } from '@object-ui/auth' ;
1111
12- // Components
12+ // Components (eagerly loaded — always needed)
1313import { ConsoleLayout } from './components/ConsoleLayout' ;
1414import { CommandPalette } from './components/CommandPalette' ;
1515import { ErrorBoundary } from './components/ErrorBoundary' ;
1616import { LoadingScreen } from './components/LoadingScreen' ;
1717import { ObjectView } from './components/ObjectView' ;
18- import { RecordDetailView } from './components/RecordDetailView' ;
19- import { DashboardView } from './components/DashboardView' ;
20- import { PageView } from './components/PageView' ;
21- import { ReportView } from './components/ReportView' ;
22- import { ViewDesignerPage } from './components/ViewDesignerPage' ;
2318import { ExpressionProvider } from './context/ExpressionProvider' ;
2419import { ConditionalAuthWrapper } from './components/ConditionalAuthWrapper' ;
2520import { KeyboardShortcutsDialog } from './components/KeyboardShortcutsDialog' ;
2621import { OnboardingWalkthrough } from './components/OnboardingWalkthrough' ;
27- import { SearchResultsPage } from './components/SearchResultsPage' ;
2822import { useRecentItems } from './hooks/useRecentItems' ;
2923
30- // Auth Pages
31- import { LoginPage } from './pages/LoginPage' ;
32- import { RegisterPage } from './pages/RegisterPage' ;
33- import { ForgotPasswordPage } from './pages/ForgotPasswordPage' ;
24+ // Route-based code splitting — lazy-load less-frequently-used routes
25+ const RecordDetailView = lazy ( ( ) => import ( './components/RecordDetailView' ) . then ( m => ( { default : m . RecordDetailView } ) ) ) ;
26+ const DashboardView = lazy ( ( ) => import ( './components/DashboardView' ) . then ( m => ( { default : m . DashboardView } ) ) ) ;
27+ const PageView = lazy ( ( ) => import ( './components/PageView' ) . then ( m => ( { default : m . PageView } ) ) ) ;
28+ const ReportView = lazy ( ( ) => import ( './components/ReportView' ) . then ( m => ( { default : m . ReportView } ) ) ) ;
29+ const ViewDesignerPage = lazy ( ( ) => import ( './components/ViewDesignerPage' ) . then ( m => ( { default : m . ViewDesignerPage } ) ) ) ;
30+ const SearchResultsPage = lazy ( ( ) => import ( './components/SearchResultsPage' ) . then ( m => ( { default : m . SearchResultsPage } ) ) ) ;
3431
35- // System Admin Pages
36- import { UserManagementPage } from './pages/system/UserManagementPage' ;
37- import { OrgManagementPage } from './pages/system/OrgManagementPage' ;
38- import { RoleManagementPage } from './pages/system/RoleManagementPage' ;
39- import { AuditLogPage } from './pages/system/AuditLogPage' ;
40- import { ProfilePage } from './pages/system/ProfilePage' ;
32+ // Auth Pages (lazy — only needed before login)
33+ const LoginPage = lazy ( ( ) => import ( './pages/LoginPage' ) . then ( m => ( { default : m . LoginPage } ) ) ) ;
34+ const RegisterPage = lazy ( ( ) => import ( './pages/RegisterPage' ) . then ( m => ( { default : m . RegisterPage } ) ) ) ;
35+ const ForgotPasswordPage = lazy ( ( ) => import ( './pages/ForgotPasswordPage' ) . then ( m => ( { default : m . ForgotPasswordPage } ) ) ) ;
36+
37+ // System Admin Pages (lazy — rarely accessed)
38+ const UserManagementPage = lazy ( ( ) => import ( './pages/system/UserManagementPage' ) . then ( m => ( { default : m . UserManagementPage } ) ) ) ;
39+ const OrgManagementPage = lazy ( ( ) => import ( './pages/system/OrgManagementPage' ) . then ( m => ( { default : m . OrgManagementPage } ) ) ) ;
40+ const RoleManagementPage = lazy ( ( ) => import ( './pages/system/RoleManagementPage' ) . then ( m => ( { default : m . RoleManagementPage } ) ) ) ;
41+ const AuditLogPage = lazy ( ( ) => import ( './pages/system/AuditLogPage' ) . then ( m => ( { default : m . AuditLogPage } ) ) ) ;
42+ const ProfilePage = lazy ( ( ) => import ( './pages/system/ProfilePage' ) . then ( m => ( { default : m . ProfilePage } ) ) ) ;
4143
4244import { useParams } from 'react-router-dom' ;
4345import { ThemeProvider } from './components/theme-provider' ;
@@ -219,6 +221,7 @@ export function AppContent() {
219221 < OnboardingWalkthrough />
220222 < SchemaRendererProvider dataSource = { dataSource || { } } >
221223 < ErrorBoundary >
224+ < Suspense fallback = { < LoadingScreen /> } >
222225 < Routes >
223226 < Route path = "/" element = {
224227 // Redirect to first route within the app
@@ -278,6 +281,7 @@ export function AppContent() {
278281 < Route path = "system/audit-log" element = { < AuditLogPage /> } />
279282 < Route path = "system/profile" element = { < ProfilePage /> } />
280283 </ Routes >
284+ </ Suspense >
281285 </ ErrorBoundary >
282286
283287 < Dialog open = { isDialogOpen } onOpenChange = { setIsDialogOpen } >
@@ -365,6 +369,7 @@ export function App() {
365369 < ConsoleToaster position = "bottom-right" />
366370 < ConditionalAuthWrapper authUrl = "/api/auth" >
367371 < BrowserRouter basename = "/" >
372+ < Suspense fallback = { < LoadingScreen /> } >
368373 < Routes >
369374 < Route path = "/login" element = { < LoginPage /> } />
370375 < Route path = "/register" element = { < RegisterPage /> } />
@@ -376,6 +381,7 @@ export function App() {
376381 } />
377382 < Route path = "/" element = { < RootRedirect /> } />
378383 </ Routes >
384+ </ Suspense >
379385 </ BrowserRouter >
380386 </ ConditionalAuthWrapper >
381387 </ ThemeProvider >
0 commit comments