-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathuseNotifications.ts
More file actions
69 lines (59 loc) · 2.11 KB
/
Copy pathuseNotifications.ts
File metadata and controls
69 lines (59 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { useState } from "react";
import { NOTIFICATION_TITLE_TO_ID } from "../lib/notificationConfig";
// Interfejs dla powiadomienia
export interface AppNotification {
title: string;
options?: NotificationOptions;
}
const COOKIE_KEY = "user_notifications_preferences";
// COOKIES
function getCookie(key: string): string | undefined {
return document.cookie.split("; ")
.find(row => row.startsWith(key + "="))
?.split("=")[1];
}
export const useNotifications = () => {
const [permission, setPermission] =
useState<NotificationPermission>(() => Notification.permission); // zmiana z "default" na () => Notification.permission
// Prośba o zgodę
const requestPermission = async () => {
const status = await Notification.requestPermission();
setPermission(status);
};
// Wysyłanie powiadomienia (z obsługą Service Workera)
const sendNotification = async (notification: AppNotification) => {
if (Notification.permission !== "granted") {
alert("Brak zgody na powiadomienia!");
return;
}
// Sprawdenie czy ten typ powiadomienia jest włączony w COOKIES
const id = NOTIFICATION_TITLE_TO_ID[notification.title];
if (id) {
const saved = getCookie(COOKIE_KEY);
if (saved) {
try {
const prefs = JSON.parse(saved);
// powiadomienie zostaje wyłączone przez użytkowika - nie wysyla sie
if (prefs[id] === false) return;
} catch (error) {
console.error("Błąd podczas odczytywania cookies:", error);
}
}
}
try {
if ("serviceWorker" in navigator) {
const registration = await navigator.serviceWorker.ready;
console.log("service Worker");
await registration.showNotification(notification.title, {
...notification.options,
});
} else {
// fallback (np. starsze przeglądarki / desktop)
new Notification(notification.title, notification.options);
}
} catch (error) {
console.error("Błąd podczas wyświetlania powiadomienia:", error);
}
};
return { permission, requestPermission, sendNotification };
};