import { ButtonSubmit } from '@components/Buttons'; import { Form, FormItem, Input, Label, TextArea } from '@components/Form'; import { sendMail } from '@services/graphql/mutations'; import { settings } from '@utils/config'; import { FormEvent, useState } from 'react'; import { useIntl } from 'react-intl'; import styles from './ContactForm.module.scss'; type Status = 'success' | 'error' | 'warning'; const ContactForm = () => { const intl = useIntl(); const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [subject, setSubject] = useState(''); const [message, setMessage] = useState(''); const [status, setStatus] = useState(); const [statusMessage, setStatusMessage] = useState(''); const resetForm = () => { setName(''); setEmail(''); setSubject(''); setMessage(''); }; const submitHandler = async (e: FormEvent) => { e.preventDefault(); if (!name || !email || !message) { setStatus('warning'); setStatusMessage( intl.formatMessage({ defaultMessage: 'Warning: mail not sent. Some required fields are empty.', description: 'ContactForm: missing fields message.', }) ); return; } const messageHTML = message.replace(/\r?\n/g, '
'); const body = `Message received from ${name} <${email}> on ${settings.url}.

${messageHTML}`; const replyTo = `${name} <${email}>`; const data = { body, mutationId: 'contact', replyTo, subject, }; const mail = await sendMail(data); if (mail.sent) { setStatus('success'); setStatusMessage( intl.formatMessage({ defaultMessage: 'Thanks. Your message was successfully sent. I will answer it as soon as possible.', description: 'ContactForm: success message', }) ); resetForm(); } else { const errorPrefix = intl.formatMessage({ defaultMessage: 'An error occurred:', description: 'ContactForm: error message', }); const error = `${errorPrefix} ${mail.message}`; setStatus('error'); setStatusMessage(error); } }; const getStatus = () => { if (!status) return <>; const statusModifier = `status--${status}`; return (

{statusMessage}

); }; const getLabel = ( body: string, htmlFor: string, required: boolean = false ) => { return