Files
vexplor_dev/frontend/hooks/useCurrent2ndLevelMenuObjid.ts

79 lines
2.8 KiB
TypeScript
Raw Normal View History

"use client";
import { usePathname } from "next/navigation";
import { useMemo } from "react";
import { useMenu } from "@/contexts/MenuContext";
import { useTabStore, selectTabs, selectActiveTabId } from "@/stores/tabStore";
function stripCompanyPrefix(pathname: string): string {
return pathname.replace(/^\/COMPANY_\d+/, "") || "/";
}
/**
* "대분류" objid .
* - parent_obj_id를 ,
* - lev ( )
* - (/main ) : usePathname '/main'
* adminUrl을 fallback으로
*/
export function useCurrent2ndLevelMenuObjid(): number | null {
const pathname = usePathname();
const { userMenus, adminMenus } = useMenu();
const tabs = useTabStore(selectTabs);
const activeTabId = useTabStore(selectActiveTabId);
return useMemo(() => {
if (!pathname) return null;
const all: any[] = [...(userMenus as any[]), ...(adminMenus as any[])];
if (all.length === 0) return null;
// 1차: 실제 pathname 기준. 2차(탭 컨테이너 경로 등): 활성 탭 URL 기준
let targetUrl = stripCompanyPrefix(pathname);
const isRootLikePath = pathname === "/main" || pathname === "/" || pathname === "";
if (isRootLikePath) {
const activeTab = tabs.find((t) => t.id === activeTabId);
if (activeTab?.adminUrl) {
targetUrl = stripCompanyPrefix(activeTab.adminUrl);
}
}
const byObjid = new Map<string, any>();
for (const m of all) {
byObjid.set(String(m.objid), m);
}
const current = all.find((m) => m.menu_url === targetUrl);
if (!current) {
// eslint-disable-next-line no-console
console.warn("[useCurrent2ndLevelMenuObjid] 메뉴 매칭 실패", { targetUrl, sample: all.slice(0, 3) });
return null;
}
let node: any = current;
let prev: any = null;
let safety = 20;
while (node && safety-- > 0) {
const parentId = node.parent_obj_id;
if (parentId === null || parentId === undefined || parentId === 0 || parentId === "0") {
break;
}
const parent = byObjid.get(String(parentId));
if (!parent) break;
prev = node;
node = parent;
}
const resultObjid = prev ? Number(prev.objid) : Number(node.objid);
// eslint-disable-next-line no-console
console.log("[useCurrent2ndLevelMenuObjid]", {
targetUrl,
currentObjid: current.objid,
currentName: current.menu_name_kor,
resultObjid,
resultName: prev ? prev.menu_name_kor : node.menu_name_kor,
});
return resultObjid;
}, [pathname, userMenus, adminMenus, tabs, activeTabId]);
}