1/******************************************************************************** 2* constructor 3********************************************************************************/ 4var webPush = function(config) { 5 this.config = $.extend(true, {}, webPush.defaultConfig, config); 6// this.init(); 7} 8 9// default config 10webPush.defaultConfig = { 11 applicationServerPublicKey: '', 12 safariWebsitePushID: 'web.posify.me', 13 userId: null, 14 invoiceId: null 15}; 16 17/******************************************************************************** 18* initialize 19********************************************************************************/ 20webPush.prototype.init = function() { 21 if (this.browserSupport()) { 22 this.askPermission().then((result) => { 23 this.subscribeUserToPush(); 24 }); 25 } else { 26 // 2021-9-3 - TK: you always need to do some ridiculous thing to make iOS work 27 // https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/NotificationProgrammingGuideForWebsites/PushNotifications/PushNotifications.html#//apple_ref/doc/uid/TP40013225-CH3-SW1 28 if ('safari' in window && 'pushNotification' in window.safari) { 29 this.safariAskPermission(); 30 } 31 } 32}; 33 34/******************************************************************************** 35* check if permission already granted 36********************************************************************************/ 37webPush.prototype.isGranted = function() { 38 if (this.browserSupport()) { 39 return Notification.permission == 'granted'; 40 } else { 41 if ('safari' in window && 'pushNotification' in window.safari) { 42 return window.safari.pushNotification.permission('web.posify.me').permission == 'granted'; 43 } else { 44 return false; 45 } 46 } 47}; 48 49 50/******************************************************************************** 51* check if browser support 52********************************************************************************/ 53webPush.prototype.browserSupport = function() { 54 return 'serviceWorker' in navigator && 'PushManager' in window; 55}; 56 57/******************************************************************************** 58* ask for web push permission 59********************************************************************************/ 60webPush.prototype.askPermission = function() { 61 return new Promise(function(resolve, reject) { 62 const permissionResult = Notification.requestPermission(function(result) { 63 resolve(result); 64 }); 65 66 if (permissionResult) { 67 permissionResult.then(resolve, reject); 68 } 69 }).then(function(permissionResult) { 70 if (permissionResult !== 'granted') { 71 throw new Error('We weren\'t granted permission.'); 72 } 73 }); 74}; 75 76/******************************************************************************** 77* subscribe user to push 78********************************************************************************/ 79webPush.prototype.subscribeUserToPush = function() { 80 return navigator.serviceWorker.register(baseUrl + '/core-assets/js/posify.web-push-worker.js?_=' + new Date().getTime()) 81 .then((registration) => { 82 const subscribeOptions = { 83 userVisibleOnly: true, 84 applicationServerKey: this.urlBase64ToUint8Array(this.config.applicationServerPublicKey) 85 }; 86 87 return registration.pushManager.subscribe(subscribeOptions); 88 }) 89 .then((pushSubscription) => { 90 $.post(baseUrl + '/page/subscribe-web-push', { pushSubscription: JSON.stringify(pushSubscription) }); 91 return pushSubscription; 92 }); 93}; 94 95/******************************************************************************** 96* util 97********************************************************************************/ 98webPush.prototype.urlBase64ToUint8Array = function(base64String) { 99 var padding = '='.repeat((4 - base64String.length % 4) % 4); 100 var base64 = (base64String + padding) 101 .replace(/\-/g, '+') 102 .replace(/_/g, '/'); 103 104 var rawData = window.atob(base64); 105 var outputArray = new Uint8Array(rawData.length); 106 107 for (var i = 0; i < rawData.length; ++i) { 108 outputArray[i] = rawData.charCodeAt(i); 109 } 110 return outputArray; 111} 112 113/******************************************************************************** 114* safari ask for notification permission 115********************************************************************************/ 116webPush.prototype.safariAskPermission = function(permissionInfo) { 117 var that = this; 118 if (permissionInfo == undefined) { 119 permissionInfo = window.safari.pushNotification.permission(this.config.safariWebsitePushID); 120 } 121 if (permissionInfo.permission == 'granted') { 122 console.log('safari permission granted:', permissionInfo); 123 this.safariSubscribeUserToPush(permissionInfo); 124 } 125 if (permissionInfo.permission == 'default') { 126 window.safari.pushNotification.requestPermission( 127 window.location.origin + baseUrl + '/page/subscribe-web-push', // The web service URL. 128 this.config.safariWebsitePushID, // The Website Push ID. 129 { 130 userId: this.config.userId != null ? this.config.userId.toString() : '', 131 invoiceId: this.config.invoiceId != null ? this.config.invoiceId.toString() : '' 132 }, // Data that you choose to send to your server to help you identify the user. 133 //this.safariAskPermission // The callback function. 134 function(permissionInfo) { 135 console.log('safari permission granted:', permissionInfo); 136 that.safariSubscribeUserToPush(permissionInfo); 137 } 138 ); 139 } 140}; 141 142/******************************************************************************** 143* safari subscribe user to push 144********************************************************************************/ 145webPush.prototype.safariSubscribeUserToPush = function(permissionInfo) { 146 var pushSubscription = { 147 deviceToken: permissionInfo.deviceToken, 148 userId: this.config.userId, 149 invoiceId: this.config.invoiceId 150 } 151 $.post(baseUrl + '/page/subscribe-web-push', { pushSubscription: JSON.stringify(pushSubscription) }); 152};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.