"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useState, FormEvent } from "react"; import { motion } from "framer-motion"; import { Background } from "../../components/background"; import { PageSchema } from "../../components/page-schema"; import { SiteFooter } from "../../components/site-footer"; import { SiteHeader } from "../../components/site-header"; import { defaultFaqs } from "../../data/faq"; import { siteInfo } from "../../data/site"; import { storeAuthTokens } from "@/lib/api"; type ApiResponse = { data: T; meta: { timestamp: string; version: "v1" }; error: null | { message: string; code?: string }; }; type AuthData = { user: { id: string; email: string; fullName?: string }; accessToken: string; refreshToken: string; message?: string; }; const inputClass = "block w-full appearance-none rounded-xl border border-border bg-white/90 px-4 py-3 text-foreground placeholder-muted-foreground shadow-sm focus:border-primary focus:outline-none focus:ring-2 focus:ring-primary/20 transition-all"; const socialButtonClass = "flex w-full items-center justify-center gap-3 rounded-xl border border-border bg-white py-3 px-4 text-sm font-medium text-foreground shadow-sm transition-all hover:shadow-md hover:border-primary/30 focus:outline-none focus:ring-2 focus:ring-primary/20"; export default function RegisterPage() { const router = useRouter(); const [fullName, setFullName] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [showPassword, setShowPassword] = useState(false); const [agreeTerms, setAgreeTerms] = useState(false); const [status, setStatus] = useState(""); const [isError, setIsError] = useState(false); const schema = [ { "@context": "https://schema.org", "@type": "WebPage", name: "LedgerOne Create Account", description: "Create a LedgerOne account and start with two free accounts.", url: `${siteInfo.url}/register`, }, { "@context": "https://schema.org", "@type": "FAQPage", mainEntity: defaultFaqs.map((item) => ({ "@type": "Question", name: item.question, acceptedAnswer: { "@type": "Answer", text: item.answer }, })), }, ]; const onSubmit = async (event: FormEvent) => { event.preventDefault(); if (password !== confirmPassword) { setStatus("Passwords do not match."); setIsError(true); return; } setStatus("Creating account..."); setIsError(false); try { const res = await fetch("/api/auth/register", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email, password, fullName: fullName || undefined }), }); const payload = (await res.json()) as ApiResponse; if (!res.ok || payload.error) { setStatus(payload.error?.message ?? "Registration failed."); setIsError(true); return; } storeAuthTokens({ accessToken: payload.data.accessToken, refreshToken: payload.data.refreshToken, user: payload.data.user, }); setStatus("Account created! Redirecting..."); router.push("/app"); } catch { setStatus("Registration failed. Please try again."); setIsError(true); } }; return (

Create your LedgerOne account

Get AI-powered financial clarity in minutes.

{/* Social sign up */}
or
setFullName(e.target.value)} className={inputClass} placeholder="Jane Smith" />
setEmail(e.target.value)} className={inputClass} placeholder="you@company.com" />
setPassword(e.target.value)} className={`${inputClass} pr-11`} placeholder="••••••••" />

Minimum 8 characters

setConfirmPassword(e.target.value)} className={inputClass} placeholder="••••••••" />
setAgreeTerms(e.target.checked)} className="mt-1 h-4 w-4 rounded border-border bg-white text-primary focus:ring-2 focus:ring-primary/20 focus:ring-offset-0" />
{status && (

{status}

)}

Already have an account?{" "} Sign in

); }