/* * @Author: ZhaoYing * @Date: 2026-02-03 16:40:01 * @Last Modified by: ZhaoYing * @Last Modified time: 2026-02-03 16:40:32 */ /** * Login Page * Handles user authentication and login * Features split-screen design with branding and login form */ import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Button, Input, Form, App } from 'antd'; import type { FormProps } from 'antd'; import { useUser, type LoginInfo } from '@/store/user'; import { login } from '@/api/user' import loginBg from '@/assets/images/login/loginBg.png' import check from '@/assets/images/login/check.png' import email from '@/assets/images/login/email.svg' import lock from '@/assets/images/login/lock.svg' import type { LoginForm } from './types'; /** * Input field styling */ const inputClassName = "rb:rounded-[8px]! rb:p-[12px]! rb:h-[44px]!" /** * Login page component */const LoginPage: React.FC = () => { const { t } = useTranslation(); const { clearUserInfo, updateLoginInfo, getUserInfo } = useUser(); const [loading, setLoading] = useState(false); const [form] = Form.useForm(); const { message } = App.useApp(); useEffect(() => { clearUserInfo(); }, []); /** Handle login form submission */ const handleLogin: FormProps['onFinish'] = async (values) => { if (!values.email) { message.warning(t('login.emailPlaceholder')); return; } if (!values.password) { message.warning(t('login.passwordPlaceholder')); return; } setLoading(true); login(values).then((res) => { const response = res as LoginInfo; updateLoginInfo(response); getUserInfo(true) }).finally(() => { setLoading(false); }); }; return (
loginBg
{t('login.title')}
{t('login.subTitle')}
{['intelligentMemory', 'instantRecall', 'knowledgeAssociation'].map(key => (
{t(`login.${key}`)}
{t(`login.${key}Desc`)}
))}
{t('login.welcome')}
} placeholder={t('login.emailPlaceholder')} className={inputClassName} /> } placeholder={t('login.passwordPlaceholder')} className={inputClassName} />
); }; export default LoginPage;