File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
import { useEffect, useState } from 'react';
import { adminAuthJson } from '../../api/adminAuth';
import type { MenuItem } from '../component/menu/MenuList';
type BackendMenuItem = {
menuNo?: number | string;
menuNm?: string;
url?: string;
upperMenuId?: number | string;
};
type MenuLeftResponse = {
head?: BackendMenuItem[];
menu?: BackendMenuItem[];
};
const fallbackHeadMenuList: MenuItem[] = [
{ name: '테스트 메뉴1', no: '1', url: '#', upperNo: '0' },
{ name: '테스트 메뉴2', no: '2', url: '#', upperNo: '0' },
{ name: '테스트 메뉴3', no: '3', url: '#', upperNo: '0' },
];
const fallbackMenuList: MenuItem[] = [
{ name: '테스트 1', no: '6', url: '#', upperNo: '1' },
{ name: '테스트 2', no: '7', url: '#', upperNo: '1' },
{ name: '테스트 3', no: '8', url: '#', upperNo: '2' },
];
function toMenuItem(item: BackendMenuItem): MenuItem {
return {
no: String(item.menuNo ?? ''),
name: item.menuNm ?? '',
url: item.url ?? '#',
upperNo: String(item.upperMenuId ?? '0'),
};
}
export const useMenuList = () => {
const [headMenuList, setHeadMenuList] = useState<MenuItem[]>(fallbackHeadMenuList);
const [menuList, setMenuList] = useState<MenuItem[]>(fallbackMenuList);
const [isLoading, setIsLoading] = useState(true);
const [errorMessage, setErrorMessage] = useState<string | null>(null);
useEffect(() => {
let mounted = true;
adminAuthJson<MenuLeftResponse>('/sym/mms/menuLeft.do')
.then((data) => {
if (!mounted) {
return;
}
const nextHeadMenuList = (data.head ?? []).map(toMenuItem).filter((item) => item.no && item.name);
const nextMenuList = (data.menu ?? []).map(toMenuItem).filter((item) => item.no && item.name);
setHeadMenuList(nextHeadMenuList.length > 0 ? nextHeadMenuList : fallbackHeadMenuList);
setMenuList(nextMenuList.length > 0 ? nextMenuList : fallbackMenuList);
setErrorMessage(null);
})
.catch((error: unknown) => {
if (!mounted) {
return;
}
setErrorMessage(error instanceof Error ? error.message : '메뉴 조회에 실패했습니다.');
})
.finally(() => {
if (mounted) {
setIsLoading(false);
}
});
return () => {
mounted = false;
};
}, []);
return {
headMenuList,
menuList,
isLoading,
errorMessage,
};
};