aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/organisms/forms/contact-form
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2023-09-29 11:47:06 +0200
committerArmand Philippot <git@armandphilippot.com>2023-10-24 12:25:00 +0200
commit81b1e0e05919eb368a66aef47adcf7738af76f29 (patch)
tree758577d3f58d7025f84bca5bac9bc0da8432deb7 /src/components/organisms/forms/contact-form
parent3272ac336da52364ace5ed76d8f609d4088ffc06 (diff)
refactor(components): rewrite Spinner component
* Message should be set as children * Default message is no longer available (depending on use case, the consumer might prefer aria-label instead) * It is now possible to define the message position
Diffstat (limited to 'src/components/organisms/forms/contact-form')
-rw-r--r--src/components/organisms/forms/contact-form/contact-form.tsx115
1 files changed, 64 insertions, 51 deletions
diff --git a/src/components/organisms/forms/contact-form/contact-form.tsx b/src/components/organisms/forms/contact-form/contact-form.tsx
index 6208b94..89fd331 100644
--- a/src/components/organisms/forms/contact-form/contact-form.tsx
+++ b/src/components/organisms/forms/contact-form/contact-form.tsx
@@ -1,4 +1,13 @@
-import { ChangeEvent, FC, FormEvent, ReactNode, useState } from 'react';
+/* eslint-disable max-statements */
+import {
+ type ChangeEvent,
+ type FC,
+ type FormEvent,
+ type ReactNode,
+ useState,
+ useCallback,
+ useMemo,
+} from 'react';
import { useIntl } from 'react-intl';
import { Button, Form, Input, Label, Spinner, TextArea } from '../../../atoms';
import { LabelledField } from '../../../molecules';
@@ -38,51 +47,54 @@ export const ContactForm: FC<ContactFormProps> = ({
}) => {
const formClass = `${styles.form} ${className}`;
const intl = useIntl();
- const emptyForm: ContactFormData = {
- email: '',
- message: '',
- name: '',
- object: '',
- };
+ const emptyForm: ContactFormData = useMemo(() => {
+ return {
+ email: '',
+ message: '',
+ name: '',
+ object: '',
+ };
+ }, []);
const [data, setData] = useState(emptyForm);
const [isSubmitting, setIsSubmitting] = useState<boolean>(false);
/**
* Reset all the form fields.
*/
- const resetForm = () => {
+ const resetForm = useCallback(() => {
setData(emptyForm);
setIsSubmitting(false);
- };
+ }, [emptyForm]);
- const updateForm = (
- e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>
- ) => {
- switch (e.target.name) {
- case 'email':
- setData((prevData) => {
- return { ...prevData, email: e.target.value };
- });
- break;
- case 'message':
- setData((prevData) => {
- return { ...prevData, message: e.target.value };
- });
- break;
- case 'name':
- setData((prevData) => {
- return { ...prevData, name: e.target.value };
- });
- break;
- case 'object':
- setData((prevData) => {
- return { ...prevData, object: e.target.value };
- });
- break;
- default:
- break;
- }
- };
+ const updateForm = useCallback(
+ (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
+ switch (e.target.name) {
+ case 'email':
+ setData((prevData) => {
+ return { ...prevData, email: e.target.value };
+ });
+ break;
+ case 'message':
+ setData((prevData) => {
+ return { ...prevData, message: e.target.value };
+ });
+ break;
+ case 'name':
+ setData((prevData) => {
+ return { ...prevData, name: e.target.value };
+ });
+ break;
+ case 'object':
+ setData((prevData) => {
+ return { ...prevData, object: e.target.value };
+ });
+ break;
+ default:
+ break;
+ }
+ },
+ []
+ );
const formName = intl.formatMessage({
defaultMessage: 'Contact form',
@@ -114,11 +126,20 @@ export const ContactForm: FC<ContactFormProps> = ({
id: 'yN5P+m',
});
- const submitHandler = async (e: FormEvent) => {
- e.preventDefault();
- setIsSubmitting(true);
- sendMail(data, resetForm).then(() => setIsSubmitting(false));
- };
+ const loadingMsg = intl.formatMessage({
+ defaultMessage: 'Sending mail...',
+ description: 'ContactForm: spinner message on submit',
+ id: 'xaqaYQ',
+ });
+
+ const submitHandler = useCallback(
+ async (e: FormEvent) => {
+ e.preventDefault();
+ setIsSubmitting(true);
+ await sendMail(data, resetForm).then(() => setIsSubmitting(false));
+ },
+ [data, resetForm, sendMail]
+ );
return (
<Form aria-label={formName} className={formClass} onSubmit={submitHandler}>
@@ -195,15 +216,7 @@ export const ContactForm: FC<ContactFormProps> = ({
id: 'VkAnvv',
})}
</Button>
- {isSubmitting && (
- <Spinner
- message={intl.formatMessage({
- defaultMessage: 'Sending mail...',
- description: 'ContactForm: spinner message on submit',
- id: 'xaqaYQ',
- })}
- />
- )}
+ {isSubmitting ? <Spinner>{loadingMsg}</Spinner> : null}
{Notice}
</Form>
);