import { LogtoProvider } from '@logto/react'; import { AppearanceMode, Setting } from '@logto/schemas'; import React, { useEffect } from 'react'; import { BrowserRouter, Navigate, Route, Routes, useLocation, useNavigate } from 'react-router-dom'; import useSWR, { SWRConfig } from 'swr'; import './scss/normalized.scss'; import * as styles from './App.module.scss'; import AppContent from './components/AppContent'; import { getPath, sections } from './components/AppContent/components/Sidebar'; import Toast from './components/Toast'; import { themeStorageKey, logtoApiResource } from './consts'; import { RequestError } from './hooks/use-api'; import useSwrFetcher from './hooks/use-swr-fetcher'; import initI18n from './i18n/init'; import ApiResourceDetails from './pages/ApiResourceDetails'; import ApiResources from './pages/ApiResources'; import ApplicationDetails from './pages/ApplicationDetails'; import Applications from './pages/Applications'; import Callback from './pages/Callback'; import ConnectorDetails from './pages/ConnectorDetails'; import Connectors from './pages/Connectors'; import NotFound from './pages/NotFound'; import Settings from './pages/Settings'; import SignInExperience from './pages/SignInExperience'; import UserDetails from './pages/UserDetails'; import Users from './pages/Users'; const isBasenameNeeded = process.env.NODE_ENV !== 'development' || process.env.PORT === '5002'; void initI18n(); const defaultTheme = localStorage.getItem(themeStorageKey) ?? AppearanceMode.SyncWithSystem; const Main = () => { const location = useLocation(); const navigate = useNavigate(); const fetcher = useSwrFetcher(); const settingsFetcher = useSwrFetcher(); const { data } = useSWR('/api/settings', settingsFetcher); useEffect(() => { const theme = data?.adminConsole.appearanceMode ?? defaultTheme; const isFollowSystem = theme === AppearanceMode.SyncWithSystem; const className = styles[theme] ?? ''; if (!isFollowSystem) { document.body.classList.add(className); } return () => { if (!isFollowSystem) { document.body.classList.remove(className); } }; }, [data?.adminConsole.appearanceMode]); useEffect(() => { (async () => { void initI18n(data?.adminConsole.language); })(); }, [data?.adminConsole.language]); useEffect(() => { if (location.pathname === '/') { navigate(getPath(sections[0]?.items[0]?.title ?? '')); } }, [location.pathname, navigate]); return ( } /> }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ); }; const App = () => (
); export default App;