"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; // ============================================================================= // Signup Page — /signup // ============================================================================= // New ISP tenant registration form. // On successful submission, redirects to /login?registered=true. // ============================================================================= interface FormData { businessName: string; ownerFirstName: string; ownerLastName: string; ownerEmail: string; password: string; confirmPassword: string; businessAddress: string; contactPhone: string; } const initialFormData: FormData = { businessName: "", ownerFirstName: "", ownerLastName: "", ownerEmail: "", password: "", confirmPassword: "", businessAddress: "", contactPhone: "", }; export default function SignupPage() { const router = useRouter(); const [formData, setFormData] = useState(initialFormData); const [error, setError] = useState(""); const [fieldErrors, setFieldErrors] = useState>>({}); const [isLoading, setIsLoading] = useState(false); function handleChange(e: React.ChangeEvent) { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); // Clear field-level error on change if (fieldErrors[name as keyof FormData]) { setFieldErrors((prev) => ({ ...prev, [name]: undefined })); } if (error) setError(""); } function validateForm(): boolean { const errors: Partial> = {}; if (!formData.businessName.trim()) { errors.businessName = "Business name is required"; } if (!formData.ownerFirstName.trim()) { errors.ownerFirstName = "First name is required"; } if (!formData.ownerLastName.trim()) { errors.ownerLastName = "Last name is required"; } if (!formData.ownerEmail.trim()) { errors.ownerEmail = "Email address is required"; } else { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(formData.ownerEmail.trim())) { errors.ownerEmail = "Please enter a valid email address"; } } if (!formData.password) { errors.password = "Password is required"; } else if (formData.password.length < 8) { errors.password = "Password must be at least 8 characters"; } if (!formData.confirmPassword) { errors.confirmPassword = "Please confirm your password"; } else if (formData.password !== formData.confirmPassword) { errors.confirmPassword = "Passwords do not match"; } setFieldErrors(errors); return Object.keys(errors).length === 0; } async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setError(""); if (!validateForm()) return; setIsLoading(true); try { const response = await fetch("/api/tenants/signup", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ businessName: formData.businessName.trim(), ownerFirstName: formData.ownerFirstName.trim(), ownerLastName: formData.ownerLastName.trim(), ownerEmail: formData.ownerEmail.trim().toLowerCase(), password: formData.password, businessAddress: formData.businessAddress.trim() || undefined, contactPhone: formData.contactPhone.trim() || undefined, }), }); const data = await response.json(); if (response.status === 201) { router.push("/login?registered=true"); return; } if (response.status === 409) { setFieldErrors((prev) => ({ ...prev, ownerEmail: "An account with this email already exists", })); return; } setError(data.error || "Something went wrong. Please try again."); } catch { setError("Unable to connect. Please check your connection and try again."); } finally { setIsLoading(false); } } return (
{/* Logo / Brand */}

NetForge

Create your ISP management account

{/* Business Name */}
{fieldErrors.businessName && (

{fieldErrors.businessName}

)}
{/* First Name / Last Name */}
{fieldErrors.ownerFirstName && (

{fieldErrors.ownerFirstName}

)}
{fieldErrors.ownerLastName && (

{fieldErrors.ownerLastName}

)}
{/* Email */}
{fieldErrors.ownerEmail && (

{fieldErrors.ownerEmail}

)}
{/* Password */}
{fieldErrors.password && (

{fieldErrors.password}

)}
{/* Confirm Password */}
{fieldErrors.confirmPassword && (

{fieldErrors.confirmPassword}

)}
{/* Business Address (optional) */}
{/* Contact Phone (optional) */}
{/* Global error message */} {error && (

{error}

)} {/* Submit button */}
{/* Sign in link */}

Already have an account?{" "} Sign in

); }