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(fallbackHeadMenuList); const [menuList, setMenuList] = useState(fallbackMenuList); const [isLoading, setIsLoading] = useState(true); const [errorMessage, setErrorMessage] = useState(null); useEffect(() => { let mounted = true; adminAuthJson('/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, }; };