import React, { useState, useEffect, useCallback } from "react"; import { View } from "react-native"; import { MaterialCommunityIcons } from "@expo/vector-icons"; import { Button, IconButton } from "react-native-paper"; import { useMutation } from "@apollo/client"; import { useTheme } from "~/theme"; import LittleLoader from "~/components/LittleLoader"; import PhoneNumberReadOnly from "~/containers/PhoneNumberReadOnly"; import PhoneNumberToggleIsPrivate from "./PhoneNumberToggleIsPrivate"; import PhoneNumberModalDelete from "./PhoneNumberModalDelete"; import PhoneNumberModalUpdateIsPrivate from "./PhoneNumberModalUpdateIsPrivate"; import SmsDisclaimerModal from "~/containers/SmsDisclaimerModel"; import { REMOVE_PHONE_NUMBER_MUTATION, UPDATE_PHONE_NUMBER_ISPRIVATE_MUTATION, } from "./gql"; import useSendAuthSMS from "~/hooks/useSendAuthSMS"; export default function PhoneNumbersView({ data, waitingSmsType }) { const [isLoading, setIsLoading] = useState(waitingSmsType === "R" || false); const phoneNumberList = data.selectOneUser.manyPhoneNumber; const { colors, custom } = useTheme(); const [removePhoneNumberMutation] = useMutation(REMOVE_PHONE_NUMBER_MUTATION); const [updatePhoneNumberIsPrivateMutation] = useMutation( UPDATE_PHONE_NUMBER_ISPRIVATE_MUTATION, ); const sendAuthSMS = useSendAuthSMS(); const registerPhoneNumber = useCallback(async () => { setIsLoading(true); sendAuthSMS({ smsType: "R", body: "S'enregistrer sur Alerte-Secours:\nCode: [CODE]\n💙", // must don't exceed 160 chars including replaced [CODE] }); }, [sendAuthSMS, setIsLoading]); // Clear loading state after 3 minutes useEffect(() => { let timeout; if (isLoading) { timeout = setTimeout( () => { setIsLoading(false); }, 3 * 60 * 1000, ); // 3 minutes } return () => { if (timeout) { clearTimeout(timeout); } }; }, [isLoading]); // Clear loading state when login request is received useEffect(() => { if (data.selectOneUser.oneUserLoginRequest) { setIsLoading(false); } }, [data.selectOneUser.oneUserLoginRequest]); const deletePhoneNumberModalStatePair = useState({ visible: false }); const [deletePhoneNumberModalState, setDeletePhoneNumberModalState] = deletePhoneNumberModalStatePair; const deletePhoneNumberModal = useCallback( (field) => { setDeletePhoneNumberModalState({ field, visible: true, }); }, [setDeletePhoneNumberModalState], ); const closeDeletePhoneNumberModal = useCallback(() => { setDeletePhoneNumberModalState({ visible: false, }); }, [setDeletePhoneNumberModalState]); const updatePhoneNumberModalStatePair = useState({ visible: false }); const [updatePhoneNumberModalState, setUpdatePhoneNumberModalState] = updatePhoneNumberModalStatePair; const updatePhoneNumberModal = useCallback( (field) => { setUpdatePhoneNumberModalState({ field, visible: true, }); }, [setUpdatePhoneNumberModalState], ); const closeUpdatePhoneNumberModal = useCallback(() => { setUpdatePhoneNumberModalState({ visible: false, }); }, [setUpdatePhoneNumberModalState]); const deletePhoneNumber = useCallback(async () => { const { field } = deletePhoneNumberModalState; await removePhoneNumberMutation({ variables: { id: field.id } }); closeDeletePhoneNumberModal(); }, [ deletePhoneNumberModalState, removePhoneNumberMutation, closeDeletePhoneNumberModal, ]); const updatePhoneNumberIsPrivate = useCallback(async () => { const { field } = updatePhoneNumberModalState; const newValue = !field.isPrivate; await updatePhoneNumberIsPrivateMutation({ variables: { id: field.id, isPrivate: newValue }, }); closeUpdatePhoneNumberModal(); }, [ updatePhoneNumberModalState, updatePhoneNumberIsPrivateMutation, closeUpdatePhoneNumberModal, ]); const smsDisclaimerModalStatePair = useState({ visible: false }); const [, setSmsDisclaimerModalState] = smsDisclaimerModalStatePair; const smsDisclaimerOk = useCallback(() => { registerPhoneNumber(true); }, [registerPhoneNumber]); return ( <> {/* {`Numéro${ phoneNumberList.length > 1 ? "s" : "" } de téléphone`} */} {phoneNumberList.map((field) => { const { country: phoneCountry, number: phoneNumber } = field; // const deleteDisabled = !!field.oneUserPhoneNumberRelative; return ( updatePhoneNumberModal(field)} /> ( )} onPress={() => deletePhoneNumberModal(field)} /> {/* remove(index)} > */} ); })} ); }