OAuth2Callback.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import React, { useContext, useEffect, useState } from 'react';
  2. import { useNavigate, useSearchParams } from 'react-router-dom';
  3. import { useTranslation } from 'react-i18next';
  4. import { API, showError, showSuccess, updateAPI, setUserData } from '../../helpers';
  5. import { UserContext } from '../../context/User';
  6. import Loading from '../common/Loading';
  7. const OAuth2Callback = (props) => {
  8. const { t } = useTranslation();
  9. const [searchParams, setSearchParams] = useSearchParams();
  10. const [userState, userDispatch] = useContext(UserContext);
  11. const [prompt, setPrompt] = useState(t('处理中...'));
  12. let navigate = useNavigate();
  13. const sendCode = async (code, state, count) => {
  14. const res = await API.get(
  15. `/api/oauth/${props.type}?code=${code}&state=${state}`,
  16. );
  17. const { success, message, data } = res.data;
  18. if (success) {
  19. if (message === 'bind') {
  20. showSuccess(t('绑定成功!'));
  21. navigate('/console/setting');
  22. } else {
  23. userDispatch({ type: 'login', payload: data });
  24. localStorage.setItem('user', JSON.stringify(data));
  25. setUserData(data);
  26. updateAPI();
  27. showSuccess(t('登录成功!'));
  28. navigate('/console/token');
  29. }
  30. } else {
  31. showError(message);
  32. if (count === 0) {
  33. setPrompt(t('操作失败,重定向至登录界面中...'));
  34. navigate('/console/setting'); // in case this is failed to bind GitHub
  35. return;
  36. }
  37. count++;
  38. setPrompt(t('出现错误,第 ${count} 次重试中...', { count }));
  39. await new Promise((resolve) => setTimeout(resolve, count * 2000));
  40. await sendCode(code, state, count);
  41. }
  42. };
  43. useEffect(() => {
  44. let code = searchParams.get('code');
  45. let state = searchParams.get('state');
  46. sendCode(code, state, 0).then();
  47. }, []);
  48. return <Loading prompt={prompt} />;
  49. };
  50. export default OAuth2Callback;