110 lines
7.2 KiB
TypeScript
110 lines
7.2 KiB
TypeScript
|
|
"use client";
|
||
|
|
|
||
|
|
import React, { useMemo } from "react";
|
||
|
|
import dynamic from "next/dynamic";
|
||
|
|
import { Loader2 } from "lucide-react";
|
||
|
|
|
||
|
|
const LoadingFallback = () => (
|
||
|
|
<div className="flex h-full items-center justify-center">
|
||
|
|
<Loader2 className="h-6 w-6 animate-spin text-muted-foreground" />
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 관리자 페이지를 URL 기반으로 동적 로딩하는 레지스트리.
|
||
|
|
* 사이드바 메뉴에서 접근하는 주요 페이지를 명시적으로 매핑한다.
|
||
|
|
* 매핑되지 않은 URL은 catch-all fallback으로 처리된다.
|
||
|
|
*/
|
||
|
|
const ADMIN_PAGE_REGISTRY: Record<string, React.ComponentType<any>> = {
|
||
|
|
// 관리자 메인
|
||
|
|
"/admin": dynamic(() => import("@/app/(main)/admin/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
|
||
|
|
// 메뉴 관리
|
||
|
|
"/admin/menu": dynamic(() => import("@/app/(main)/admin/menu/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
|
||
|
|
// 사용자 관리
|
||
|
|
"/admin/userMng/userMngList": dynamic(() => import("@/app/(main)/admin/userMng/userMngList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/userMng/rolesList": dynamic(() => import("@/app/(main)/admin/userMng/rolesList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/userMng/userAuthList": dynamic(() => import("@/app/(main)/admin/userMng/userAuthList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/userMng/companyList": dynamic(() => import("@/app/(main)/admin/userMng/companyList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
|
||
|
|
// 화면 관리
|
||
|
|
"/admin/screenMng/screenMngList": dynamic(() => import("@/app/(main)/admin/screenMng/screenMngList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/screenMng/popScreenMngList": dynamic(() => import("@/app/(main)/admin/screenMng/popScreenMngList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/screenMng/dashboardList": dynamic(() => import("@/app/(main)/admin/screenMng/dashboardList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/screenMng/reportList": dynamic(() => import("@/app/(main)/admin/screenMng/reportList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
|
||
|
|
// 시스템 관리
|
||
|
|
"/admin/systemMng/commonCodeList": dynamic(() => import("@/app/(main)/admin/systemMng/commonCodeList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/systemMng/tableMngList": dynamic(() => import("@/app/(main)/admin/systemMng/tableMngList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/systemMng/i18nList": dynamic(() => import("@/app/(main)/admin/systemMng/i18nList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/systemMng/collection-managementList": dynamic(() => import("@/app/(main)/admin/systemMng/collection-managementList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/systemMng/dataflow": dynamic(() => import("@/app/(main)/admin/systemMng/dataflow/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
|
||
|
|
// 자동화 관리
|
||
|
|
"/admin/automaticMng/flowMgmtList": dynamic(() => import("@/app/(main)/admin/automaticMng/flowMgmtList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/automaticMng/batchmngList": dynamic(() => import("@/app/(main)/admin/automaticMng/batchmngList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/automaticMng/exconList": dynamic(() => import("@/app/(main)/admin/automaticMng/exconList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/automaticMng/exCallConfList": dynamic(() => import("@/app/(main)/admin/automaticMng/exCallConfList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
|
||
|
|
// 메일
|
||
|
|
"/admin/automaticMng/mail/send": dynamic(() => import("@/app/(main)/admin/automaticMng/mail/send/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/automaticMng/mail/receive": dynamic(() => import("@/app/(main)/admin/automaticMng/mail/receive/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/automaticMng/mail/sent": dynamic(() => import("@/app/(main)/admin/automaticMng/mail/sent/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/automaticMng/mail/drafts": dynamic(() => import("@/app/(main)/admin/automaticMng/mail/drafts/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/automaticMng/mail/trash": dynamic(() => import("@/app/(main)/admin/automaticMng/mail/trash/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/automaticMng/mail/accounts": dynamic(() => import("@/app/(main)/admin/automaticMng/mail/accounts/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/automaticMng/mail/templates": dynamic(() => import("@/app/(main)/admin/automaticMng/mail/templates/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/automaticMng/mail/dashboardList": dynamic(() => import("@/app/(main)/admin/automaticMng/mail/dashboardList/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/automaticMng/mail/bulk-send": dynamic(() => import("@/app/(main)/admin/automaticMng/mail/bulk-send/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
|
||
|
|
// 배치 관리
|
||
|
|
"/admin/batch-management": dynamic(() => import("@/app/(main)/admin/batch-management/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/batch-management-new": dynamic(() => import("@/app/(main)/admin/batch-management-new/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
|
||
|
|
// 기타
|
||
|
|
"/admin/cascading-management": dynamic(() => import("@/app/(main)/admin/cascading-management/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/cascading-relations": dynamic(() => import("@/app/(main)/admin/cascading-relations/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/layouts": dynamic(() => import("@/app/(main)/admin/layouts/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/templates": dynamic(() => import("@/app/(main)/admin/templates/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/monitoring": dynamic(() => import("@/app/(main)/admin/monitoring/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/standards": dynamic(() => import("@/app/(main)/admin/standards/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/flow-external-db": dynamic(() => import("@/app/(main)/admin/flow-external-db/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
"/admin/auto-fill": dynamic(() => import("@/app/(main)/admin/auto-fill/page"), { ssr: false, loading: LoadingFallback }),
|
||
|
|
};
|
||
|
|
|
||
|
|
// 매핑되지 않은 URL용 Fallback
|
||
|
|
function AdminPageFallback({ url }: { url: string }) {
|
||
|
|
return (
|
||
|
|
<div className="flex h-full items-center justify-center">
|
||
|
|
<div className="text-center">
|
||
|
|
<p className="text-lg font-semibold text-foreground">페이지 로딩 불가</p>
|
||
|
|
<p className="mt-1 text-sm text-muted-foreground">
|
||
|
|
경로: {url}
|
||
|
|
</p>
|
||
|
|
<p className="mt-2 text-xs text-muted-foreground">
|
||
|
|
AdminPageRenderer 레지스트리에 이 URL을 추가해주세요.
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
interface AdminPageRendererProps {
|
||
|
|
url: string;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function AdminPageRenderer({ url }: AdminPageRendererProps) {
|
||
|
|
const PageComponent = useMemo(() => {
|
||
|
|
// URL에서 쿼리스트링/해시 제거 후 매칭
|
||
|
|
const cleanUrl = url.split("?")[0].split("#")[0].replace(/\/$/, "");
|
||
|
|
return ADMIN_PAGE_REGISTRY[cleanUrl] || null;
|
||
|
|
}, [url]);
|
||
|
|
|
||
|
|
if (!PageComponent) {
|
||
|
|
return <AdminPageFallback url={url} />;
|
||
|
|
}
|
||
|
|
|
||
|
|
return <PageComponent />;
|
||
|
|
}
|