import React, { useCallback, useState, useEffect } from "react"; import { View } from "react-native"; import LittleLoader from "~/components/LittleLoader"; import { Button } from "react-native-paper"; import { MaterialCommunityIcons } from "@expo/vector-icons"; import { useMutation } from "@apollo/client"; import Text from "~/components/Text"; import PhoneNumberReadOnly from "~/containers/PhoneNumberReadOnly"; import SmsDisclaimerModal from "~/containers/SmsDisclaimerModel"; import { useSessionState, authActions } from "~/stores"; import { useStyles } from "./styles"; import useSendAuthSMS from "~/hooks/useSendAuthSMS"; import { useTheme } from "~/theme"; import { DELETE_LOGIN_REQUEST_MUTATION, LOGIN_CONFIRM_MUTATION } from "./gql"; import ConnectViaEmail from "./ConnectViaEmail"; import isConnectedProfile from "./isConnectedProfile"; import { getDeviceUuid } from "~/auth/deviceUuid"; export default function AccountManagementModalConnect({ closeModal, profileData, authMethod, setAuthMethod, waitingSmsType, clearAuthWaitParams, }) { const styles = useStyles(); const { colors, custom } = useTheme(); const isConnected = isConnectedProfile(profileData); const [isLoading, setIsLoading] = useState(false); const sendAuthSMS = useSendAuthSMS(); const loginRequest = profileData.selectOneUser.oneUserLoginRequest; // Show loader when component mounts if waiting for connect SMS and no login request yet useEffect(() => { if (waitingSmsType === "C" && !loginRequest) { setIsLoading(true); } }, [waitingSmsType, loginRequest]); // Clear loading state after 3 minutes or when login request is received useEffect(() => { let timeout; if (isLoading) { // Clear loading when login request is received if (loginRequest) { setIsLoading(false); } else { // Set timeout for 3 minutes if no login request timeout = setTimeout( () => { setIsLoading(false); }, 3 * 60 * 1000, ); // 3 minutes } } return () => { if (timeout) { clearTimeout(timeout); } }; }, [isLoading, loginRequest]); const connectUsingPhoneNumber = () => { setIsLoading(true); sendAuthSMS({ smsType: "C", body: "Se connecter sur Alerte-Secours:\nCode: [CODE]\n💙", // must don't exceed 160 chars including replaced [CODE] }); }; const smsDisclaimerModalStatePair = useState({ visible: false }); const [, setSmsDisclaimerModalState] = smsDisclaimerModalStatePair; const smsDisclaimerOk = () => { connectUsingPhoneNumber(); }; const connectUsingEmail = useCallback(async () => { setAuthMethod("email"); }, [setAuthMethod]); const [deleteLoginRequest] = useMutation(DELETE_LOGIN_REQUEST_MUTATION); const [loginConfirmRequest] = useMutation(LOGIN_CONFIRM_MUTATION); const confirmLoginRequest = useCallback(async () => { 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 () => { try { await deleteLoginRequest({ variables: { id: loginRequest.id } }); } finally { setIsLoading(false); clearAuthWaitParams?.(); closeModal(); } }, [deleteLoginRequest, loginRequest?.id, clearAuthWaitParams, closeModal]); return ( Se connecter à un compte {loginRequest && ( {}} style={{ flex: 1, flexDirection: "column", alignItems: "center", justifyContent: "center", marginBottom: 10, }} > Connexion via {loginRequest?.type === "phone_number" && ( )} {loginRequest?.type === "email" && ( {loginRequest?.oneEmail.email} )} )} {authMethod === "email" && ( )} {!authMethod && ( <> {isLoading && ( En attente de réception du SMS... )} )} ); }