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 (
Self-registration is currently closed. Please check back later.
) : ( <> {avail.password && ( )} {avail.sso && providers.length > 0 && (