import React, { PropsWithChildren, Suspense, useEffect } from 'react'; import { BrowserRouter, HashRouter, Navigate, Route, Routes, } from 'react-router-dom'; import { sharedEvent, TcProvider, useColorScheme, useGlobalConfigStore, useLanguage, } from 'tailchat-shared'; import clsx from 'clsx'; import { Loadable } from './components/Loadable'; import { ConfigProvider as AntdProvider } from 'antd'; import { Helmet } from 'react-helmet'; import { useRecordMeasure } from './utils/measure-helper'; import { getPopupContainer, preventDefault } from './utils/dom-helper'; import { LoadingSpinner } from './components/LoadingSpinner'; import { pluginRootRoute } from './plugin/common'; import { PortalHost as FallbackPortalHost } from './components/Portal'; import isElectron from 'is-electron'; import { AppRouterApi } from './components/AppRouterApi'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; import { ErrorBoundary } from './components/ErrorBoundary'; const AppRouter: any = isElectron() ? HashRouter : BrowserRouter; const MainRoute = Loadable( () => import( /* webpackChunkName: 'main' */ /* webpackPreload: true */ './routes/Main' ) ); const EntryRoute = Loadable( () => import( /* webpackChunkName: 'entry' */ /* webpackPreload: true */ './routes/Entry' ) ); const PanelRoute = Loadable(() => import('./routes/Panel')); const InviteRoute = Loadable( () => import( /* webpackChunkName: 'invite' */ /* webpackPreload: true */ './routes/Invite' ) ); const AppProvider: React.FC = React.memo((props) => { return ( }> {props.children} ); }); AppProvider.displayName = 'AppProvider'; const AppContainer: React.FC = React.memo((props) => { const { isDarkMode, extraSchemeName } = useColorScheme(); return (
{props.children}
); }); AppContainer.displayName = 'AppContainer'; const AppHeader: React.FC = React.memo(() => { const { language } = useLanguage(); const { serverName } = useGlobalConfigStore((state) => ({ serverName: state.serverName, })); return ( {serverName} ); }); AppHeader.displayName = 'AppHeader'; export const App: React.FC = React.memo(() => { useRecordMeasure('appRenderStart'); useEffect(() => { sharedEvent.emit('appLoaded'); }, []); return ( } /> } /> } /> } /> {pluginRootRoute.map((r, i) => ( // NOTICE: Switch里不能出现动态路由 ))} } /> } /> ); }); App.displayName = 'App';