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 && (
)}