Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
709d5f4
refactor: extract webhook submission logic into a `useWebhookSubmit` …
Manishnemade12 Mar 22, 2026
c17fb1c
Merge branch 'master' into eliminate
Manishnemade12 Mar 22, 2026
aeb3e68
Merge branch 'master' into eliminate
Manishnemade12 Mar 24, 2026
b1f5d72
Merge branch 'master' into eliminate
Manishnemade12 Mar 24, 2026
9dede11
Update src/utils/hooks/useWebhookSubmit.js
Manishnemade12 Mar 25, 2026
bff7508
Merge branch 'master' into eliminate
Manishnemade12 Mar 25, 2026
96f097d
Merge branch 'master' into eliminate
Manishnemade12 Mar 26, 2026
f744db5
Merge branch 'master' into eliminate
Manishnemade12 Mar 28, 2026
185c96e
Remove unnecessary state update in EventForm on successful submission
Manishnemade12 Mar 28, 2026
5b5f726
Merge branch 'master' into eliminate
Manishnemade12 Apr 3, 2026
f5f5384
fix(forms): replace alert with inline error status
Manishnemade12 Apr 3, 2026
9359f93
Merge branch 'master' into eliminate
Manishnemade12 Apr 4, 2026
271d732
fix(form): enhance error handling and status display in CommonForm an…
Manishnemade12 Apr 5, 2026
3ccd76f
fix(forms): remove unused state and add unmount safety to webhook sub…
Manishnemade12 Apr 5, 2026
3455552
Merge branch 'master' into eliminate
Manishnemade12 Apr 9, 2026
cfb6655
Merge branch 'master' into eliminate
Manishnemade12 Apr 11, 2026
b83d998
Merge branch 'master' into eliminate
yi-nuo426 Apr 16, 2026
57462b2
Merge branch 'master' into eliminate
Manishnemade12 Apr 17, 2026
55d03c5
Merge branch 'master' into eliminate
Manishnemade12 Apr 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 24 additions & 24 deletions src/components/CommonForm/events.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useState, useEffect } from "react";
import React, { useState } from "react";
import Button from "../../reusecore/Button";
import axios from "axios";
import { useWebhookSubmit } from "../../utils/hooks/useWebhookSubmit";
import { Field, Form, Formik } from "formik";
import CommonFormWrapper from "./commonForm.style";
import { Container } from "../../reusecore/Layout";
Expand All @@ -10,8 +10,7 @@ import layer5_img from "../../assets/images/layer5/layer5-only/svg/layer5-white-
const EventForm = ({ form, title, submit_title, submit_body }) => {

const [stepNumber, setStepNumber] = useState(0);
const [memberFormOne, setMemberFormOne] = useState({});
const [submit, setSubmit] = useState(false);
const { submitForm } = useWebhookSubmit();

// Form values
const [email, setEmail] = useState("");
Expand All @@ -21,14 +20,6 @@ const EventForm = ({ form, title, submit_title, submit_body }) => {
const [occupation, setOccupation] = useState("");


useEffect(() => {
if (submit) {
axios.post("https://hook.us1.make.com/nficb3d7swqkclkl467st4hp4cg65u8o", {
memberFormOne,
});
}
}, [submit]);

return (
<CommonFormWrapper>
{
Expand All @@ -44,19 +35,27 @@ const EventForm = ({ form, title, submit_title, submit_body }) => {
org: org,
form: form,
}}
onSubmit={values => {
setMemberFormOne(values);
setStepNumber(1);
setSubmit(true);
window.scrollTo(0,window.scrollY - 800);
setFirstName(values.firstname);
setEmail(values.email);
setLastName(values.lastname);
setOccupation(values.occupation);
setOrg(values.org);
onSubmit={async (values, { setStatus }) => {
const { success } = await submitForm({ memberFormOne: values });
if (success) {
setStatus(null);
setStepNumber(1);
window.scrollTo(0,window.scrollY - 800);
setFirstName(values.firstname);
setEmail(values.email);
setLastName(values.lastname);
setOccupation(values.occupation);
setOrg(values.org);
} else {
setStatus({ submitError: "Submission failed. Please try again." });
}
Comment thread
Manishnemade12 marked this conversation as resolved.
}}
>
<Form className="form" method="post">
{({ status }) => (
<Form className="form" method="post" aria-describedby="event-form-status">
<div id="event-form-status" className="form-error" role="alert" aria-live="assertive">
{status?.submitError || ""}
</div>
<label htmlFor="firstname" className="form-name">First Name <span className="required-sign">*</span></label>
<Field type="text" className="text-field" id="firstname" name="firstname" maxLength="32" pattern="[A-Za-z]{1,32}" required />
<label htmlFor="lastname" className="form-name">Last Name <span className="required-sign">*</span></label>
Expand All @@ -69,7 +68,8 @@ const EventForm = ({ form, title, submit_title, submit_body }) => {
<Field type="text" className="text-field" id="org" name="org" />

<Button $secondary className="btn" title="Submit" />
</Form>
</Form>
)}
</Formik>
</div>
}
Expand Down
38 changes: 21 additions & 17 deletions src/components/CommonForm/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useState, useEffect, useRef, forwardRef } from "react";
import Button from "../../reusecore/Button";
import axios from "axios";
import { useWebhookSubmit } from "../../utils/hooks/useWebhookSubmit";
import { Field, Form, Formik } from "formik";
import CommonFormWrapper from "./commonForm.style";
import { Container } from "../../reusecore/Layout";
Expand All @@ -12,6 +12,7 @@ const CommonForm = ({ form, title, submit_title, submit_body, submit_button_titl
const [stepNumber, setStepNumber] = useState(0);
const [memberFormOne, setMemberFormOne] = useState({});
const [submit, setSubmit] = useState(false);
const { submitForm } = useWebhookSubmit();

// Form values
// const [validateAccounts, setValidateAccounts] = useState(false);
Expand Down Expand Up @@ -71,14 +72,6 @@ const CommonForm = ({ form, title, submit_title, submit_body, submit_button_titl
return true;
}
};
useEffect(() => {
if (submit) {
axios.post("https://hook.us1.make.com/nficb3d7swqkclkl467st4hp4cg65u8o", {
memberFormOne,
});
}
}, [submit, errorEmail, validateEmail, validateRole]);

return (
<CommonFormWrapper>
{
Expand All @@ -103,14 +96,20 @@ const CommonForm = ({ form, title, submit_title, submit_body, submit_button_titl
role: role,
form: form,
}}
onSubmit={values => {
onSubmit={async (values, { setStatus }) => {
if (isValidRole(values.role) && isValidEmail(values.email)) {
setMemberFormOne(values);
setStepNumber(1);
setSubmit(true);
// window.scrollTo(0,window.scrollY - 800);
// confirmationMessageRef.current.scrollIntoView({ behavior: 'smooth' })
scrollElementIntoView(confirmationMessageRef.current, navBarOffset);
const { success } = await submitForm({ memberFormOne: values });
if (success) {
setStatus(null);
setMemberFormOne(values);
setStepNumber(1);
setSubmit(true);
// window.scrollTo(0,window.scrollY - 800);
// confirmationMessageRef.current.scrollIntoView({ behavior: 'smooth' })
scrollElementIntoView(confirmationMessageRef.current, navBarOffset);
} else {
setStatus({ submitError: "Submission failed. Please try again." });
}
Comment thread
Manishnemade12 marked this conversation as resolved.
} else {
// if (!(values.google || values.github || values.twitter || values.linkedin)) {
// setValidateAccounts(true);
Expand All @@ -130,7 +129,11 @@ const CommonForm = ({ form, title, submit_title, submit_body, submit_button_titl
}
}}
>
<Form className="form" method="post">
{({ status }) => (
<Form className="form" method="post" aria-describedby="common-form-status">
<div id="common-form-status" className="form-error" role="alert" aria-live="assertive">
{status?.submitError || ""}
</div>
<label htmlFor="firstname" className="form-name">First Name <span className="required-sign">*</span></label>
<Field type="text" className="text-field" id="firstname" name="firstname" maxLength="32" pattern="^[\p{L}]+('[\p{L}]*)?(?:-[\p{L}]+)*([\s][\p{L}]+('[\p{L}]*)?(?:-[\p{L}]+)*){0,31}$" required />
<label htmlFor="lastname" className="form-name">Last Name <span className="required-sign">*</span></label>
Expand Down Expand Up @@ -290,6 +293,7 @@ const CommonForm = ({ form, title, submit_title, submit_body, submit_button_titl

<Button $secondary className="btn" title={submit_button_title || "Submit"} />
</Form>
)}
</Formik>
</div>
}
Expand Down
37 changes: 20 additions & 17 deletions src/components/ContactForm/index.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,14 @@
import React, { useState, useEffect } from "react";
import React, { useState } from "react";
import Button from "../../reusecore/Button";
import axios from "axios";
import { useWebhookSubmit } from "../../utils/hooks/useWebhookSubmit";
import { Field, Form, Formik } from "formik";
import logo from "../../assets/images/app/layer5.svg";
import ContactFormWrapper from "./contact-form.style";

const ContactForm = () => {
const [memberFormOne, setmemberFormOne] = useState({});
const [submit, setSubmit] = useState(false);

useEffect(() => {
if (submit) {
// Webhook to handle all event forms and all signup forms, except for the community member form.
axios.post("https://hook.us1.make.com/nficb3d7swqkclkl467st4hp4cg65u8o", {
memberFormOne,
});
window.scrollTo(0, 700);
}
}, [submit]);
const { submitForm } = useWebhookSubmit();

if (submit) {
document.querySelector(".showForm").style.height = "20rem";
Expand Down Expand Up @@ -45,12 +36,23 @@ const ContactForm = () => {
scope: "",
form: "contact",
}}
onSubmit={(values) => {
setmemberFormOne(values);
setSubmit(true);
onSubmit={async (values, { setStatus }) => {
const { success } = await submitForm({ memberFormOne: values });
if (success) {
setStatus(null);
setmemberFormOne(values);
setSubmit(true);
window.scrollTo(0, 700);
} else {
setStatus({ submitError: "Submission failed. Please try again." });
}
Comment thread
Manishnemade12 marked this conversation as resolved.
}}
>
<Form className="form" method="post">
{({ status }) => (
<Form className="form" method="post" aria-describedby="contact-form-status">
<div id="contact-form-status" className="form-error" role="alert" aria-live="assertive">
{status?.submitError || ""}
</div>
<div className="title">
<img className="layer5-logo" src={logo} alt="Layer5 Logo" />
</div>
Expand Down Expand Up @@ -212,7 +214,8 @@ const ContactForm = () => {
/>
</div>
</div>
</Form>
</Form>
)}
</Formik>
</div>
</ContactFormWrapper>
Expand Down
60 changes: 60 additions & 0 deletions src/utils/hooks/useWebhookSubmit.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { useEffect, useRef, useState } from 'react';
import axios from 'axios';

export const useWebhookSubmit = () => {
const [isSubmitting, setIsSubmitting] = useState(false);
const [error, setError] = useState(null);
Comment thread
Manishnemade12 marked this conversation as resolved.
const isMountedRef = useRef(true);
const requestControllerRef = useRef(null);

useEffect(() => {
return () => {
isMountedRef.current = false;
if (requestControllerRef.current) {
requestControllerRef.current.abort();
}
};
}, []);

const submitForm = async (payload) => {
const controller = new AbortController();
requestControllerRef.current = controller;

if (isMountedRef.current) {
setIsSubmitting(true);
setError(null);
}

try {
const response = await axios.post(
"https://hook.us1.make.com/nficb3d7swqkclkl467st4hp4cg65u8o",
payload,
{ signal: controller.signal },
);
return { success: true, data: response.data };
} catch (err) {
const isAborted = controller.signal.aborted || err?.name === "CanceledError";
if (isAborted) {
return { success: false, error: null, errorMessage: "Request was cancelled." };
}

const errorMessage = (err && err.message) || 'An error occurred during submission.';
const errorObject = err instanceof Error ? err : new Error(errorMessage);
if (isMountedRef.current) {
setError(errorObject);
}
return { success: false, error: errorObject, errorMessage };
} finally {
if (requestControllerRef.current === controller) {
requestControllerRef.current = null;
}
if (isMountedRef.current) {
setIsSubmitting(false);
}
}
};
Comment thread
Manishnemade12 marked this conversation as resolved.

const errorMessage = error ? (error.message || 'An error occurred during submission.') : null;

return { submitForm, isSubmitting, error, errorMessage };
};
Loading