Skip to content

Commit 74b706d

Browse files
authored
Merge pull request oxen-io#2534 from Bilb/add-settings-audio-notifications
Add support for audio notifications Windows/MacOS/Linux
2 parents d62a9c1 + 4271e66 commit 74b706d

File tree

8 files changed

+42
-8
lines changed

8 files changed

+42
-8
lines changed

_locales/en/messages.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@
358358
"appearanceSettingsTitle": "Appearance",
359359
"privacySettingsTitle": "Privacy",
360360
"notificationsSettingsTitle": "Notifications",
361+
"audioNotificationsSettingsTitle": "Audio Notifications",
361362
"notificationsSettingsContent": "Notification Content",
362363
"notificationPreview": "Preview",
363364
"recoveryPhraseEmpty": "Enter your recovery phrase",

sound/new_message.mp3

43.5 KB
Binary file not shown.

ts/components/settings/SessionNotificationGroupSettings.tsx

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import React from 'react';
33
import useUpdate from 'react-use/lib/useUpdate';
44
import styled from 'styled-components';
55
import { SettingsKey } from '../../data/settings-key';
6+
import { isAudioNotificationSupported } from '../../types/Settings';
67
import { Notifications } from '../../util/notifications';
78
import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
89
import { SessionRadioGroup } from '../basic/SessionRadioGroup';
@@ -30,10 +31,15 @@ export const SessionNotificationGroupSettings = (props: { hasPassword: boolean |
3031
if (props.hasPassword === null) {
3132
return null;
3233
}
33-
const initialItem =
34+
35+
const initialNotificationEnabled =
3436
window.getSettingValue(SettingsKey.settingsNotification) || NOTIFICATION.MESSAGE;
3537

36-
const notificationsAreEnabled = initialItem && initialItem !== NOTIFICATION.OFF;
38+
const initialAudioNotificationEnabled =
39+
window.getSettingValue(SettingsKey.settingsAudioNotification) || false;
40+
41+
const notificationsAreEnabled =
42+
initialNotificationEnabled && initialNotificationEnabled !== NOTIFICATION.OFF;
3743

3844
const items = [
3945
{
@@ -58,7 +64,7 @@ export const SessionNotificationGroupSettings = (props: { hasPassword: boolean |
5864
{
5965
conversationId: `preview-notification-${Date.now()}`,
6066
message:
61-
items.find(m => m.value === initialItem)?.label ||
67+
items.find(m => m.value === initialNotificationEnabled)?.label ||
6268
window?.i18n?.('messageBody') ||
6369
'Message body',
6470
title: window.i18n('notificationPreview'),
@@ -83,14 +89,27 @@ export const SessionNotificationGroupSettings = (props: { hasPassword: boolean |
8389
title={window.i18n('notificationsSettingsTitle')}
8490
active={notificationsAreEnabled}
8591
/>
92+
{notificationsAreEnabled && isAudioNotificationSupported() && (
93+
<SessionToggleWithDescription
94+
onClickToggle={async () => {
95+
await window.setSettingValue(
96+
SettingsKey.settingsAudioNotification,
97+
!initialAudioNotificationEnabled
98+
);
99+
forceUpdate();
100+
}}
101+
title={window.i18n('audioNotificationsSettingsTitle')}
102+
active={initialAudioNotificationEnabled}
103+
/>
104+
)}
86105
{notificationsAreEnabled ? (
87106
<SessionSettingsItemWrapper
88107
title={window.i18n('notificationsSettingsContent')}
89108
description={window.i18n('notificationSettingsDialog')}
90109
inline={false}
91110
>
92111
<SessionRadioGroup
93-
initialItem={initialItem}
112+
initialItem={initialNotificationEnabled}
94113
group={SettingsKey.settingsNotification}
95114
items={items}
96115
onClick={async (selectedRadioValue: string) => {

ts/data/settings-key.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const settingsLinkPreview = 'link-preview-setting';
88
const settingsStartInTray = 'start-in-tray-setting';
99
const settingsOpengroupPruning = 'prune-setting';
1010
const settingsNotification = 'notification-setting';
11+
const settingsAudioNotification = 'audio-notification-setting';
1112

1213
export const SettingsKey = {
1314
settingsReadReceipt,
@@ -19,4 +20,5 @@ export const SettingsKey = {
1920
settingsStartInTray,
2021
settingsOpengroupPruning,
2122
settingsNotification,
23+
settingsAudioNotification,
2224
};

ts/test/types/Settings_test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ describe('Settings', () => {
6363
});
6464

6565
it('should return true', () => {
66-
assert.isFalse(Settings.isAudioNotificationSupported());
66+
assert.isTrue(Settings.isAudioNotificationSupported());
6767
});
6868
});
6969
});

ts/types/LocalizerKeys.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ export type LocalizerKeys =
118118
| 'appMenuUnhide'
119119
| 'timerOption_30_minutes_abbreviated'
120120
| 'pruneSettingDescription'
121+
| 'audioNotificationsSettingsTitle'
121122
| 'voiceMessage'
122123
| 'primaryColorPink'
123124
| 'changePasswordTitle'

ts/types/Settings.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import * as OS from '../OS';
22

33
const MIN_WINDOWS_VERSION = '8.0.0';
44

5-
export const isAudioNotificationSupported = () => OS.isWindows(MIN_WINDOWS_VERSION) || OS.isMacOS();
5+
export const isAudioNotificationSupported = () =>
6+
OS.isWindows(MIN_WINDOWS_VERSION) || OS.isMacOS() || OS.isLinux();
67

78
// Using `Notification::tag` has a bug on Windows 7:
89
// https://github.com/electron/electron/issues/11189

ts/util/notifications.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { debounce, last } from 'lodash';
2+
import { SettingsKey } from '../data/settings-key';
23
import { getStatus } from '../notifications';
34
import { UserSetting } from '../notifications/getStatus';
45
import { isMacOS } from '../OS';
@@ -21,6 +22,8 @@ function filter(text?: string) {
2122
.replace(/>/g, '&gt;');
2223
}
2324

25+
let sound: any;
26+
2427
export type SessionNotification = {
2528
conversationId: string;
2629
iconUrl: string | null;
@@ -117,7 +120,8 @@ function update(forceRefresh = false) {
117120
}
118121

119122
const isAppFocused = isWindowFocused();
120-
const isAudioNotificationEnabled = (Storage.get('audio-notification') as boolean) || false;
123+
const isAudioNotificationEnabled =
124+
(Storage.get(SettingsKey.settingsAudioNotification) as boolean) || false;
121125
const audioNotificationSupported = isAudioNotificationSupported();
122126
// const isNotificationGroupingSupported = Settings.isNotificationGroupingSupported();
123127
const numNotifications = currentNotifications.length;
@@ -216,10 +220,16 @@ function update(forceRefresh = false) {
216220
}
217221

218222
window.drawAttention();
223+
if (status.shouldPlayNotificationSound) {
224+
if (!sound) {
225+
sound = new Audio('sound/new_message.mp3');
226+
}
227+
void sound.play();
228+
}
219229
lastNotificationDisplayed = new Notification(title || '', {
220230
body: window.platform === 'linux' ? filter(message) : message,
221231
icon: iconUrl || undefined,
222-
silent: !status.shouldPlayNotificationSound,
232+
silent: true,
223233
});
224234
lastNotificationDisplayed.onclick = () => {
225235
window.openFromNotification(lastNotification.conversationId);

0 commit comments

Comments
 (0)