// 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 ( ) }