alerte-secours/src/scenes/Profile/PhoneNumbers.js
2025-10-23 17:20:51 +02:00

304 lines
9.3 KiB
JavaScript

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 (
<>
<PhoneNumberModalDelete
modalState={deletePhoneNumberModalStatePair}
action={deletePhoneNumber}
/>
<PhoneNumberModalUpdateIsPrivate
modalState={updatePhoneNumberModalStatePair}
action={updatePhoneNumberIsPrivate}
/>
<SmsDisclaimerModal
modalState={smsDisclaimerModalStatePair}
action={smsDisclaimerOk}
/>
<View
style={{
paddingBottom: 20,
}}
>
{/* <View>
<Text style={{ fontSize: 16 }}>{`Numéro${
phoneNumberList.length > 1 ? "s" : ""
} de téléphone`}</Text>
</View> */}
<View
style={{
flex: 1,
width: "100%",
}}
>
{phoneNumberList.map((field) => {
const { country: phoneCountry, number: phoneNumber } = field;
// const deleteDisabled = !!field.oneUserPhoneNumberRelative;
return (
<View
key={field.id}
style={{
flexDirection: "row",
marginBottom: 10,
}}
>
<View
style={{
flex: 1,
}}
>
<View
style={{
alignItems: "center",
justifyContent: "space-between",
borderBottomColor: "rgba(0, 0, 0, 0.12)",
borderBottomWidth: 0.2,
paddingBottom: 10,
flexDirection: "row",
}}
>
<View>
<PhoneNumberReadOnly
phoneNumber={phoneNumber}
phoneCountry={phoneCountry}
/>
</View>
<View
style={{
flexDirection: "row",
justifyContent: "center",
}}
>
<View
style={{
flexDirection: "row",
justifyContent: "center",
}}
>
<PhoneNumberToggleIsPrivate
field={field}
action={() => updatePhoneNumberModal(field)}
/>
</View>
<View
style={{
flexDirection: "row",
justifyContent: "center",
alignSelf: "flex-end",
}}
>
<IconButton
// disabled={deleteDisabled}
size={14}
style={{
backgroundColor: colors.no,
}}
icon={() => (
<MaterialCommunityIcons
name="close"
size={22}
color={colors.onPrimary}
/>
)}
onPress={() => deletePhoneNumberModal(field)}
/>
</View>
</View>
</View>
</View>
{/* <TouchableRipple
disabled={index === 0}
compact
style={{
justifyContent: "center",
paddingHorizontal: 10,
}}
labelStyle={{ paddingRight: 0 }}
onPress={() => remove(index)}
>
<MaterialCommunityIcons
name="close"
size={28}
style={{}}
color={colors.primary}
/>
</TouchableRipple> */}
</View>
);
})}
<Button
key="enable-add-phone-number"
mode="contained"
onPress={() =>
setSmsDisclaimerModalState({ visible: true, action: "R" })
}
icon={() => (
<MaterialCommunityIcons
name="card-account-phone"
size={22}
color={colors.onPrimary}
/>
)}
style={{
marginHorizontal: 0,
borderRadius: 4,
height: 45,
marginTop: 5,
justifyContent: "center",
}}
contentStyle={{
flexDirection: "row",
alignItems: "center",
justifyContent: "center",
}}
loading={isLoading}
>
{phoneNumberList.length > 0
? "Ajouter un numéro de téléphone"
: "Enregistrer mon numéro de téléphone"}
</Button>
</View>
</View>
</>
);
}