11import { useAdmin } from '@/hooks/use-admin'
2- import { useEffect } from 'react'
2+ import { useEffect , useRef } from 'react'
33import { useLocation , useNavigate } from 'react-router'
44
55export default function RouteGuard ( { children } : { children : React . ReactNode } ) {
66 const { admin } = useAdmin ( )
77 const location = useLocation ( )
88 const navigate = useNavigate ( )
99 const is_sudo = admin ?. is_sudo || false
10+ const hasNavigatedRef = useRef ( false )
1011
1112 useEffect ( ( ) => {
12- if ( ! admin ) return // Wait for admin data to load
13+ if ( ! admin ) {
14+ hasNavigatedRef . current = false
15+ return // Wait for admin data to load
16+ }
1317
1418 if ( ! is_sudo ) {
1519 const currentPath = location . pathname
@@ -20,6 +24,12 @@ export default function RouteGuard({ children }: { children: React.ReactNode })
2024
2125 // If current route is allowed, don't redirect
2226 if ( isAllowedRoute ) {
27+ hasNavigatedRef . current = false
28+ return
29+ }
30+
31+ // Prevent multiple navigations for the same route change
32+ if ( hasNavigatedRef . current ) {
2333 return
2434 }
2535
@@ -28,12 +38,14 @@ export default function RouteGuard({ children }: { children: React.ReactNode })
2838 const isRestrictedRoute = restrictedRoutes . some ( route => currentPath . startsWith ( route ) )
2939
3040 if ( isRestrictedRoute ) {
41+ hasNavigatedRef . current = true
3142 navigate ( '/users' , { replace : true } )
3243 return
3344 }
3445
3546 // Handle settings routes
3647 if ( currentPath === '/settings' ) {
48+ hasNavigatedRef . current = true
3749 navigate ( '/settings/theme' , { replace : true } )
3850 return
3951 }
@@ -43,11 +55,19 @@ export default function RouteGuard({ children }: { children: React.ReactNode })
4355
4456 if ( restrictedSettingsRoutes . includes ( currentPath ) ) {
4557 // Redirecting non-sudo admin from restricted settings
58+ hasNavigatedRef . current = true
4659 navigate ( '/settings/theme' , { replace : true } )
4760 return
4861 }
62+ } else {
63+ hasNavigatedRef . current = false
4964 }
5065 } , [ admin , is_sudo , location . pathname , navigate ] )
5166
67+ // Reset navigation flag when pathname changes (after navigation completes)
68+ useEffect ( ( ) => {
69+ hasNavigatedRef . current = false
70+ } , [ location . pathname ] )
71+
5272 return < > { children } </ >
5373}
0 commit comments