UNPKG

clevertap-web-sdk

Version:

<p align="center"> <img src="https://github.com/CleverTap/clevertap-ios-sdk/blob/master/docs/images/clevertap-logo.png" width = "50%"/> </p>

137 lines (123 loc) 4.95 kB
/* eslint-disable handle-callback-err */ /* eslint-disable no-use-before-define */ /* eslint-disable no-undef */ /** * Author: Jashan Shewakramani * Last updated: 27 June 2016 * Description: Service worker for handling chrome push notifications * * NOTES: * -> "self" refers to the global ServiceWorker Object * -> This script is registered to the browser from a.js * -> We're only handling notification clicks; "delivered" is handled by NB * -> Use Google's closure compiler on http://closure-compiler.appspot.com/ for minifying */ importScripts('https://d2r1yp2w7bby2u.cloudfront.net/js/localforage.min.js') // var CACHE_VERSION = 3; // var CURRENT_CACHES = { // prefetch: 'prefetch-cache-v' + CACHE_VERSION // }; if (typeof globalRedirectPath === 'undefined') { // set up some variables we need gobally var globalNotificationData // global redirect path for backward compatibility var globalRedirectPath // when showing thr url; we need to log to LC before opening up the deep link } self.addEventListener('install', function (event) { // force this service worker to become the active service worker; removes any previous implementations or migrations self.skipWaiting() console.log('CT Service worker installed') }) self.addEventListener('activate', function (event) { console.log('CT Service worker activated') }) self.addEventListener('push', function (event) { console.log('Push event: ', event) // get all the notification data var notificationData = JSON.parse(event.data.text()) var title = notificationData.title var notificationOptions = notificationData.notificationOptions var data = notificationOptions.data var key if (typeof data !== 'undefined') { data.wzrk_id += `_${new Date().getTime()}` key = data.wzrk_id } if (typeof key === 'undefined') { key = title } localforage.setItem(key, event.data.text()).then(function (value) { // console.log("persisted"); }).catch(function (err) { // This code runs if there were any errors console.log('Error in persisting') }) // two global variables for backward compatibility globalRedirectPath = notificationData.redirectPath globalNotificationData = notificationData var raiseNotificationViewedPath = notificationData.raiseNotificationViewedPath if (typeof raiseNotificationViewedPath !== 'undefined') { // raise notification viewed event fetch(raiseNotificationViewedPath, { mode: 'no-cors' }) // ignore the response } event.waitUntil(self.registration.showNotification(title, notificationOptions)) }) function onClick (event, redirectPath, notificationData) { let finalDeepLink = '' let trackingUrl = redirectPath if (event.action === 'action1') { // button 1 was clicked if (typeof notificationData.notificationOptions.actions[0].deepLink !== 'undefined') { trackingUrl += '&r=' + encodeURIComponent(notificationData.notificationOptions.actions[0].deepLink) finalDeepLink = notificationData.notificationOptions.actions[0].deepLink } trackingUrl += '&b=' + encodeURIComponent('button1') } else if (event.action === 'action2') { // the second button was clicked if (typeof notificationData.notificationOptions.actions[1].deepLink !== 'undefined') { trackingUrl += '&r=' + encodeURIComponent(notificationData.notificationOptions.actions[1].deepLink) finalDeepLink = notificationData.notificationOptions.actions[1].deepLink } trackingUrl += '&b=' + encodeURIComponent('button2') } else { // general click if (typeof notificationData.deepLink !== 'undefined') { trackingUrl += '&r=' + encodeURIComponent(notificationData.deepLink) finalDeepLink = notificationData.deepLink } trackingUrl += '&b=' + encodeURIComponent('button0') } fireSilentRequest(trackingUrl) if (finalDeepLink) { clients.openWindow(finalDeepLink) } event.notification.close() } self.addEventListener('notificationclick', function (event) { var notification = event.notification var data = notification.data var key if (typeof data !== 'undefined' && data !== null) { key = data.wzrk_id } if (typeof key === 'undefined') { key = notification.title } var promise = localforage.getItem(key).then(function (value) { var notificationData = JSON.parse(value) var redirectPath = notificationData.redirectPath onClick(event, redirectPath, notificationData) }).catch(function (err) { // This code runs if there were any errors // onClick below for backward compatibility onClick(event, globalRedirectPath, globalNotificationData) console.log(err) }) event.waitUntil(promise) }) var fireSilentRequest = function (url) { // add the silent parameter to the deeplink so that LC knows not to raise an error url += '&s=true' // use the fetch API to make a silent request (we don't care about the response here) fetch(url, { mode: 'no-cors' }) }