import {useEffect, useState} from 'react'; import {apiClient} from '../../api/apiClient'; 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[]; }; 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([]); const [menuList, setMenuList] = useState([]); const [isLoading, setIsLoading] = useState(true); const [errorMessage, setErrorMessage] = useState(null); useEffect(() => { let mounted = true; apiClient.get('/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 : []); setMenuList(nextMenuList.length > 0 ? nextMenuList : []); setErrorMessage(null); }) .catch((error: Error) => { if (!mounted) { return; } setErrorMessage(error ? error.message : '메뉴 조회에 실패했습니다.'); }) .finally(() => { if (mounted) { setIsLoading(false); } }); return () => { mounted = false; }; }, []); return { headMenuList, menuList, isLoading, errorMessage, }; };