handle desktop notifications clicks

This commit is contained in:
Henry Jameson 2023-11-16 20:41:41 +02:00
parent 6ed2cb8f43
commit a17defc5ab
4 changed files with 31 additions and 8 deletions

View File

@ -345,7 +345,7 @@ const afterStoreSetup = async ({ store, i18n }) => {
store.dispatch('setLayoutHeight', windowHeight()) store.dispatch('setLayoutHeight', windowHeight())
FaviconService.initFaviconService() FaviconService.initFaviconService()
initServiceWorker() initServiceWorker(store)
window.addEventListener('focus', () => updateFocus()) window.addEventListener('focus', () => updateFocus())

View File

@ -159,14 +159,16 @@ const Notifications = {
updateScrollPosition () { updateScrollPosition () {
this.showScrollTop = this.$refs.root.offsetTop < this.scrollerRef.scrollTop this.showScrollTop = this.$refs.root.offsetTop < this.scrollerRef.scrollTop
}, },
/* "Interacted" really refers to "actionable" notifications that require user input,
* everything else (likes/repeats/reacts) cannot be acted and therefore we just clear
* the "seen" status upon any clicks on them
*/
notificationClicked (notification) { notificationClicked (notification) {
// const { type, id, seen } = notification const { id } = notification
this.$store.dispatch('notificationClicked', { id })
}, },
notificationInteracted (notification) { notificationInteracted (notification) {
const { id, seen } = notification const { id } = notification
if (!seen) this.markOneAsSeen(id)
},
markOneAsSeen (id) {
this.$store.dispatch('markSingleNotificationAsSeen', { id }) this.$store.dispatch('markSingleNotificationAsSeen', { id })
}, },
markAsSeen () { markAsSeen () {

View File

@ -113,6 +113,21 @@ export const notifications = {
} }
}) })
}, },
notificationClicked ({ state, commit }, id) {
const notification = state.idStore[id]
const { type, seen } = notification
if (!seen) {
switch (type) {
case 'mention':
case 'pleroma:report':
case 'follow_request':
break
default:
commit('markSingleNotificationAsSeen', { id })
}
}
},
setNotificationsLoading ({ rootState, commit }, { value }) { setNotificationsLoading ({ rootState, commit }, { value }) {
commit('setNotificationsLoading', { value }) commit('setNotificationsLoading', { value })
}, },

View File

@ -82,12 +82,18 @@ function sendSubscriptionToBackEnd (subscription, token, notificationVisibility)
return responseData return responseData
}) })
} }
export async function initServiceWorker () { export async function initServiceWorker (store) {
if (!isSWSupported()) return if (!isSWSupported()) return
await getOrCreateServiceWorker() await getOrCreateServiceWorker()
navigator.serviceWorker.addEventListener('message', (event) => { navigator.serviceWorker.addEventListener('message', (event) => {
const { dispatch } = store
console.log('SW MESSAGE', event) console.log('SW MESSAGE', event)
// TODO actually act upon click (open drawer on mobile, open chat/thread etc) const { type, ...rest } = event
switch (type) {
case 'notificationClicked':
dispatch('notificationClicked', { id: rest.id })
}
}) })
} }