sozsoft-platform/ui/src/routes/dynamicRouter.tsx
2026-04-23 13:36:51 +03:00

144 lines
4.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// DynamicRouter.tsx
import React from 'react'
import { Routes, Route, Navigate, useLocation } from 'react-router-dom'
import { mapDynamicRoutes } from './dynamicRouteLoader'
import { useDynamicRoutes } from './dynamicRoutesContext'
import { useComponents } from '@/contexts/ComponentContext'
import ProtectedRoute from '@/components/route/ProtectedRoute'
import PermissionGuard from '@/components/route/PermissionGuard'
import PageContainer from '@/components/template/PageContainer'
import { ROUTES_ENUM } from './route.constant'
import { hasSubdomain } from '@/utils/subdomain'
// AccessDenied ve NotFound'u dinamiklikten çıkarıyoruz
const AccessDenied = React.lazy(() => import('@/views/AccessDenied'))
const NotFound = React.lazy(() => import('@/views/NotFound'))
const DatabaseSetup = React.lazy(() => import('@/views/setup/DatabaseSetup'))
export const DynamicRouter: React.FC = () => {
const { routes, loading, error } = useDynamicRoutes()
const { registeredComponents, renderComponent, isComponentRegistered } = useComponents()
const location = useLocation()
const dynamicRoutes = React.useMemo(() => mapDynamicRoutes(routes), [routes])
// /setup path'inde loading bekleme — setup route her zaman erişilebilir olmalı
if (loading && location.pathname !== '/setup') return <div>Loading...</div>
if (error && location.pathname !== '/setup') return <div>Hata: {error}</div>
return (
<Routes>
{/* ADMIN */}
<Route path="/admin/*" element={<ProtectedRoute />}>
{dynamicRoutes
.filter((r) => r.routeType === 'protected')
.map((route) => {
const Component = route.getComponent(registeredComponents, renderComponent, isComponentRegistered)
return (
<Route
key={route.key}
path={route.path.replace(/^\/admin\/?/, '') || '.'}
element={
<PermissionGuard permissions={route.authority}>
<PageContainer>
<React.Suspense fallback={<div>Loading {route.path}...</div>}>
<Component />
</React.Suspense>
</PageContainer>
</PermissionGuard>
}
/>
)
})}
{/* admin default */}
<Route index element={<Navigate to={ROUTES_ENUM.protected.dashboard} replace />} />
{/* 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>
}
/>
</Route>
{/* Auth/Public dinamik rotalar */}
{dynamicRoutes
.filter((r) =>
hasSubdomain() ? r.routeType === 'authenticated' : r.routeType !== 'protected',
)
.map((route) => {
const Component = route.getComponent(registeredComponents, renderComponent, isComponentRegistered)
return (
<Route
key={route.key}
path={route.path}
element={
<React.Suspense fallback={<div>Loading {route.path}...</div>}>
<Component />
</React.Suspense>
}
/>
)
})}
{/* root redirect */}
<Route
path="/"
element={
<Navigate
to={hasSubdomain() ? ROUTES_ENUM.authenticated.login : ROUTES_ENUM.public.home}
replace
/>
}
/>
{/* public access denied (statik) */}
<Route
path="/access-denied"
element={
<React.Suspense fallback={<div>Loading...</div>}>
<AccessDenied />
</React.Suspense>
}
/>
{/* public not found (statik) */}
<Route
path="*"
element={
<React.Suspense fallback={<div>Loading...</div>}>
<NotFound />
</React.Suspense>
}
/>
{/* İlk kurulum — veritabanı mevcut değilse gösterilir */}
<Route
path={ROUTES_ENUM.setup}
element={
<React.Suspense fallback={<div>Loading...</div>}>
<DatabaseSetup />
</React.Suspense>
}
/>
</Routes>
)
}