diff options
Diffstat (limited to 'src/services')
| -rw-r--r-- | src/services/chat_utils/chat_utils.js | 18 | ||||
| -rw-r--r-- | src/services/desktop_notification_utils/desktop_notification_utils.js | 9 | ||||
| -rw-r--r-- | src/services/notification_utils/notification_utils.js | 40 |
3 files changed, 58 insertions, 9 deletions
diff --git a/src/services/chat_utils/chat_utils.js b/src/services/chat_utils/chat_utils.js new file mode 100644 index 00000000..7264ebcc --- /dev/null +++ b/src/services/chat_utils/chat_utils.js @@ -0,0 +1,18 @@ +import { showDesktopNotification } from '../desktop_notification_utils/desktop_notification_utils.js' + +export const maybeShowChatNotification = (store, chat) => { + if (!chat.lastMessage) return + + const opts = { + tag: chat.lastMessage.id, + title: chat.account.name, + icon: chat.account.profile_image_url, + body: chat.lastMessage.content + } + + if (chat.lastMessage.attachment && chat.lastMessage.attachment.type === 'image') { + opts.image = chat.lastMessage.attachment.preview_url + } + + showDesktopNotification(store.rootState, opts) +} diff --git a/src/services/desktop_notification_utils/desktop_notification_utils.js b/src/services/desktop_notification_utils/desktop_notification_utils.js new file mode 100644 index 00000000..b84a1f75 --- /dev/null +++ b/src/services/desktop_notification_utils/desktop_notification_utils.js @@ -0,0 +1,9 @@ +export const showDesktopNotification = (rootState, desktopNotificationOpts) => { + if (!('Notification' in window && window.Notification.permission === 'granted')) return + if (rootState.statuses.notifications.desktopNotificationSilence) { return } + + const desktopNotification = new window.Notification(desktopNotificationOpts.title, desktopNotificationOpts) + // Chrome is known for not closing notifications automatically + // according to MDN, anyway. + setTimeout(desktopNotification.close.bind(desktopNotification), 5000) +} diff --git a/src/services/notification_utils/notification_utils.js b/src/services/notification_utils/notification_utils.js index 5cc19215..d912d19f 100644 --- a/src/services/notification_utils/notification_utils.js +++ b/src/services/notification_utils/notification_utils.js @@ -1,16 +1,22 @@ import { filter, sortBy, includes } from 'lodash' +import { muteWordHits } from '../status_parser/status_parser.js' +import { showDesktopNotification } from '../desktop_notification_utils/desktop_notification_utils.js' export const notificationsFromStore = store => store.state.statuses.notifications.data -export const visibleTypes = store => ([ - store.state.config.notificationVisibility.likes && 'like', - store.state.config.notificationVisibility.mentions && 'mention', - store.state.config.notificationVisibility.repeats && 'repeat', - store.state.config.notificationVisibility.follows && 'follow', - store.state.config.notificationVisibility.followRequest && 'follow_request', - store.state.config.notificationVisibility.moves && 'move', - store.state.config.notificationVisibility.emojiReactions && 'pleroma:emoji_reaction' -].filter(_ => _)) +export const visibleTypes = store => { + const rootState = store.rootState || store.state + + return ([ + rootState.config.notificationVisibility.likes && 'like', + rootState.config.notificationVisibility.mentions && 'mention', + rootState.config.notificationVisibility.repeats && 'repeat', + rootState.config.notificationVisibility.follows && 'follow', + rootState.config.notificationVisibility.followRequest && 'follow_request', + rootState.config.notificationVisibility.moves && 'move', + rootState.config.notificationVisibility.emojiReactions && 'pleroma:emoji_reaction' + ].filter(_ => _)) +} const statusNotifications = ['like', 'mention', 'repeat', 'pleroma:emoji_reaction'] @@ -32,6 +38,22 @@ const sortById = (a, b) => { } } +const isMutedNotification = (store, notification) => { + if (!notification.status) return + return notification.status.muted || muteWordHits(notification.status, store.rootGetters.mergedConfig.muteWords).length > 0 +} + +export const maybeShowNotification = (store, notification) => { + const rootState = store.rootState || store.state + + if (notification.seen) return + if (!visibleTypes(store).includes(notification.type)) return + if (notification.type === 'mention' && isMutedNotification(store, notification)) return + + const notificationObject = prepareNotificationObject(notification, store.rootGetters.i18n) + showDesktopNotification(rootState, notificationObject) +} + export const filteredNotificationsFromStore = (store, types) => { // map is just to clone the array since sort mutates it and it causes some issues let sortedNotifications = notificationsFromStore(store).map(_ => _).sort(sortById) |
