"use client"; import React, { useState } from "react"; import { useAuth } from "@/hooks/useAuth"; import { useSearchParams } from "next/navigation"; import Link from "next/link"; import { isValidZAPhone } from "@/lib/phone"; export function RegisterForm() { const { register } = useAuth(); const searchParams = useSearchParams(); const raw = searchParams.get("redirect") || ""; const redirectTo = raw.startsWith("/") && !raw.startsWith("//") ? raw : "/dashboard"; const loginHref = redirectTo !== "/dashboard" ? `/login?redirect=${encodeURIComponent(redirectTo)}` : "/login"; const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [phoneNumber, setPhoneNumber] = useState(""); const [notificationPreference, setNotificationPreference] = useState<"email" | "whatsapp" | "both">("email"); const [accepted, setAccepted] = useState(false); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const hasValidPhone = isValidZAPhone(phoneNumber); const getErrorMessage = (err: any) => { if (!err) return "Login failed"; // If it's already a normal Error if (err.message && typeof err.message === "string") { // Handle case where message is accidentally JSON string try { const parsed = JSON.parse(err.message); return parsed.message || err.message; } catch { return err.message; } } // If API response object was thrown directly if (err.message) return err.message; return "Registration failed. Please try again."; }; const onSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!accepted) { setError("Please accept the Terms of Use and Privacy Policy before continuing."); return; } setError(null); setLoading(true); try { await register({ name, email, password, phoneNumber: phoneNumber || undefined, notificationPreference: hasValidPhone ? notificationPreference : "email", }); window.location.href = redirectTo; } catch (err: any) { setError(getErrorMessage(err) || "Registration failed. Please try again."); } finally { setLoading(false); } }; return (
setName(e.target.value)} className="w-full border rounded px-3 py-2" required />
setEmail(e.target.value)} className="w-full border rounded px-3 py-2" required />
setPassword(e.target.value)} className="w-full border rounded px-3 py-2" required />
setPhoneNumber(e.target.value)} placeholder="e.g. 082 123 4567" className="w-full border rounded px-3 py-2" />
{hasValidPhone && (
)}
setAccepted(e.target.checked)} className="mt-1 h-4 w-4 border-gray-300 rounded accent-brand-600" required />
Already have an account? Sign in here.
{error &&

{error}

}
); }