Skip to content

Instantly share code, notes, and snippets.

@kaycebasques
Created November 12, 2020 02:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kaycebasques/04efb69b949682e35df654d2e169f297 to your computer and use it in GitHub Desktop.
Save kaycebasques/04efb69b949682e35df654d2e169f297 to your computer and use it in GitHub Desktop.
Cross-browser compatible code for requesting notification permission
async function subscribeButtonHandler() {
function permissionRequestCallback(result) {
permissionStatus = result;
subscribe();
}
async function subscribe() {
if (subscriptionInFlight) return;
subscriptionInFlight = true;
if (permissionStatus === 'denied') {
console.error('The user explicitly denied notification permission.');
return;
}
const registration = await navigator.serviceWorker.getRegistration();
console.info({registration});
if (!registration.pushManager) {
console.error('PushManager interface not found.');
return;
}
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlB64ToUint8Array(VAPID_PUBLIC_KEY)
});
if (subscription.endpoint) {
console.info('Successfully subscribed to push notifications!');
console.info({subscription});
unsubscribeButton.disabled = false;
}
fetch('/add-subscription', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(subscription)
});
}
let permissionStatus;
let subscriptionInFlight = false;
try {
Notification.requestPermission(permissionRequestCallback).then(result => {
permissionStatus = result;
subscribe();
});
} catch (error) {
if (error instanceof TypeError) {
console.info('Callback version of Notification.requestPermission() detected');
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment