diff --git a/src/scenes/Profile/AccountManagement.js b/src/scenes/Profile/AccountManagement.js index aafc0ab..fe13b97 100644 --- a/src/scenes/Profile/AccountManagement.js +++ b/src/scenes/Profile/AccountManagement.js @@ -20,6 +20,7 @@ export default function AccountManagement({ profileData, openAccountModal, waitingSmsType, + clearAuthWaitParams, }) { const { colors, custom } = useTheme(); const isConnected = isConnectedProfile(profileData); @@ -136,6 +137,7 @@ export default function AccountManagement({ modalState={modalState} profileData={profileData} waitingSmsType={waitingSmsType} + clearAuthWaitParams={clearAuthWaitParams} /> ); diff --git a/src/scenes/Profile/AccountManagementModal.js b/src/scenes/Profile/AccountManagementModal.js index 81a2f31..2568204 100644 --- a/src/scenes/Profile/AccountManagementModal.js +++ b/src/scenes/Profile/AccountManagementModal.js @@ -12,6 +12,7 @@ export default function AccountManagementModal({ modalState, profileData, waitingSmsType, + clearAuthWaitParams, }) { const styles = useStyles(); const [modal, setModal] = modalState; @@ -38,6 +39,7 @@ export default function AccountManagementModal({ authMethod={authMethod} setAuthMethod={setAuthMethod} waitingSmsType={waitingSmsType} + clearAuthWaitParams={clearAuthWaitParams} /> )} {visible && component === "destroy" && ( diff --git a/src/scenes/Profile/AccountManagementModalConnect.js b/src/scenes/Profile/AccountManagementModalConnect.js index acea2a6..a4c84fb 100644 --- a/src/scenes/Profile/AccountManagementModalConnect.js +++ b/src/scenes/Profile/AccountManagementModalConnect.js @@ -29,6 +29,7 @@ export default function AccountManagementModalConnect({ authMethod, setAuthMethod, waitingSmsType, + clearAuthWaitParams, }) { const styles = useStyles(); const { colors, custom } = useTheme(); @@ -92,20 +93,39 @@ export default function AccountManagementModalConnect({ const [loginConfirmRequest] = useMutation(LOGIN_CONFIRM_MUTATION); const confirmLoginRequest = useCallback(async () => { - const deviceUuid = await getDeviceUuid(); - const { - data: { - doAuthLoginConfimLoginRequest: { authTokenJwt }, - }, - } = await loginConfirmRequest({ - variables: { loginRequestId: loginRequest.id, deviceUuid }, - }); - await authActions.confirmLoginRequest({ authTokenJwt, isConnected }); - }, [loginConfirmRequest, loginRequest?.id, isConnected]); + try { + const deviceUuid = await getDeviceUuid(); + const { + data: { + doAuthLoginConfimLoginRequest: { authTokenJwt }, + }, + } = await loginConfirmRequest({ + variables: { loginRequestId: loginRequest.id, deviceUuid }, + }); + await authActions.confirmLoginRequest({ authTokenJwt, isConnected }); + setIsLoading(false); + clearAuthWaitParams?.(); + closeModal(); + } catch (e) { + setIsLoading(false); + } + }, [ + loginConfirmRequest, + loginRequest?.id, + isConnected, + clearAuthWaitParams, + closeModal, + ]); const rejectLoginRequest = useCallback(async () => { - await deleteLoginRequest({ variables: { id: loginRequest.id } }); - }, [deleteLoginRequest, loginRequest]); + try { + await deleteLoginRequest({ variables: { id: loginRequest.id } }); + } finally { + setIsLoading(false); + clearAuthWaitParams?.(); + closeModal(); + } + }, [deleteLoginRequest, loginRequest?.id, clearAuthWaitParams, closeModal]); return ( - + diff --git a/src/scenes/Profile/PhoneNumbers.js b/src/scenes/Profile/PhoneNumbers.js index a75eb03..2b44124 100644 --- a/src/scenes/Profile/PhoneNumbers.js +++ b/src/scenes/Profile/PhoneNumbers.js @@ -26,7 +26,11 @@ import { import useSendAuthSMS from "~/hooks/useSendAuthSMS"; -export default function PhoneNumbersView({ data, waitingSmsType }) { +export default function PhoneNumbersView({ + data, + waitingSmsType, + clearAuthWaitParams, +}) { const [isLoading, setIsLoading] = useState(waitingSmsType === "R" || false); const phoneNumberList = data.selectOneUser.manyPhoneNumber; @@ -69,8 +73,16 @@ export default function PhoneNumbersView({ data, waitingSmsType }) { useEffect(() => { if (data.selectOneUser.oneUserLoginRequest) { setIsLoading(false); + clearAuthWaitParams?.(); } - }, [data.selectOneUser.oneUserLoginRequest]); + }, [data.selectOneUser.oneUserLoginRequest, clearAuthWaitParams]); + + // Defensive cleanup on unmount to ensure no lingering loader + useEffect(() => { + return () => { + setIsLoading(false); + }; + }, []); const deletePhoneNumberModalStatePair = useState({ visible: false }); const [deletePhoneNumberModalState, setDeletePhoneNumberModalState] = diff --git a/src/scenes/Profile/index.js b/src/scenes/Profile/index.js index 0f229ad..a4ddb2d 100644 --- a/src/scenes/Profile/index.js +++ b/src/scenes/Profile/index.js @@ -37,6 +37,13 @@ export default withConnectivity(function Profile({ navigation, route }) { // eslint-disable-next-line react-hooks/exhaustive-deps }, [userId]); + const clearAuthWaitParams = React.useCallback(() => { + navigation.setParams({ + waitingSmsType: undefined, + openAccountModal: undefined, + }); + }, [navigation]); + if (loading || !data?.selectOneUser) { return ; } @@ -53,6 +60,7 @@ export default withConnectivity(function Profile({ navigation, route }) { profileData={data} openAccountModal={route.params?.openAccountModal} waitingSmsType={route.params?.waitingSmsType} + clearAuthWaitParams={clearAuthWaitParams} /> );