import Heading from "@/components/ui/heading"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { useCallback, useContext, useEffect } from "react"; import { Toaster } from "sonner"; import { toast } from "sonner"; import { Separator } from "../../components/ui/separator"; import { Button } from "../../components/ui/button"; import useSWR from "swr"; import { FrigateConfig } from "@/types/frigateConfig"; import { useUserPersistence, deleteUserNamespacedKey, } from "@/hooks/use-user-persistence"; import { isSafari } from "react-device-detect"; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, } from "../../components/ui/select"; import { useTranslation } from "react-i18next"; import { AuthContext } from "@/context/auth-context"; const PLAYBACK_RATE_DEFAULT = isSafari ? [0.5, 1, 2] : [0.5, 1, 2, 4, 8, 16]; const WEEK_STARTS_ON = ["Sunday", "Monday"]; export default function UiSettingsView() { const { data: config } = useSWR("config"); const { t } = useTranslation("views/settings"); const { auth } = useContext(AuthContext); const username = auth?.user?.username; const clearStoredLayouts = useCallback(() => { if (!config) { return []; } Object.entries(config.camera_groups).forEach(async (value) => { await deleteUserNamespacedKey(`${value[0]}-draggable-layout`, username) .then(() => { toast.success( t("general.toast.success.clearStoredLayout", { cameraName: value[0], }), { position: "top-center", }, ); }) .catch((error) => { const errorMessage = error.response?.data?.message || error.response?.data?.detail || "Unknown error"; toast.error( t("general.toast.error.clearStoredLayoutFailed", { errorMessage }), { position: "top-center", }, ); }); }); }, [config, t, username]); const clearStreamingSettings = useCallback(async () => { if (!config) { return []; } await deleteUserNamespacedKey(`streaming-settings`, username) .then(() => { toast.success(t("general.toast.success.clearStreamingSettings"), { position: "top-center", }); }) .catch((error) => { const errorMessage = error.response?.data?.message || error.response?.data?.detail || "Unknown error"; toast.error( t("general.toast.error.clearStreamingSettingsFailed", { errorMessage, }), { position: "top-center", }, ); }); }, [config, t, username]); useEffect(() => { document.title = t("documentTitle.general"); }, [t]); // settings const [autoLive, setAutoLive] = useUserPersistence("autoLiveView", true); const [cameraNames, setCameraName] = useUserPersistence( "displayCameraNames", false, ); const [playbackRate, setPlaybackRate] = useUserPersistence("playbackRate", 1); const [weekStartsOn, setWeekStartsOn] = useUserPersistence("weekStartsOn", 0); const [alertVideos, setAlertVideos] = useUserPersistence("alertVideos", true); const [fallbackTimeout, setFallbackTimeout] = useUserPersistence( "liveFallbackTimeout", 3, ); return ( <>
{t("general.title")} {t("general.liveDashboard.title")}

{t("general.liveDashboard.automaticLiveView.desc")}

{t("general.liveDashboard.playAlertVideos.desc")}

{t("general.liveDashboard.displayCameraNames.desc")}

{t("general.liveDashboard.liveFallbackTimeout.desc")}

{t("general.storedLayouts.title")}

{t("general.storedLayouts.desc")}

{t("general.cameraGroupStreaming.title")}

{t("general.cameraGroupStreaming.desc")}

{t("general.recordingsViewer.title")}
{t("general.recordingsViewer.defaultPlaybackRate.label")}

{t("general.recordingsViewer.defaultPlaybackRate.desc")}

{t("general.calendar.title")}
{t("general.calendar.firstWeekday.label")}

{t("general.calendar.firstWeekday.desc")}

); }