import React, { useState, useEffect, useRef } from "react"; import * as Yup from "yup"; import { Formik, FieldArray, Form, Field } from "formik"; import { toast } from "react-toastify"; import { makeStyles } from "@material-ui/core/styles"; import { green } from "@material-ui/core/colors"; import Button from "@material-ui/core/Button"; import TextField from "@material-ui/core/TextField"; import Dialog from "@material-ui/core/Dialog"; import DialogActions from "@material-ui/core/DialogActions"; import DialogContent from "@material-ui/core/DialogContent"; import DialogTitle from "@material-ui/core/DialogTitle"; import Typography from "@material-ui/core/Typography"; import IconButton from "@material-ui/core/IconButton"; import DeleteOutlineIcon from "@material-ui/icons/DeleteOutline"; import CircularProgress from "@material-ui/core/CircularProgress"; import { i18n } from "../../translate/i18n"; import api from "../../services/api"; import toastError from "../../errors/toastError"; import InputMask from 'react-input-mask'; const useStyles = makeStyles(theme => ({ root: { display: "flex", flexWrap: "wrap", }, textField: { marginRight: theme.spacing(1), flex: 1, }, extraAttr: { display: "flex", justifyContent: "center", alignItems: "center", }, btnWrapper: { position: "relative", }, buttonProgress: { color: green[500], position: "absolute", top: "50%", left: "50%", marginTop: -12, marginLeft: -12, }, })); const MaskedTextField = ({ field, form, ...props }) => { return ( {(inputProps) => } ); }; const ContactSchema = Yup.object().shape({ name: Yup.string() .min(2, i18n.t("contactModal.formErrors.name.short")) .max(50, i18n.t("contactModal.formErrors.name.long")) .required(i18n.t("contactModal.formErrors.name.required")), number: Yup.string().min(8, i18n.t("contactModal.formErrors.phone.short")).max(50, i18n.t("contactModal.formErrors.phone.long")), email: Yup.string().email(i18n.t("contactModal.formErrors.email.invalid")), }); const ContactModal = ({ open, onClose, contactId, initialValues, onSave }) => { const classes = useStyles(); const isMounted = useRef(true); const initialState = { name: "", number: "", email: "", }; const [contact, setContact] = useState(initialState); useEffect(() => { return () => { isMounted.current = false; }; }, []); useEffect(() => { const fetchContact = async () => { if (initialValues) { setContact(prevState => { return { ...prevState, ...initialValues }; }); } if (!contactId) return; try { const { data } = await api.get(`/contacts/${contactId}`); if (isMounted.current) { console.log(data) setContact({ ...data, number: data.number, }); } } catch (err) { toastError(err); } }; fetchContact(); }, [contactId, open, initialValues]); const handleClose = () => { onClose(); setContact(initialState); }; const handleSaveContact = async values => { try { if (contactId) { await api.put(`/contacts/${contactId}`, values); handleClose(); } else { const { data } = await api.post("/contacts", values); if (onSave) { onSave(data); } handleClose(); } toast.success(i18n.t("contactModal.success")); } catch (e) { toastError(e); } }; return (
{contactId ? `${i18n.t("contactModal.title.edit")}` : `${i18n.t("contactModal.title.add")}`} { setTimeout(() => { handleSaveContact(values); actions.setSubmitting(false); }, 400); }} > {({ values, errors, touched, isSubmitting }) => (
{i18n.t("contactModal.form.mainInfo")}
{i18n.t("contactModal.form.whatsapp")} {contact?.whatsapp ? contact?.whatsapp.name : ""} {i18n.t("contactModal.form.extraInfo")} {({ push, remove }) => ( <> {values.extraInfo && values.extraInfo.length > 0 && values.extraInfo.map((info, index) => (
remove(index)} >
))}
)}
)}
); }; export default ContactModal;