59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
"use client";
|
|
|
|
import { useEffect } from "react";
|
|
import { usePathname, useRouter } from "next/navigation";
|
|
import { MenuAuthorityApi } from "@/entities/menu-authority/@x/menu";
|
|
import { getCookie, useAlertStore, useMenuStore } from "@/shared/lib";
|
|
import { SITE_ID } from "@/shared/config";
|
|
import { MenuApi } from "../api/menu-service";
|
|
import { getCurrentMenu } from "./utils";
|
|
|
|
const MenuWrapper = ({ children }: { children: React.ReactNode }) => {
|
|
const router = useRouter();
|
|
const pathname = usePathname();
|
|
|
|
const alert = useAlertStore((state) => state.setMessage);
|
|
const { pageMenuAuthority, setCurrentMenuInfo, setPageMenuAuthority } =
|
|
useMenuStore((state) => state);
|
|
|
|
const getCurrentMenuInfo = async () => {
|
|
const menuRoles = await MenuApi.getMenuRoles(SITE_ID);
|
|
if (!menuRoles) return;
|
|
return getCurrentMenu(menuRoles, pathname ?? "");
|
|
};
|
|
|
|
const getPageMenuAuthority = async () => {
|
|
const menuCd = getCookie("menu-code-key");
|
|
if (!menuCd) return;
|
|
const response = await MenuAuthorityApi.getPageMenuAuthority(
|
|
parseInt(menuCd),
|
|
);
|
|
return response;
|
|
};
|
|
|
|
const checkInquiryAuthority = () => {
|
|
return pageMenuAuthority?.inqAuthrtYn === "Y";
|
|
};
|
|
|
|
useEffect(() => {
|
|
(async () => {
|
|
const currentMenu = await getCurrentMenuInfo();
|
|
if (currentMenu) setCurrentMenuInfo(currentMenu);
|
|
|
|
const response = await getPageMenuAuthority();
|
|
if (response?.length) setPageMenuAuthority(response[0]!);
|
|
})();
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
if (!pageMenuAuthority) return;
|
|
const inquiryAuthority = checkInquiryAuthority();
|
|
if (!inquiryAuthority)
|
|
alert("페이지에 대한 조회 권한이 없습니다.", () => router.push("/"));
|
|
}, [pageMenuAuthority]);
|
|
|
|
return <>{children}</>;
|
|
};
|
|
|
|
export { MenuWrapper };
|