메뉴 즐겨찾기

This commit is contained in:
focp212@naver.com
2025-09-30 15:15:02 +09:00
parent f3d028da85
commit 31b9c3682d
7 changed files with 141 additions and 125 deletions

View File

@@ -16,37 +16,46 @@ const items: Array<UserFavorite> = [
];
*/
export interface FavoriteWrapperProps {
usingType: 'home' | 'menu'
usingType: 'home' | 'menu',
editMode?: boolean,
setEditMode?: (editMode: boolean) => void;
changeMenuId?: string;
};
export const FavoriteWrapper = ({
usingType
usingType,
editMode,
setEditMode,
changeMenuId
}: FavoriteWrapperProps) => {
const { navigate } = useNavigate();
const [edit, setEdit] = useState<boolean>(false);
const [favoriteItems, setFavoriteItems] = useState<Array<UserFavorite>>([]);
const itemAdd: UserFavorite = {
img: IMAGE_ROOT + '/ico_menu_plus.svg',
title: '편집하기'
};
const onClickToFavoriteEdit = () => {
setEdit(true);
if(usingType === 'menu' && setEditMode){
setEditMode(true);
}
};
//useSetFavoriteEdit(true);
//useSetMenuOn(true);
const onClickToNavigate = (path?: string) => {
if(!!path){
navigate(path);
}
};
const getFavoriteItems = () => {
const getFavoriteList = () => {
console.log('1111')
let userFavorite = useStore.getState().UserStore.userFavorite;
setFavoriteItems(userFavorite);
};
const makeFavoriteItems = () => {
let rs = [];
for(let i=0;i<favoriteItems.length;i++){
rs.push(
@@ -66,33 +75,45 @@ export const FavoriteWrapper = ({
</SwiperSlide>
);
}
rs.push(
<SwiperSlide key={ `favorite-item-add-slide-key` }>
<div
className="swiper-item"
onClick={ onClickToFavoriteEdit }
>
<div className="swiper-icon coin-icon">
<img
src={ itemAdd.img }
alt={ itemAdd.title }
/>
return rs;
};
const makeAddFavoriteItem = () => {
let rs = [];
if(!editMode){
rs.push(
<SwiperSlide key={ `favorite-item-add-slide-key` }>
<div
className="swiper-item"
onClick={ onClickToFavoriteEdit }
>
<div className="swiper-icon coin-icon">
<img
src={ itemAdd.img }
alt={ itemAdd.title }
/>
</div>
<span className="swiper-text">{ itemAdd.title }</span>
</div>
<span className="swiper-text">{ itemAdd.title }</span>
</div>
</SwiperSlide>
);
</SwiperSlide>
);
}
return rs;
};
useEffect(() => {
getFavoriteList();
}, [changeMenuId]);
return (
<>
<Swiper
spaceBetween={ 9 }
slidesPerView={ 4 }
>{ getFavoriteItems() }</Swiper>
>
{ (favoriteItems.length > 0) && makeFavoriteItems() }
{ makeAddFavoriteItem() }
</Swiper>
</>
);
};

View File

@@ -12,5 +12,6 @@ export interface MenuCategoryProps {
menuName?: string;
subMenu?: Array<MenuItem>;
setMenuOn?: (menuOn: boolean) => void;
favoriteEdit?: boolean;
editMode?: boolean;
setChangeMenuId?: (menuId?: string) => void;
};

View File

@@ -2,6 +2,8 @@ import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { MenuCategoryProps } from '../model/types';
import { useStore } from '@/shared/model/store';
import { IMAGE_ROOT } from '@/shared/constants/common';
import { UserFavorite } from '@/entities/user/model/types';
import { useEffect, useState } from 'react';
export const MenuCategory = ({
menuId,
@@ -9,12 +11,16 @@ export const MenuCategory = ({
menuName,
subMenu,
setMenuOn,
favoriteEdit
editMode,
setChangeMenuId
}: MenuCategoryProps) => {
const { navigate } = useNavigate();
const [favoriteItems, setFavoriteItems] = useState<Array<UserFavorite>>([]);
const [menuIds, setMenuIds] = useState<Array<string | undefined>>([]);
const onClickToNavigate = (path?: string) => {
if(!!path && !!setMenuOn && !favoriteEdit){
if(!!path && !!setMenuOn && !editMode){
setMenuOn(false);
navigate(path);
}
@@ -23,20 +29,53 @@ export const MenuCategory = ({
const favoriteSetting = (
checked: boolean,
title?: string,
path?: string
path?: string,
menuId?: string
) => {
useStore.getState().UserStore.setUserFavorite([{
title: title,
img: IMAGE_ROOT + '/ico_menu_01.svg',
path: path,
}]);
console.log(checked, title, path, menuId)
let userFavorite = useStore.getState().UserStore.userFavorite;
if(checked){
userFavorite = [
...userFavorite,
{
title: title,
img: IMAGE_ROOT + '/ico_menu_01.svg',
path: path,
menuId: menuId
}
];
}
else{
userFavorite = userFavorite.filter((value, index) => {
return value.menuId !== menuId
});
}
useStore.getState().UserStore.setUserFavorite(userFavorite);
callFavoiteItems();
if(setChangeMenuId){
setChangeMenuId(menuId);
}
};
const callFavoiteItems = () => {
let userFavorite = useStore.getState().UserStore.userFavorite;
console.log(userFavorite)
setFavoriteItems(userFavorite);
let newArr: Array<string | undefined> = userFavorite.map((value, index) => {
return value.menuId;
});
setMenuIds(newArr);
};
useEffect(() => {
callFavoiteItems();
}, []);
const getMenuItems = () => {
let rs = [];
if(subMenu){
for(let i=0;i<subMenu.length;i++){
if(!!favoriteEdit){
if(!!editMode){
rs.push(
<li
key={ `menu-item-key-${menuId}-${i}` }
@@ -45,14 +84,20 @@ export const MenuCategory = ({
<span>{ subMenu[i]?.menuName }</span>
<div className="check_box_scrap">
<input
id={ `menu-item-checkbox-${menuId}-${i}` }
id={ `menu-item-checkbox-${subMenu[i]?.menuId}-${i}` }
className="checkbox"
type="checkbox"
onChange={ (e) => favoriteSetting(e.target.checked, subMenu[i]?.menuName, subMenu[i]?.path) }
type="checkbox"
checked={ menuIds.includes(subMenu[i]?.menuId)? true: false }
onChange={ (e) => favoriteSetting(
e.target.checked,
subMenu[i]?.menuName,
subMenu[i]?.path,
subMenu[i]?.menuId
)}
/>
<label
className="gtr"
htmlFor={ `menu-item-checkbox-${menuId}-${i}` }
htmlFor={ `menu-item-checkbox-${subMenu[i]?.menuId}-${i}` }
></label>
</div>
</li>

View File

@@ -56,7 +56,6 @@ export const createUserInfoStore = lens<UserInfoState>((set, get) => ({
return {
...state,
userFavorite: [
...state.userFavorite,
...newUserFavorite
],
};

View File

@@ -32,6 +32,7 @@ export interface UserFavorite {
title?: string;
img?: string;
path?: string;
menuId?: string;
};
export interface UserInfo extends LoginResponse {
status: boolean;