import React, { useState, useEffect } from 'react'; import { Link, useNavigate, useSearchParams } from 'react-router-dom'; import { useAuthStore } from '../../stores/authStore'; import { RateLimitError } from '../../api/client'; export function LoginPage() { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(''); const [retryAfter, setRetryAfter] = useState(0); const login = useAuthStore((s) => s.login); const isLoading = useAuthStore((s) => s.isLoading); const navigate = useNavigate(); const [searchParams] = useSearchParams(); const redirect = searchParams.get('redirect'); useEffect(() => { if (retryAfter <= 0) return; const timer = setInterval(() => { setRetryAfter((prev) => { if (prev <= 1) { clearInterval(timer); return 0; } return prev - 1; }); }, 1000); return () => clearInterval(timer); }, [retryAfter]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); if (!username.trim()) { setError('Username is required'); return; } if (!password) { setError('Password is required'); return; } try { await login(username.trim(), password); if (redirect && redirect.startsWith('/') && !redirect.startsWith('//')) { navigate(redirect); } else { navigate('/channels/@me'); } } catch (err) { if (err instanceof RateLimitError) { setRetryAfter(err.retryAfter); setError(''); } else { setError(err instanceof Error ? err.message : 'Login failed'); } } }; const isDisabled = isLoading || retryAfter > 0; return (
We're so excited to see you again!