즐겨찾기 삭제 로직 개선 및 스크롤 위치 수정 (롤백된 로직 복원)

- 즐겨찾기 삭제 시 최소 1개 유지 검증을 삭제 전에 수행하도록 수정
  - 기존: 삭제 후 체크 → UI에서 아이템 사라진 후 알림
  - 개선: 삭제 전 early return → 삭제 자체를 중단
- 하드코딩된 한글 메시지를 다국어 키로 변경
  - '바로가기는 1개이상 설정 필요 합니다.' → t('favorite.cannotDeleteLastItem')
- showAlert 대신 snackBar 사용으로 일관성 유지
- 메뉴 오픈 시 즐겨찾기 목록 스크롤을 맨 앞으로 초기화
  - prevMenuOn 상태로 메뉴 오픈 감지
  - 추가/삭제 시에만 마지막 아이템으로 스크롤

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Jay Sheen
2025-11-14 17:27:25 +09:00
parent 6721ed15ff
commit c6d22e9856

View File

@@ -8,6 +8,7 @@ import { useFavoriteEditOnStore, useMenuIds, useMenuOnStore, useStore } from '@/
import { useTranslation } from 'react-i18next';
import { showAlert } from '@/widgets/show-alert';
import { checkGrant } from '@/shared/lib/check-grant';
import { snackBar } from '@/shared/lib';
export interface FavoriteWrapperProps {
usingType: 'home' | 'menu',
@@ -27,6 +28,7 @@ export const FavoriteWrapper = ({
const { menuIds, setMenuIds, deleteMenuId} = useMenuIds();
const [isFirst, setIsFirst] = useState<boolean>(true);
const [favoriteItems, setFavoriteItems] = useState<Array<UserFavorite>>([]);
const [prevMenuOn, setPrevMenuOn] = useState<boolean>(false);
const itemAdd: UserFavorite = {
menuId: -1,
@@ -73,6 +75,12 @@ export const FavoriteWrapper = ({
};
const onClickToRemoveItem = (item?: UserFavorite) => {
// 삭제 전에 먼저 개수 체크
if(menuIds.length === 1){
snackBar(t('favorite.cannotDeleteLastItem'));
return; // 삭제 중단
}
let idx = -1;
let newFavorite: Array<UserFavorite> = favoriteItems.filter((value, index) => {
if(value.menuId === item?.menuId){
@@ -80,18 +88,16 @@ export const FavoriteWrapper = ({
}
return value.menuId !== item?.menuId;
});
useStore.getState().UserStore.setUserFavorite(newFavorite);
setFavoriteItems(newFavorite);
if(idx > -1){
goToSlide(idx);
}
if(menuIds.length <= 1){
showAlert('바로가기는 1개이상 설정 필요 합니다.');
}
else{
if(item?.menuId){
deleteMenuId(item?.menuId);
}
if(item?.menuId){
deleteMenuId(item?.menuId);
}
};
@@ -162,16 +168,31 @@ export const FavoriteWrapper = ({
useEffect(() => {
getFavoriteList();
if(usingType === 'home'){
goToSlide('first');
}
else if(usingType === 'menu' && !isFirst){
setTimeout(() => {
goToSlide('last');
}, 100);
else if(usingType === 'menu'){
// 메뉴가 새로 열렸는지 확인 (prevMenuOn: false -> menuOn: true)
const isMenuJustOpened = !prevMenuOn && menuOn;
if(isMenuJustOpened || isFirst){
// 메뉴가 새로 열렸거나 처음 렌더링 시 맨 앞으로
setTimeout(() => {
goToSlide('first');
}, 100);
}
else if(changeMenuId){
// 즐겨찾기 아이템 추가/삭제 시 마지막으로 (변경된 항목 보여주기)
setTimeout(() => {
goToSlide('last');
}, 100);
}
}
setIsFirst(false);
}, [changeMenuId, favoriteEditOn]);
setPrevMenuOn(menuOn);
}, [changeMenuId, favoriteEditOn, menuOn]);
return (
<>