import { useEffect, useState } from 'react' import { Link, useNavigate } from 'react-router-dom' import ProviderIcon from '../../components/ProviderIcon.jsx' import { useAuth } from '../../contexts/AuthContext.jsx' import { api } from '../../api/client.js' import PlayerShell, { honeypotStyle } from './PlayerShell.jsx' export default function PlayerRegister() { const { user, register } = useAuth() const navigate = useNavigate() const [username, setUsername] = useState('') const [password, setPassword] = useState('') const [email, setEmail] = useState('') const [company, setCompany] = useState('') // honeypot — must stay empty const [error, setError] = useState('') const [busy, setBusy] = useState(false) // Which methods are enabled (derived, from /public/settings). null = loading. const [avail, setAvail] = useState(null) const [providers, setProviders] = useState([]) useEffect(() => { if (user && user.role === 'player') navigate('/account', { replace: true }) }, [user, navigate]) useEffect(() => { let active = true api .publicSettings() .then((s) => active && setAvail(s?.registration || { password: false, sso: false })) .catch(() => active && setAvail({ password: false, sso: false })) api .authProviders() .then((list) => active && setProviders(Array.isArray(list) ? list : [])) .catch(() => active && setProviders([])) return () => { active = false } }, []) function startSso(provider) { window.location.assign(provider.loginUrl + `?returnTo=${encodeURIComponent('/account')}`) } async function onSubmit(e) { e.preventDefault() setError('') if (username.trim().length < 3) return setError('Username must be at least 3 characters.') if (password.length < 8) return setError('Password must be at least 8 characters.') setBusy(true) try { await register(username.trim(), password, { email: email.trim() || undefined, company }) navigate('/account', { replace: true }) } catch (err) { if (err.status === 409) setError('That username is already taken.') else if (err.status === 403) setError('Registration is not open right now.') else if (err.status === 400) setError(err.message || 'Please check your details and try again.') else setError('Could not create your account right now.') setBusy(false) } } const closed = avail && !avail.password && !avail.sso return ( Already have an account?{' '} Sign in

} > {avail === null ? (
) : closed ? (

Self-registration is currently closed. Please check back later.

) : ( <> {avail.password && (
{error && (

{error}

)}
)} {avail.sso && providers.length > 0 && (
{avail.password && (
or
)}
{providers.map((p) => ( ))}
)} )}
) } const ssoBtnStyle = { display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 10, width: '100%', borderRadius: 8, padding: 11, border: '1px solid var(--line)', background: 'rgba(255,255,255,0.04)', color: 'var(--ink)', }