diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index b7abc18c2..e021b1ec7 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -21,6 +21,7 @@ import i18n from '../dashboard/i18n'; import createAxios from '../dashboard/helper/APIHelper'; import commonHelpers from '../dashboard/helper/commons'; import { getAlertAudio } from '../shared/helpers/AudioNotificationHelper'; +import { initFaviconSwitcher } from '../shared/helpers/faviconHelper'; import router from '../dashboard/routes'; import store from '../dashboard/store'; import vueActionCable from '../dashboard/helper/actionCable'; @@ -80,4 +81,5 @@ window.addEventListener('load', () => { }) ); getAlertAudio(); + initFaviconSwitcher(); }); diff --git a/app/javascript/shared/helpers/AudioNotificationHelper.js b/app/javascript/shared/helpers/AudioNotificationHelper.js index 90d3bcdaa..8aeb32b91 100644 --- a/app/javascript/shared/helpers/AudioNotificationHelper.js +++ b/app/javascript/shared/helpers/AudioNotificationHelper.js @@ -1,6 +1,7 @@ import { MESSAGE_TYPE } from 'shared/constants/messages'; const notificationAudio = require('shared/assets/audio/ding.mp3'); import axios from 'axios'; +import { showBadgeOnFavicon } from './faviconHelper'; export const playNotificationAudio = () => { try { @@ -74,5 +75,6 @@ export const newMessageNotification = data => { if (enableAudioAlerts && playAudio) { window.playAudioAlert(); + showBadgeOnFavicon(); } }; diff --git a/app/javascript/shared/helpers/faviconHelper.js b/app/javascript/shared/helpers/faviconHelper.js new file mode 100644 index 000000000..6adc45c60 --- /dev/null +++ b/app/javascript/shared/helpers/faviconHelper.js @@ -0,0 +1,21 @@ +export const showBadgeOnFavicon = () => { + const favicons = document.querySelectorAll('.favicon'); + + favicons.forEach(favicon => { + const newFileName = `/favicon-badge-${favicon.sizes[[0]]}.png`; + favicon.href = newFileName; + }); +}; + +export const initFaviconSwitcher = () => { + const favicons = document.querySelectorAll('.favicon'); + + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible') { + favicons.forEach(favicon => { + const oldFileName = `/favicon-${favicon.sizes[[0]]}.png`; + favicon.href = oldFileName; + }); + } + }); +}; diff --git a/app/views/layouts/vueapp.html.erb b/app/views/layouts/vueapp.html.erb index 6ec5e5c01..b9350e3b9 100644 --- a/app/views/layouts/vueapp.html.erb +++ b/app/views/layouts/vueapp.html.erb @@ -23,9 +23,9 @@ - - - + + + <% end %> diff --git a/public/favicon-badge-16x16.png b/public/favicon-badge-16x16.png new file mode 100644 index 000000000..325f31785 Binary files /dev/null and b/public/favicon-badge-16x16.png differ diff --git a/public/favicon-badge-32x32.png b/public/favicon-badge-32x32.png new file mode 100644 index 000000000..e68f6912f Binary files /dev/null and b/public/favicon-badge-32x32.png differ diff --git a/public/favicon-badge-96x96.png b/public/favicon-badge-96x96.png new file mode 100644 index 000000000..20ab1bde0 Binary files /dev/null and b/public/favicon-badge-96x96.png differ