The localhost:8080 server references in fetch calls within verify_mail.tsx and contact.tsx files have been updated to localhost:8002. Furthermore, the application base URL has been set to '/forms' in package.json, and in the BrowserRouter element within App.tsx, to ensure proper routing on the production server.
152 lines
5.5 KiB
TypeScript
152 lines
5.5 KiB
TypeScript
import React, {useState} from "react";
|
|
import './Contact.css';
|
|
import {useNavigate} from 'react-router-dom'
|
|
import {validationSchema} from "./validationSchema";
|
|
import {ErrorMessage, Field, Form, Formik, FormikValues} from "formik";
|
|
|
|
type InputNames = "username" | "email" | "question";
|
|
|
|
interface Step {
|
|
label: string;
|
|
name: InputNames;
|
|
type: "text" | "email" | "textarea";
|
|
min_length: number;
|
|
max_length: number;
|
|
required: boolean;
|
|
pattern: string;
|
|
}
|
|
|
|
const ContactForm = () => {
|
|
|
|
const navigate = useNavigate();
|
|
|
|
const [currentStep, setCurrentStep] = useState<number>(0);
|
|
|
|
|
|
const steps: Step[] = [
|
|
{
|
|
label: "Username",
|
|
name: "username",
|
|
type: "text",
|
|
min_length: 3,
|
|
max_length: 16,
|
|
required: true,
|
|
pattern: ""
|
|
},
|
|
{
|
|
label: "Email",
|
|
name: "email",
|
|
type: "email",
|
|
min_length: 3,
|
|
max_length: 254,
|
|
required: true,
|
|
pattern: ""
|
|
},
|
|
{
|
|
label: "Question",
|
|
name: "question",
|
|
type: "textarea",
|
|
min_length: 10,
|
|
max_length: 2000,
|
|
required: true,
|
|
pattern: ""
|
|
},
|
|
]
|
|
|
|
const handleSubmit = async (e: FormikValues) => {
|
|
try {
|
|
const response = await fetch('http://localhost:8002/api/contact/submitContactForm', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(e)
|
|
})
|
|
if (!response.ok) {
|
|
alert("Your form submission was denied by the server, or the server was unable to process it, if you didn't mess with the data please contact the administrator at admin@alttd.com");
|
|
} else {
|
|
navigate('/verify-email', {
|
|
state: {
|
|
email: e['email']
|
|
}
|
|
});
|
|
}
|
|
} catch (e) {
|
|
alert("Your form submission was denied by the server, if you didn't mess with the data please contact the administrator at admin@alttd.com")
|
|
}
|
|
};
|
|
|
|
const next = () => {
|
|
setCurrentStep(current => current + 1)
|
|
}
|
|
|
|
const prev = () => {
|
|
setCurrentStep(current => Math.max(current - 1, 0))
|
|
}
|
|
|
|
const [prevLength, setPrevLength] = useState(0);
|
|
return (
|
|
<div className="container">
|
|
<div>
|
|
<h1>Contact Form</h1>
|
|
</div>
|
|
<div>
|
|
<Formik
|
|
initialValues={{username: '', email: '', question: ''}}
|
|
validationSchema={validationSchema}
|
|
onSubmit={(values: FormikValues) => {
|
|
handleSubmit(values);
|
|
}}
|
|
>
|
|
{({
|
|
touched,
|
|
errors,
|
|
isValid,
|
|
handleChange,
|
|
values,
|
|
setFieldTouched
|
|
}) => (
|
|
|
|
<Form>
|
|
<div>
|
|
<label>
|
|
{steps[currentStep].label}
|
|
<Field
|
|
type={steps[currentStep].type}
|
|
name={steps[currentStep].name}
|
|
required={steps[currentStep].required}
|
|
min={steps[currentStep].min_length}
|
|
max={steps[currentStep].max_length}
|
|
as={(steps[currentStep].type === "textarea") ? "textarea" : "input"}
|
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
|
handleChange(e);
|
|
if (prevLength != values[steps[currentStep].name].length) {
|
|
setFieldTouched(steps[currentStep].name);
|
|
setPrevLength(values[steps[currentStep].name].length);
|
|
}
|
|
}}
|
|
/>
|
|
<ErrorMessage name={steps[currentStep].name} component="div"/>
|
|
</label>
|
|
</div>
|
|
<button type="button" onClick={prev} disabled={currentStep === 0}>
|
|
Previous
|
|
</button>
|
|
<button type="button" onClick={next}
|
|
hidden={currentStep === (steps.length - 1)}
|
|
disabled={(!touched[steps[currentStep].name] || !!errors[steps[currentStep].name]) || currentStep === (steps.length - 1)}>
|
|
Next
|
|
</button>
|
|
<input type="submit" value="Submit"
|
|
hidden={currentStep !== (steps.length - 1)}
|
|
disabled={!isValid || currentStep !== (steps.length - 1)}
|
|
/>
|
|
</Form>
|
|
)}
|
|
</Formik>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default ContactForm; |