From 0ac2714a07d4a3e90ebfd8cf19c8df52566d68ce Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Tue, 28 Oct 2025 15:38:02 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EC=84=A4=EC=A0=95=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F?= =?UTF-8?q?=20=EC=83=9D=EC=B2=B4=EC=9D=B8=EC=A6=9D=20=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?=ED=94=8C=EB=A1=9C=EC=9A=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - registerBiometric으로 변경하고 bottomsheet 닫은 후 생체인증 팝업 표시 - ID 로그인 선택 시 네이티브 setLoginType AppBridge 호출 추가 - 생체인증 등록 완료 후 로그인 타입 재조회하여 설정 화면 갱신 - SET_LOGIN_TYPE 브릿지 메시지 타입 및 관련 메서드 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../alarm/ui/login-type-bottom-sheet.tsx | 22 ++++++++++++++----- src/hooks/useAppBridge.tsx | 11 ++++++++++ src/pages/setting/setting-page.tsx | 1 + src/types/bridge.ts | 1 + src/utils/appBridge.ts | 5 +++++ 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/entities/alarm/ui/login-type-bottom-sheet.tsx b/src/entities/alarm/ui/login-type-bottom-sheet.tsx index 5a47e64..071f9f1 100644 --- a/src/entities/alarm/ui/login-type-bottom-sheet.tsx +++ b/src/entities/alarm/ui/login-type-bottom-sheet.tsx @@ -8,16 +8,17 @@ export interface LoginTypeBottomSheetProps { setLoginTypeBottomSheetOn: (loginTypeBottomSheetOn: boolean) => void; loginType: LoginType; setLoginType: (loginType: string) => void; + onBiometricRegistered?: () => void; }; export const LoginTypeBottomSheet = ({ - loginTypeBottomSheetOn, setLoginTypeBottomSheetOn, loginType, - setLoginType + setLoginType, + onBiometricRegistered }: LoginTypeBottomSheetProps) => { const { t } = useTranslation(); - const { openBiometricRegistrationPopup } = useAppBridge(); + const { registerBiometric, setLoginType: setLoginTypeNative } = useAppBridge(); const onClickToClose = () => { setLoginTypeBottomSheetOn(false); @@ -25,12 +26,21 @@ export const LoginTypeBottomSheet = ({ const onChangeLoginType = async (type: string) => { if (loginType !== type) { if (type === 'BIOMETRIC') { - await openBiometricRegistrationPopup(); + onClickToClose(); + registerBiometric().then(() => { + onBiometricRegistered?.(); + }).catch(() => { + // 에러 처리 + }); } else { - setLoginType(type); + setLoginTypeNative(type).then(() => { + setLoginType(type); + onClickToClose(); + }).catch(() => { + onClickToClose(); + }); } } - onClickToClose(); }; return ( diff --git a/src/hooks/useAppBridge.tsx b/src/hooks/useAppBridge.tsx index 1d5c01d..180d54f 100644 --- a/src/hooks/useAppBridge.tsx +++ b/src/hooks/useAppBridge.tsx @@ -63,6 +63,9 @@ interface UseAppBridgeReturn { // 로그인 방식 설정 조회 getLoginType: () => Promise; + // 로그인 방식 설정 + setLoginType: (type: string) => Promise; + getNotificationSetting: () => Promise; setNotificationSetting: (enabled: boolean) => Promise; @@ -305,6 +308,13 @@ export const useAppBridge = (): UseAppBridgeReturn => { return result || 'ko'; }, [isNativeEnvironment]); + const setLoginType = useCallback(async (type: string): Promise => { + if (!isNativeEnvironment) { + return; + } + return appBridge.safeCall(() => appBridge.setLoginType(type)); + }, [isNativeEnvironment]); + return { isNativeEnvironment, isAndroid, @@ -329,6 +339,7 @@ export const useAppBridge = (): UseAppBridgeReturn => { isPushNotificationEnabled, openAppSettings, getLoginType, + setLoginType, getNotificationSetting, setNotificationSetting, getLanguage diff --git a/src/pages/setting/setting-page.tsx b/src/pages/setting/setting-page.tsx index 9e04611..5240a2b 100644 --- a/src/pages/setting/setting-page.tsx +++ b/src/pages/setting/setting-page.tsx @@ -439,6 +439,7 @@ export const SettingPage = () => { setLoginTypeBottomSheetOn={ setLoginTypeBottomSheetOn } loginType={ loginType } setLoginType={ handleSetLoginType } + onBiometricRegistered={ loadLoginType } > } { !!serviceLanguageBottomSheetOn && diff --git a/src/types/bridge.ts b/src/types/bridge.ts index eae6728..de6b1df 100644 --- a/src/types/bridge.ts +++ b/src/types/bridge.ts @@ -75,6 +75,7 @@ export enum BridgeMessageType { // 로그인 방식 설정 GET_LOGIN_TYPE = 'getLoginType', + SET_LOGIN_TYPE = 'setLoginType', // 알림 수신 설정 (Android only) GET_NOTIFICATION_SETTING = 'getNotificationSetting', diff --git a/src/utils/appBridge.ts b/src/utils/appBridge.ts index 4bbfb34..8eb98aa 100644 --- a/src/utils/appBridge.ts +++ b/src/utils/appBridge.ts @@ -210,6 +210,11 @@ class AppBridge { return this.sendMessage(BridgeMessageType.GET_LOGIN_TYPE); } + // 로그인 방식 설정 + async setLoginType(type: string): Promise { + return this.sendMessage(BridgeMessageType.SET_LOGIN_TYPE, { type }); + } + // 알림 수신 설정 가져오기 (Android only) async getNotificationSetting(): Promise<{ enabled: boolean }> { return this.sendMessage(BridgeMessageType.GET_NOTIFICATION_SETTING);