import React, { useState } from 'react'; import { useNavigate } from 'react-router'; import { ArrowRightIcon, LockClosedIcon, UserIcon } from '@heroicons/react/24/outline'; import { useAuth } from './hooks.tsx'; import { handleApiError } from './utils.ts'; // 登录页面组件 const LoginPage: React.FC = () => { const { login } = useAuth(); const navigate = useNavigate(); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const handleLogin = async (e: React.FormEvent) => { e.preventDefault(); if (!username.trim() || !password.trim()) { setError('用户名和密码不能为空'); return; } setLoading(true); setError(null); try { // 获取地理位置 const position = await new Promise((resolve, reject) => { if (!navigator.geolocation) { reject(new Error('浏览器不支持地理位置功能')); return; } navigator.geolocation.getCurrentPosition( resolve, (err) => reject(new Error(`获取位置失败: ${err.message}`)), { timeout: 5000 } ); }); const { latitude, longitude } = position.coords; await login(username, password, latitude, longitude); navigate('/'); } catch (err) { // 如果获取位置失败,仍然允许登录但不带位置信息 const error = err instanceof Error ? err : new Error(String(err)); if (error.message.includes('获取位置失败')) { console.warn('获取位置失败:', err); try { await login(username, password); navigate('/'); } catch (loginErr) { setError(handleApiError(loginErr)); } } else { setError(handleApiError(err)); } } finally { setLoading(false); } }; return (
{/* 顶部Logo和标题 */}

{window.CONFIG?.APP_NAME || '移动应用'}

登录您的账户

{/* 登录表单 */}
{error && (
{error}
)}
setUsername(e.target.value)} className="w-full pl-10 pr-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" placeholder="请输入用户名" />
setPassword(e.target.value)} className="w-full pl-10 pr-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" placeholder="请输入密码" />
{/* 底部文本 */}
© {new Date().getFullYear()} {window.CONFIG?.APP_NAME || '移动应用'}

保留所有权利

); }; export default LoginPage;