UNPKG

@magicbell/react-headless

Version:
86 lines 3.26 kB
import { path } from 'ramda'; import { postAPI } from './ajax.js'; function stringToUint8Array(plainString) { const padding = '='.repeat((4 - (plainString.length % 4)) % 4); const base64 = (plainString + padding).replace(/-/g, '+').replace(/_/g, '/'); const rawData = window.atob(base64); const outputArray = new Uint8Array(rawData.length); for (let i = 0; i < rawData.length; ++i) { outputArray[i] = rawData.charCodeAt(i); } return outputArray; } /** * Store a subscription in the backend so we can notify this user later. * * @param subscription The push subscription */ function storeSubscription(subscription) { const data = { web_push_subscription: { data: subscription, }, }; return postAPI('/web_push_subscriptions', data); } /** * Request permission to send push notifications. * * @param pushManager * @param publicKey VAPID public key */ export function subscribeToPushNotifications(pushManager, publicKey) { const applicationServerKey = stringToUint8Array(publicKey); return pushManager.subscribe({ userVisibleOnly: true, applicationServerKey }); } /** * Request permission to send push notifications and store the subscription in * the backend. * * @param pushManager * @param user * @param project */ export async function createPushSubscription(pushManager, config) { const vapidPublicKey = path(['webPush', 'config', 'vapidAuthentication', 'publicKey'], config.channels); const subscription = await subscribeToPushNotifications(pushManager, vapidPublicKey); return storeSubscription(subscription.toJSON()); } /** * Request permission to send push notifications in Safari and store the * subscription in the backend. * * @param authenticationToken A string that helps you identify the user * @param webServiceUrl URL of the Safari web push service * @param websitePushID Apple identifier of the website push service */ export function createSafariPushSubscription(authenticationToken, webServiceUrl, websitePushID = 'web.com.magicbell-notifications') { const permissionData = window['safari'].pushNotification.permission(websitePushID); if (permissionData.permission === 'granted') return Promise.resolve(permissionData); if (permissionData.permission === 'denied') return Promise.reject(false); return new Promise(function (resolve, reject) { window['safari'].pushNotification.requestPermission(webServiceUrl, websitePushID, { authenticationToken }, function (permissionData) { if (permissionData.deviceToken) { const subscriptionData = { endpoint: permissionData.deviceToken, keys: { websitePushID }, platform: 'safari', }; storeSubscription(subscriptionData) .then((subscription) => { resolve(subscription); }) .catch((error) => { reject(error); }); } else { const error = new Error('Permission was denied'); reject(error); } }); }); } //# sourceMappingURL=push.js.map