| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | 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; |
| |
|