import { Icon } from 'tailchat-design'; import { Divider } from 'antd'; import { isValidStr, loginWithEmail, t, useAsyncFn, useGlobalConfigStore, } from 'tailchat-shared'; import React, { useEffect, useState } from 'react'; import { string } from 'yup'; import { useLocation, useNavigate } from 'react-router'; import { setUserJWT } from '../../utils/jwt-helper'; import { setGlobalUserLoginInfo, tryAutoLogin } from '../../utils/user-helper'; import { useSearchParam } from '@/hooks/useSearchParam'; import { useNavToView } from './utils'; import { IconBtn } from '@/components/IconBtn'; import { openModal } from '@/components/Modal'; import { ServiceUrlSettings } from '@/components/modals/ServiceUrlSettings'; import { LanguageSelect } from '@/components/LanguageSelect'; import { EntryInput } from './components/Input'; import { SecondaryBtn } from './components/SecondaryBtn'; import { PrimaryBtn } from './components/PrimaryBtn'; import { pluginLoginAction } from '@/plugin/common'; /** * TODO: * 第三方登录 */ const OAuthLoginView: React.FC = React.memo(() => { return ( <> {t('或')}
); }); OAuthLoginView.displayName = 'OAuthLoginView'; /** * 登录视图 */ export const LoginView: React.FC = React.memo(() => { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const navigate = useNavigate(); const navRedirect = useSearchParam('redirect'); const { pathname } = useLocation(); const { serverName, disableGuestLogin, disableUserRegister } = useGlobalConfigStore((state) => ({ serverName: state.serverName, disableGuestLogin: state.disableGuestLogin, disableUserRegister: state.disableUserRegister, })); useEffect(() => { tryAutoLogin() .then(() => { navigate('/main'); }) .catch(() => {}); }, []); const [{ loading, error }, handleLogin] = useAsyncFn(async () => { await string() .email(t('邮箱格式不正确')) .required(t('邮箱不能为空')) .validate(email); await string() .min(6, t('密码不能低于6位')) .required(t('密码不能为空')) .validate(password); const data = await loginWithEmail(email, password); setGlobalUserLoginInfo(data); await setUserJWT(data.token); if (isValidStr(navRedirect) && navRedirect !== pathname) { // 增加非当前状态判定避免循环 navigate(decodeURIComponent(navRedirect)); } else { navigate('/main'); } }, [email, password, navRedirect, pathname, navigate]); const navToView = useNavToView(); return (
{t('登录 {{serverName}}', { serverName: serverName || 'Tailchat', })}
{t('邮箱')}
setEmail(e.target.value)} />
{t('密码')}
setPassword(e.target.value)} />
{loading === false && error && (

{error.message}

navToView('/entry/forget')} > {t('忘记密码?')}
)} {t('登录')} {!disableUserRegister && ( navToView('/entry/register')} > {t('注册账号')} )} {!disableGuestLogin && ( navToView('/entry/guest')} > {t('游客访问')} )} {pluginLoginAction.map((item) => { const { name, component: Component } = item; return ; })}
openModal()} />
); }); LoginView.displayName = 'LoginView';