From ef9afa8cbca29a3dd83454f44264a4682e968c59 Mon Sep 17 00:00:00 2001
From: Jonas Dellinger <jonas@dellinger.dev>
Date: Sat, 24 Jun 2023 12:59:39 +0200
Subject: Add notification settings, which allows muting decky/plugin toast
 notifications (#479)

* Add notification settings, which allows muting decky/plugin toast notifications

* Fix typos
---
 frontend/src/notification-service.tsx | 51 +++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)
 create mode 100644 frontend/src/notification-service.tsx

(limited to 'frontend/src/notification-service.tsx')

diff --git a/frontend/src/notification-service.tsx b/frontend/src/notification-service.tsx
new file mode 100644
index 00000000..188cebd3
--- /dev/null
+++ b/frontend/src/notification-service.tsx
@@ -0,0 +1,51 @@
+import { DeckyState } from './components/DeckyState';
+import { getSetting, setSetting } from './utils/settings';
+
+export interface NotificationSettings {
+  deckyUpdates: boolean;
+  pluginUpdates: boolean;
+}
+
+export const DEFAULT_NOTIFICATION_SETTINGS: NotificationSettings = {
+  deckyUpdates: true,
+  pluginUpdates: true,
+};
+
+/**
+ * A Service class for managing the notification settings
+ *
+ * It's mostly responsible for sending setting updates to the server and keeping the local state in sync.
+ */
+export class NotificationService {
+  constructor(private deckyState: DeckyState) {}
+
+  async init() {
+    const notificationSettings = await getSetting<Partial<NotificationSettings>>('notificationSettings', {});
+
+    // Adding a fallback to the default settings to be backwards compatible if we ever add new notification settings
+    this.deckyState.setNotificationSettings({
+      ...DEFAULT_NOTIFICATION_SETTINGS,
+      ...notificationSettings,
+    });
+  }
+
+  /**
+   * Sends the new notification settings to the server and persists it locally in the decky state
+   *
+   * @param notificationSettings The new notification settings
+   */
+  async update(notificationSettings: NotificationSettings) {
+    await setSetting('notificationSettings', notificationSettings);
+    this.deckyState.setNotificationSettings(notificationSettings);
+  }
+
+  /**
+   * For a specific event, returns true if a notification should be shown
+   *
+   * @param event The notification event that should be checked
+   * @returns true if the notification should be shown
+   */
+  shouldNotify(event: keyof NotificationSettings) {
+    return this.deckyState.publicState().notificationSettings[event];
+  }
+}
-- 
cgit v1.2.3

