erp-platform/ui/src/routes/dynamicRouter.tsx

90 lines
2.9 KiB
TypeScript
Raw Normal View History

2025-06-28 21:34:28 +00:00
import React, { useMemo } from 'react'
import { Routes, Route, Navigate } from 'react-router-dom'
import { mapDynamicRoutes, loadComponent } from './dynamicRouteLoader'
2025-06-28 21:34:28 +00:00
import { useDynamicRoutes } from './dynamicRoutesContext'
import ProtectedRoute from '@/components/route/ProtectedRoute'
import PermissionGuard from '@/components/route/PermissionGuard'
import PageContainer from '@/components/template/PageContainer'
import { ROUTES_ENUM } from './route.constant'
2025-08-11 13:43:39 +00:00
import { hasSubdomain } from '@/utils/subdomain'
2025-06-28 21:34:28 +00:00
export const DynamicRouter: React.FC = () => {
const { routes, loading, error } = useDynamicRoutes()
const dynamicRoutes = useMemo(() => mapDynamicRoutes(routes), [routes])
const NotFoundComponent = useMemo(() => loadComponent('views/NotFound'), [])
2025-06-28 21:34:28 +00:00
if (loading) return <div>Loading...</div>
if (error) return <div>Hata: {error}</div>
return (
<Routes>
2025-08-11 06:34:44 +00:00
<Route path="/admin/*" element={<ProtectedRoute />}>
2025-06-28 21:34:28 +00:00
{dynamicRoutes
.filter((r) => r.routeType === 'protected')
.map((route) => {
const Component = route.getComponent()
return (
<Route
key={route.key}
2025-08-11 06:34:44 +00:00
path={route.path.replace(/^\/admin\/?/, '') || '.'} // Remove /admin prefix for nested routes
2025-06-28 21:34:28 +00:00
element={
<PermissionGuard permissions={route.authority}>
<PageContainer>
<React.Suspense fallback={<div>Loading {route.path}...</div>}>
<Component />
</React.Suspense>
</PageContainer>
</PermissionGuard>
}
/>
)
})}
2025-08-11 06:34:44 +00:00
<Route index element={<Navigate to={ROUTES_ENUM.protected.dashboard} replace />} />
2025-06-28 21:34:28 +00:00
</Route>
{dynamicRoutes
2025-08-11 14:52:19 +00:00
.filter((r) =>
hasSubdomain() ? r.routeType === 'authenticated' : r.routeType !== 'protected',
)
2025-06-28 21:34:28 +00:00
.map((route) => {
const Component = route.getComponent()
return (
<Route
key={route.key}
path={route.path}
element={
<React.Suspense fallback={<div>Loading {route.path}...</div>}>
<Component />
</React.Suspense>
}
/>
)
})}
2025-08-11 13:43:39 +00:00
<Route
path="/"
element={
<Navigate
to={hasSubdomain() ? ROUTES_ENUM.authenticated.login : ROUTES_ENUM.public.home}
replace
/>
}
/>
2025-08-11 14:52:19 +00:00
<Route
path="*"
element={
hasSubdomain() ? (
<Navigate to={ROUTES_ENUM.authenticated.login} replace />
) : (
<React.Suspense fallback={<div>Loading...</div>}>
<NotFoundComponent />
</React.Suspense>
)
2025-08-11 14:52:19 +00:00
}
/>
2025-06-28 21:34:28 +00:00
</Routes>
)
}