App.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. import React, { lazy, Suspense, useContext, useEffect } from 'react';
  2. import { Route, Routes } from 'react-router-dom';
  3. import Loading from './components/Loading';
  4. import User from './pages/User';
  5. import { PrivateRoute } from './components/PrivateRoute';
  6. import RegisterForm from './components/RegisterForm';
  7. import LoginForm from './components/LoginForm';
  8. import NotFound from './pages/NotFound';
  9. import Setting from './pages/Setting';
  10. import EditUser from './pages/User/EditUser';
  11. import AddUser from './pages/User/AddUser';
  12. import { API, showError, showNotice } from './helpers';
  13. import PasswordResetForm from './components/PasswordResetForm';
  14. import GitHubOAuth from './components/GitHubOAuth';
  15. import PasswordResetConfirm from './components/PasswordResetConfirm';
  16. import { UserContext } from './context/User';
  17. import { StatusContext } from './context/Status';
  18. import Channel from './pages/Channel';
  19. import Token from './pages/Token';
  20. import EditToken from './pages/Token/EditToken';
  21. import EditChannel from './pages/Channel/EditChannel';
  22. import AddChannel from './pages/Channel/AddChannel';
  23. const Home = lazy(() => import('./pages/Home'));
  24. const About = lazy(() => import('./pages/About'));
  25. function App() {
  26. const [userState, userDispatch] = useContext(UserContext);
  27. const [statusState, statusDispatch] = useContext(StatusContext);
  28. const loadUser = () => {
  29. let user = localStorage.getItem('user');
  30. if (user) {
  31. let data = JSON.parse(user);
  32. userDispatch({ type: 'login', payload: data });
  33. }
  34. };
  35. const loadStatus = async () => {
  36. const res = await API.get('/api/status');
  37. const { success, data } = res.data;
  38. if (success) {
  39. localStorage.setItem('status', JSON.stringify(data));
  40. statusDispatch({ type: 'set', payload: data });
  41. localStorage.setItem('footer_html', data.footer_html);
  42. if (
  43. data.version !== process.env.REACT_APP_VERSION &&
  44. data.version !== 'v0.0.0' &&
  45. process.env.REACT_APP_VERSION !== ''
  46. ) {
  47. showNotice(
  48. `新版本可用:${data.version},请使用快捷键 Shift + F5 刷新页面`
  49. );
  50. }
  51. } else {
  52. showError('无法正常连接至服务器!');
  53. }
  54. };
  55. useEffect(() => {
  56. loadUser();
  57. loadStatus().then();
  58. }, []);
  59. return (
  60. <Routes>
  61. <Route
  62. path='/'
  63. element={
  64. <Suspense fallback={<Loading></Loading>}>
  65. <Home />
  66. </Suspense>
  67. }
  68. />
  69. <Route
  70. path='/channel'
  71. element={
  72. <PrivateRoute>
  73. <Channel />
  74. </PrivateRoute>
  75. }
  76. />
  77. <Route
  78. path='/channel/edit/:id'
  79. element={
  80. <Suspense fallback={<Loading></Loading>}>
  81. <EditChannel />
  82. </Suspense>
  83. }
  84. />
  85. <Route
  86. path='/channel/add'
  87. element={
  88. <Suspense fallback={<Loading></Loading>}>
  89. <AddChannel />
  90. </Suspense>
  91. }
  92. />
  93. <Route
  94. path='/token'
  95. element={
  96. <PrivateRoute>
  97. <Token />
  98. </PrivateRoute>
  99. }
  100. />
  101. <Route
  102. path='/token/edit/:id'
  103. element={
  104. <Suspense fallback={<Loading></Loading>}>
  105. <EditToken />
  106. </Suspense>
  107. }
  108. />
  109. <Route
  110. path='/token/add'
  111. element={
  112. <Suspense fallback={<Loading></Loading>}>
  113. <EditToken />
  114. </Suspense>
  115. }
  116. />
  117. <Route
  118. path='/user'
  119. element={
  120. <PrivateRoute>
  121. <User />
  122. </PrivateRoute>
  123. }
  124. />
  125. <Route
  126. path='/user/edit/:id'
  127. element={
  128. <Suspense fallback={<Loading></Loading>}>
  129. <EditUser />
  130. </Suspense>
  131. }
  132. />
  133. <Route
  134. path='/user/edit'
  135. element={
  136. <Suspense fallback={<Loading></Loading>}>
  137. <EditUser />
  138. </Suspense>
  139. }
  140. />
  141. <Route
  142. path='/user/add'
  143. element={
  144. <Suspense fallback={<Loading></Loading>}>
  145. <AddUser />
  146. </Suspense>
  147. }
  148. />
  149. <Route
  150. path='/user/reset'
  151. element={
  152. <Suspense fallback={<Loading></Loading>}>
  153. <PasswordResetConfirm />
  154. </Suspense>
  155. }
  156. />
  157. <Route
  158. path='/login'
  159. element={
  160. <Suspense fallback={<Loading></Loading>}>
  161. <LoginForm />
  162. </Suspense>
  163. }
  164. />
  165. <Route
  166. path='/register'
  167. element={
  168. <Suspense fallback={<Loading></Loading>}>
  169. <RegisterForm />
  170. </Suspense>
  171. }
  172. />
  173. <Route
  174. path='/reset'
  175. element={
  176. <Suspense fallback={<Loading></Loading>}>
  177. <PasswordResetForm />
  178. </Suspense>
  179. }
  180. />
  181. <Route
  182. path='/oauth/github'
  183. element={
  184. <Suspense fallback={<Loading></Loading>}>
  185. <GitHubOAuth />
  186. </Suspense>
  187. }
  188. />
  189. <Route
  190. path='/setting'
  191. element={
  192. <PrivateRoute>
  193. <Suspense fallback={<Loading></Loading>}>
  194. <Setting />
  195. </Suspense>
  196. </PrivateRoute>
  197. }
  198. />
  199. <Route
  200. path='/about'
  201. element={
  202. <Suspense fallback={<Loading></Loading>}>
  203. <About />
  204. </Suspense>
  205. }
  206. />
  207. <Route path='*' element={NotFound} />
  208. </Routes>
  209. );
  210. }
  211. export default App;