85 lines
2.9 KiB
TypeScript
85 lines
2.9 KiB
TypeScript
import type { MenuItem } from "@/src/entities/menu";
|
|
|
|
export type ParsedStatisticsMenuUrl = {
|
|
categoryFromPath: string | null;
|
|
componentName: string | null;
|
|
rawUrlPath: string;
|
|
};
|
|
|
|
/** 메뉴 `urlPath`에서 통계 화면 카테고리·컴포넌트명을 파싱합니다. */
|
|
export function parseStatisticsMenuUrlPath(
|
|
urlPath: string,
|
|
): ParsedStatisticsMenuUrl {
|
|
const trimmed = (urlPath ?? "").trim();
|
|
if (!trimmed) {
|
|
return { categoryFromPath: null, componentName: null, rawUrlPath: trimmed };
|
|
}
|
|
|
|
let pathPart = trimmed;
|
|
let queryString = "";
|
|
const queryIndex = trimmed.indexOf("?");
|
|
if (queryIndex >= 0) {
|
|
pathPart = trimmed.slice(0, queryIndex);
|
|
queryString = trimmed.slice(queryIndex + 1);
|
|
}
|
|
|
|
const tabParam = new URLSearchParams(queryString).get("tab")?.trim() || null;
|
|
const segments = pathPart.replace(/^\/+/, "").split("/").filter(Boolean);
|
|
|
|
let categoryFromPath: string | null = null;
|
|
if (segments[0] === "statistics" && segments.length >= 2) {
|
|
categoryFromPath = segments[1] ?? null;
|
|
}
|
|
|
|
let componentName = tabParam;
|
|
if (!componentName) {
|
|
if (!pathPart.includes("/") && !queryString) {
|
|
componentName = trimmed;
|
|
} else if (segments.length === 1 && segments[0] !== "statistics") {
|
|
componentName = segments[0] ?? null;
|
|
} else if (segments[0] === "statistics" && segments.length >= 3) {
|
|
componentName = segments[segments.length - 1] ?? null;
|
|
}
|
|
}
|
|
|
|
return { categoryFromPath, componentName, rawUrlPath: trimmed };
|
|
}
|
|
|
|
/** 동적 import용 카테고리 폴더명 (`input`, `review` 등) */
|
|
export function resolveStatisticsCategory(
|
|
urlPath: string,
|
|
parentEngNm: string,
|
|
): string {
|
|
const { categoryFromPath } = parseStatisticsMenuUrlPath(urlPath);
|
|
return categoryFromPath || parentEngNm || "";
|
|
}
|
|
|
|
/** 탭 ID·URL `?tab=` 값 - 컴포넌트 파일명(확장자 제외) */
|
|
export function resolveStatisticsTabId(urlPath: string): string {
|
|
const { componentName, rawUrlPath } = parseStatisticsMenuUrlPath(urlPath);
|
|
return componentName || rawUrlPath;
|
|
}
|
|
|
|
/** `@/src/components/statistics/{category}/{Component}` 또는 루트 컴포넌트 경로 */
|
|
export function buildStatisticsComponentImportPath(
|
|
urlPath: string,
|
|
parentEngNm: string,
|
|
): string {
|
|
const { componentName } = parseStatisticsMenuUrlPath(urlPath);
|
|
const category = resolveStatisticsCategory(urlPath, parentEngNm);
|
|
const name = componentName || urlPath;
|
|
if (!category) {
|
|
return `@/src/components/statistics/${name}`;
|
|
}
|
|
return `@/src/components/statistics/${category}/${name}`;
|
|
}
|
|
|
|
export function menuMatchesStatisticsTabId(
|
|
menu: MenuItem,
|
|
tabId: string,
|
|
): boolean {
|
|
if (!tabId) return false;
|
|
if (menu.urlPath === tabId) return true;
|
|
return resolveStatisticsTabId(menu.urlPath) === tabId;
|
|
}
|