import { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { useAuthStore } from '@/stores/state' import { loginToServer, getAuthStatus } from '@/api/lightrag' import { toast } from 'sonner' import { useTranslation } from 'react-i18next' import { Card, CardContent, CardHeader } from '@/components/ui/Card' import Input from '@/components/ui/Input' import Button from '@/components/ui/Button' import { ZapIcon } from 'lucide-react' import AppSettings from '@/components/AppSettings' const LoginPage = () => { const navigate = useNavigate() const { login, isAuthenticated } = useAuthStore() const { t } = useTranslation() const [loading, setLoading] = useState(false) const [username, setUsername] = useState('') const [password, setPassword] = useState('') const [checkingAuth, setCheckingAuth] = useState(true) // Check if authentication is configured useEffect(() => { let isMounted = true; // Flag to prevent state updates after unmount const checkAuthConfig = async () => { try { // If already authenticated, redirect to home if (isAuthenticated) { navigate('/') return } // Check auth status const status = await getAuthStatus() // Only proceed if component is still mounted if (!isMounted) return; if (!status.auth_configured && status.access_token) { // If auth is not configured, use the guest token and redirect login(status.access_token, true) if (status.message) { toast.info(status.message) } navigate('/') return; // Exit early, no need to set checkingAuth to false } } catch (error) { console.error('Failed to check auth configuration:', error) } finally { // Only update state if component is still mounted if (isMounted) { setCheckingAuth(false) } } } // Execute immediately checkAuthConfig() // Cleanup function to prevent state updates after unmount return () => { isMounted = false; } }, [isAuthenticated, login, navigate]) // Don't render anything while checking auth if (checkingAuth) { return null } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!username || !password) { toast.error(t('login.errorEmptyFields')) return } try { setLoading(true) const response = await loginToServer(username, password) // Check authentication mode const isGuestMode = response.auth_mode === 'disabled' login(response.access_token, isGuestMode) if (isGuestMode) { // Show authentication disabled notification toast.info(response.message || t('login.authDisabled', 'Authentication is disabled. Using guest access.')) } else { toast.success(t('login.successMessage')) } navigate('/') } catch (error) { console.error('Login failed...', error) toast.error(t('login.errorInvalidCredentials')) } finally { setLoading(false) } } return (
LightRAG Logo

LightRAG

{t('login.description')}

setUsername(e.target.value)} required className="h-11 flex-1" />
setPassword(e.target.value)} required className="h-11 flex-1" />
) } export default LoginPage