HomeAccounting
189 строк · 6.3 Кб
1// Initialize Firebase
2var config = {3apiKey: "AIzaSyC0zXM9j_M45LsqEu9kqajx4EhOmszpSTU",4authDomain: "homeaccount-199914.firebaseapp.com",5databaseURL: "https://homeaccount-199914.firebaseio.com",6projectId: "homeaccount-199914",7storageBucket: "homeaccount-199914.appspot.com",8messagingSenderId: "994137243551"9};10firebase.initializeApp(config);11
12var bt_register = $('#push-on');13var bt_delete = $('#push-off');14
15var info = $('#info-push');16var info_message = $('#info-message');17
18var csrf_token = $('meta[name="csrf-token"]').attr('content');19
20var alert = $('#alert');21
22
23if (24'Notification' in window &&25'serviceWorker' in navigator &&26'localStorage' in window &&27'fetch' in window &&28'postMessage' in window29) {30var messaging = firebase.messaging();31
32// already granted33if (Notification.permission === 'granted') {34getToken();35}36
37// get permission on subscribe only once38bt_register.on('click', function() {39getToken();40});41
42bt_delete.on('click', function() {43// Delete Instance ID token.44messaging.getToken()45.then(function(currentToken) {46messaging.deleteToken(currentToken)47.then(function() {48setTokenSentToServer(false);49})50.catch(function(error) {51showError('Unable to delete token', error);52});53})54.catch(function(error) {55showError('Error retrieving Instance ID token', error);56});57//delete on server base58deleteTokenToServer();59});60
61// handle catch the notification on current page62messaging.onMessage(function(payload) {63console.log('Message received', payload);64info.show();65info_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 devices72navigator.serviceWorker.register('serviceworker/firebase-messaging-sw.js');73Notification.requestPermission(function(permission) {74if (permission === 'granted') {75navigator.serviceWorker.ready.then(function(registration) {76// Copy data object to get parameters in the click handler77payload.data.data = JSON.parse(JSON.stringify(payload.data));78
79registration.showNotification(payload.data.title, payload.data);80}).catch(function(error) {81// registration failed :(82showError('ServiceWorker registration failed', error);83});84}85});86});87
88// Callback fired if Instance ID token is updated.89messaging.onTokenRefresh(function() {90messaging.getToken()91.then(function(refreshedToken) {92sendTokenToServer(refreshedToken);93})94.catch(function(error) {95showError('Unable to retrieve refreshed token', error);96});97});98
99} else {100if (!('Notification' in window)) {101showError('Notification not supported');102} else if (!('serviceWorker' in navigator)) {103showError('ServiceWorker not supported');104} else if (!('localStorage' in window)) {105showError('LocalStorage not supported');106} else if (!('fetch' in window)) {107showError('fetch not supported');108} else if (!('postMessage' in window)) {109showError('postMessage not supported');110}111
112console.warn('This browser does not support desktop notification.');113console.log('Is HTTPS', window.location.protocol === 'https:');114console.log('Support Notification', 'Notification' in window);115console.log('Support ServiceWorker', 'serviceWorker' in navigator);116console.log('Support LocalStorage', 'localStorage' in window);117console.log('Support fetch', 'fetch' in window);118console.log('Support postMessage', 'postMessage' in window);119}
120
121
122function getToken() {123messaging.requestPermission()124.then(function() {125// Get Instance ID token. Initially this makes a network call, once retrieved126// subsequent calls to getToken will return from cache.127messaging.getToken()128.then(function(currentToken) {129
130if (currentToken) {131sendTokenToServer(currentToken);132} else {133showError('No Instance ID token available. Request permission to generate one');134setTokenSentToServer(false);135}136})137.catch(function(error) {138showError('An error occurred while retrieving token', error);139setTokenSentToServer(false);140});141})142.catch(function(error) {143showError('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
151function sendTokenToServer(currentToken) {152if (!isTokenSentToServer(currentToken)) {153console.log('Sending token to server...');154// send current token to server155$.post('/callback/push-on/', {browser_token: currentToken, _token: csrf_token});156setTokenSentToServer(currentToken);157} else {158console.log('Token already sent to server so won\'t send it again unless it changes');159}160}
161
162function deleteTokenToServer()163{
164$.post('/callback/push-off/', {_token: csrf_token});165setTokenSentToServer(false);166}
167
168function isTokenSentToServer(currentToken) {169return window.localStorage.getItem('sentFirebaseMessagingToken') === currentToken;170}
171
172function setTokenSentToServer(currentToken) {173if (currentToken) {174window.localStorage.setItem('sentFirebaseMessagingToken', currentToken);175} else {176window.localStorage.removeItem('sentFirebaseMessagingToken');177}178}
179
180function showError(error, error_data) {181if (typeof error_data !== "undefined") {182console.error(error, error_data);183} else {184console.error(error);185}186
187info.show();188info.html(error);189}