From 6980083ed073d5be0ecaf7aaee6317fc31e1603c Mon Sep 17 00:00:00 2001 From: Nolan Lawson Date: Wed, 19 Jun 2019 23:00:27 -0700 Subject: [PATCH] fix: push subscriptions per instance (#1277) * fix: push subscriptions per instance fixes #1274 * fixup * add notice about one push notification per instance at a time --- src/inline-script/inline-script.js | 19 ++++++++++++++++++- src/routes/_actions/pushSubscription.js | 18 +++++++++--------- .../instance/PushNotificationSettings.html | 8 +++++--- .../computations/instanceComputations.js | 1 + src/routes/_store/mixins/instanceMixins.js | 11 +++++++++++ src/routes/_store/store.js | 2 +- src/routes/_store/storeLite.js | 11 +++++++++-- 7 files changed, 54 insertions(+), 16 deletions(-) diff --git a/src/inline-script/inline-script.js b/src/inline-script/inline-script.js index bd75c538..741fbd8b 100644 --- a/src/inline-script/inline-script.js +++ b/src/inline-script/inline-script.js @@ -14,7 +14,9 @@ const { currentInstance, instanceThemes, disableCustomScrollbars, - enableGrayscale + enableGrayscale, + pushSubscription, + loggedInInstancesInOrder } = storeLite.get() const theme = (instanceThemes && instanceThemes[currentInstance]) || DEFAULT_THEME @@ -65,3 +67,18 @@ if (/iP(?:hone|ad|od)/.test(navigator.userAgent) && IntersectionObserver.toString().includes('[native code]'))) { document.head.removeChild(document.getElementById('theManifest')) } + +if (pushSubscription) { + // Fix a bug in Pinafore <=v1.9.0 if we only have one instance we're logged in to + // (https://github.com/nolanlawson/pinafore/issues/1274) + if (loggedInInstancesInOrder && loggedInInstancesInOrder.length === 1) { + storeLite.set({ + pushSubscriptions: { + [currentInstance]: pushSubscription + } + }) + } + storeLite.set({ + pushSubscription: null + }) +} diff --git a/src/routes/_actions/pushSubscription.js b/src/routes/_actions/pushSubscription.js index 6d45a1d8..f4b07631 100644 --- a/src/routes/_actions/pushSubscription.js +++ b/src/routes/_actions/pushSubscription.js @@ -5,10 +5,10 @@ import { urlBase64ToUint8Array } from '../_utils/base64' const dummyApplicationServerKey = 'BImgAz4cF_yvNFp8uoBJCaGpCX4d0atNIFMHfBvAAXCyrnn9IMAFQ10DW_ZvBCzGeR4fZI5FnEi2JVcRE-L88jY=' export async function updatePushSubscriptionForInstance (instanceName) { - const { loggedInInstances, pushSubscription } = store.get() + const { loggedInInstances, currentPushSubscription } = store.get() const accessToken = loggedInInstances[instanceName].access_token - if (pushSubscription === null) { + if (currentPushSubscription === null) { return } @@ -16,7 +16,7 @@ export async function updatePushSubscriptionForInstance (instanceName) { const subscription = await registration.pushManager.getSubscription() if (subscription === null) { - store.set({ pushSubscription: null }) + store.setInstanceData(instanceName, 'pushSubscriptions', null) store.save() return } @@ -28,16 +28,16 @@ export async function updatePushSubscriptionForInstance (instanceName) { if (btoa(urlBase64ToUint8Array(backendSubscription.server_key).buffer) !== btoa(subscription.options.applicationServerKey)) { await subscription.unsubscribe() await deleteSubscription(instanceName, accessToken) - await updateAlerts(instanceName, pushSubscription.alerts) + await updateAlerts(instanceName, currentPushSubscription.alerts) } else { - store.set({ pushSubscription: backendSubscription }) + store.setInstanceData(instanceName, 'pushSubscriptions', backendSubscription) store.save() } } catch (e) { // TODO: Better way to detect 404 if (e.message.startsWith('404:')) { await subscription.unsubscribe() - store.set({ pushSubscription: null }) + store.setInstanceData(instanceName, 'pushSubscriptions', null) store.save() } } @@ -73,16 +73,16 @@ export async function updateAlerts (instanceName, alerts) { backendSubscription = await postSubscription(instanceName, accessToken, subscription, alerts) - store.set({ pushSubscription: backendSubscription }) + store.setInstanceData(instanceName, 'pushSubscriptions', backendSubscription) store.save() } else { try { const backendSubscription = await putSubscription(instanceName, accessToken, alerts) - store.set({ pushSubscription: backendSubscription }) + store.setInstanceData(instanceName, 'pushSubscriptions', backendSubscription) store.save() } catch (e) { const backendSubscription = await postSubscription(instanceName, accessToken, subscription, alerts) - store.set({ pushSubscription: backendSubscription }) + store.setInstanceData(instanceName, 'pushSubscriptions', backendSubscription) store.save() } } diff --git a/src/routes/_components/settings/instance/PushNotificationSettings.html b/src/routes/_components/settings/instance/PushNotificationSettings.html index 75f6d1d8..0ed44e27 100644 --- a/src/routes/_components/settings/instance/PushNotificationSettings.html +++ b/src/routes/_components/settings/instance/PushNotificationSettings.html @@ -1,8 +1,10 @@
{#if pushNotificationsSupport === false} -

Your browser doesn't support push notifications.

+

Your browser doesn't support push notifications.

{:elseif $notificationPermission === "denied"} -

You have denied permission to show notifications.

+

You have denied permission to show notifications.

+ {:elseif $loggedInInstancesInOrder.length > 1} +

Note that you can only have push notifications for one instance at a time.

{/if}