import { CombinedStorageGraph } from "@/components/graph/CombinedStorageGraph"; import { StorageGraph } from "@/components/graph/StorageGraph"; import { FrigateStats } from "@/types/stats"; import { useMemo } from "react"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import useSWR from "swr"; import { LuAlertCircle } from "react-icons/lu"; import { FrigateConfig } from "@/types/frigateConfig"; import { useTimezone } from "@/hooks/use-date-utils"; import { RecordingsSummary } from "@/types/review"; import { formatUnixTimestampToDateTime } from "@/utils/dateUtil"; type CameraStorage = { [key: string]: { bandwidth: number; usage: number; usage_percent: number; }; }; type StorageMetricsProps = { setLastUpdated: (last: number) => void; }; export default function StorageMetrics({ setLastUpdated, }: StorageMetricsProps) { const { data: cameraStorage } = useSWR("recordings/storage"); const { data: stats } = useSWR("stats"); const { data: config } = useSWR("config", { revalidateOnFocus: false, }); const timezone = useTimezone(config); const totalStorage = useMemo(() => { if (!cameraStorage || !stats) { return undefined; } const totalStorage = { used: 0, total: stats.service.storage["/media/frigate/recordings"]["total"], }; Object.values(cameraStorage).forEach( (cam) => (totalStorage.used += cam.usage), ); setLastUpdated(Date.now() / 1000); return totalStorage; }, [cameraStorage, stats, setLastUpdated]); // recordings summary const { data: recordingsSummary } = useSWR([ "recordings/summary", { timezone: timezone, }, ]); const earliestDate = useMemo(() => { const keys = Object.keys(recordingsSummary || {}); return keys.length ? new Date(keys[keys.length - 1]).getTime() / 1000 : null; }, [recordingsSummary]); if (!cameraStorage || !stats || !totalStorage || !config) { return; } return (
Overview
Recordings
This value represents the total storage used by the recordings in Frigate's database. Frigate does not track storage usage for all files on your disk.
{earliestDate && (
Earliest recording available:{" "} {formatUnixTimestampToDateTime(earliestDate, { timezone: timezone, strftime_fmt: config.ui.time_format == "24hour" ? "%d %b %Y" : "%B %d, %Y", })}
)}
/tmp/cache
/dev/shm
Camera Storage
); }