| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| 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 ModelDeploymentPage from './pages/ModelDeployment';
|
| 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/deployment'
|
| element={
|
| <AdminRoute>
|
| <ModelDeploymentPage />
|
| </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;
|
|
|