From 70efcfeaa0603415dd992cb662d8efb960e6e49a Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Tue, 26 Sep 2023 15:54:28 +0200 Subject: refactor(routes): replace hardcoded routes with constants It makes it easier to change a route if needed and it avoid typo mistakes. I also refactored a bit the concerned files to be complient with the new ESlint config. However, I should rewrite the pages to reduce the number of statements. --- src/pages/contact.tsx | 102 +++++++++++++++++++++++++++++--------------------- 1 file changed, 60 insertions(+), 42 deletions(-) (limited to 'src/pages/contact.tsx') diff --git a/src/pages/contact.tsx b/src/pages/contact.tsx index 92c58cc..d187a93 100644 --- a/src/pages/contact.tsx +++ b/src/pages/contact.tsx @@ -1,8 +1,9 @@ -import { GetStaticProps } from 'next'; +/* eslint-disable max-statements */ +import type { GetStaticProps } from 'next'; import Head from 'next/head'; import { useRouter } from 'next/router'; import Script from 'next/script'; -import { useState } from 'react'; +import { useCallback, useState } from 'react'; import { useIntl } from 'react-intl'; import { ContactForm, @@ -16,7 +17,8 @@ import { import { meta } from '../content/pages/contact.mdx'; import { sendMail } from '../services/graphql'; import styles from '../styles/pages/contact.module.scss'; -import { type NextPageWithLayout } from '../types'; +import type { NextPageWithLayout } from '../types'; +import { ROUTES } from '../utils/constants'; import { getSchemaJson, getSinglePageSchema, @@ -30,9 +32,14 @@ const ContactPage: NextPageWithLayout = () => { const intl = useIntl(); const { items: breadcrumbItems, schema: breadcrumbSchema } = useBreadcrumb({ title, - url: `/contact`, + url: ROUTES.CONTACT, }); + const pageTitle = intl.formatMessage({ + defaultMessage: 'Contact', + description: 'ContactPage: page title', + id: 'AN9iy7', + }); const socialMediaTitle = intl.formatMessage({ defaultMessage: 'Find me elsewhere', description: 'ContactPage: social media widget title', @@ -61,6 +68,7 @@ const ContactPage: NextPageWithLayout = () => { const widgets = [ { />, ]; - const [status, setStatus] = useState('info'); + const [statusKind, setStatusKind] = useState('info'); const [statusMessage, setStatusMessage] = useState(''); - const submitMail: ContactFormProps['sendMail'] = async (data, reset) => { - const { email, message, name, object } = data; - const messageHTML = message.replace(/\r?\n/g, '
'); - const body = `Message received from ${name} <${email}> on ${website.url}.

${messageHTML}`; - const replyTo = `${name} <${email}>`; - const mailData = { - body, - clientMutationId: 'contact', - replyTo, - subject: object, - }; - const { message: mutationMessage, sent } = await sendMail(mailData); + const submitMail: ContactFormProps['sendMail'] = useCallback( + async (data, reset) => { + const { email, message, name, object } = data; + const messageHTML = message.replace(/\r?\n/g, '
'); + const body = `Message received from ${name} <${email}> on ${website.url}.

${messageHTML}`; + const replyTo = `${name} <${email}>`; + const mailData = { + body, + clientMutationId: 'contact', + replyTo, + subject: object, + }; + const { message: mutationMessage, sent } = await sendMail(mailData); - if (sent) { - setStatus('success'); - setStatusMessage( - intl.formatMessage({ - defaultMessage: - 'Thanks. Your message was successfully sent. I will answer it as soon as possible.', - description: 'Contact: success message', - id: '3Pipok', - }) - ); - reset(); - } else { - const errorPrefix = intl.formatMessage({ - defaultMessage: 'An error occurred:', - description: 'Contact: error message', - id: 'TpyFZ6', - }); - const error = `${errorPrefix} ${mutationMessage}`; - setStatus('error'); - setStatusMessage(error); - } + if (sent) { + setStatusKind('success'); + setStatusMessage( + intl.formatMessage({ + defaultMessage: + 'Thanks. Your message was successfully sent. I will answer it as soon as possible.', + description: 'Contact: success message', + id: '3Pipok', + }) + ); + reset(); + } else { + const errorPrefix = intl.formatMessage({ + defaultMessage: 'An error occurred:', + description: 'Contact: error message', + id: 'TpyFZ6', + }); + const error = `${errorPrefix} ${mutationMessage}`; + setStatusKind('error'); + setStatusMessage(error); + } + }, + [intl, website.url] + ); + const page = { + title: `${seo.title} - ${website.name}`, + url: `${website.url}${asPath}`, }; return ( <> - {`${seo.title} - ${website.name}`} + {page.title} + {/*eslint-disable-next-line react/jsx-no-literals -- Name allowed */} - + + {/*eslint-disable-next-line react/jsx-no-literals -- Content allowed */}