simplified some code, made it possible to unregister serviceworker altogether

This commit is contained in:
Henry Jameson 2018-12-20 09:17:59 +03:00
parent d0b47488fb
commit 957b2a6f7e
3 changed files with 30 additions and 15 deletions

View file

@ -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')
}
}
})
}

View file

@ -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'))

View file

@ -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}`))
}
}