| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import React, { lazy, Suspense, useContext, useMemo } from 'react'; |
| import { Route, Routes, useLocation } from 'react-router-dom'; |
| import Loading from './components/common/ui/Loading'; |
| import User from './pages/User'; |
| import { AuthRedirect, PrivateRoute, AdminRoute } from './helpers'; |
| import RegisterForm from './components/auth/RegisterForm'; |
| import LoginForm from './components/auth/LoginForm'; |
| import NotFound from './pages/NotFound'; |
| import Forbidden from './pages/Forbidden'; |
| import Setting from './pages/Setting'; |
| import { StatusContext } from './context/Status'; |
|
|
| import PasswordResetForm from './components/auth/PasswordResetForm'; |
| import PasswordResetConfirm from './components/auth/PasswordResetConfirm'; |
| import Channel from './pages/Channel'; |
| import Token from './pages/Token'; |
| import Redemption from './pages/Redemption'; |
| import TopUp from './pages/TopUp'; |
| import Log from './pages/Log'; |
| import Chat from './pages/Chat'; |
| import Chat2Link from './pages/Chat2Link'; |
| import Midjourney from './pages/Midjourney'; |
| import Pricing from './pages/Pricing'; |
| import Task from './pages/Task'; |
| import ModelPage from './pages/Model'; |
| import Playground from './pages/Playground'; |
| import OAuth2Callback from './components/auth/OAuth2Callback'; |
| import PersonalSetting from './components/settings/PersonalSetting'; |
| import Setup from './pages/Setup'; |
| import SetupCheck from './components/layout/SetupCheck'; |
|
|
| const Home = lazy(() => import('./pages/Home')); |
| const Dashboard = lazy(() => import('./pages/Dashboard')); |
| const About = lazy(() => import('./pages/About')); |
| const UserAgreement = lazy(() => import('./pages/UserAgreement')); |
| const PrivacyPolicy = lazy(() => import('./pages/PrivacyPolicy')); |
|
|
| function App() { |
| const location = useLocation(); |
| const [statusState] = useContext(StatusContext); |
|
|
| |
| const pricingRequireAuth = useMemo(() => { |
| const headerNavModulesConfig = statusState?.status?.HeaderNavModules; |
| if (headerNavModulesConfig) { |
| try { |
| const modules = JSON.parse(headerNavModulesConfig); |
|
|
| |
| if (typeof modules.pricing === 'boolean') { |
| return false; |
| } |
|
|
| |
| return modules.pricing?.requireAuth === true; |
| } catch (error) { |
| console.error('解析顶栏模块配置失败:', error); |
| return false; |
| } |
| } |
| return false; |
| }, [statusState?.status?.HeaderNavModules]); |
|
|
| return ( |
| <SetupCheck> |
| <Routes> |
| <Route |
| path='/' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <Home /> |
| </Suspense> |
| } |
| /> |
| <Route |
| path='/setup' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <Setup /> |
| </Suspense> |
| } |
| /> |
| <Route path='/forbidden' element={<Forbidden />} /> |
| <Route |
| path='/console/models' |
| element={ |
| <AdminRoute> |
| <ModelPage /> |
| </AdminRoute> |
| } |
| /> |
| <Route |
| path='/console/channel' |
| element={ |
| <AdminRoute> |
| <Channel /> |
| </AdminRoute> |
| } |
| /> |
| <Route |
| path='/console/token' |
| element={ |
| <PrivateRoute> |
| <Token /> |
| </PrivateRoute> |
| } |
| /> |
| <Route |
| path='/console/playground' |
| element={ |
| <PrivateRoute> |
| <Playground /> |
| </PrivateRoute> |
| } |
| /> |
| <Route |
| path='/console/redemption' |
| element={ |
| <AdminRoute> |
| <Redemption /> |
| </AdminRoute> |
| } |
| /> |
| <Route |
| path='/console/user' |
| element={ |
| <AdminRoute> |
| <User /> |
| </AdminRoute> |
| } |
| /> |
| <Route |
| path='/user/reset' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <PasswordResetConfirm /> |
| </Suspense> |
| } |
| /> |
| <Route |
| path='/login' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <AuthRedirect> |
| <LoginForm /> |
| </AuthRedirect> |
| </Suspense> |
| } |
| /> |
| <Route |
| path='/register' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <AuthRedirect> |
| <RegisterForm /> |
| </AuthRedirect> |
| </Suspense> |
| } |
| /> |
| <Route |
| path='/reset' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <PasswordResetForm /> |
| </Suspense> |
| } |
| /> |
| <Route |
| path='/oauth/github' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <OAuth2Callback type='github'></OAuth2Callback> |
| </Suspense> |
| } |
| /> |
| <Route |
| path='/oauth/discord' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <OAuth2Callback type='discord'></OAuth2Callback> |
| </Suspense> |
| } |
| /> |
| <Route |
| path='/oauth/oidc' |
| element={ |
| <Suspense fallback={<Loading></Loading>}> |
| <OAuth2Callback type='oidc'></OAuth2Callback> |
| </Suspense> |
| } |
| /> |
| <Route |
| path='/oauth/linuxdo' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <OAuth2Callback type='linuxdo'></OAuth2Callback> |
| </Suspense> |
| } |
| /> |
| <Route |
| path='/console/setting' |
| element={ |
| <AdminRoute> |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <Setting /> |
| </Suspense> |
| </AdminRoute> |
| } |
| /> |
| <Route |
| path='/console/personal' |
| element={ |
| <PrivateRoute> |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <PersonalSetting /> |
| </Suspense> |
| </PrivateRoute> |
| } |
| /> |
| <Route |
| path='/console/topup' |
| element={ |
| <PrivateRoute> |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <TopUp /> |
| </Suspense> |
| </PrivateRoute> |
| } |
| /> |
| <Route |
| path='/console/log' |
| element={ |
| <PrivateRoute> |
| <Log /> |
| </PrivateRoute> |
| } |
| /> |
| <Route |
| path='/console' |
| element={ |
| <PrivateRoute> |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <Dashboard /> |
| </Suspense> |
| </PrivateRoute> |
| } |
| /> |
| <Route |
| path='/console/midjourney' |
| element={ |
| <PrivateRoute> |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <Midjourney /> |
| </Suspense> |
| </PrivateRoute> |
| } |
| /> |
| <Route |
| path='/console/task' |
| element={ |
| <PrivateRoute> |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <Task /> |
| </Suspense> |
| </PrivateRoute> |
| } |
| /> |
| <Route |
| path='/pricing' |
| element={ |
| pricingRequireAuth ? ( |
| <PrivateRoute> |
| <Suspense |
| fallback={<Loading></Loading>} |
| key={location.pathname} |
| > |
| <Pricing /> |
| </Suspense> |
| </PrivateRoute> |
| ) : ( |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <Pricing /> |
| </Suspense> |
| ) |
| } |
| /> |
| <Route |
| path='/about' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <About /> |
| </Suspense> |
| } |
| /> |
| <Route |
| path='/user-agreement' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <UserAgreement /> |
| </Suspense> |
| } |
| /> |
| <Route |
| path='/privacy-policy' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <PrivacyPolicy /> |
| </Suspense> |
| } |
| /> |
| <Route |
| path='/console/chat/:id?' |
| element={ |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <Chat /> |
| </Suspense> |
| } |
| /> |
| {/* 方便使用chat2link直接跳转聊天... */} |
| <Route |
| path='/chat2link' |
| element={ |
| <PrivateRoute> |
| <Suspense fallback={<Loading></Loading>} key={location.pathname}> |
| <Chat2Link /> |
| </Suspense> |
| </PrivateRoute> |
| } |
| /> |
| <Route path='*' element={<NotFound />} /> |
| </Routes> |
| </SetupCheck> |
| ); |
| } |
|
|
| export default App; |
|
|