From ef9afa8cbca29a3dd83454f44264a4682e968c59 Mon Sep 17 00:00:00 2001 From: Jonas Dellinger 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>('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