File size: 3,113 Bytes
47e77e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
window.ttsFirebase = (() => {
    let initialized = false;

    function getConfig() {
        return window.ttsFirebaseConfig || {};
    }

    function ensureInitialized() {
        if (initialized) {
            return;
        }

        if (typeof firebase === "undefined") {
            throw new Error("Firebase SDK is not loaded.");
        }

        const config = getConfig();
        if (!config.apiKey || !config.projectId || !config.messagingSenderId || !config.appId) {
            throw new Error("Firebase web config is incomplete.");
        }

        firebase.initializeApp({
            apiKey: config.apiKey,
            authDomain: config.authDomain,
            projectId: config.projectId,
            messagingSenderId: config.messagingSenderId,
            appId: config.appId
        });

        initialized = true;
    }

    async function getRegistrationToken() {
        if (!("Notification" in window) || !("serviceWorker" in navigator)) {
            return null;
        }

        const config = getConfig();
        if (!config.vapidKey) {
            throw new Error("Firebase VAPID key is missing.");
        }

        ensureInitialized();

        const permission = await Notification.requestPermission();
        if (permission !== "granted") {
            return null;
        }

        const registration = await navigator.serviceWorker.register("/firebase-messaging-sw.js");
        const messaging = firebase.messaging();
        const token = await messaging.getToken({
            vapidKey: config.vapidKey,
            serviceWorkerRegistration: registration
        });

        return token || null;
    }

    async function areNotificationsEnabled() {
        if (!("Notification" in window) || !("serviceWorker" in navigator)) {
            return false;
        }
        if (Notification.permission !== "granted") {
            return false;
        }
        try {
            const registration = await navigator.serviceWorker.getRegistration("/firebase-messaging-sw.js");
            if (!registration) {
                return false;
            }
            const messaging = firebase.messaging();
            const config = getConfig();
            const token = await messaging.getToken({
                vapidKey: config.vapidKey,
                serviceWorkerRegistration: registration
            });
            return !!token;
        } catch (e) {
            return false;
        }
    }

    async function disableNotifications() {
        if (!("Notification" in window) || !("serviceWorker" in navigator)) {
            return;
        }
        try {
            const registration = await navigator.serviceWorker.getRegistration("/firebase-messaging-sw.js");
            if (registration) {
                const messaging = firebase.messaging();
                await messaging.deleteToken();
            }
        } catch (e) {
            console.error("Error during disableNotifications:", e);
        }
    }

    return {
        getRegistrationToken,
        areNotificationsEnabled,
        disableNotifications
    };
})();