alerte-secours/src/scenes/Relatives/ToContact.js

231 lines
7.3 KiB
JavaScript

import React, { useCallback, useMemo, useEffect, useState } from "react";
import { View, Text } from "react-native";
import { TouchableRipple } from "react-native-paper";
import ModalSelector from "react-native-modal-selector";
import { useMutation } from "@apollo/client";
import { MaterialCommunityIcons } from "@expo/vector-icons";
import ToContactPhoneNumberList from "./ToContactPhoneNumberList";
import InvitationContactPhoneNumber from "./InvitationContactPhoneNumber";
import { useForm, FormProvider } from "react-hook-form";
import useDeviceCountryCode from "~/hooks/useDeviceCountryCode";
import PhoneNumberReadOnly from "~/containers/PhoneNumberReadOnly";
import { useTheme } from "~/theme";
import RelativeModalDelete from "./RelativeModalDelete";
import useStylesCommon from "./styles";
import {
UPSERT_USER_PHONE_NUMBER_RELATIVE_MUTATION,
REMOVE_RELATIVE_MUTATION,
REMOVE_RELATIVE_UNREGISTERED_MUTATION,
} from "./gql";
export default function ToContact({ data }) {
const {
selectOneUser: {
manyRelative,
manyPhoneNumber,
manyRelativeInvitationAsTo,
oneUserPhoneNumberRelative,
},
} = data;
const commonStyles = useStylesCommon();
const { colors, custom } = useTheme();
const defaultCountryCode = useDeviceCountryCode();
const formMethods = useForm({
mode: "onTouched",
defaultValues: {
userPhoneNumberRelative:
oneUserPhoneNumberRelative?.onePhoneNumber || manyPhoneNumber[0],
new: {
phoneCountry: defaultCountryCode,
phoneNumber: "",
},
},
});
const { watch, setValue } = formMethods;
const userPhoneNumberRelative = watch("userPhoneNumberRelative");
const [
isSelectingUserPhoneNumberRelative,
setIsSelectingUserPhoneNumberRelative,
] = useState(false);
const [upsertUserPhoneNumberRelative] = useMutation(
UPSERT_USER_PHONE_NUMBER_RELATIVE_MUTATION,
);
const [removeRelativeMutation] = useMutation(REMOVE_RELATIVE_MUTATION);
const [removeRelativeUnregisteredMutation] = useMutation(
REMOVE_RELATIVE_UNREGISTERED_MUTATION,
);
const deleteRelativeModalStatePair = useState({ visible: false });
const [deleteRelativeModalState, setDeleteRelativeModalState] =
deleteRelativeModalStatePair;
const deleteRelativeModal = (field) => {
setDeleteRelativeModalState({
field,
visible: true,
});
};
const closeDeleteRelativeModal = () => {
setDeleteRelativeModalState({
visible: false,
});
};
const deleteRelative = async () => {
const { field } = deleteRelativeModalState;
switch (field.type) {
case "registered":
await removeRelativeMutation({ variables: { id: field.id } });
break;
case "unregistered":
await removeRelativeUnregisteredMutation({
variables: { id: field.id },
});
break;
}
closeDeleteRelativeModal();
};
return (
<View>
<FormProvider {...formMethods}>
{manyPhoneNumber.length > 1 && (
<View key="select-relative-phone-number">
<View style={{ flexDirection: "row" }}>
<MaterialCommunityIcons
name="cellphone-information"
size={24}
style={{ paddingRight: 10, color: colors.primary }}
/>
<Text style={{ fontSize: 18, color: colors.primary, flex: 1 }}>
Numéro de contact
</Text>
</View>
<View style={{ marginVertical: 10 }}>
<TouchableRipple
onPress={() => setIsSelectingUserPhoneNumberRelative(true)}
style={{
backgroundColor: colors.surface,
shadowColor: "rgba(0,0,0,0.4)",
shadowOffset: {
width: 1,
height: 5,
},
shadowOpacity: 0.34,
shadowRadius: 6.27,
elevation: 10,
}}
>
<View
style={{
flexDirection: "row",
justifyContent: "space-between",
}}
>
{userPhoneNumberRelative && (
<PhoneNumberReadOnly
phoneNumber={userPhoneNumberRelative.number}
phoneCountry={userPhoneNumberRelative.country}
/>
)}
<View
style={{
flexDirection: "row",
height: "100%",
alignItems: "center",
marginHorizontal: 10,
}}
>
<MaterialCommunityIcons
// name="pencil-box-outline"
// name="pencil-circle-outline"
name="pencil"
size={22}
/>
</View>
</View>
</TouchableRipple>
</View>
</View>
)}
{isSelectingUserPhoneNumberRelative && (
<ModalSelector
key="modal-number-select-relative"
visible
selectStyle={{ display: "none" }}
data={[
{
key: "label",
section: true,
label: `Sélectionnez le numéro à utiliser par vos proches:`,
},
...manyPhoneNumber.map((row, index) => ({
key: index,
value: row,
component: (
<View
style={{
flexDirection: "row",
alignItems: "center",
}}
>
<PhoneNumberReadOnly
phoneNumber={row.number}
phoneCountry={row.country}
/>
</View>
),
})),
]}
cancelText="Annuler"
onModalClose={() => {
setIsSelectingUserPhoneNumberRelative(false);
}}
onChange={async (option) => {
const { value } = option;
setIsSelectingUserPhoneNumberRelative(false);
setValue("userPhoneNumberRelative", value);
await upsertUserPhoneNumberRelative({
variables: { phoneNumberId: value.id },
});
// setModalNumberSelect(null);
}}
/>
)}
{data && (
<ToContactPhoneNumberList
data={data}
deleteRelativeModal={deleteRelativeModal}
/>
)}
<View>
{manyRelativeInvitationAsTo.length > 0 && (
<View style={commonStyles.subtitleContainer}>
<View style={{ marginTop: 10, paddingBottom: 10 }}>
<Text style={commonStyles.subtitleText}>
Propositions reçues en attente
</Text>
</View>
<View>
{manyRelativeInvitationAsTo.map((row, index) => (
<InvitationContactPhoneNumber key={index} row={row} />
))}
</View>
</View>
)}
</View>
</FormProvider>
<RelativeModalDelete
modalState={deleteRelativeModalStatePair}
action={deleteRelative}
/>
</View>
);
}