From 9e35c036b19514451b69cbfe2a2062f33b328cd0 Mon Sep 17 00:00:00 2001 From: Andreas Nedbal Date: Sat, 14 Oct 2023 20:57:09 +0200 Subject: [PATCH] Rewrite WebPush enable handler to properly catch errors --- .../retrospring/features/webpush/enable.ts | 81 ++++++++++--------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/app/javascript/retrospring/features/webpush/enable.ts b/app/javascript/retrospring/features/webpush/enable.ts index c92aed64..3a77485a 100644 --- a/app/javascript/retrospring/features/webpush/enable.ts +++ b/app/javascript/retrospring/features/webpush/enable.ts @@ -3,52 +3,53 @@ import I18n from "retrospring/i18n"; import { showNotification } from "utilities/notifications"; import { Buffer } from "buffer"; -export function enableHandler (event: Event): void { +export async function enableHandler (event: Event): Promise { event.preventDefault(); const sender = event.target as HTMLButtonElement; try { - getServiceWorker() - .then(subscribe) - .then(async subscription => { - return Notification.requestPermission().then(permission => { - if (permission != "granted") { - return; - } + const registration = await getServiceWorker(); + const subscription = await subscribe(registration); + const permission = await Notification.requestPermission(); - post('/ajax/webpush', { - body: { - subscription - }, - contentType: 'application/json' - }).then(async response => { - const data = await response.json; - - if (data.success) { - new Notification(I18n.translate("frontend.push_notifications.subscribe.success.title"), { - body: I18n.translate("frontend.push_notifications.subscribe.success.body") - }); - - document.querySelectorAll('button[data-action="push-disable"], button[data-action="push-remove-all"]') - .forEach(button => button.classList.remove('d-none')); - - sender.classList.add('d-none'); - document.querySelector('.push-settings')?.classList.add('d-none'); - localStorage.setItem('dismiss-push-settings-prompt', 'true'); - - document.getElementById('subscription-count').textContent = data.message; - } else { - new Notification(I18n.translate("frontend.push_notifications.fail.title"), { - body: I18n.translate("frontend.push_notifications.fail.body") - }); - } - }); - }); - }); - } catch (error) { - console.error("Failed to set up push notifications", error); - showNotification(I18n.translate("frontend.push_notifications.setup_fail")); + if (permission != "granted") { + return; } + + const response = await post('/ajax/webpush', { + body: { + subscription + }, + contentType: 'application/json' + }); + + const data = await response.json; + + if (data.success) { + new Notification(I18n.translate("frontend.push_notifications.subscribe.success.title"), { + body: I18n.translate("frontend.push_notifications.subscribe.success.body") + }); + + document.querySelectorAll('button[data-action="push-disable"], button[data-action="push-remove-all"]') + .forEach(button => button.classList.remove('d-none')); + + sender.classList.add('d-none'); + document.querySelector('.push-settings')?.classList.add('d-none'); + localStorage.setItem('dismiss-push-settings-prompt', 'true'); + + const subscriptionCountElement = document.getElementById('subscription-count'); + if (subscriptionCountElement != null) { + subscriptionCountElement.textContent = data.message; + } + } else { + new Notification(I18n.translate("frontend.push_notifications.fail.title"), { + body: I18n.translate("frontend.push_notifications.fail.body") + }); + } + } catch (error) { + console.error("Failed to set up push notifications", error); + showNotification(I18n.translate("frontend.push_notifications.setup_fail"), false); + } } async function getServiceWorker(): Promise {