import { StatusMessage } from "@/context/statusbar-context"; import { useAutoFrigateStats } from "@/hooks/use-stats"; import useStatusMessages from "@/hooks/use-status-messages"; import StatusMessageList, { StatusMessageItem, } from "@/components/StatusMessageList"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import StatusBarNotices from "@/components/health/StatusBarNotices"; import { cn } from "@/lib/utils"; import type { ProfilesApiResponse } from "@/types/profile"; import { getProfileColor } from "@/utils/profileColors"; import { useIsAdmin } from "@/hooks/use-is-admin"; import { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import useSWR from "swr"; import { FaCheck } from "react-icons/fa"; import { MdCircle } from "react-icons/md"; import { Link } from "react-router-dom"; export default function Statusbar() { const { t } = useTranslation(["views/system"]); const isAdmin = useIsAdmin(); const messages = useStatusMessages(); const stats = useAutoFrigateStats(); const cpuPercent = useMemo(() => { const systemCpu = stats?.cpu_usages["frigate.full_system"]?.cpu; if (!systemCpu || systemCpu == "0.0") { return null; } return parseInt(systemCpu); }, [stats]); const { data: profilesData } = useSWR("profiles"); const activeProfile = useMemo(() => { if (!profilesData?.active_profile || !profilesData.profiles) return null; const info = profilesData.profiles.find( (p) => p.name === profilesData.active_profile, ); const allNames = profilesData.profiles.map((p) => p.name).sort(); return { name: profilesData.active_profile, friendlyName: info?.friendly_name ?? profilesData.active_profile, color: getProfileColor(profilesData.active_profile, allNames), }; }, [profilesData]); return (
{cpuPercent && (
CPU {cpuPercent}%
)} {Object.entries(stats?.gpu_usages || {}).map(([name, stats]) => { if (name == "error-gpu") { return; } let gpuTitle; switch (name) { case "amd-vaapi": gpuTitle = "AMD GPU"; break; case "intel-gpu": gpuTitle = "Intel GPU"; break; case "rockchip": gpuTitle = "Rockchip GPU"; break; default: gpuTitle = name; break; } const gpu = parseInt(stats.gpu); if (isNaN(gpu)) { return; } return ( {" "}
{gpuTitle} {gpu}%
); })} {activeProfile && (isAdmin ? (
{activeProfile.friendlyName}
) : (
{activeProfile.friendlyName}
))}
{!isAdmin ? null : messages.length === 0 ? ( {t("stats.healthy")} ) : messages.length === 1 ? ( ) : ( )} {isAdmin && }
); } type StatusMessagesPopoverProps = { messages: StatusMessage[]; }; /** The most severe message and a count of the rest, which open the full list. */ function StatusMessagesPopover({ messages }: StatusMessagesPopoverProps) { const { t } = useTranslation(["views/system"]); const [open, setOpen] = useState(false); const [first, ...rest] = messages; return ( setOpen(false)} /> ); }