HomeAccounting

Форк
0
189 строк · 6.3 Кб
1
// Initialize Firebase
2
var config = {
3
    apiKey: "AIzaSyC0zXM9j_M45LsqEu9kqajx4EhOmszpSTU",
4
    authDomain: "homeaccount-199914.firebaseapp.com",
5
    databaseURL: "https://homeaccount-199914.firebaseio.com",
6
    projectId: "homeaccount-199914",
7
    storageBucket: "homeaccount-199914.appspot.com",
8
    messagingSenderId: "994137243551"
9
};
10
firebase.initializeApp(config);
11

12
var bt_register = $('#push-on');
13
var bt_delete = $('#push-off');
14

15
var info = $('#info-push');
16
var info_message = $('#info-message');
17

18
var csrf_token = $('meta[name="csrf-token"]').attr('content');
19

20
var alert = $('#alert');
21

22

23
if (
24
    'Notification' in window &&
25
    'serviceWorker' in navigator &&
26
    'localStorage' in window &&
27
    'fetch' in window &&
28
    'postMessage' in window
29
) {
30
    var messaging = firebase.messaging();
31

32
    // already granted
33
    if (Notification.permission === 'granted') {
34
        getToken();
35
    }
36

37
    // get permission on subscribe only once
38
    bt_register.on('click', function() {
39
        getToken();
40
    });
41

42
    bt_delete.on('click', function() {
43
        // Delete Instance ID token.
44
        messaging.getToken()
45
            .then(function(currentToken) {
46
                messaging.deleteToken(currentToken)
47
                    .then(function() {
48
                        setTokenSentToServer(false);
49
                    })
50
                    .catch(function(error) {
51
                        showError('Unable to delete token', error);
52
                    });
53
            })
54
            .catch(function(error) {
55
                showError('Error retrieving Instance ID token', error);
56
            });
57
        //delete on server base
58
        deleteTokenToServer();
59
    });
60

61
    // handle catch the notification on current page
62
    messaging.onMessage(function(payload) {
63
        console.log('Message received', payload);
64
        info.show();
65
        info_message
66
            .text('')
67
            .append('<strong>'+payload.data.title+'</strong>')
68
            .append('<em>'+payload.data.body+'</em>')
69
        ;
70

71
        // register fake ServiceWorker for show notification on mobile devices
72
        navigator.serviceWorker.register('serviceworker/firebase-messaging-sw.js');
73
        Notification.requestPermission(function(permission) {
74
            if (permission === 'granted') {
75
                navigator.serviceWorker.ready.then(function(registration) {
76
                    // Copy data object to get parameters in the click handler
77
                    payload.data.data = JSON.parse(JSON.stringify(payload.data));
78

79
                    registration.showNotification(payload.data.title, payload.data);
80
                }).catch(function(error) {
81
                    // registration failed :(
82
                    showError('ServiceWorker registration failed', error);
83
                });
84
            }
85
        });
86
    });
87

88
    // Callback fired if Instance ID token is updated.
89
    messaging.onTokenRefresh(function() {
90
        messaging.getToken()
91
            .then(function(refreshedToken) {
92
                sendTokenToServer(refreshedToken);
93
            })
94
            .catch(function(error) {
95
                showError('Unable to retrieve refreshed token', error);
96
            });
97
    });
98

99
} else {
100
    if (!('Notification' in window)) {
101
        showError('Notification not supported');
102
    } else if (!('serviceWorker' in navigator)) {
103
        showError('ServiceWorker not supported');
104
    } else if (!('localStorage' in window)) {
105
        showError('LocalStorage not supported');
106
    } else if (!('fetch' in window)) {
107
        showError('fetch not supported');
108
    } else if (!('postMessage' in window)) {
109
        showError('postMessage not supported');
110
    }
111

112
    console.warn('This browser does not support desktop notification.');
113
    console.log('Is HTTPS', window.location.protocol === 'https:');
114
    console.log('Support Notification', 'Notification' in window);
115
    console.log('Support ServiceWorker', 'serviceWorker' in navigator);
116
    console.log('Support LocalStorage', 'localStorage' in window);
117
    console.log('Support fetch', 'fetch' in window);
118
    console.log('Support postMessage', 'postMessage' in window);
119
}
120

121

122
function getToken() {
123
    messaging.requestPermission()
124
        .then(function() {
125
            // Get Instance ID token. Initially this makes a network call, once retrieved
126
            // subsequent calls to getToken will return from cache.
127
            messaging.getToken()
128
                .then(function(currentToken) {
129

130
                    if (currentToken) {
131
                        sendTokenToServer(currentToken);
132
                    } else {
133
                        showError('No Instance ID token available. Request permission to generate one');
134
                        setTokenSentToServer(false);
135
                    }
136
                })
137
                .catch(function(error) {
138
                    showError('An error occurred while retrieving token', error);
139
                    setTokenSentToServer(false);
140
                });
141
        })
142
        .catch(function(error) {
143
            showError('Unable to get permission to notify', error);
144
        });
145
}
146

147

148
// Send the Instance ID token your application server, so that it can:
149
// - send messages back to this app
150
// - subscribe/unsubscribe the token from topics
151
function sendTokenToServer(currentToken) {
152
    if (!isTokenSentToServer(currentToken)) {
153
        console.log('Sending token to server...');
154
        // send current token to server
155
        $.post('/callback/push-on/', {browser_token: currentToken, _token: csrf_token});
156
        setTokenSentToServer(currentToken);
157
    } else {
158
        console.log('Token already sent to server so won\'t send it again unless it changes');
159
    }
160
}
161

162
function deleteTokenToServer()
163
{
164
    $.post('/callback/push-off/', {_token: csrf_token});
165
    setTokenSentToServer(false);
166
}
167

168
function isTokenSentToServer(currentToken) {
169
    return window.localStorage.getItem('sentFirebaseMessagingToken') === currentToken;
170
}
171

172
function setTokenSentToServer(currentToken) {
173
    if (currentToken) {
174
        window.localStorage.setItem('sentFirebaseMessagingToken', currentToken);
175
    } else {
176
        window.localStorage.removeItem('sentFirebaseMessagingToken');
177
    }
178
}
179

180
function showError(error, error_data) {
181
    if (typeof error_data !== "undefined") {
182
        console.error(error, error_data);
183
    } else {
184
        console.error(error);
185
    }
186

187
    info.show();
188
    info.html(error);
189
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.