App.js 10 KB

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