App.js 5.4 KB

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