diff --git a/web/src/types/frigateConfig.ts b/web/src/types/frigateConfig.ts index 5c5971fc0..ac60ec5b3 100644 --- a/web/src/types/frigateConfig.ts +++ b/web/src/types/frigateConfig.ts @@ -110,6 +110,11 @@ export interface CameraConfig { timestamp: boolean; }; name: string; + notifications: { + enabled: boolean; + email?: string; + enabled_in_config: boolean; + }; objects: { filters: { [objectName: string]: { @@ -363,6 +368,7 @@ export interface FrigateConfig { notifications: { enabled: boolean; email?: string; + enabled_in_config: boolean; }; objects: { diff --git a/web/src/views/settings/NotificationsSettingsView.tsx b/web/src/views/settings/NotificationsSettingsView.tsx index e6dd9d346..83b2768c3 100644 --- a/web/src/views/settings/NotificationsSettingsView.tsx +++ b/web/src/views/settings/NotificationsSettingsView.tsx @@ -31,7 +31,6 @@ import { useNotificationSuspend, useNotificationTest, } from "@/api/ws"; -import FilterSwitch from "@/components/filter/FilterSwitch"; import { Select, SelectTrigger, @@ -39,6 +38,7 @@ import { SelectContent, SelectItem, } from "@/components/ui/select"; +import { formatUnixTimestampToDateTime } from "@/utils/dateUtil"; const NOTIFICATION_SERVICE_WORKER = "notifications-worker.js"; @@ -66,7 +66,7 @@ export default function NotificationView({ } return Object.values(config.cameras) - .filter((conf) => conf.ui.dashboard && conf.enabled) + .filter((conf) => conf.enabled && conf.notifications.enabled_in_config) .sort((aConf, bConf) => aConf.ui.order - bConf.ui.order); }, [config]); @@ -388,7 +388,10 @@ export default function NotificationView({
{cameras.map((item) => ( - + ))}
@@ -401,10 +404,12 @@ export default function NotificationView({ } type CameraNotificationSwitchProps = { + config?: FrigateConfig; camera: string; }; export function CameraNotificationSwitch({ + config, camera, }: CameraNotificationSwitchProps) { const { payload: notificationState, send: sendNotification } = @@ -420,21 +425,26 @@ export function CameraNotificationSwitch({ }, [notificationSuspendUntil]); const handleSuspend = (duration: string) => { - sendNotificationSuspend(duration); + if (duration == "off") { + sendNotification("OFF"); + setIsSuspended(true); + } else { + sendNotificationSuspend(duration); + } }; const handleCancelSuspension = () => { - sendNotificationSuspend("0"); // Assuming sending "0" cancels the suspension + sendNotificationSuspend("0"); }; const formatSuspendedUntil = (timestamp: string) => { - const date = new Date(parseInt(timestamp) * 1000); - return date.toLocaleString(undefined, { - year: "numeric", - month: "short", - day: "numeric", - hour: "2-digit", - minute: "2-digit", + if (timestamp === "0") return "Frigate restarts."; + + return formatUnixTimestampToDateTime(parseInt(timestamp), { + time_style: "medium", + date_style: "medium", + timezone: config?.ui.timezone, + strftime_fmt: `%b %d, ${config?.ui.time_format == "24hour" ? "%H:%M" : "%I:%M %p"}`, }); }; @@ -443,14 +453,13 @@ export function CameraNotificationSwitch({ return (
- { - sendNotification(isChecked ? "ON" : "OFF"); - }} - /> + + {!isSuspended && isOn && ( )}