summaryrefslogtreecommitdiffstats
path: root/webapp
diff options
context:
space:
mode:
authorPepijn <pepijnfens@gmail.com>2016-11-17 19:46:07 +0100
committerHarrison Healey <harrisonmhealey@gmail.com>2016-11-17 13:46:07 -0500
commit6d2882f6e70bc1c8794e0193a574dfe254b57d79 (patch)
treea9f2919afee7026c7009de7b1a5cb2010cadde34 /webapp
parenta7987149582a42e0f6d05813bc0f61fcdd6f805c (diff)
downloadchat-6d2882f6e70bc1c8794e0193a574dfe254b57d79.tar.gz
chat-6d2882f6e70bc1c8794e0193a574dfe254b57d79.tar.bz2
chat-6d2882f6e70bc1c8794e0193a574dfe254b57d79.zip
Don't show desktop notifications for messages entering the channel th… (#4216)
* Don't show desktop notifications for messages entering the channel the user is currently on Coding style fixes Allow notifications if browser tab is not focussed * Don't show desktop notifications for messages entering the channel the user is currently on Coding style fixes Allow notifications if browser tab is not focussed * Mute sound when a user doesn't get a desktop notification * Also play sound on desktop notifications * Fixed reviewer's remarks: * Removed double notification check * Removed direct links to browser store, created separate actions
Diffstat (limited to 'webapp')
-rw-r--r--webapp/actions/global_actions.jsx7
-rw-r--r--webapp/components/logged_in.jsx16
-rw-r--r--webapp/stores/notification_store.jsx22
-rw-r--r--webapp/utils/constants.jsx4
4 files changed, 45 insertions, 4 deletions
diff --git a/webapp/actions/global_actions.jsx b/webapp/actions/global_actions.jsx
index a70462295..9337595af 100644
--- a/webapp/actions/global_actions.jsx
+++ b/webapp/actions/global_actions.jsx
@@ -535,3 +535,10 @@ export function toggleSideBarAction(visible) {
});
}
}
+
+export function emitBrowserFocus(focus) {
+ AppDispatcher.handleViewAction({
+ type: ActionTypes.BROWSER_CHANGE_FOCUS,
+ focus
+ });
+}
diff --git a/webapp/components/logged_in.jsx b/webapp/components/logged_in.jsx
index ec4ca2a6a..841061d48 100644
--- a/webapp/components/logged_in.jsx
+++ b/webapp/components/logged_in.jsx
@@ -109,6 +109,10 @@ export default class LoggedIn extends React.Component {
// Listen for user
UserStore.addChangeListener(this.onUserChanged);
+ // Listen for focussed tab/window state
+ window.addEventListener('focus', this.onFocusListener);
+ window.addEventListener('blur', this.onBlurListener);
+
// ???
$('body').on('mouseenter mouseleave', '.post', function mouseOver(ev) {
if (ev.type === 'mouseenter') {
@@ -166,6 +170,10 @@ export default class LoggedIn extends React.Component {
$('.modal').off('show.bs.modal');
$(window).off('keydown.preventBackspace');
+
+ // Listen for focussed tab/window state
+ window.removeEventListener('focus', this.onFocusListener);
+ window.removeEventListener('blur', this.onBlurListener);
}
render() {
@@ -177,6 +185,14 @@ export default class LoggedIn extends React.Component {
user: this.state.user
});
}
+
+ onFocusListener() {
+ GlobalActions.emitBrowserFocus(true);
+ }
+
+ onBlurListener() {
+ GlobalActions.emitBrowserFocus(false);
+ }
}
LoggedIn.propTypes = {
diff --git a/webapp/stores/notification_store.jsx b/webapp/stores/notification_store.jsx
index dc707b50e..d5e8acb4d 100644
--- a/webapp/stores/notification_store.jsx
+++ b/webapp/stores/notification_store.jsx
@@ -26,6 +26,9 @@ class NotificationStoreClass extends EventEmitter {
removeChangeListener(callback) {
this.removeListener(CHANGE_EVENT, callback);
}
+ setFocus(focus) {
+ this.inFocus = focus;
+ }
handleRecievedPost(post, msgProps) {
// Send desktop notification
@@ -98,11 +101,21 @@ class NotificationStoreClass extends EventEmitter {
duration = parseInt(user.notify_props.desktop_duration, 10) * 1000;
}
+ //Play a sound if explicitly set in settings
const sound = !user.notify_props || user.notify_props.desktop_sound === 'true';
- Utils.notifyMe(title, body, channel, teamId, duration, !sound);
- if (sound && !UserAgent.isWindowsApp() && !UserAgent.isMacApp()) {
- Utils.ding();
+ // Notify if you're not looking in the right channel or when
+ // the window itself is not active
+ const activeChannel = ChannelStore.getCurrent();
+ const notify = activeChannel.id !== channel.id || !this.inFocus;
+
+ if (notify) {
+ Utils.notifyMe(title, body, channel, teamId, duration, !sound);
+
+ //Don't add extra sounds on native desktop clients
+ if (sound && !UserAgent.isWindowsApp() && !UserAgent.isMacApp() && !UserAgent.isMobileApp()) {
+ Utils.ding();
+ }
}
}
}
@@ -118,6 +131,9 @@ NotificationStore.dispatchToken = AppDispatcher.register((payload) => {
NotificationStore.handleRecievedPost(action.post, action.websocketMessageProps);
NotificationStore.emitChange();
break;
+ case ActionTypes.BROWSER_CHANGE_FOCUS:
+ NotificationStore.setFocus(action.focus);
+ break;
}
});
diff --git a/webapp/utils/constants.jsx b/webapp/utils/constants.jsx
index 611f8ccd0..a90c4c502 100644
--- a/webapp/utils/constants.jsx
+++ b/webapp/utils/constants.jsx
@@ -156,7 +156,9 @@ export const ActionTypes = keyMirror({
SUGGESTION_CLEAR_SUGGESTIONS: null,
SUGGESTION_COMPLETE_WORD: null,
SUGGESTION_SELECT_NEXT: null,
- SUGGESTION_SELECT_PREVIOUS: null
+ SUGGESTION_SELECT_PREVIOUS: null,
+
+ BROWSER_CHANGE_FOCUS: null
});
export const WebrtcActionTypes = keyMirror({