Chatwoot/app/javascript/shared/helpers/AudioNotificationHelper.js
Sivin Varghese 050df43789
feat: Adds sound alert notification for new messages on the widget (#3181)
* feat: Adds sound alert notification for new messages on the widget

* Review fixes

* uses absolute path

* Minor fixes

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
2021-10-18 06:09:04 -07:00

100 lines
2.6 KiB
JavaScript

import { MESSAGE_TYPE } from 'shared/constants/messages';
import axios from 'axios';
import { showBadgeOnFavicon } from './faviconHelper';
export const getAlertAudio = async () => {
window.playAudioAlert = () => {};
const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
const playsound = audioBuffer => {
window.playAudioAlert = () => {
const source = audioCtx.createBufferSource();
source.buffer = audioBuffer;
source.connect(audioCtx.destination);
source.loop = false;
source.start();
};
};
try {
const response = await axios.get('/dashboard/audios/ding.mp3', {
responseType: 'arraybuffer',
});
audioCtx.decodeAudioData(response.data).then(playsound);
} catch (error) {
// error
}
};
export const notificationEnabled = (enableAudioAlerts, id, userId) => {
if (enableAudioAlerts === 'mine') {
return userId === id;
}
if (enableAudioAlerts === 'all') {
return true;
}
return false;
};
export const shouldPlayAudio = (
message,
conversationId,
userId,
isDocHidden
) => {
const {
conversation_id: incomingConvId,
sender_id: senderId,
message_type: messageType,
private: isPrivate,
} = message;
const isFromCurrentUser = userId === senderId;
const playAudio =
!isFromCurrentUser && (messageType === MESSAGE_TYPE.INCOMING || isPrivate);
if (isDocHidden) return playAudio;
if (conversationId !== incomingConvId) return playAudio;
return false;
};
export const getAssigneeFromNotification = currentConv => {
let id;
if (currentConv.meta) {
const assignee = currentConv.meta.assignee;
if (assignee) {
id = assignee.id;
}
}
return id;
};
export const newMessageNotification = data => {
const { conversation_id: currentConvId } = window.WOOT.$route.params;
const currentUserId = window.WOOT.$store.getters.getCurrentUserID;
const { conversation_id: incomingConvId } = data;
const currentConv =
window.WOOT.$store.getters.getConversationById(incomingConvId) || {};
const assigneeId = getAssigneeFromNotification(currentConv);
const isDocHidden = document.hidden;
const {
enable_audio_alerts: enableAudioAlerts = false,
} = window.WOOT.$store.getters.getUISettings;
const playAudio = shouldPlayAudio(
data,
currentConvId,
currentUserId,
isDocHidden
);
const isNotificationEnabled = notificationEnabled(
enableAudioAlerts,
currentUserId,
assigneeId
);
if (playAudio && isNotificationEnabled) {
window.playAudioAlert();
showBadgeOnFavicon();
}
};
export const playNewMessageNotificationInWidget = () => {
window.playAudioAlert();
};