1- import { BrowserRouter , Routes , Route , Navigate } from 'react-router-dom' ;
1+ import { createBrowserRouter , RouterProvider , Navigate , Outlet } from 'react-router-dom' ;
22import { Toaster } from 'react-hot-toast' ;
3+ import { QueryClient , QueryClientProvider } from '@tanstack/react-query' ;
4+ import { GlobalErrorBoundary } from '@/components/GlobalErrorBoundary' ;
35import { AuthProvider , useAuth } from '@/context/AuthContext' ;
46import Login from '@/pages/auth/Login' ;
57import Dashboard from '@/pages/dashboard' ;
@@ -9,6 +11,8 @@ import SentMailbox from "@/pages/mailbox/Sent";
911import Layout from '@/components/layout/Layout' ;
1012import { Loader2 } from 'lucide-react' ;
1113
14+ const queryClient = new QueryClient ( ) ;
15+
1216const PrivateRoute = ( { children, roles = [ ] } : { children : React . ReactNode , roles ?: string [ ] } ) => {
1317 const { user, isLoading } = useAuth ( ) ;
1418
@@ -33,9 +37,9 @@ const PrivateRoute = ({ children, roles = [] }: { children: React.ReactNode, rol
3337 return < > { children } </ > ;
3438} ;
3539
36- function AppRoutes ( ) {
40+ const AuthenticatedRoute = ( ) => {
3741 const { user, isLoading } = useAuth ( ) ;
38-
42+
3943 if ( isLoading ) {
4044 return (
4145 < div className = "min-h-screen flex items-center justify-center bg-background" >
@@ -44,31 +48,65 @@ function AppRoutes() {
4448 ) ;
4549 }
4650
47- return (
48- < Routes >
49- < Route path = "/login" element = { ! user ? < Login /> : < Navigate to = "/dashboard" /> } />
51+ if ( ! user ) return < Navigate to = "/login" replace /> ;
5052
51- < Route element = { user ? < Layout /> : < Navigate to = "/login" /> } >
52- < Route path = "/dashboard" element = { < Dashboard /> } />
53- < Route path = "/mailbox" element = { < PrivateRoute roles = { [ 'admin' , 'user' , 'mailbox' ] } > < Mailbox /> </ PrivateRoute > } />
54- < Route path = "/compose" element = { < PrivateRoute roles = { [ 'admin' , 'user' , 'mailbox' ] } > < ComposePage /> </ PrivateRoute > } />
55- < Route path = "/sent" element = { < PrivateRoute roles = { [ 'admin' , 'user' , 'mailbox' ] } > < SentMailbox /> </ PrivateRoute > } />
56- < Route path = "/settings" element = { < PrivateRoute roles = { [ 'admin' , 'user' ] } > < div className = "p-8" > Settings (Work in Progress)</ div > </ PrivateRoute > } />
57- < Route index element = { < Navigate to = "/dashboard" /> } />
58- </ Route >
59-
60- < Route path = "*" element = { < Navigate to = { user ? "/dashboard" : "/login" } /> } />
61- </ Routes >
53+ return (
54+ < Layout >
55+ < Outlet />
56+ </ Layout >
6257 ) ;
63- }
58+ } ;
59+
60+ const router = createBrowserRouter ( [
61+ {
62+ path : "/login" ,
63+ element : < Login /> ,
64+ } ,
65+ {
66+ path : "/" ,
67+ element : < AuthenticatedRoute /> ,
68+ children : [
69+ {
70+ index : true ,
71+ element : < Navigate to = "/dashboard" replace /> ,
72+ } ,
73+ {
74+ path : "dashboard" ,
75+ element : < Dashboard /> ,
76+ } ,
77+ {
78+ path : "mailbox" ,
79+ element : < PrivateRoute roles = { [ 'admin' , 'user' , 'mailbox' ] } > < Mailbox /> </ PrivateRoute > ,
80+ } ,
81+ {
82+ path : "compose" ,
83+ element : < PrivateRoute roles = { [ 'admin' , 'user' , 'mailbox' ] } > < ComposePage /> </ PrivateRoute > ,
84+ } ,
85+ {
86+ path : "sent" ,
87+ element : < PrivateRoute roles = { [ 'admin' , 'user' , 'mailbox' ] } > < SentMailbox /> </ PrivateRoute > ,
88+ } ,
89+ {
90+ path : "settings" ,
91+ element : < PrivateRoute roles = { [ 'admin' , 'user' ] } > < div className = "p-8" > Settings (Work in Progress)</ div > </ PrivateRoute > ,
92+ }
93+ ]
94+ } ,
95+ {
96+ path : "*" ,
97+ element : < Navigate to = "/dashboard" replace />
98+ }
99+ ] ) ;
64100
65101export default function App ( ) {
66102 return (
67- < BrowserRouter >
68- < AuthProvider >
69- < AppRoutes />
70- < Toaster position = "top-right" />
71- </ AuthProvider >
72- </ BrowserRouter >
103+ < GlobalErrorBoundary >
104+ < QueryClientProvider client = { queryClient } >
105+ < AuthProvider >
106+ < RouterProvider router = { router } />
107+ < Toaster position = "top-right" />
108+ </ AuthProvider >
109+ </ QueryClientProvider >
110+ </ GlobalErrorBoundary >
73111 ) ;
74112}
0 commit comments