import { useEffect, useState } from "react"; import { Link, useNavigate } from "react-router-dom"; import { http } from "../server/http"; import { Swiper, SwiperSlide } from 'swiper/react'; import Button from "../components/ui/Button"; import "../style.css"; import Checkbox from "../components/ui/CheckBox"; import FormInput from "../components/ui/FormInput"; function Signup() { const navigate = useNavigate(); // TODO_FIX_pageTitle // useEffect(() => { // document.title = "Registrierung"; // }, []); const [gName, setGName] = useState(""); const [fName, setFName] = useState(""); const [email, setEmail] = useState(""); const [phone, setPhone] = useState(""); const [birthDate, setBirthDate] = useState(""); const [password, setPassword] = useState(""); const [confirm, setConfirm] = useState(""); const [twoFactor, setTwoFactor] = useState(false); const [error, setError] = useState(""); const [errorOpen, setErrorOpen] = useState(false); const [loading, setLoading] = useState(false); // errors function showError(msg) { setError(msg); setErrorOpen(true); clearTimeout(showError._t); showError._t = setTimeout(() => { closeError(); }, 20000); } function closeError() { setErrorOpen(false); setTimeout(() => { setError(""); }, 300); } function formatBirthInput(v) { const digits = v.replace(/\D/g, "").slice(0, 8); const dd = digits.slice(0, 2); const mm = digits.slice(2, 4); const yyyy = digits.slice(4, 8); let out = dd; if (mm) out += "." + mm; if (yyyy) out += "." + yyyy; return out; } function parseGermanDate(str) { const m = /^(\d{2})\.(\d{2})\.(\d{4})$/.exec(str); if (!m) return null; const dd = Number(m[1]); const mm = Number(m[2]); const yyyy = Number(m[3]); // if (yyyy < 1900 || yyyy > new Date().getFullYear()) return null; if (mm < 1 || mm > 12) return null; const d = new Date(yyyy, mm - 1, dd); if ( d.getFullYear() !== yyyy || d.getMonth() !== mm - 1 || d.getDate() !== dd ) return null; return d; } function germanToISO(str) { const dob = parseGermanDate(str); if (!dob) return null; const yyyy = dob.getFullYear(); const mm = String(dob.getMonth() + 1).padStart(2, "0"); const dd = String(dob.getDate()).padStart(2, "0"); return `${yyyy}-${mm}-${dd}`; } async function checkInput() { if (loading) return; setLoading(true); const userGName = gName.trim(); const userFName = fName.trim(); const userPhone = phone.trim(); const userEmail = email.trim(); const userPassword = password.trim(); let userData = { first_name: userGName, last_name: userFName, email: userEmail, phone_number: userPhone, date_of_birth: germanToISO(birthDate), password: userPassword, require_otp: twoFactor, }; let hasError = false; // userChecker if (userGName === "" || userFName === "") { document.querySelector("#errorUser").classList.remove("hidden"); document.querySelector("#svgUser").classList.add("fill-red-500"); hasError = true; } else { document.querySelector("#errorUser").classList.add("hidden"); document.querySelector("#svgUser").classList.remove("fill-red-500"); } // phone_checker if (userPhone === "") { document.querySelector("#errorPhone").classList.remove("hidden"); document.querySelector("#svgPhone").classList.add("fill-red-500"); hasError = true; } else { document.querySelector("#errorPhone").classList.add("hidden"); document.querySelector("#svgPhone").classList.remove("fill-red-500"); } let phonePattern = /^[0-9]{7,15}$/; if (phonePattern.test(phone)) { userData.phone_number = userPhone; } else { document.querySelector("#errorPhone").classList.remove("hidden"); document.querySelector("#svgPhone").classList.add("fill-red-500"); hasError = true; } // email-checker if (userEmail === "") { document.querySelector("#errorEmail").classList.remove("hidden"); document.querySelector("#svgEmail").classList.add("fill-red-500"); hasError = true; } else { document.querySelector("#errorEmail").classList.add("hidden"); document.querySelector("#svgEmail").classList.remove("fill-red-500"); } let emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (emailPattern.test(email)) { userData.email = userEmail; } else { document.querySelector("#errorEmail").classList.remove("hidden"); document.querySelector("#svgEmail").classList.add("fill-red-500"); hasError = true; } // BirthChecher const dob = parseGermanDate(birthDate); if (!dob) { document.querySelector("#errorBirth").classList.remove("hidden"); document.querySelector("#svgBirth").classList.add("fill-red-500"); hasError = true; } else { document.querySelector("#errorBirth").classList.add("hidden"); document.querySelector("#svgBirth").classList.remove("fill-red-500"); // fea const today = new Date(); const t = new Date( today.getFullYear(), today.getMonth(), today.getDate(), ); const d = new Date(dob.getFullYear(), dob.getMonth(), dob.getDate()); if (d > t) { showError("Geburtsdatum darf nicht in der Zukunft liegen."); document.querySelector("#errorBirth").classList.remove("hidden"); document.querySelector("#svgBirth").classList.add("fill-red-500"); hasError = true; } } // passCheck if (userPassword === "") { document.querySelector("#errorPass").classList.remove("hidden"); document.querySelector("#svgPass").classList.add("fill-red-500"); hasError = true; } else { document.querySelector("#errorPass").classList.add("hidden"); document.querySelector("#svgPass").classList.remove("fill-red-500"); } // confirmChecker if (password !== confirm) { document.querySelector("#errorConfimPass").classList.remove("hidden"); document.querySelector("#svgConfimPass").classList.add("fill-red-500"); hasError = true; } else { document.querySelector("#errorConfimPass").classList.add("hidden"); document.querySelector("#svgConfimPass").classList.remove("fill-red-500"); } if (hasError) { setLoading(false); return; } // server try { const respon = await http.post("/api/accounts/register/", userData); console.log(respon); const otpId = respon?.data?.otp_id; // if (!otpId) { // showError("Registrierung fehlgeschlagen. Bitte erneut versuchen."); // setLoading(false); // return; // } // navigate("/Verify", { // state: { // mode: "email_verify", // otp_id: otpId, // email: userEmail, // phone: userPhone, // contactType: "E-Mail-Adresse", // twoFactor: twoFactor, // }, // }); navigate("/"); } catch (error) { const status = error?.response?.status; const errorData = error?.response?.data; console.log("status", status); console.log("errorData", errorData); console.log(error?.response); if (errorData) { if (typeof errorData === "object") { const message = Object.values(errorData).flat().join(" "); showError(message); } else { showError(String(errorData)); } } else { showError("Bitte versuchen Sie es erneut"); } } finally { setLoading(false); } } return ( <>
Geben Sie Ihre Daten ein, um ein neues Konto zu erstellen.
{error}