import useSWR from "swr"; import { FrigateStats } from "@/types/stats"; import { useEffect, useMemo, useState } from "react"; import TimeAgo from "@/components/dynamic/TimeAgo"; import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; import { isDesktop, isMobile } from "react-device-detect"; import GeneralMetrics from "@/views/system/GeneralMetrics"; import StorageMetrics from "@/views/system/StorageMetrics"; import { LuActivity, LuHardDrive, LuSearchCode } from "react-icons/lu"; import { FaVideo } from "react-icons/fa"; import Logo from "@/components/Logo"; import useOptimisticState from "@/hooks/use-optimistic-state"; import CameraMetrics from "@/views/system/CameraMetrics"; import { useHashState } from "@/hooks/use-overlay-state"; import { Toaster } from "@/components/ui/sonner"; import { FrigateConfig } from "@/types/frigateConfig"; import EnrichmentMetrics from "@/views/system/EnrichmentMetrics"; import { useTranslation } from "react-i18next"; const allMetrics = ["general", "enrichments", "storage", "cameras"] as const; type SystemMetric = (typeof allMetrics)[number]; function System() { const { t } = useTranslation(["views/system"]); const { data: config } = useSWR("config", { revalidateOnFocus: false, }); const metrics = useMemo(() => { const metrics = [...allMetrics]; if ( !config?.semantic_search.enabled && !config?.lpr.enabled && !config?.face_recognition.enabled ) { const index = metrics.indexOf("enrichments"); metrics.splice(index, 1); } return metrics; }, [config]); // stats page const [page, setPage] = useHashState(); const [pageToggle, setPageToggle] = useOptimisticState( page ?? "general", setPage, 100, ); const [lastUpdated, setLastUpdated] = useState(Date.now() / 1000); useEffect(() => { if (pageToggle) { document.title = t("documentTitle." + pageToggle); } }, [pageToggle, t]); // stats collection const { data: statsSnapshot } = useSWR("stats", { revalidateOnFocus: false, }); return (
{isMobile && ( )} { if (value) { setPageToggle(value); } }} // don't allow the severity to be unselected > {Object.values(metrics).map((item) => ( {item == "general" && } {item == "enrichments" && } {item == "storage" && } {item == "cameras" && } {isDesktop && (
{t(item + ".title")}
)}
))}
{lastUpdated && (
{t("lastRefreshed")}
)}
{t("title")}
{statsSnapshot && (
{statsSnapshot.service.version}
)}
{page == "general" && ( )} {page == "enrichments" && ( )} {page == "storage" && } {page == "cameras" && ( )}
); } export default System;