import { useEffect, useMemo, useState } from "react"; import { Link, useNavigate } from "react-router-dom"; import { ChevronLeftIcon, EyeCloseIcon, EyeIcon } from "../../icons"; import Label from "../form/Label"; import Input from "../form/input/InputField"; import Checkbox from "../form/input/Checkbox"; import { useAuthStore } from "../../store/authStore"; export default function SignUpForm({ planDetails: planDetailsProp, planLoading: planLoadingProp }: { planDetails?: any; planLoading?: boolean }) { const [showPassword, setShowPassword] = useState(false); const [isChecked, setIsChecked] = useState(false); const [formData, setFormData] = useState({ firstName: "", lastName: "", email: "", password: "", username: "", accountName: "", }); const [error, setError] = useState(""); const [planDetails, setPlanDetails] = useState(planDetailsProp || null); const [planLoading, setPlanLoading] = useState(planLoadingProp || false); const [planError, setPlanError] = useState(""); const navigate = useNavigate(); const { register, loading } = useAuthStore(); const planSlug = useMemo(() => new URLSearchParams(window.location.search).get("plan") || "", []); const paidPlans = ["starter", "growth", "scale"]; useEffect(() => { if (planSlug && paidPlans.includes(planSlug)) { setError(""); } }, [planSlug]); useEffect(() => { if (planDetailsProp) { setPlanDetails(planDetailsProp); setPlanLoading(!!planLoadingProp); setPlanError(""); return; } const fetchPlan = async () => { if (!planSlug) return; setPlanLoading(true); setPlanError(""); try { const API_BASE_URL = import.meta.env.VITE_BACKEND_URL || "https://api.igny8.com/api"; const res = await fetch(`${API_BASE_URL}/v1/auth/plans/?slug=${planSlug}`); const data = await res.json(); const plan = data?.results?.[0]; if (!plan) { setPlanError("Plan not found or inactive."); } else { const features = Array.isArray(plan.features) ? plan.features.map((f: string) => f.charAt(0).toUpperCase() + f.slice(1)) : []; setPlanDetails({ ...plan, features }); } } catch (e: any) { setPlanError("Unable to load plan details right now."); } finally { setPlanLoading(false); } }; fetchPlan(); }, [planSlug, planDetailsProp, planLoadingProp]); const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); if (!formData.email || !formData.password || !formData.firstName || !formData.lastName) { setError("Please fill in all required fields"); return; } if (!isChecked) { setError("Please agree to the Terms and Conditions"); return; } try { // Generate username from email if not provided const username = formData.username || formData.email.split("@")[0]; const user = await register({ email: formData.email, password: formData.password, username: username, first_name: formData.firstName, last_name: formData.lastName, account_name: formData.accountName, plan_slug: planSlug || undefined, }); const status = user?.account?.status; if (status === "pending_payment") { navigate("/account/plans", { replace: true }); } else { navigate("/sites", { replace: true }); } } catch (err: any) { setError(err.message || "Registration failed. Please try again."); } }; return (
Back to dashboard

Start Your Free Trial

{planSlug && paidPlans.includes(planSlug) ? `You're signing up for the ${planSlug} plan. You'll be taken to billing to complete payment.` : "No credit card required. 100 AI credits to get started."}

Or
{error && (
{error}
)}
{/* First Name */}
{/* Last Name */}
{/* Email */}
{/* Account Name */}
{/* Password */}
setShowPassword(!showPassword)} className="absolute z-30 -translate-y-1/2 cursor-pointer right-4 top-1/2" > {showPassword ? ( ) : ( )}
{/* Terms Checkbox */}

By creating an account means you agree to the{" "} Terms and Conditions, {" "} and our{" "} Privacy Policy

{/* Submit Button */}

Already have an account?{" "} Sign In

); }