// src/app/App.jsx
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
import { AuthProvider, useAuth } from './providers/AuthProvider'
import AppLayout from '../layouts/AppLayout'
import AuthLayout from '../layouts/AuthLayout'
import Placeholder from './Placeholder'
import Login from '../auth/pages/Login'
import Home from '../auth/pages/Home'
import Admin from '../auth/pages/Admin'
import ProductsPage from '../features/products/ProductsPage'
import DriverDailyStatPage from '../features/crm/DriverDailyStat/DriverDailyStatPage'
import CsHomePage from '../features/crm/CsHome/CsHomePage'
import { RequireAuth, RequireRole } from '../auth/authGuard'
import { NAV } from '../lib/navConfig'
// 실제 구현된 페이지만 여기에 등록. 나머지 메뉴는 자동으로 Placeholder로 채워진다.
// key는 navConfig item의 `to`(절대경로)와 일치시킨다.
const REAL_PAGES = {
'/crm/home': ,
'/crm/driver-daily-stat': ,
'/opr/products': ,
}
// navConfig.NAV 를 펼쳐 라우트를 생성한다.
// - element: REAL_PAGES에 있으면 실제 페이지, 없으면 Placeholder
// - 모듈에 role이 있으면 해당 라우트를 로 감싼다.
function buildModuleRoutes() {
return NAV.map((mod) => {
const seg = mod.base.replace(/^\//, '') // '/hcm' -> 'hcm'
const first = mod.items[0]
const firstSeg = first ? first.to.replace(mod.base + '/', '') : '' // '/hcm/employees' -> 'employees'
const children = mod.items.map((it) => {
const childSeg = it.to.replace(mod.base + '/', '') // 모듈 기준 상대경로
const page = REAL_PAGES[it.to] ??
const element = mod.role
? {page}
: page
return
})
// /hcm 처럼 모듈 base로 오면 첫 서브메뉴로 보낸다.
// → 경로가 /hcm/* 로 유지되어 사이드바가 뜨고 탑 탭이 활성화된다.
// (빈 '모듈 홈' 화면을 원하면 아래 index element를 로 바꾸면 됨)
return (
{first && } />}
{children}
)
})
}
function AppRoutes() {
const { user } = useAuth()
return (
:
}
/>
}
>
} />
{/* navConfig 기반 자동 생성 라우트 (HR/ACC/CS/OPR/SYS/CONFIG) */}
{buildModuleRoutes()}
{/* navConfig에 없지만 유지하는 관리자 전용 라우트 */}
}
/>
{/* 알 수 없는 경로는 홈으로 */}
} />
)
}
export default function App() {
return (
)
}