| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | 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; |
| |
|