feat: 즐겨찾기 메뉴 4개 제한 기능 추가

- 즐겨찾기 메뉴 최대 4개 제한
- 5번째 추가 시 마지막 항목 자동 제거
- menu-category 컴포넌트 아이콘 파일 경로 수정

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Jay Sheen
2025-10-21 19:13:32 +09:00
parent cb58b6b1d0
commit e38469f181

View File

@@ -4,13 +4,12 @@ import { IMAGE_ROOT } from '@/shared/constants/common';
import { UserFavorite } from '@/entities/user/model/types'; import { UserFavorite } from '@/entities/user/model/types';
import { RefObject, useEffect, useState } from 'react'; import { RefObject, useEffect, useState } from 'react';
import { useLocation } from 'react-router'; import { useLocation } from 'react-router';
import { PATHS } from '@/shared/constants/paths';
import { MenuItem } from '../model/types'; import { MenuItem } from '../model/types';
export interface MenuCategoryProps { export interface MenuCategoryProps {
menuId?: number; menuId?: number;
menuIcon?: string;
menuName?: string; menuName?: string;
iconFilePath?: string;
subMenu?: Array<MenuItem>; subMenu?: Array<MenuItem>;
setMenuOn?: (menuOn: boolean) => void; setMenuOn?: (menuOn: boolean) => void;
editMode?: boolean; editMode?: boolean;
@@ -21,7 +20,7 @@ export interface MenuCategoryProps {
export const MenuCategory = ({ export const MenuCategory = ({
menuId, menuId,
menuIcon, iconFilePath,
menuName, menuName,
subMenu, subMenu,
setMenuOn, setMenuOn,
@@ -31,7 +30,7 @@ export const MenuCategory = ({
itemIndex itemIndex
}: MenuCategoryProps) => { }: MenuCategoryProps) => {
const { navigate } = useNavigate(); const { navigate } = useNavigate();
const location = useLocation(); // const location = useLocation();
const [favoriteItems, setFavoriteItems] = useState<Array<UserFavorite>>([]); const [favoriteItems, setFavoriteItems] = useState<Array<UserFavorite>>([]);
const [menuIds, setMenuIds] = useState<Array<number | undefined>>([]); const [menuIds, setMenuIds] = useState<Array<number | undefined>>([]);
@@ -52,36 +51,39 @@ export const MenuCategory = ({
programPath?: string, programPath?: string,
) => { ) => {
let userFavorite = useStore.getState().UserStore.userFavorite; let userFavorite = useStore.getState().UserStore.userFavorite;
let randomNum = Math.floor(Math.random() * 3) + 1;
if(checked){ if(checked){
// 즐겨찾기가 4개 이상일 경우 마지막 항목 제거
if(userFavorite.length >= 4){
userFavorite = userFavorite.slice(0, 3);
}
userFavorite = [ userFavorite = [
...userFavorite, ...userFavorite,
{ {
menuId: menuId, menuId: menuId,
menuName: menuName, menuName: menuName,
menuNameEng: menuNameEng, menuNameEng: menuNameEng,
iconFilePath: `${IMAGE_ROOT}/ico_menu_0${randomNum}.svg`, iconFilePath: iconFilePath,
programPath: programPath programPath: programPath
} }
]; ];
} }
else{ else{
userFavorite = userFavorite.filter((value, index) => { userFavorite = userFavorite.filter((value, _) => {
return value.menuId !== menuId return value.menuId !== menuId
}); });
} }
useStore.getState().UserStore.setUserFavorite(userFavorite); useStore.getState().UserStore.setUserFavorite(userFavorite);
setChangeMenuId(`${menuId}-${checked}`); setChangeMenuId(`${menuId}-${checked}`);
callFavoiteItems(); callFavoiteItems();
if(location.pathname === PATHS.home){ // if(location.pathname === PATHS.home){
} // }
}; };
const callFavoiteItems = () => { const callFavoiteItems = () => {
let userFavorite = useStore.getState().UserStore.userFavorite; let userFavorite = useStore.getState().UserStore.userFavorite;
setFavoriteItems(userFavorite); setFavoriteItems(userFavorite);
let newArr: Array<number | undefined> = userFavorite.map((value, index) => { let newArr: Array<number | undefined> = userFavorite.map((value, _) => {
return value.menuId; return value.menuId;
}); });
setMenuIds(newArr); setMenuIds(newArr);
@@ -158,7 +160,7 @@ export const MenuCategory = ({
} } } }
> >
<div className="category-header"> <div className="category-header">
<div className={ 'category-icon ' + menuIcon }></div> <div className={ 'category-icon ' + iconFilePath }></div>
<span>{ menuName }</span> <span>{ menuName }</span>
</div> </div>
<ul className="category-items"> <ul className="category-items">