2025-08-12 19:42:32 +00:00
|
|
|
|
// DynamicRouter.tsx
|
|
|
|
|
|
import React from 'react'
|
2025-06-28 21:34:28 +00:00
|
|
|
|
import { Routes, Route, Navigate } from 'react-router-dom'
|
2025-08-12 09:46:32 +00:00
|
|
|
|
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
|
|
|
|
|
2025-08-12 19:42:32 +00:00
|
|
|
|
// AccessDenied ve NotFound'u dinamiklikten çıkarıyoruz
|
|
|
|
|
|
const AccessDenied = React.lazy(() => import('@/views/AccessDenied'))
|
|
|
|
|
|
const NotFound = React.lazy(() => import('@/views/NotFound'))
|
|
|
|
|
|
|
2025-06-28 21:34:28 +00:00
|
|
|
|
export const DynamicRouter: React.FC = () => {
|
|
|
|
|
|
const { routes, loading, error } = useDynamicRoutes()
|
2025-08-12 19:42:32 +00:00
|
|
|
|
const dynamicRoutes = React.useMemo(() => mapDynamicRoutes(routes), [routes])
|
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-12 19:42:32 +00:00
|
|
|
|
{/* ADMIN */}
|
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-12 19:42:32 +00:00
|
|
|
|
path={route.path.replace(/^\/admin\/?/, '') || '.'}
|
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-12 19:42:32 +00:00
|
|
|
|
|
|
|
|
|
|
{/* admin default */}
|
2025-08-11 06:34:44 +00:00
|
|
|
|
<Route index element={<Navigate to={ROUTES_ENUM.protected.dashboard} replace />} />
|
2025-08-12 19:42:32 +00:00
|
|
|
|
|
|
|
|
|
|
{/* admin access denied (statik) */}
|
|
|
|
|
|
<Route
|
|
|
|
|
|
path="access-denied"
|
|
|
|
|
|
element={
|
|
|
|
|
|
<PageContainer>
|
|
|
|
|
|
<React.Suspense fallback={<div>Loading...</div>}>
|
|
|
|
|
|
<AccessDenied />
|
|
|
|
|
|
</React.Suspense>
|
|
|
|
|
|
</PageContainer>
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
|
|
{/* admin not found (statik) */}
|
|
|
|
|
|
<Route
|
|
|
|
|
|
path="*"
|
|
|
|
|
|
element={
|
|
|
|
|
|
<PageContainer>
|
|
|
|
|
|
<React.Suspense fallback={<div>Loading...</div>}>
|
|
|
|
|
|
<NotFound />
|
|
|
|
|
|
</React.Suspense>
|
|
|
|
|
|
</PageContainer>
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
2025-06-28 21:34:28 +00:00
|
|
|
|
</Route>
|
|
|
|
|
|
|
2025-08-12 19:42:32 +00:00
|
|
|
|
{/* Auth/Public dinamik rotalar */}
|
2025-06-28 21:34:28 +00:00
|
|
|
|
{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-12 19:42:32 +00:00
|
|
|
|
{/* root redirect */}
|
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-12 19:42:32 +00:00
|
|
|
|
{/* public access denied (statik) */}
|
|
|
|
|
|
<Route
|
|
|
|
|
|
path="/access-denied"
|
|
|
|
|
|
element={
|
|
|
|
|
|
<React.Suspense fallback={<div>Loading...</div>}>
|
|
|
|
|
|
<AccessDenied />
|
|
|
|
|
|
</React.Suspense>
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
|
|
{/* public not found (statik) */}
|
2025-08-11 14:52:19 +00:00
|
|
|
|
<Route
|
|
|
|
|
|
path="*"
|
|
|
|
|
|
element={
|
2025-08-12 19:42:32 +00:00
|
|
|
|
<React.Suspense fallback={<div>Loading...</div>}>
|
|
|
|
|
|
<NotFound />
|
|
|
|
|
|
</React.Suspense>
|
2025-08-11 14:52:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
/>
|
2025-06-28 21:34:28 +00:00
|
|
|
|
</Routes>
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|