|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import React, { useContext, useEffect } from 'react'; |
|
|
import { useNavigate, useSearchParams } from 'react-router-dom'; |
|
|
import { useTranslation } from 'react-i18next'; |
|
|
import { |
|
|
API, |
|
|
showError, |
|
|
showSuccess, |
|
|
updateAPI, |
|
|
setUserData, |
|
|
} from '../../helpers'; |
|
|
import { UserContext } from '../../context/User'; |
|
|
import Loading from '../common/ui/Loading'; |
|
|
|
|
|
const OAuth2Callback = (props) => { |
|
|
const { t } = useTranslation(); |
|
|
const [searchParams] = useSearchParams(); |
|
|
const [, userDispatch] = useContext(UserContext); |
|
|
const navigate = useNavigate(); |
|
|
|
|
|
|
|
|
const MAX_RETRIES = 3; |
|
|
|
|
|
const sendCode = async (code, state, retry = 0) => { |
|
|
try { |
|
|
const { data: resData } = await API.get( |
|
|
`/api/oauth/${props.type}?code=${code}&state=${state}`, |
|
|
); |
|
|
|
|
|
const { success, message, data } = resData; |
|
|
|
|
|
if (!success) { |
|
|
throw new Error(message || 'OAuth2 callback error'); |
|
|
} |
|
|
|
|
|
if (message === 'bind') { |
|
|
showSuccess(t('绑定成功!')); |
|
|
navigate('/console/personal'); |
|
|
} else { |
|
|
userDispatch({ type: 'login', payload: data }); |
|
|
localStorage.setItem('user', JSON.stringify(data)); |
|
|
setUserData(data); |
|
|
updateAPI(); |
|
|
showSuccess(t('登录成功!')); |
|
|
navigate('/console/token'); |
|
|
} |
|
|
} catch (error) { |
|
|
if (retry < MAX_RETRIES) { |
|
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, (retry + 1) * 2000)); |
|
|
return sendCode(code, state, retry + 1); |
|
|
} |
|
|
|
|
|
|
|
|
showError(error.message || t('授权失败')); |
|
|
navigate('/console/personal'); |
|
|
} |
|
|
}; |
|
|
|
|
|
useEffect(() => { |
|
|
const code = searchParams.get('code'); |
|
|
const state = searchParams.get('state'); |
|
|
|
|
|
|
|
|
if (!code) { |
|
|
showError(t('未获取到授权码')); |
|
|
navigate('/console/personal'); |
|
|
return; |
|
|
} |
|
|
|
|
|
sendCode(code, state); |
|
|
}, []); |
|
|
|
|
|
return <Loading />; |
|
|
}; |
|
|
|
|
|
export default OAuth2Callback; |
|
|
|