import React, { useState } from 'react'; import { useHistory } from 'react-router'; import { useFormik } from 'formik'; import {register, login, addCustomerAssociation, getMultiCarts, getMultiCartsList } from './service'; import { useCustomerData, useMultiCartData, useTranslation } from './app-state'; import './RegistrationForm.scss'; interface FormValues { firstName: string, lastName: string, email: string, emailConfirm: string, password: string, passwordConfirm: string, } export const RegistrationForm: React.FC = (props) => { const { setCustomerData } = useCustomerData(); const { setMultiCartData, updateSelectedCart, setMultiCartDataList } = useMultiCartData(); const { t } = useTranslation(); const history = useHistory(); const [registrationErrors, setRegistrationErrors] = useState(''); const [isLoading, setIsLoading] = useState(false); const initialValues:FormValues = { firstName: '', lastName: '', email: '', emailConfirm: '', password: '', passwordConfirm: '', }; const validate = (values:FormValues) => { const errors:any = {}; if (!values.firstName) { errors.firstName = t('required'); } if (!values.lastName) { errors.lastName = t('required'); } if (!values.email) { errors.email = t('required'); } if (!values.emailConfirm) { errors.emailConfirm = t('required'); } if (values.email && values.emailConfirm && values.email !== values.emailConfirm) { errors.emailConfirm = t('email-slash-username-confirm-error'); } if (!values.password) { errors.password = t('required'); } if (!values.passwordConfirm) { errors.passwordConfirm = t('required'); } if (values.password && values.passwordConfirm && values.password !== values.passwordConfirm) { errors.passwordConfirm = t('password-confirm-error'); } return errors; }; const {handleSubmit, handleChange, values, errors} = useFormik({ initialValues, validate, onSubmit: (values) => { setRegistrationErrors(''); setIsLoading(true); const guestCart = localStorage.getItem('mcart') || ''; register(`${values.firstName} ${values.lastName}`, values.email, values.password) .then(() => { login(values.email.toLowerCase(), values.password).then((result) => { setIsLoading(false); setCustomerData(result.token, result.customer_id); addCustomerAssociation(guestCart, result.customer_id, result.token) .then(() => getMultiCartsList(result.token, 1).then((res) => { setMultiCartDataList(res.data); getMultiCarts(result.token).then(res => { setMultiCartData(res.data); updateSelectedCart(res.data[0]); localStorage.setItem('mcart', res.data[0].id); }) }) .catch(error => { console.error(error); }) ) .catch(error => { console.error(error); }); history.push('/'); }) }) .catch(error => { const errorsContainer = error.errors.map((el:any) => el.detail).join('\n'); setIsLoading(false); setRegistrationErrors(errorsContainer); console.error(error); }); }, }); return ( <div className="registrationform container"> <h1 className="eppagetitle"> {t('register-new-account')} </h1> <div className="registrationform__feedback"> {registrationErrors} </div> <div className={`registrationform__content ${isLoading ? '--loading' : ''}`}> <form className="epform" onSubmit={handleSubmit}> { (isLoading) ? <div className="epminiLoader --centered" /> : ('') } <div className={`epform__group ${errors.firstName ? '--error' : ''}`}> <label htmlFor="firstName" className="epform__label"> {t('first-name')} * </label> <input id="firstName" name="firstName" className="epform__input" type="text" onChange={handleChange} value={values.firstName} /> <div className="epform__error"> {errors.firstName ? errors.firstName : null} </div> </div> <div className={`epform__group ${errors.lastName ? '--error' : ''}`}> <label htmlFor="lastName" className="epform__label"> {t('last-name')} * </label> <input id="lastName" name="lastName" className="epform__input" type="text" onChange={handleChange} value={values.lastName} /> <div className="epform__error"> {errors.lastName ? errors.lastName : null} </div> </div> <div className={`epform__group ${errors.email ? '--error' : ''}`}> <label htmlFor="email" className="epform__label"> {t('email-slash-username')} * </label> <input id="email" name="email" className="epform__input" type="email" onChange={handleChange} value={values.email} /> <div className="epform__error"> {errors.email ? errors.email : null} </div> </div> <div className={`epform__group ${errors.emailConfirm ? '--error' : ''}`}> <label htmlFor="email" className="epform__label"> {t('email-slash-username-confirmation')} * </label> <input id="email" name="emailConfirm" className="epform__input" type="email" onChange={handleChange} value={values.emailConfirm} /> <div className="epform__error"> {errors.emailConfirm ? errors.emailConfirm : null} </div> </div> <div className={`epform__group ${errors.password ? '--error' : ''}`}> <label htmlFor="password" className="epform__label"> {t('password')} * </label> <input id="password" name="password" className="epform__input" type="password" onChange={handleChange} value={values.password} /> <div className="epform__error"> {errors.password ? errors.password : null} </div> </div> <div className={`epform__group ${errors.passwordConfirm ? '--error' : ''}`}> <label htmlFor="passwordConfirm" className="epform__label"> {t('password-confirmation')} * </label> <input id="passwordConfirm" name="passwordConfirm" className="epform__input" type="password" onChange={handleChange} value={values.passwordConfirm} /> <div className="epform__error"> {errors.passwordConfirm ? errors.passwordConfirm : null} </div> </div> <div className="epform__group --btn-container"> <button className="epbtn --secondary" id="registration_form_register_button" type="submit" disabled={isLoading}> {t('submit')} </button> </div> </form> </div> </div> ); };