From 4434877670a52eb893d30f559ae2517933830d65 Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Fri, 14 Nov 2025 18:30:09 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AC=B4=ED=95=9C=20=EB=A3=A8=ED=94=84=20?= =?UTF-8?q?=EC=99=84=EC=A0=84=20=EC=88=98=EC=A0=95=20-=20useSetOnRightClic?= =?UTF-8?q?k=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 문제: - useSetOnRightClick의 의존성 배열에 fn이 포함되어 무한 루프 발생 - fn이 변경될 때마다 useEffect 재실행 → setState → 리렌더 → fn 재생성 → 무한 반복 해결: - useSetOnBack 패턴과 동일하게 의존성에서 fn 제거 - useCallback도 제거하여 코드 단순화 - 페이지 마운트 시 한 번만 설정되므로 안정적 참고: - isDeleteAllowed는 usrid가 변경되지 않는 한 고정값 - 대부분의 경우 페이지 생명주기 동안 변경되지 않음 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/pages/account/user/login-auth-info-page.tsx | 6 +++--- src/widgets/sub-layout/use-sub-layout.ts | 8 ++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/pages/account/user/login-auth-info-page.tsx b/src/pages/account/user/login-auth-info-page.tsx index dbae031..eaad1ab 100644 --- a/src/pages/account/user/login-auth-info-page.tsx +++ b/src/pages/account/user/login-auth-info-page.tsx @@ -1,4 +1,4 @@ -import { useState, useCallback } from 'react'; +import { useState } from 'react'; import { useLocation } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; @@ -29,7 +29,7 @@ export const UserLoginAuthInfoPage = () => { const [activeTab, ] = useState(AccountUserTabKeys.LoginAuthInfo); - const handleDeleteUser = useCallback(async () => { + const handleDeleteUser = async () => { const confirmed = await showConfirm(t('account.deleteUserConfirm', '사용자를 삭제하시겠습니까?')); if (!confirmed) return; @@ -44,7 +44,7 @@ export const UserLoginAuthInfoPage = () => { } catch (error: any) { snackBar(error.message || t('account.deleteUserFailed', '사용자 삭제를 실패했습니다.')); } - }, [mid, usrid, userDelete, navigate, t]); + }; useSetHeaderTitle(t('account.userSettings')); useSetHeaderType(HeaderType.LeftArrow); diff --git a/src/widgets/sub-layout/use-sub-layout.ts b/src/widgets/sub-layout/use-sub-layout.ts index 8558e19..eeb0b0e 100644 --- a/src/widgets/sub-layout/use-sub-layout.ts +++ b/src/widgets/sub-layout/use-sub-layout.ts @@ -22,15 +22,11 @@ export const useSetOnBack = (fn: any) => { export const useSetOnRightClick = (fn: any) => { const { setOnRightClick } = useSubLayoutContext(); useEffect(() => { - if (fn) { - setOnRightClick(() => fn); - } else { - setOnRightClick(() => undefined); - } + setOnRightClick(() => fn); return () => { setOnRightClick(() => undefined); }; - }, [fn, setOnRightClick]); + }, [setOnRightClick]); return { setOnRightClick }; };