import LogoIcon from '@/assets/images/logo.png'; import { initialPasswordAtom, userAtom } from '@/atoms/user'; import SealInput from '@/components/seal-form/seal-input'; import { getRememberMe, rememberMe, removeRememberMe } from '@/utils/localstore/index'; import { GlobalOutlined, LockOutlined, UserOutlined } from '@ant-design/icons'; import { SelectLang, history, useIntl, useModel } from '@umijs/max'; import { Button, Checkbox, Form } from 'antd'; import CryptoJS from 'crypto-js'; import { useAtom } from 'jotai'; import { useEffect } from 'react'; import { flushSync } from 'react-dom'; import { login } from '../apis'; const REMEMBER_ME_KEY = 'r_m'; const CRYPT_TEXT = 'seal'; const renderLogo = () => { return (
logo SEAL
); }; const LoginForm = () => { const [userInfo, setUserInfo] = useAtom(userAtom); const [initialPassword, setInitialPassword] = useAtom(initialPasswordAtom); const { initialState, setInitialState } = useModel('@@initialState'); const intl = useIntl(); const [form] = Form.useForm(); const gotoDefaultPage = (userInfo: any) => { const pathname = userInfo && userInfo?.is_admin ? '/dashboard' : '/playground'; history.push(pathname); }; const fetchUserInfo = async () => { const userInfo = await initialState?.fetchUserInfo?.(); if (userInfo) { flushSync(() => { setInitialState((s: any) => ({ ...s, currentUser: userInfo })); }); } return userInfo; }; const encryptPassword = (password: string) => { const psw = CryptoJS.AES?.encrypt?.(password, CRYPT_TEXT).toString(); return psw; }; const decryptPassword = (password: string) => { const bytes = CryptoJS.AES?.decrypt?.(password, CRYPT_TEXT); const res = bytes.toString(CryptoJS.enc.Utf8); return res; }; const callRememberMe = async (values: any) => { const { autoLogin } = values; if (autoLogin) { await rememberMe(REMEMBER_ME_KEY, { um: encryptPassword(values.username), pw: encryptPassword(values.password), f: true }); } else { await removeRememberMe(REMEMBER_ME_KEY); } }; const callGetRememberMe = async () => { const rememberMe = await getRememberMe(REMEMBER_ME_KEY); if (rememberMe?.f) { const username = decryptPassword(rememberMe?.um); const password = decryptPassword(rememberMe?.pw); form.setFieldsValue({ username, password, autoLogin: true }); } }; const handleLogin = async (values: any) => { try { await login({ username: values.username, password: values.password }); const userInfo = await fetchUserInfo(); setUserInfo(userInfo); setInitialPassword(values.password); if (values.autoLogin) { await callRememberMe(values); } else { await removeRememberMe(REMEMBER_ME_KEY); } if (!userInfo?.require_password_change) { gotoDefaultPage(userInfo); } } catch (error) { // to do something } }; useEffect(() => { callGetRememberMe(); }, []); return (
} reload={false} />
{renderLogo()}
} /> } label={intl.formatMessage({ id: 'common.form.password' })} /> {intl.formatMessage({ id: 'common.login.rember' })}
); }; export default LoginForm;