From dc6e153b92adb8b34ace30f7974e6f8e441083b2 Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Fri, 18 Mar 2022 04:37:11 +0100 Subject: [PATCH] Notification sounds (#367) * Basic notification sound support * Add settings option for notification sounds * Allow sound without desktop notifications --- public/sound/notification.ogg | Bin 0 -> 11295 bytes src/app/organisms/settings/Settings.jsx | 18 +++++++- src/client/action/settings.js | 6 +++ src/client/state/Notifications.js | 59 +++++++++++++++--------- src/client/state/cons.js | 2 + src/client/state/settings.js | 15 ++++++ webpack.common.js | 2 +- 7 files changed, 78 insertions(+), 24 deletions(-) create mode 100755 public/sound/notification.ogg diff --git a/public/sound/notification.ogg b/public/sound/notification.ogg new file mode 100755 index 0000000000000000000000000000000000000000..93b3a0144e69dc584f2e08e52e5547d6d9fa3f59 GIT binary patch literal 11295 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 p2{kD}AUtgCx!bC2^5y%rZxvo|e5jQE+_&Show notifications when new messages arrive.} /> + { toggleNotificationSounds(); updateState({}); }} + /> + )} + content={Play a sound when new messages arrive.} + /> ); } @@ -200,7 +210,7 @@ function AboutSection() {
Cinny logo
- + Cinny {`v${cons.version}`} @@ -223,6 +233,10 @@ function AboutSection() { {/* eslint-disable-next-line react/jsx-one-expression-per-line */ } The Twemoji emoji art is © Twitter, Inc and other contributors used under the terms of CC-BY 4.0. +
  • + {/* eslint-disable-next-line react/jsx-one-expression-per-line */ } + The Material sound resources are © Google used under the terms of CC-BY 4.0. +
  • diff --git a/src/client/action/settings.js b/src/client/action/settings.js index 1192341..7b539c8 100644 --- a/src/client/action/settings.js +++ b/src/client/action/settings.js @@ -36,3 +36,9 @@ export function toggleNotifications() { type: cons.actions.settings.TOGGLE_NOTIFICATIONS, }); } + +export function toggleNotificationSounds() { + appDispatcher.dispatch({ + type: cons.actions.settings.TOGGLE_NOTIFICATION_SOUNDS, + }); +} diff --git a/src/client/state/Notifications.js b/src/client/state/Notifications.js index 11fd665..7bcd950 100644 --- a/src/client/state/Notifications.js +++ b/src/client/state/Notifications.js @@ -6,6 +6,8 @@ import cons from './cons'; import navigation from './navigation'; import settings from './settings'; +import NotificationSound from '../../../public/sound/notification.ogg'; + function isNotifEvent(mEvent) { const eType = mEvent.getType(); if (!cons.supportEventTypes.includes(eType)) return false; @@ -185,7 +187,7 @@ class Notifications extends EventEmitter { } async _displayPopupNoti(mEvent, room) { - if (!settings.showNotifications) return; + if (!settings.showNotifications && !settings.isNotificationSounds) return; const actions = this.matrixClient.getPushActionsForEvent(mEvent); if (!actions?.notify) return; @@ -196,28 +198,43 @@ class Notifications extends EventEmitter { await mEvent.attemptDecryption(this.matrixClient.crypto); } - let title; - if (!mEvent.sender || room.name === mEvent.sender.name) { - title = room.name; - } else if (mEvent.sender) { - title = `${mEvent.sender.name} (${room.name})`; + if (settings.showNotifications) { + let title; + if (!mEvent.sender || room.name === mEvent.sender.name) { + title = room.name; + } else if (mEvent.sender) { + title = `${mEvent.sender.name} (${room.name})`; + } + + const iconSize = 36; + const icon = await renderAvatar({ + text: mEvent.sender.name, + bgColor: cssColorMXID(mEvent.getSender()), + imageSrc: mEvent.sender?.getAvatarUrl(this.matrixClient.baseUrl, iconSize, iconSize, 'crop'), + size: iconSize, + borderRadius: 8, + scale: 8, + }); + + const noti = new window.Notification(title, { + body: mEvent.getContent().body, + icon, + silent: settings.isNotificationSounds, + }); + if (settings.isNotificationSounds) { + noti.onshow = () => this._playNotiSounds(); + } + noti.onclick = () => selectRoom(room.roomId, mEvent.getId()); + } else { + this._playNotiSounds(); } + } - const iconSize = 36; - const icon = await renderAvatar({ - text: mEvent.sender.name, - bgColor: cssColorMXID(mEvent.getSender()), - imageSrc: mEvent.sender?.getAvatarUrl(this.matrixClient.baseUrl, iconSize, iconSize, 'crop'), - size: iconSize, - borderRadius: 8, - scale: 8, - }); - - const noti = new window.Notification(title, { - body: mEvent.getContent().body, - icon, - }); - noti.onclick = () => selectRoom(room.roomId, mEvent.getId()); + _playNotiSounds() { + if (!this._notiAudio) { + this._notiAudio = new Audio(NotificationSound); + } + this._notiAudio.play(); } _listenEvents() { diff --git a/src/client/state/cons.js b/src/client/state/cons.js index 6ec6c27..862bf5c 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -67,6 +67,7 @@ const cons = { TOGGLE_MEMBERSHIP_EVENT: 'TOGGLE_MEMBERSHIP_EVENT', TOGGLE_NICKAVATAR_EVENT: 'TOGGLE_NICKAVATAR_EVENT', TOGGLE_NOTIFICATIONS: 'TOGGLE_NOTIFICATIONS', + TOGGLE_NOTIFICATION_SOUNDS: 'TOGGLE_NOTIFICATION_SOUNDS', }, }, events: { @@ -135,6 +136,7 @@ const cons = { MEMBERSHIP_EVENTS_TOGGLED: 'MEMBERSHIP_EVENTS_TOGGLED', NICKAVATAR_EVENTS_TOGGLED: 'NICKAVATAR_EVENTS_TOGGLED', NOTIFICATIONS_TOGGLED: 'NOTIFICATIONS_TOGGLED', + NOTIFICATION_SOUNDS_TOGGLED: 'NOTIFICATION_SOUNDS_TOGGLED', }, }, }; diff --git a/src/client/state/settings.js b/src/client/state/settings.js index 25d0b2d..0f476ef 100644 --- a/src/client/state/settings.js +++ b/src/client/state/settings.js @@ -29,6 +29,7 @@ class Settings extends EventEmitter { this.hideMembershipEvents = this.getHideMembershipEvents(); this.hideNickAvatarEvents = this.getHideNickAvatarEvents(); this._showNotifications = this.getShowNotifications(); + this.isNotificationSounds = this.getIsNotificationSounds(); this.isTouchScreenDevice = ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0); } @@ -125,6 +126,15 @@ class Settings extends EventEmitter { return settings.showNotifications; } + getIsNotificationSounds() { + if (typeof this.isNotificationSounds === 'boolean') return this.isNotificationSounds; + + const settings = getSettings(); + if (settings === null) return true; + if (typeof settings.isNotificationSounds === 'undefined') return true; + return settings.isNotificationSounds; + } + setter(action) { const actions = { [cons.actions.settings.TOGGLE_SYSTEM_THEME]: () => { @@ -164,6 +174,11 @@ class Settings extends EventEmitter { setSettings('showNotifications', this._showNotifications); this.emit(cons.events.settings.NOTIFICATIONS_TOGGLED, this._showNotifications); }, + [cons.actions.settings.TOGGLE_NOTIFICATION_SOUNDS]: () => { + this.isNotificationSounds = !this.isNotificationSounds; + setSettings('isNotificationSounds', this.isNotificationSounds); + this.emit(cons.events.settings.NOTIFICATION_SOUNDS_TOGGLED, this.isNotificationSounds); + }, }; actions[action.type]?.(); diff --git a/webpack.common.js b/webpack.common.js index dd45a06..9ff58da 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -39,7 +39,7 @@ module.exports = { use: ['html-loader'], }, { - test: /\.(png|jpe?g|gif|otf|ttf|woff|woff2)$/, + test: /\.(png|jpe?g|gif|otf|ttf|woff|woff2|ogg)$/, type: 'asset/resource', }, {