import { useState } from 'react'; const API_URL = import.meta.env.VITE_API_URL ?? 'https://api.t4t-gateway.com'; type SignupResponse = { token: string; user: { id: string; email: string; role: string; emailVerified: boolean }; verificationToken?: string; }; export function meta() { return [{ title: 'Sign up · t4t Gateway' }]; } export default function Signup() { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); const [result, setResult] = useState(null); async function onSubmit(e: React.FormEvent) { e.preventDefault(); setError(null); setSubmitting(true); try { const res = await fetch(`${API_URL}/auth/email/signup`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password }), }); const body = await res.json(); if (!res.ok) { throw new Error(body?.message ?? body?.error ?? `Signup failed (${res.status})`); } localStorage.setItem('jwt', body.token); setResult(body); } catch (err) { setError(err instanceof Error ? err.message : 'Unknown error'); } finally { setSubmitting(false); } } if (result) { return (

Check your email

We sent a verification link to {result.user.email}. Open it to activate your 50 xBZZ welcome credit.

{result.verificationToken && (

Dev mode — verification token:

{result.verificationToken} Verify now →
)}
); } return (

Sign up

50 xBZZ welcome credit. No wallet needed.

setEmail(e.target.value)} className='mt-1 block w-full rounded-md border border-neutral-300 px-3 py-2 text-sm shadow-sm focus:border-neutral-900 focus:outline-none focus:ring-1 focus:ring-neutral-900' />
setPassword(e.target.value)} className='mt-1 block w-full rounded-md border border-neutral-300 px-3 py-2 text-sm shadow-sm focus:border-neutral-900 focus:outline-none focus:ring-1 focus:ring-neutral-900' />

At least 8 characters.

{error && (

{error}

)}

Already have an account?{' '} Log in

); }