import React, { useState, useEffect } from 'react'; import { Link, useNavigate, useLocation } from 'react-router-dom'; import { RefreshCw } from 'lucide-react'; import { useCTF } from './CTFContext'; import { Button } from './UIComponents'; export const Login: React.FC = () => { const { login, getCaptcha } = useCTF(); const navigate = useNavigate(); const location = useLocation(); const [name, setName] = useState(''); const [pass, setPass] = useState(''); const [error, setError] = useState(''); // CAPTCHA State const [captchaData, setCaptchaData] = useState<{ id: string, data: string } | null>(null); const [captchaInput, setCaptchaInput] = useState(''); const fetchCaptcha = async () => { try { const res = await getCaptcha(); setCaptchaData(res); setCaptchaInput(''); } catch (err) { setError('FAILED_TO_LOAD_CAPTCHA'); } }; useEffect(() => { fetchCaptcha(); }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!captchaData) return; if (await login(name, pass, captchaData.id, captchaInput)) { const from = (location.state as any)?.from?.pathname || '/'; navigate(from, { replace: true }); } else { setError('ACCESS_DENIED: INVALID_CREDENTIALS_OR_CAPTCHA'); fetchCaptcha(); } }; return (

LOGIN

setName(e.target.value)} required /> setPass(e.target.value)} required />
{captchaData ? (
) :
} setCaptchaInput(e.target.value)} required />
{error &&

{error}

}

NEW PLAYER? REGISTER

); }; export const Register: React.FC = () => { const { register, getCaptcha } = useCTF(); const navigate = useNavigate(); const [name, setName] = useState(''); const [pass, setPass] = useState(''); const [error, setError] = useState(''); // CAPTCHA State const [captchaData, setCaptchaData] = useState<{ id: string, data: string } | null>(null); const [captchaInput, setCaptchaInput] = useState(''); const fetchCaptcha = async () => { try { const res = await getCaptcha(); setCaptchaData(res); setCaptchaInput(''); } catch (err) { setError('FAILED_TO_LOAD_CAPTCHA'); } }; useEffect(() => { fetchCaptcha(); }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!captchaData) return; try { await register(name, pass, captchaData.id, captchaInput); navigate('/challenges'); } catch (err: any) { setError(err.message || 'REGISTRATION_FAILED'); fetchCaptcha(); } }; return (

REGISTER

setName(e.target.value)} required />
setPass(e.target.value)} required />
{captchaData ? (
) :
} setCaptchaInput(e.target.value)} required />
{error &&

{error}

}

PLAYER ALREADY? LOGIN

); };