PageSourceSearch

https://www.shampoo.hk/core-assets/js/posify.web-push.js

js shampoo.hk collected 2026-09-27 05:08:32 UTC 5,861 bytes, 152 lines download raw bytes

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.