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)}
>
*/}
);
})}
>
);
}