From 957b2a6f7ef8ca381fc44b79a17639e400407b67 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 20 Dec 2018 09:17:59 +0300 Subject: [PATCH] simplified some code, made it possible to unregister serviceworker altogether --- src/main.js | 23 ++++++++++------------- src/modules/users.js | 5 ++++- src/services/push/push.js | 17 ++++++++++++++++- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/main.js b/src/main.js index bf92e78e9a..c22a762e0a 100644 --- a/src/main.js +++ b/src/main.js @@ -54,24 +54,21 @@ const persistedStateOptions = { const registerPushNotifications = store => { store.subscribe((mutation, state) => { const vapidPublicKey = state.instance.vapidPublicKey + const webPushNotification = state.config.webPushNotifications const permission = state.interface.notificationPermission === 'granted' - const isUserMutation = mutation.type === 'setCurrentUser' - - if (isUserMutation && vapidPublicKey && permission) { - return store.dispatch('registerPushNotifications') - } - const user = state.users.currentUser + + const isUserMutation = mutation.type === 'setCurrentUser' const isVapidMutation = mutation.type === 'setInstanceOption' && mutation.payload.name === 'vapidPublicKey' - - if (isVapidMutation && user && permission) { - return store.dispatch('registerPushNotifications') - } - const isPermMutation = mutation.type === 'setNotificationPermission' && mutation.payload === 'granted' + const isUserConfigMutation = mutation.type === 'setOption' && mutation.payload.name === 'webPushNotifications' - if (isPermMutation && user && vapidPublicKey) { - return store.dispatch('registerPushNotifications') + if (isUserMutation || isVapidMutation || isPermMutation || isUserConfigMutation) { + if (user && vapidPublicKey && permission && webPushNotification) { + return store.dispatch('registerPushNotifications') + } else if (isUserConfigMutation && !webPushNotification) { + return store.dispatch('unregisterPushNotifications') + } } }) } diff --git a/src/modules/users.js b/src/modules/users.js index 13d3f26e23..2ea0919ef8 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -1,7 +1,7 @@ import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js' import { compact, map, each, merge } from 'lodash' import { set } from 'vue' -import registerPushNotifications from '../services/push/push.js' +import { registerPushNotifications, unregisterPushNotifications } from '../services/push/push.js' import oauthApi from '../services/new_api/oauth' import { humanizeErrors } from './errors' @@ -116,6 +116,9 @@ const users = { registerPushNotifications(isEnabled, vapidPublicKey, token) }, + unregisterPushNotifications (store) { + unregisterPushNotifications() + }, addNewStatuses (store, { statuses }) { const users = map(statuses, 'user') const retweetedUsers = compact(map(statuses, 'retweeted_status.user')) diff --git a/src/services/push/push.js b/src/services/push/push.js index 1ac304d147..ff67fd5a22 100644 --- a/src/services/push/push.js +++ b/src/services/push/push.js @@ -19,6 +19,12 @@ function registerServiceWorker () { .catch((err) => console.error('Unable to register service worker.', err)) } +function unregisterServiceWorker () { + return runtime.register() + .then((registration) => registration.unregister()) + .catch((err) => console.error('Unable to unregister serviceworker', err)) +} + function subscribe (registration, isEnabled, vapidPublicKey) { if (!isEnabled) return Promise.reject(new Error('Web Push is disabled in config')) if (!vapidPublicKey) return Promise.reject(new Error('VAPID public key is not found')) @@ -59,7 +65,7 @@ function sendSubscriptionToBackEnd (subscription, token) { }) } -export default function registerPushNotifications (isEnabled, vapidPublicKey, token) { +export function registerPushNotifications (isEnabled, vapidPublicKey, token) { if (isPushSupported()) { registerServiceWorker() .then((registration) => subscribe(registration, isEnabled, vapidPublicKey)) @@ -67,3 +73,12 @@ export default function registerPushNotifications (isEnabled, vapidPublicKey, to .catch((e) => console.warn(`Failed to setup Web Push Notifications: ${e.message}`)) } } + +export function unregisterPushNotifications (isEnabled, vapidPublicKey, token) { + if (isPushSupported()) { + unregisterServiceWorker() + .then((registration) => subscribe(registration, isEnabled, vapidPublicKey)) + .then((subscription) => sendSubscriptionToBackEnd(subscription, token)) + .catch((e) => console.warn(`Failed to setup Web Push Notifications: ${e.message}`)) + } +}