import Heading from "@/components/ui/heading"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { useCallback, useEffect } from "react"; import { Toaster } from "sonner"; import { toast } from "sonner"; import { Separator } from "../ui/separator"; import { Button } from "../ui/button"; import useSWR from "swr"; import { FrigateConfig } from "@/types/frigateConfig"; import { del as delData } from "idb-keyval"; import { usePersistence } from "@/hooks/use-persistence"; import { isSafari } from "react-device-detect"; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, } from "../ui/select"; const PLAYBACK_RATE_DEFAULT = isSafari ? [0.5, 1, 2] : [0.5, 1, 2, 4, 8, 16]; export default function General() { const { data: config } = useSWR("config"); const clearStoredLayouts = useCallback(() => { if (!config) { return []; } Object.entries(config.camera_groups).forEach(async (value) => { await delData(`${value[0]}-draggable-layout`) .then(() => { toast.success(`Cleared stored layout for ${value[0]}`, { position: "top-center", }); }) .catch((error) => { toast.error( `Failed to clear stored layout: ${error.response.data.message}`, { position: "top-center" }, ); }); }); }, [config]); useEffect(() => { document.title = "General Settings - Frigate"; }, []); const [playbackRate, setPlaybackRate] = usePersistence("playbackRate", 1); return ( <>
General Settings
Stored Layouts

The layout of cameras in a camera group can be dragged/resized. The positions are stored in your browser's local storage.

Default Playback Rate

Default playback rate for recordings playback.

Low Data Mode

Not yet implemented. Default: disabled

{}} />
); }