Skip to content

Commit 14d783d

Browse files
committed
feat: ブラウザが WebKit の場合に通知の許可を求める toast を出す
1 parent 6170bb9 commit 14d783d

File tree

3 files changed

+31
-24
lines changed

3 files changed

+31
-24
lines changed

src/components/Settings/BrowserTab/NotificationState.vue

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,16 @@
1919

2020
<script lang="ts">
2121
import { ref } from 'vue'
22-
import { requestNotificationPermission } from '/@/lib/notification/requestPermission'
2322
import AToggle from '/@/components/UI/AToggle.vue'
2423
2524
const useNotificationPermission = () => {
2625
const permission = ref<NotificationPermission>()
27-
permission.value = window.Notification?.permission
26+
permission.value = Notification?.permission
2827
2928
const requestPermission = async () => {
3029
// permission.valueがundefinedでないときは、
3130
// 上の取得の仕方からNotificationが存在していることが確定している
32-
permission.value = await requestNotificationPermission()
31+
permission.value = await Notification.requestPermission()
3332
}
3433
3534
return { permission, requestPermission }

src/lib/notification/notification.ts

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
import type { NotificationClickEvent } from '/@/types/InlineNotificationReplies'
22
import apis from '/@/lib/apis'
33
import router from '/@/router'
4-
import { isIOSApp } from '/@/lib/dom/browser'
4+
import { isIOSApp, isPWA, isWebKit } from '/@/lib/dom/browser'
55
import type { ChannelId, DMChannelId } from '/@/types/entity-ids'
66
import { createNotificationArgumentsCreator } from './notificationArguments'
77
import type { OnCanUpdate } from './updateToast'
88
import { setupUpdateToast } from './updateToast'
99
import type { FirebasePayloadData } from './firebase'
1010
import { setupFirebaseApp, getFirebaseApp } from './firebase'
11-
import { requestNotificationPermission } from './requestPermission'
1211
import {
1312
getMessaging,
1413
onMessage,
1514
getToken as getTokenFb,
1615
deleteToken as deleteTokenFb
1716
} from 'firebase/messaging'
1817
import { wait } from '/@/lib/basic/timer'
18+
import { useToastStore } from '/@/store/ui/toast'
1919

2020
const appName = window.traQConfig.name || 'traQ'
2121
const ignoredChannels = window.traQConfig.inlineReplyDisableChannels ?? []
@@ -48,7 +48,7 @@ const notify = async (
4848
return regist.showNotification(notificationTitle, notificationOptions)
4949
}
5050
}
51-
if (window.Notification?.permission === 'granted') {
51+
if (Notification?.permission === 'granted') {
5252
return new Notification(notificationTitle, notificationOptions)
5353
}
5454
return null
@@ -63,10 +63,30 @@ export const connectFirebase = async (onCanUpdate: OnCanUpdate) => {
6363
}
6464
}
6565

66-
if (window.Notification) {
66+
if (Notification) {
6767
if (Notification.permission === 'default') {
68-
// 上でNotificationが存在していることを確認している
69-
const permission = await requestNotificationPermission()
68+
// 上で Notification が存在していることを確認している
69+
const permission = await (() => {
70+
// WebKit ではユーザージェスチャーを起点としたポップアップのみ許可される
71+
if (isWebKit() && isPWA()) {
72+
const { addToast, deleteToast } = useToastStore()
73+
74+
return new Promise<NotificationPermission>((resolve, reject) => {
75+
addToast({
76+
type: 'info',
77+
text: '【通知を有効にしてください】\nメッセージ受信時に通知が届くようになります。(クリックで許可)',
78+
timeout: Infinity,
79+
onClick: id => {
80+
deleteToast(id)
81+
Notification.requestPermission().then(resolve).catch(reject)
82+
}
83+
})
84+
})
85+
} else {
86+
return Notification.requestPermission()
87+
}
88+
})()
89+
7090
if (permission === 'granted') {
7191
notify({ title: `ようこそ${appName}へ!!` }, true)
7292
} else {
@@ -102,9 +122,9 @@ export const connectFirebase = async (onCanUpdate: OnCanUpdate) => {
102122

103123
setupUpdateToast(registration, onCanUpdate)
104124

105-
if (window.Notification?.permission !== 'granted') {
125+
if (Notification?.permission !== 'granted') {
106126
// eslint-disable-next-line no-console
107-
console.warn(`[Notification] permission ${window.Notification?.permission}`)
127+
console.warn(`[Notification] permission ${Notification?.permission}`)
108128
return
109129
}
110130
if (!firebaseApp) {
@@ -162,7 +182,7 @@ export const connectFirebase = async (onCanUpdate: OnCanUpdate) => {
162182
}
163183

164184
export const deleteToken = () => {
165-
if (window.Notification?.permission !== 'granted') return
185+
if (Notification?.permission !== 'granted') return
166186

167187
const firebaseApp = getFirebaseApp()
168188
const messaging = getMessaging(firebaseApp)

src/lib/notification/requestPermission.ts

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)