import React, { useEffect, useState } from "react"; import axios from "axios"; import { useNavigate } from "react-router-dom"; import TechInformation from "./TechInformation"; const RequestForm = ({ techInformation, attachDesign, glContext, sceneContext, cameraContext }) => { const navigate = useNavigate(); const [formData, setFormData] = useState({ aanhef: "Dhr", voornaam: "", tussenvoegsel: "", achternaam: "", straatnaam: "", huisnummer: "", postcode: "", woonplaats: "", land: "Nederland", emailadres: "", telefoonnummer: "", comment: "", file: null, }); useEffect(() => { setFormData({...formData, file: attachDesign}); }, [attachDesign]) const [isSubmitting, setIsSubmitting] = useState(false); const [isClearSubmitting, setIsClearSubmitting] = useState(false); const [formErrors, setFormErrors] = useState({}); const handleChange = (e) => { const { name, value, files } = e.target; if (name === "file") { setFormData({ ...formData, [name]: files[0], }); } else { setFormData({ ...formData, [name]: value, }); } }; const validate = () => { const errors = {}; Object.keys(formData).forEach((key) => { if (["comment", "tussenvoegsel", "file"].includes(key)) return; if (!formData[key]) { errors[key] = "Dit veld is verplicht"; } }); return errors; }; const dataURLToBlob = (dataURL) => { const byteString = atob(dataURL.split(',')[1]); const mimeString = dataURL.split(',')[0].split(':')[1].split(';')[0]; const arrayBuffer = new ArrayBuffer(byteString.length); const uint8Array = new Uint8Array(arrayBuffer); for (let i = 0; i < byteString.length; i++) { uint8Array[i] = byteString.charCodeAt(i); } return new Blob([arrayBuffer], { type: mimeString }); }; const handleSubmit = async (isReset = false) => { const errors = validate(); if (Object.keys(errors).length === 0) { setIsSubmitting(true); setIsClearSubmitting(isReset); try { glContext.render(sceneContext, cameraContext); const image = glContext.domElement.toDataURL('image/png'); const imageBlob = dataURLToBlob(image); const formDataToSubmit = new FormData(); Object.keys(formData).forEach((key) => { formDataToSubmit.append(key, formData[key]); }); formDataToSubmit.append('constructImage', imageBlob, 'constructImage.png'); formDataToSubmit.append( "techInformation", JSON.stringify(techInformation) ); formDataToSubmit.append( "platform", "clooz" ); const response = await axios.post( "https://api-lumbronch.agreatidea.studio/api/request-a-quote", formDataToSubmit, { headers: { "Content-Type": "multipart/form-data", }, } ); navigate("/request-confirmation"); if (isReset) { setFormData({ aanhef: "Dhr", voornaam: "", tussenvoegsel: "", achternaam: "", straatnaam: "", huisnummer: "", postcode: "", woonplaats: "", land: "Nederland", emailadres: "", telefoonnummer: "", comment: "", file: null, }); } // Handle successful form submission } catch (error) { console.error(error); // Handle error in form submission } finally { setIsSubmitting(false); } } else { setFormErrors(errors); } }; const formStyle = { maxWidth: "400px", margin: "0 auto", backgroundColor: "#2D3748", padding: "20px", borderRadius: "8px", }; const inputStyle = { width: "100%", padding: "10px", marginBottom: "10px", borderRadius: "4px", backgroundColor: "#fff", color: "#333", border: "none", boxSizing: "border-box", }; const fileInputStyle = { display: "none", }; const labelStyle = { color: "#fff", fontSize: "14px", fontWeight: "bold", display: "block", }; const errorStyle = { color: "red", fontSize: "12px", margin: 0, }; const buttonStyle = { backgroundColor: "#48BB78", color: "#FFF", fontSize: "16px", padding: "10px 20px", borderRadius: "100px", border: "none", cursor: "pointer", }; const linkButtonStyle = { fontSize: "14px", color: "#FFF", cursor: "pointer", display: "block", }; const fileUploadLabelStyle = { display: "flex", alignItems: "center", gap: "10px", cursor: "pointer", backgroundColor: "#48BB78", padding: "8px 15px", borderRadius: "50px", color: "#FFF", fontSize: "14px", textAlign: "center", }; return (
); }; export default RequestForm;