import { useQuery } from "@tanstack/react-query" import React, { useEffect, useState } from "react" import { useTranslation } from "react-i18next" import { Route, BrowserRouter as Router, Routes } from "react-router-dom" import { DashCommand } from "./components/DashCommand" import ErrorBoundary from "./components/ErrorBoundary" import Footer from "./components/Footer" import Header, { RefreshToast } from "./components/Header" import { useBackground } from "./hooks/use-background" import { useTheme } from "./hooks/use-theme" import { InjectContext } from "./lib/inject" import { fetchSetting } from "./lib/nezha-api" import { cn } from "./lib/utils" import ErrorPage from "./pages/ErrorPage" import NotFound from "./pages/NotFound" import Server from "./pages/Server" import ServerDetail from "./pages/ServerDetail" const App: React.FC = () => { const { data: settingData, error } = useQuery({ queryKey: ["setting"], queryFn: () => fetchSetting(), refetchOnMount: true, refetchOnWindowFocus: true, }) const { i18n } = useTranslation() const { setTheme } = useTheme() const [isCustomCodeInjected, setIsCustomCodeInjected] = useState(false) const { backgroundImage: customBackgroundImage } = useBackground() useEffect(() => { if (settingData?.data?.config?.custom_code) { InjectContext(settingData?.data?.config?.custom_code) setIsCustomCodeInjected(true) } }, [settingData?.data?.config?.custom_code]) // 检测是否强制指定了主题颜色 const forceTheme = // @ts-expect-error ForceTheme is a global variable (window.ForceTheme as string) !== "" ? window.ForceTheme : undefined useEffect(() => { if (forceTheme === "dark" || forceTheme === "light") { setTheme(forceTheme) } }, [forceTheme]) if (error) { return } if (!settingData) { return null } if (settingData?.data?.config?.custom_code && !isCustomCodeInjected) { return null } if (settingData?.data?.config?.language && !localStorage.getItem("language")) { i18n.changeLanguage(settingData?.data?.config?.language) } const customMobileBackgroundImage = window.CustomMobileBackgroundImage !== "" ? window.CustomMobileBackgroundImage : undefined return ( {/* 固定定位的背景层 */} {customBackgroundImage && (
)} {customMobileBackgroundImage && (
)}
} /> } /> } /> } />
) } export default App