import { ModeToggle } from "@/components/ThemeSwitcher" import { Separator } from "@/components/ui/separator" import { Skeleton } from "@/components/ui/skeleton" import { fetchLoginUser, fetchSetting } from "@/lib/nezha-api" import { useQuery } from "@tanstack/react-query" import { DateTime } from "luxon" import { useEffect, useRef, useState } from "react" import { useTranslation } from "react-i18next" import { useNavigate } from "react-router-dom" import { LanguageSwitcher } from "./LanguageSwitcher" function Header() { const { t } = useTranslation() const navigate = useNavigate() const { data: settingData, isLoading } = useQuery({ queryKey: ["setting"], queryFn: () => fetchSetting(), refetchOnMount: true, refetchOnWindowFocus: true, }) const siteName = settingData?.data?.site_name useEffect(() => { document.title = siteName || "哪吒监控 Nezha Monitoring" }, [siteName]) return (
navigate("/")} className="cursor-pointer flex items-center text-base font-medium" >
apple-touch-icon
{isLoading ? ( ) : ( siteName || "NEZHA" )}

{t("nezha")}

) } function DashboardLink() { const { t } = useTranslation() const { data: userData } = useQuery({ queryKey: ["login-user"], queryFn: () => fetchLoginUser(), refetchOnMount: true, refetchOnWindowFocus: true, }) return (
{!userData?.data?.id && t("login")} {userData?.data?.id && t("dashboard")}
) } // https://github.com/streamich/react-use/blob/master/src/useInterval.ts const useInterval = (callback: () => void, delay: number | null) => { const savedCallback = useRef<() => void>(() => {}) useEffect(() => { savedCallback.current = callback }) useEffect(() => { if (delay !== null) { const interval = setInterval(() => savedCallback.current(), delay || 0) return () => clearInterval(interval) } return undefined }, [delay]) } function Overview() { const { t } = useTranslation() const [mouted, setMounted] = useState(false) useEffect(() => { setMounted(true) }, []) const timeOption = DateTime.TIME_SIMPLE timeOption.hour12 = true const [timeString, setTimeString] = useState( DateTime.now().setLocale("en-US").toLocaleString(timeOption), ) useInterval(() => { setTimeString(DateTime.now().setLocale("en-US").toLocaleString(timeOption)) }, 1000) return (

👋 {t("overview")}

{t("whereTheTimeIs")}

{mouted ? (

{timeString}

) : ( )}
) } export default Header