App.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  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, getLogo, getSystemName, 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 Redemption from './pages/Redemption';
  23. import EditRedemption from './pages/Redemption/EditRedemption';
  24. import TopUp from './pages/TopUp';
  25. import Log from './pages/Log';
  26. const Home = lazy(() => import('./pages/Home'));
  27. const About = lazy(() => import('./pages/About'));
  28. function App() {
  29. const [userState, userDispatch] = useContext(UserContext);
  30. const [statusState, statusDispatch] = useContext(StatusContext);
  31. const loadUser = () => {
  32. let user = localStorage.getItem('user');
  33. if (user) {
  34. let data = JSON.parse(user);
  35. userDispatch({ type: 'login', payload: data });
  36. }
  37. };
  38. const loadStatus = async () => {
  39. const res = await API.get('/api/status');
  40. const { success, data } = res.data;
  41. if (success) {
  42. localStorage.setItem('status', JSON.stringify(data));
  43. statusDispatch({ type: 'set', payload: data });
  44. localStorage.setItem('system_name', data.system_name);
  45. localStorage.setItem('logo', data.logo);
  46. localStorage.setItem('footer_html', data.footer_html);
  47. if (
  48. data.version !== process.env.REACT_APP_VERSION &&
  49. data.version !== 'v0.0.0' &&
  50. process.env.REACT_APP_VERSION !== ''
  51. ) {
  52. showNotice(
  53. `新版本可用:${data.version},请使用快捷键 Shift + F5 刷新页面`
  54. );
  55. }
  56. } else {
  57. showError('无法正常连接至服务器!');
  58. }
  59. };
  60. useEffect(() => {
  61. loadUser();
  62. loadStatus().then();
  63. let systemName = getSystemName();
  64. if (systemName) {
  65. document.title = systemName;
  66. }
  67. let logo = getLogo();
  68. if (logo) {
  69. let linkElement = document.querySelector("link[rel~='icon']");
  70. if (linkElement) {
  71. linkElement.href = logo;
  72. }
  73. }
  74. }, []);
  75. return (
  76. <Routes>
  77. <Route
  78. path='/'
  79. element={
  80. <Suspense fallback={<Loading></Loading>}>
  81. <Home />
  82. </Suspense>
  83. }
  84. />
  85. <Route
  86. path='/channel'
  87. element={
  88. <PrivateRoute>
  89. <Channel />
  90. </PrivateRoute>
  91. }
  92. />
  93. <Route
  94. path='/channel/edit/:id'
  95. element={
  96. <Suspense fallback={<Loading></Loading>}>
  97. <EditChannel />
  98. </Suspense>
  99. }
  100. />
  101. <Route
  102. path='/channel/add'
  103. element={
  104. <Suspense fallback={<Loading></Loading>}>
  105. <EditChannel />
  106. </Suspense>
  107. }
  108. />
  109. <Route
  110. path='/token'
  111. element={
  112. <PrivateRoute>
  113. <Token />
  114. </PrivateRoute>
  115. }
  116. />
  117. <Route
  118. path='/token/edit/:id'
  119. element={
  120. <Suspense fallback={<Loading></Loading>}>
  121. <EditToken />
  122. </Suspense>
  123. }
  124. />
  125. <Route
  126. path='/token/add'
  127. element={
  128. <Suspense fallback={<Loading></Loading>}>
  129. <EditToken />
  130. </Suspense>
  131. }
  132. />
  133. <Route
  134. path='/redemption'
  135. element={
  136. <PrivateRoute>
  137. <Redemption />
  138. </PrivateRoute>
  139. }
  140. />
  141. <Route
  142. path='/redemption/edit/:id'
  143. element={
  144. <Suspense fallback={<Loading></Loading>}>
  145. <EditRedemption />
  146. </Suspense>
  147. }
  148. />
  149. <Route
  150. path='/redemption/add'
  151. element={
  152. <Suspense fallback={<Loading></Loading>}>
  153. <EditRedemption />
  154. </Suspense>
  155. }
  156. />
  157. <Route
  158. path='/user'
  159. element={
  160. <PrivateRoute>
  161. <User />
  162. </PrivateRoute>
  163. }
  164. />
  165. <Route
  166. path='/user/edit/:id'
  167. element={
  168. <Suspense fallback={<Loading></Loading>}>
  169. <EditUser />
  170. </Suspense>
  171. }
  172. />
  173. <Route
  174. path='/user/edit'
  175. element={
  176. <Suspense fallback={<Loading></Loading>}>
  177. <EditUser />
  178. </Suspense>
  179. }
  180. />
  181. <Route
  182. path='/user/add'
  183. element={
  184. <Suspense fallback={<Loading></Loading>}>
  185. <AddUser />
  186. </Suspense>
  187. }
  188. />
  189. <Route
  190. path='/user/reset'
  191. element={
  192. <Suspense fallback={<Loading></Loading>}>
  193. <PasswordResetConfirm />
  194. </Suspense>
  195. }
  196. />
  197. <Route
  198. path='/login'
  199. element={
  200. <Suspense fallback={<Loading></Loading>}>
  201. <LoginForm />
  202. </Suspense>
  203. }
  204. />
  205. <Route
  206. path='/register'
  207. element={
  208. <Suspense fallback={<Loading></Loading>}>
  209. <RegisterForm />
  210. </Suspense>
  211. }
  212. />
  213. <Route
  214. path='/reset'
  215. element={
  216. <Suspense fallback={<Loading></Loading>}>
  217. <PasswordResetForm />
  218. </Suspense>
  219. }
  220. />
  221. <Route
  222. path='/oauth/github'
  223. element={
  224. <Suspense fallback={<Loading></Loading>}>
  225. <GitHubOAuth />
  226. </Suspense>
  227. }
  228. />
  229. <Route
  230. path='/setting'
  231. element={
  232. <PrivateRoute>
  233. <Suspense fallback={<Loading></Loading>}>
  234. <Setting />
  235. </Suspense>
  236. </PrivateRoute>
  237. }
  238. />
  239. <Route
  240. path='/topup'
  241. element={
  242. <PrivateRoute>
  243. <Suspense fallback={<Loading></Loading>}>
  244. <TopUp />
  245. </Suspense>
  246. </PrivateRoute>
  247. }
  248. />
  249. <Route
  250. path='/log'
  251. element={
  252. <PrivateRoute>
  253. <Log />
  254. </PrivateRoute>
  255. }
  256. />
  257. <Route
  258. path='/about'
  259. element={
  260. <Suspense fallback={<Loading></Loading>}>
  261. <About />
  262. </Suspense>
  263. }
  264. />
  265. <Route path='*' element={NotFound} />
  266. </Routes>
  267. );
  268. }
  269. export default App;