summaryrefslogtreecommitdiffstats
path: root/src/pages
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2022-02-10 16:51:08 +0100
committerArmand Philippot <git@armandphilippot.com>2022-02-10 16:51:08 +0100
commit82e387d33fc296b1e5a08fef17bcd4595e0c7071 (patch)
tree780a3886a5e33804b16a335b37bd14bcaa1f6ed3 /src/pages
parentf2be002df3b13254a5b549dd1589089545c53f02 (diff)
refactor: extract contact form from contact page
The contact page file was too long. By extracting the contact form the readability is improved.
Diffstat (limited to 'src/pages')
-rw-r--r--src/pages/contact.tsx143
1 files changed, 2 insertions, 141 deletions
diff --git a/src/pages/contact.tsx b/src/pages/contact.tsx
index dc57981..176d130 100644
--- a/src/pages/contact.tsx
+++ b/src/pages/contact.tsx
@@ -1,10 +1,8 @@
-import { ButtonSubmit } from '@components/Buttons';
-import { Form, FormItem, Input, TextArea } from '@components/Form';
+import ContactForm from '@components/ContactForm/ContactForm';
import { getLayout } from '@components/Layouts/Layout';
import PostHeader from '@components/PostHeader/PostHeader';
import Sidebar from '@components/Sidebar/Sidebar';
import { SocialMedia } from '@components/Widgets';
-import { sendMail } from '@services/graphql/mutations';
import styles from '@styles/pages/Page.module.scss';
import { NextPageWithLayout } from '@ts/types/app';
import { settings } from '@utils/config';
@@ -12,88 +10,13 @@ import { getIntlInstance, loadTranslation } from '@utils/helpers/i18n';
import { GetStaticProps, GetStaticPropsContext } from 'next';
import Head from 'next/head';
import { useRouter } from 'next/router';
-import { FormEvent, useState } from 'react';
import { useIntl } from 'react-intl';
import { ContactPage as ContactPageSchema, Graph, WebPage } from 'schema-dts';
-type Status = 'success' | 'error' | 'warning';
-
const ContactPage: NextPageWithLayout = () => {
const intl = useIntl();
- const [name, setName] = useState('');
- const [email, setEmail] = useState('');
- const [subject, setSubject] = useState('');
- const [message, setMessage] = useState('');
- const [status, setStatus] = useState<Status>();
- const [statusMessage, setStatusMessage] = useState<string>('');
const router = useRouter();
- 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: 'ContactPage: missing fields message.',
- })
- );
- return;
- }
-
- const messageHTML = message.replace(/\r?\n/g, '<br />');
- const body = `Message received from ${name} <${email}> on ${settings.url}.<br /><br />${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: 'ContactPage: success message',
- })
- );
- resetForm();
- } else {
- const errorPrefix = intl.formatMessage({
- defaultMessage: 'An error occurred:',
- description: 'ContactPage: error message',
- });
- const error = `${errorPrefix} ${mail.message}`;
- setStatus('error');
- setStatusMessage(error);
- }
- };
-
- const getStatus = () => {
- if (!status) return <></>;
-
- const statusModifier = `status--${status}`;
-
- return (
- <p className={`${styles.status} ${styles[statusModifier]}`}>
- {statusMessage}
- </p>
- );
- };
-
const pageTitle = intl.formatMessage(
{
defaultMessage: 'Contact form - {websiteName}',
@@ -176,69 +99,7 @@ const ContactPage: NextPageWithLayout = () => {
description: 'ContactPage: required fields text',
})}
</p>
- <Form submitHandler={submitHandler}>
- <FormItem>
- <Input
- id="contact-name"
- name="name"
- value={name}
- setValue={setName}
- label={intl.formatMessage({
- defaultMessage: 'Name',
- description: 'ContactPage: name field label',
- })}
- required={true}
- />
- </FormItem>
- <FormItem>
- <Input
- id="contact-email"
- type="email"
- name="email"
- value={email}
- setValue={setEmail}
- label={intl.formatMessage({
- defaultMessage: 'Email',
- description: 'ContactPage: email field label',
- })}
- required={true}
- />
- </FormItem>
- <FormItem>
- <Input
- id="contact-subject"
- name="subject"
- value={subject}
- setValue={setSubject}
- label={intl.formatMessage({
- defaultMessage: 'Subject',
- description: 'ContactPage: subject field label',
- })}
- />
- </FormItem>
- <FormItem>
- <TextArea
- id="contact-message"
- name="message"
- value={message}
- setValue={setMessage}
- label={intl.formatMessage({
- defaultMessage: 'Message',
- description: 'ContactPage: message field label',
- })}
- required={true}
- />
- </FormItem>
- <FormItem>
- <ButtonSubmit>
- {intl.formatMessage({
- defaultMessage: 'Send',
- description: 'ContactPage: send button text',
- })}
- </ButtonSubmit>
- </FormItem>
- </Form>
- {getStatus()}
+ <ContactForm />
</div>
<Sidebar position="right">
<SocialMedia