App.js 7.3 KB

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