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