OAuth2Callback.js 2.2 KB

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