aboutsummaryrefslogtreecommitdiff
path: root/src/services/push/push.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/services/push/push.js')
-rw-r--r--src/services/push/push.js81
1 files changed, 61 insertions, 20 deletions
diff --git a/src/services/push/push.js b/src/services/push/push.js
index 1ac304d1..1b189a29 100644
--- a/src/services/push/push.js
+++ b/src/services/push/push.js
@@ -14,12 +14,12 @@ function isPushSupported () {
return 'serviceWorker' in navigator && 'PushManager' in window
}
-function registerServiceWorker () {
+function getOrCreateServiceWorker () {
return runtime.register()
- .catch((err) => console.error('Unable to register service worker.', err))
+ .catch((err) => console.error('Unable to get or create a service worker.', err))
}
-function subscribe (registration, isEnabled, vapidPublicKey) {
+function subscribePush (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'))
@@ -30,7 +30,28 @@ function subscribe (registration, isEnabled, vapidPublicKey) {
return registration.pushManager.subscribe(subscribeOptions)
}
-function sendSubscriptionToBackEnd (subscription, token) {
+function unsubscribePush (registration) {
+ return registration.pushManager.getSubscription()
+ .then((subscribtion) => {
+ if (subscribtion === null) { return }
+ return subscribtion.unsubscribe()
+ })
+}
+
+function deleteSubscriptionFromBackEnd (token) {
+ return window.fetch('/api/v1/push/subscription/', {
+ method: 'DELETE',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': `Bearer ${token}`
+ }
+ }).then((response) => {
+ if (!response.ok) throw new Error('Bad status code from server.')
+ return response
+ })
+}
+
+function sendSubscriptionToBackEnd (subscription, token, notificationVisibility) {
return window.fetch('/api/v1/push/subscription/', {
method: 'POST',
headers: {
@@ -41,29 +62,49 @@ function sendSubscriptionToBackEnd (subscription, token) {
subscription,
data: {
alerts: {
- follow: true,
- favourite: true,
- mention: true,
- reblog: true
+ follow: notificationVisibility.follows,
+ favourite: notificationVisibility.likes,
+ mention: notificationVisibility.mentions,
+ reblog: notificationVisibility.repeats
}
}
})
+ }).then((response) => {
+ if (!response.ok) throw new Error('Bad status code from server.')
+ return response.json()
+ }).then((responseData) => {
+ if (!responseData.id) throw new Error('Bad response from server.')
+ return responseData
})
- .then((response) => {
- if (!response.ok) throw new Error('Bad status code from server.')
- return response.json()
- })
- .then((responseData) => {
- if (!responseData.id) throw new Error('Bad response from server.')
- return responseData
- })
}
-export default function registerPushNotifications (isEnabled, vapidPublicKey, token) {
+export function registerPushNotifications (isEnabled, vapidPublicKey, token, notificationVisibility) {
if (isPushSupported()) {
- registerServiceWorker()
- .then((registration) => subscribe(registration, isEnabled, vapidPublicKey))
- .then((subscription) => sendSubscriptionToBackEnd(subscription, token))
+ getOrCreateServiceWorker()
+ .then((registration) => subscribePush(registration, isEnabled, vapidPublicKey))
+ .then((subscription) => sendSubscriptionToBackEnd(subscription, token, notificationVisibility))
.catch((e) => console.warn(`Failed to setup Web Push Notifications: ${e.message}`))
}
}
+
+export function unregisterPushNotifications (token) {
+ if (isPushSupported()) {
+ Promise.all([
+ deleteSubscriptionFromBackEnd(token),
+ getOrCreateServiceWorker()
+ .then((registration) => {
+ return unsubscribePush(registration).then((result) => [registration, result])
+ })
+ .then(([registration, unsubResult]) => {
+ if (!unsubResult) {
+ console.warn('Push subscription cancellation wasn\'t successful, killing SW anyway...')
+ }
+ return registration.unregister().then((result) => {
+ if (!result) {
+ console.warn('Failed to kill SW')
+ }
+ })
+ })
+ ]).catch((e) => console.warn(`Failed to disable Web Push Notifications: ${e.message}`))
+ }
+}