GitHubOAuth.js 1.8 KB

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