82 lines
2.2 KiB
TypeScript
82 lines
2.2 KiB
TypeScript
import {Injectable, signal} from '@angular/core';
|
|
|
|
@Injectable({providedIn: 'root'})
|
|
export class NotificationService {
|
|
|
|
private readonly notificationSound = new Audio('/public/sounds/notification.mp3');
|
|
private readonly notificationStorageKey = 'chat-notifications-enabled';
|
|
private readonly _notificationEnabled = signal<Record<string, boolean>>(
|
|
this.getStoredNotificationSettings()
|
|
);
|
|
|
|
public notify(server: string) {
|
|
if (!this.isNotificationEnabled(server)) {
|
|
return;
|
|
}
|
|
this.playSound();
|
|
|
|
}
|
|
|
|
private enableSound() {
|
|
this.notificationSound.muted = true;
|
|
this.notificationSound.play()
|
|
.then(() => {
|
|
this.notificationSound.pause();
|
|
this.notificationSound.currentTime = 0;
|
|
this.notificationSound.muted = false;
|
|
})
|
|
.catch((error) => {
|
|
console.log('Could not unlock notification sound:', error);
|
|
this.notificationSound.muted = false;
|
|
});
|
|
}
|
|
|
|
private playSound() {
|
|
this.notificationSound.currentTime = 0;
|
|
this.notificationSound.play().catch((error) => {
|
|
console.log('Could not play notification sound:', error);
|
|
});
|
|
}
|
|
|
|
public isNotificationEnabled(server: string): boolean {
|
|
return this._notificationEnabled()[server];
|
|
}
|
|
|
|
public enableNotifications(server: string) {
|
|
this.setNotificationEnabled(server, true);
|
|
this.enableSound()
|
|
}
|
|
|
|
public disableNotifications(server: string) {
|
|
this.setNotificationEnabled(server, false);
|
|
}
|
|
|
|
private setNotificationEnabled(server: string, enabled: boolean) {
|
|
const notificationSettings = {
|
|
...this._notificationEnabled(),
|
|
[server]: enabled
|
|
};
|
|
|
|
this._notificationEnabled.set(notificationSettings);
|
|
localStorage.setItem(this.notificationStorageKey, JSON.stringify(notificationSettings));
|
|
}
|
|
|
|
private getStoredNotificationSettings(): Record<string, boolean> {
|
|
const storedSettings = localStorage.getItem(this.notificationStorageKey);
|
|
|
|
if (storedSettings === null) {
|
|
return {};
|
|
}
|
|
|
|
if (storedSettings === 'true' || storedSettings === 'false') {
|
|
return {};
|
|
}
|
|
|
|
try {
|
|
return JSON.parse(storedSettings) as Record<string, boolean>;
|
|
} catch {
|
|
return {};
|
|
}
|
|
}
|
|
}
|