fix: push notification request permission (#677)

This commit is contained in:
Joaquín Sánchez 2023-01-01 20:24:22 +01:00 committed by GitHub
parent 6c38477bc2
commit d8abea75aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 123 additions and 35 deletions

View file

@ -2,7 +2,7 @@ import type { Emoji, PushSubscription as MastoPushSubscription, PushSubscription
import type { UserLogin } from '~/types'
export type SubscriptionResult = 'subscribed' | 'notification-denied' | 'invalid-state'
export type SubscriptionResult = 'subscribed' | 'notification-denied' | 'not-supported' | 'invalid-vapid-key' | 'no-user'
export interface PushManagerSubscriptionInfo {
registration: ServiceWorkerRegistration
subscription: PushSubscription | null

View file

@ -59,33 +59,28 @@ export const usePushManager = () => {
}
}, { immediate: true, flush: 'post' })
const subscribe = async (notificationData?: CreatePushNotification, policy?: SubscriptionPolicy, force?: boolean): Promise<SubscriptionResult> => {
if (!isSupported || !currentUser.value)
return 'invalid-state'
const subscribe = async (
notificationData?: CreatePushNotification,
policy?: SubscriptionPolicy,
force?: boolean,
): Promise<SubscriptionResult> => {
if (!isSupported)
return 'not-supported'
if (!currentUser.value)
return 'no-user'
const { pushSubscription, server, token, vapidKey, account: { acct } } = currentUser.value
if (!token || !server || !vapidKey)
return 'invalid-state'
return 'invalid-vapid-key'
let permission: PermissionState | undefined
// always request permission, browsers should remember user decision
const permission = await Promise.resolve(Notification.requestPermission()).then((p) => {
return p === 'default' ? 'prompt' : p
})
if (!notificationPermission.value || (notificationPermission.value === 'prompt' && !hiddenNotification.value[acct])) {
// safari 16 does not support navigator.permissions.query for notifications
// try {
// permission = (await navigator.permissions?.query({ name: 'notifications' }))?.state
// }
// catch {
permission = await Promise.resolve(Notification.requestPermission()).then((p: NotificationPermission) => {
return p === 'default' ? 'prompt' : p
})
// }
}
else {
permission = notificationPermission.value
}
if (!permission || permission === 'denied') {
if (permission === 'denied') {
notificationPermission.value = permission
return 'notification-denied'
}