import React, { useMemo } from 'react'; import { useIntl } from 'react-intl'; import { useFormik } from 'formik'; import * as Yup from 'yup'; import { Dialog, Button, FormGroup, InputGroup, Intent, Classes, } from '@blueprintjs/core'; import UserListDialogConnect from 'connectors/UsersList.connector'; import DialogReduxConnect from 'components/DialogReduxConnect'; import useAsync from 'hooks/async'; import { objectKeysTransform } from 'utils'; import { pick, snakeCase } from 'lodash'; import ErrorMessage from 'components/ErrorMessage'; import classNames from 'classnames'; import AppToaster from 'components/AppToaster'; import { compose } from 'utils'; function InviteUserDialog({ name, payload, isOpen, closeDialog, requestFetchUser, requestEditUser, }) { const intl = useIntl(); const fetchHook = useAsync(async () => { await Promise.all([ ...(payload.action === 'edit' ? [requestFetchUser(payload.user.id)] : []), ]); }, false); const validationSchema = Yup.object().shape({ first_name: Yup.string().required(intl.formatMessage({ id: 'required' })), last_name: Yup.string().required(intl.formatMessage({ id: 'required' })), email: Yup.string() .email() .required(intl.formatMessage({ id: 'required' })), phone_number: Yup.number().required(intl.formatMessage({ id: 'required' })), }); const initialValues = useMemo( () => ({ first_name: '', last_name: '', email: '', phone_number: '', }), [] ); const formik = useFormik({ enableReinitialize: true, initialValues: { ...(payload.action === 'edit' && pick( objectKeysTransform(payload.user, snakeCase), Object.keys(initialValues) )), }, validationSchema, onSubmit: (values, { setSubmitting }) => { const form = { ...values, }; if (payload.action === 'edit') { requestEditUser(payload.user.id, form) .then((response) => { closeDialog(name); AppToaster.show({ message: 'the_user_details_has_been_updated', }); setSubmitting(false); }) .catch((error) => { setSubmitting(false); }); } }, }); const { values, errors, touched } = useMemo(() => formik, [formik]); const onDialogOpening = () => { fetchHook.execute(); }; const onDialogClosed = () => { formik.resetForm(); }; const handleClose = () => { closeDialog(name); }; return (
} inline={true} > } inline={true} > } inline={true} > } inline={true} >
); } export default compose( UserListDialogConnect, DialogReduxConnect )(InviteUserDialog);