UNPKG

@plone/volto

Version:
131 lines (122 loc) 4.15 kB
import { useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { defineMessages, useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; import { toast } from 'react-toastify'; import Helmet from '@plone/volto/helpers/Helmet/Helmet'; import { usePrevious } from '@plone/volto/helpers/Utils/usePrevious'; import Toast from '@plone/volto/components/manage/Toast/Toast'; import { Form } from '@plone/volto/components/manage/Form'; import { createUser } from '@plone/volto/actions/users/users'; const messages = defineMessages({ title: { id: 'Registration form', defaultMessage: 'Registration form', }, default: { id: 'Default', defaultMessage: 'Default', }, fullnameTitle: { id: 'Full Name', defaultMessage: 'Full Name', }, fullnameDescription: { id: 'Enter full name, e.g. John Smith.', defaultMessage: 'Enter full name, e.g. John Smith.', }, emailTitle: { id: 'E-mail', defaultMessage: 'E-mail', }, emailDescription: { id: 'Enter an email address. This will be your login name. We respect your privacy, and will not give the address away to any third parties or expose it anywhere.', defaultMessage: 'Enter an email address. This will be your login name. We respect your privacy, and will not give the address away to any third parties or expose it anywhere.', }, successRegisterCompletedTitle: { id: 'Account Registration Completed', defaultMessage: 'Account Registration Completed', }, successRegisterCompletedBody: { id: 'The registration process has been successful. Please check your e-mail inbox for information on how activate your account.', defaultMessage: 'The registration process has been successful. Please check your e-mail inbox for information on how activate your account.', }, register: { id: 'Register', defaultMessage: 'Register', }, }); const useUsers = () => { const error = useSelector((state) => state.users.create.error); const loading = useSelector((state) => state.users.create.loading); const loaded = useSelector((state) => state.users.create.loaded); return { error, loaded, loading }; }; const Register = () => { const dispatch = useDispatch(); const intl = useIntl(); const history = useHistory(); const [errors, setError] = useState(null); const { loaded, loading, error } = useUsers(); const prevloading = usePrevious(loading); useEffect(() => { if (prevloading && loaded) { toast.success( <Toast success title={intl.formatMessage(messages.successRegisterCompletedTitle)} content={intl.formatMessage(messages.successRegisterCompletedBody)} />, ); history.push('/login'); } }, [intl, history, loaded, prevloading]); const onSubmit = (data) => { const { fullname, email } = data; dispatch( createUser({ fullname: fullname, email: email, sendPasswordReset: true, }), ); setError(null); }; return ( <div id="page-register"> <Helmet title={intl.formatMessage(messages.register)} /> <Form onSubmit={onSubmit} title={intl.formatMessage(messages.title)} error={errors || error} loading={loading} submitLabel={intl.formatMessage(messages.register)} schema={{ fieldsets: [ { id: 'default', title: intl.formatMessage(messages.default), fields: ['fullname', 'email'], }, ], properties: { fullname: { type: 'string', title: intl.formatMessage(messages.fullnameTitle), description: intl.formatMessage(messages.fullnameDescription), }, email: { type: 'string', title: intl.formatMessage(messages.emailTitle), description: intl.formatMessage(messages.emailDescription), }, }, required: ['fullname', 'email'], }} /> </div> ); }; export default Register;