import { FC, ReactNode, useState } from 'react'; import { useIntl } from 'react-intl'; import { Button, Form, Spinner } from '../../atoms'; import { LabelledField } from '../../molecules'; import styles from './contact-form.module.scss'; export type ContactFormData = { email: string; message: string; name: string; subject: string; }; export type ContactFormProps = { /** * Set additional classnames to the form wrapper. */ className?: string; /** * Pass a component to print a success/error message. */ Notice?: ReactNode; /** * A callback function to send mail. */ sendMail: (data: ContactFormData, reset: () => void) => Promise; }; /** * ContactForm component * * Render a contact form. */ export const ContactForm: FC = ({ className = '', Notice, sendMail, }) => { const intl = useIntl(); const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [object, setObject] = useState(''); const [message, setMessage] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); /** * Reset all the form fields. */ const resetForm = () => { setName(''); setEmail(''); setObject(''); setMessage(''); setIsSubmitting(false); }; const formName = intl.formatMessage({ defaultMessage: 'Contact form', description: 'ContactForm: form accessible name', id: 'HFdzae', }); const nameLabel = intl.formatMessage({ defaultMessage: 'Name:', description: 'ContactForm: name label', id: '1dCuCx', }); const emailLabel = intl.formatMessage({ defaultMessage: 'Email:', description: 'ContactForm: email label', id: 'w4B5PA', }); const objectLabel = intl.formatMessage({ defaultMessage: 'Object:', description: 'ContactForm: object label', id: 's8/tyz', }); const messageLabel = intl.formatMessage({ defaultMessage: 'Message:', description: 'ContactForm: message label', id: 'yN5P+m', }); const submitHandler = async () => { setIsSubmitting(true); sendMail({ email, message, name, subject: object }, resetForm).then(() => setIsSubmitting(false) ); }; return (
{isSubmitting && ( )} {Notice} ); };