new-api/web/src/components/auth/OAuth2Callback.js

58 lines
1.9 KiB
JavaScript
Raw Normal View History

2024-11-12 16:11:38 +08:00
import React, { useContext, useEffect, useState } 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/Loading';
2024-11-12 16:11:38 +08:00
const OAuth2Callback = (props) => {
const { t } = useTranslation();
2025-04-04 12:00:38 +08:00
const [searchParams, setSearchParams] = useSearchParams();
2024-11-12 16:11:38 +08:00
2025-04-04 12:00:38 +08:00
const [userState, userDispatch] = useContext(UserContext);
const [prompt, setPrompt] = useState(t('处理中...'));
2024-11-12 16:11:38 +08:00
2025-04-04 12:00:38 +08:00
let navigate = useNavigate();
2024-11-12 16:11:38 +08:00
2025-04-04 12:00:38 +08:00
const sendCode = async (code, state, count) => {
const res = await API.get(
`/api/oauth/${props.type}?code=${code}&state=${state}`,
);
const { success, message, data } = res.data;
if (success) {
if (message === 'bind') {
showSuccess(t('绑定成功!'));
navigate('/console/setting');
2025-04-04 12:00:38 +08:00
} else {
userDispatch({ type: 'login', payload: data });
localStorage.setItem('user', JSON.stringify(data));
setUserData(data);
updateAPI();
showSuccess(t('登录成功!'));
navigate('/console/token');
2025-04-04 12:00:38 +08:00
}
} else {
showError(message);
if (count === 0) {
setPrompt(t('操作失败,重定向至登录界面中...'));
navigate('/console/setting'); // in case this is failed to bind GitHub
2025-04-04 12:00:38 +08:00
return;
}
count++;
setPrompt(t('出现错误,第 ${count} 次重试中...', { count }));
2025-04-04 12:00:38 +08:00
await new Promise((resolve) => setTimeout(resolve, count * 2000));
await sendCode(code, state, count);
}
};
2024-11-12 16:11:38 +08:00
2025-04-04 12:00:38 +08:00
useEffect(() => {
let code = searchParams.get('code');
let state = searchParams.get('state');
sendCode(code, state, 0).then();
}, []);
2024-11-12 16:11:38 +08:00
return <Loading prompt={prompt} />;
2024-11-12 16:11:38 +08:00
};
export default OAuth2Callback;