import React, { useState } from 'react'; import { Eye, EyeOff, Mail, Lock, ArrowRight } from 'lucide-react'; import { useAppConfig } from '../contexts/AppConfigContext'; import { persistAuth, getApiBaseUrl } from '../utils/authStorage'; import CopyrightNotice from './CopyrightNotice'; import '../styles/Login.css'; const Login = ({ onNavigateToSignup, onNavigateToHome }) => { const { config, resolveIcon } = useAppConfig(); const LogoIcon = resolveIcon(config?.app?.logo_icon || 'BookOpen'); const [showPassword, setShowPassword] = useState(false); const [formData, setFormData] = useState({ email: '', password: '' }); const [isLoading, setIsLoading] = useState(false); const [isGuestLoading, setIsGuestLoading] = useState(false); const [errors, setErrors] = useState({}); const handleInputChange = (e) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); if (errors[name]) { setErrors(prev => ({ ...prev, [name]: '' })); } }; const validateForm = () => { const newErrors = {}; if (!formData.email) { newErrors.email = 'Email is required'; } else if (!/\S+@\S+\.\S+/.test(formData.email)) { newErrors.email = 'Please enter a valid email address'; } if (!formData.password) { newErrors.password = 'Password is required'; } else if (formData.password.length < 6) { newErrors.password = 'Password must be at least 6 characters'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleGuestContinue = async () => { setIsGuestLoading(true); setErrors({}); try { const response = await fetch(`${getApiBaseUrl()}/auth/guest`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, }); const data = await response.json(); if (response.ok) { persistAuth(data.user, data.access_token); onNavigateToHome?.(data.user, data.access_token); } else { setErrors({ submit: data.detail || 'Could not start a guest session.' }); } } catch (error) { console.error('Guest login error:', error); setErrors({ submit: 'Could not start a guest session. Please try again.' }); } finally { setIsGuestLoading(false); } }; const handleSubmit = async (e) => { e.preventDefault(); if (!validateForm()) return; setIsLoading(true); try { const response = await fetch(`${getApiBaseUrl()}/auth/login`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email: formData.email, password: formData.password }), }); const data = await response.json(); if (response.ok) { persistAuth(data.user, data.access_token); onNavigateToHome?.(data.user, data.access_token); } else { setErrors({ submit: data.detail || 'Login failed. Please try again.' }); } } catch (error) { console.error('Login error:', error); setErrors({ submit: 'Login failed. Please try again.' }); } finally { setIsLoading(false); } }; const busy = isLoading || isGuestLoading; return (
{config?.login?.subtitle || 'Sign in to continue'}
Play with the advisors first. Create an account later if you want to save your chats.
Don't have an account?{' '}