feat: 登录页尝试自动登录

pull/81/head
moonrailgun 3 years ago
parent 76c56cb4e4
commit 5d11c84edb

@ -8,6 +8,7 @@ import { openModal } from '@/components/Modal';
import { closeModal } from '@/plugin/common';
import { getGlobalSocket } from '@/utils/global-state-helper';
import { setUserJWT } from '@/utils/jwt-helper';
import { setGlobalUserLoginInfo } from '@/utils/user-helper';
import { Button, Divider, Typography } from 'antd';
import React, { useCallback } from 'react';
import { useHistory } from 'react-router';
@ -64,6 +65,7 @@ export const SettingsAccount: React.FC = React.memo(() => {
const handleLogout = useCallback(async () => {
await setUserJWT(null);
getGlobalSocket()?.disconnect();
setGlobalUserLoginInfo(null);
history.push('/');
}, []);

@ -1,12 +1,12 @@
import { Icon } from '@/components/Icon';
import { Divider } from 'antd';
import { isValidStr, loginWithEmail, t, useAsyncFn } from 'tailchat-shared';
import React, { useState } from 'react';
import React, { useEffect, useState } from 'react';
import { Spinner } from '../../components/Spinner';
import { string } from 'yup';
import { useHistory } from 'react-router';
import { setUserJWT } from '../../utils/jwt-helper';
import { setGlobalUserLoginInfo } from '../../utils/user-helper';
import { setGlobalUserLoginInfo, tryAutoLogin } from '../../utils/user-helper';
import { useSearchParam } from '@/hooks/useSearchParam';
import { useNavToView } from './utils';
@ -36,6 +36,14 @@ export const LoginView: React.FC = React.memo(() => {
const history = useHistory();
const navRedirect = useSearchParam('redirect');
useEffect(() => {
tryAutoLogin()
.then(() => {
history.push('/main');
})
.catch(() => {});
}, []);
const [{ loading, error }, handleLogin] = useAsyncFn(async () => {
await string()
.email(t('邮箱格式不正确'))

@ -7,10 +7,11 @@ import {
loginWithToken,
t,
ReduxProvider,
UserLoginInfo,
} from 'tailchat-shared';
import React from 'react';
import { LoadingSpinner } from '@/components/LoadingSpinner';
import { getGlobalUserLoginInfo } from '@/utils/user-helper';
import { getGlobalUserLoginInfo, tryAutoLogin } from '@/utils/user-helper';
import _isNil from 'lodash/isNil';
import { getUserJWT } from '@/utils/jwt-helper';
import { useHistory } from 'react-router';
@ -27,26 +28,15 @@ function useAppState() {
const history = useHistory();
const { value, loading, error } = useAsync(async () => {
let userLoginInfo = getGlobalUserLoginInfo();
if (_isNil(userLoginInfo)) {
// 如果没有全局缓存的数据, 则尝试自动登录
try {
const token = await getUserJWT();
if (typeof token !== 'string') {
throw new Error('Token 格式不合法');
}
userLoginInfo = await loginWithToken(token);
if (userLoginInfo === null) {
throw new Error('Token 内容不合法');
}
} catch (e) {
// 当前 Token 不存在或已过期
history.replace(
`/entry/login?redirect=${encodeURIComponent(location.pathname)}`
);
return;
}
let userLoginInfo: UserLoginInfo;
try {
userLoginInfo = await tryAutoLogin();
} catch (e) {
// 当前 Token 不存在或已过期
history.replace(
`/entry/login?redirect=${encodeURIComponent(location.pathname)}`
);
return;
}
// 到这里 userLoginInfo 必定存在

@ -1,8 +1,10 @@
import type { UserLoginInfo } from 'tailchat-shared';
import { loginWithToken, UserLoginInfo } from 'tailchat-shared';
import _isNil from 'lodash/isNil';
import { getUserJWT } from './jwt-helper';
let _userLoginInfo: UserLoginInfo;
let _userLoginInfo: UserLoginInfo | null = null;
export function setGlobalUserLoginInfo(loginInfo: UserLoginInfo) {
export function setGlobalUserLoginInfo(loginInfo: UserLoginInfo | null) {
_userLoginInfo = loginInfo;
}
@ -13,3 +15,27 @@ export function setGlobalUserLoginInfo(loginInfo: UserLoginInfo) {
export function getGlobalUserLoginInfo() {
return _userLoginInfo;
}
/**
*
*/
export async function tryAutoLogin(): Promise<UserLoginInfo> {
let userLoginInfo = getGlobalUserLoginInfo();
if (_isNil(userLoginInfo)) {
// 如果没有全局缓存的数据, 则尝试自动登录
const token = await getUserJWT();
if (typeof token !== 'string') {
throw new Error('Token 格式不合法');
}
console.debug('正在尝试使用Token登录');
userLoginInfo = await loginWithToken(token);
if (userLoginInfo === null) {
throw new Error('Token 内容不合法');
}
setGlobalUserLoginInfo(userLoginInfo);
}
return userLoginInfo;
}

Loading…
Cancel
Save