From 02a687b226ad91897c9642ddebc7e55fab47c4ce Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Thu, 29 Dec 2022 23:51:23 +0530
Subject: [PATCH] feat: Add new audio alert options (#6141)
Co-authored-by: Pranav Raj S
---
.../dashboard/i18n/locale/en/settings.json | 16 +-
.../settings/profile/NotificationSettings.vue | 204 ++++++++++++++----
app/javascript/shared/assets/audio/bell.mp3 | Bin 0 -> 85518 bytes
.../shared/helpers/AudioNotificationHelper.js | 23 +-
public/audio/dashboard/bell.mp3 | Bin 0 -> 85518 bytes
5 files changed, 191 insertions(+), 52 deletions(-)
create mode 100644 app/javascript/shared/assets/audio/bell.mp3
create mode 100644 public/audio/dashboard/bell.mp3
diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json
index e8eac0e8e..f87e59930 100644
--- a/app/javascript/dashboard/i18n/locale/en/settings.json
+++ b/app/javascript/dashboard/i18n/locale/en/settings.json
@@ -58,9 +58,19 @@
"AUDIO_NOTIFICATIONS_SECTION": {
"TITLE": "Audio Notifications",
"NOTE": "Enable audio notifications in dashboard for new messages and conversations.",
- "NONE": "None",
- "ASSIGNED": "Assigned Conversations",
- "ALL_CONVERSATIONS": "All Conversations"
+ "ALERT_TYPE": {
+ "TITLE": "Alert types:",
+ "NONE": "None",
+ "ASSIGNED": "Assigned Conversations",
+ "ALL_CONVERSATIONS": "All Conversations"
+ },
+ "DEFAULT_TONE": {
+ "TITLE": "Default tone:"
+ },
+ "CONDITIONS": {
+ "TITLE": "Conditions:",
+ "CONDITION_ONE": "Send audio alerts only if the browser window is not active"
+ }
},
"EMAIL_NOTIFICATIONS_SECTION": {
"TITLE": "Email Notifications",
diff --git a/app/javascript/dashboard/routes/dashboard/settings/profile/NotificationSettings.vue b/app/javascript/dashboard/routes/dashboard/settings/profile/NotificationSettings.vue
index 60584d726..af8f14f8f 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/profile/NotificationSettings.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/profile/NotificationSettings.vue
@@ -10,50 +10,115 @@
-
-
-
-
-
-
-
-
-
-
-
@@ -257,6 +322,18 @@ export default {
selectedPushFlags: [],
enableAudioAlerts: false,
hasEnabledPushPermissions: false,
+ playAudioWhenTabIsInactive: false,
+ notificationTone: 'ding',
+ notificationAlertTones: [
+ {
+ value: 'ding',
+ label: 'Ding',
+ },
+ {
+ value: 'bell',
+ label: 'Bell',
+ },
+ ],
};
},
computed: {
@@ -280,20 +357,27 @@ export default {
this.selectedPushFlags = value;
},
uiSettings(value) {
- const { enable_audio_alerts: enableAudio = false } = value;
- this.enableAudioAlerts = enableAudio;
+ this.notificationUISettings(value);
},
},
mounted() {
if (hasPushPermissions()) {
this.getPushSubscription();
}
-
+ this.notificationUISettings(this.uiSettings);
this.$store.dispatch('userNotificationSettings/get');
- const { enable_audio_alerts: enableAudio = false } = this.uiSettings;
- this.enableAudioAlerts = enableAudio;
},
methods: {
+ notificationUISettings(uiSettings) {
+ const {
+ enable_audio_alerts: enableAudio = false,
+ always_play_audio_alert: alwaysPlayAudioAlert,
+ notification_tone: notificationTone,
+ } = uiSettings;
+ this.enableAudioAlerts = enableAudio;
+ this.playAudioWhenTabIsInactive = !alwaysPlayAudioAlert;
+ this.notificationTone = notificationTone || 'ding';
+ },
onRegistrationSuccess() {
this.hasEnabledPushPermissions = true;
},
@@ -351,6 +435,19 @@ export default {
});
this.showAlert(this.$t('PROFILE_SETTINGS.FORM.API.UPDATE_SUCCESS'));
},
+ handleAudioAlertConditions(e) {
+ let condition = e.target.value;
+ if (condition === 'tab_is_inactive') {
+ this.updateUISettings({
+ always_play_audio_alert: !e.target.checked,
+ });
+ }
+ this.showAlert(this.$t('PROFILE_SETTINGS.FORM.API.UPDATE_SUCCESS'));
+ },
+ handleAudioToneChange(e) {
+ this.updateUISettings({ notification_tone: e.target.value });
+ this.showAlert(this.$t('PROFILE_SETTINGS.FORM.API.UPDATE_SUCCESS'));
+ },
toggleInput(selected, current) {
if (selected.includes(current)) {
const newSelectedFlags = selected.filter(flag => flag !== current);
@@ -372,4 +469,21 @@ export default {
.push-notification--button {
margin-bottom: var(--space-one);
}
+
+.notification-items--wrapper {
+ margin-bottom: var(--space-smaller);
+}
+
+.notification-label {
+ display: flex;
+ font-weight: var(--font-weight-bold);
+ margin-bottom: var(--space-small);
+}
+
+.tone-selector {
+ height: var(--space-large);
+ padding-bottom: var(--space-micro);
+ padding-top: var(--space-micro);
+ width: var(--space-mega);
+}
diff --git a/app/javascript/shared/assets/audio/bell.mp3 b/app/javascript/shared/assets/audio/bell.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..77087072fc966da3516b54a6f01879934e758711
GIT binary patch
literal 85518
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