From 9625362494888c9423bb6503b7e18557b6b9cc79 Mon Sep 17 00:00:00 2001 From: Joram Wilander Date: Wed, 10 May 2017 07:41:12 -0400 Subject: Fix DM getting marked unread from your own message (#6373) --- webapp/components/notify_counts.jsx | 34 +--------------------------------- webapp/components/sidebar.jsx | 24 ++---------------------- webapp/stores/channel_store.jsx | 21 ++++++++++++++------- webapp/utils/channel_utils.jsx | 25 +++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 62 deletions(-) (limited to 'webapp') diff --git a/webapp/components/notify_counts.jsx b/webapp/components/notify_counts.jsx index dda352349..f05ecbf12 100644 --- a/webapp/components/notify_counts.jsx +++ b/webapp/components/notify_counts.jsx @@ -2,42 +2,10 @@ // See License.txt for license information. import * as utils from 'utils/utils.jsx'; +import {getCountsStateFromStores} from 'utils/channel_utils.jsx'; import ChannelStore from 'stores/channel_store.jsx'; import TeamStore from 'stores/team_store.jsx'; -function getCountsStateFromStores() { - let mentionCount = 0; - let messageCount = 0; - const teamMembers = TeamStore.getMyTeamMembers(); - const channels = ChannelStore.getAll(); - const members = ChannelStore.getMyMembers(); - - teamMembers.forEach((member) => { - if (member.team_id !== TeamStore.getCurrentId()) { - mentionCount += (member.mention_count || 0); - messageCount += (member.msg_count || 0); - } - }); - - channels.forEach((channel) => { - const channelMember = members[channel.id]; - if (channelMember == null) { - return; - } - - if (channel.type === 'D') { - mentionCount += channel.total_msg_count - channelMember.msg_count; - } else if (channelMember.mention_count > 0) { - mentionCount += channelMember.mention_count; - } - if (channelMember.notify_props.mark_unread !== 'mention' && channel.total_msg_count - channelMember.msg_count > 0) { - messageCount += 1; - } - }); - - return {mentionCount, messageCount}; -} - import React from 'react'; export default class NotifyCounts extends React.Component { diff --git a/webapp/components/sidebar.jsx b/webapp/components/sidebar.jsx index aa7b98be0..5784f96ba 100644 --- a/webapp/components/sidebar.jsx +++ b/webapp/components/sidebar.jsx @@ -90,28 +90,8 @@ export default class Sidebar extends React.Component { } getTotalUnreadCount() { - let msgs = 0; - let mentions = 0; - const unreadCounts = this.state.unreadCounts; - const teamMembers = this.state.teamMembers; - - teamMembers.forEach((member) => { - if (member.team_id !== this.state.currentTeam.id) { - msgs += member.msg_count || 0; - mentions += member.mention_count || 0; - } - }); - - Object.keys(unreadCounts).forEach((chId) => { - const channel = ChannelStore.get(chId); - - if (channel && (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL || channel.team_id === this.state.currentTeam.id)) { - msgs += unreadCounts[chId].msgs; - mentions += unreadCounts[chId].mentions; - } - }); - - return {msgs, mentions}; + const unreads = ChannelUtils.getCountsStateFromStores(this.state.currentTeam, this.state.teamMembers, this.state.unreadCounts); + return {msgs: unreads.messageCount, mentions: unreads.mentionCount}; } getStateFromStores() { diff --git a/webapp/stores/channel_store.jsx b/webapp/stores/channel_store.jsx index db1bead46..58a7dfb78 100644 --- a/webapp/stores/channel_store.jsx +++ b/webapp/stores/channel_store.jsx @@ -20,6 +20,7 @@ const LAST_VIEVED_EVENT = 'last_viewed'; import store from 'stores/redux_store.jsx'; import * as Selectors from 'mattermost-redux/selectors/entities/channels'; import {ChannelTypes, UserTypes} from 'mattermost-redux/action_types'; +import {batchActions} from 'redux-batched-actions'; class ChannelStoreClass extends EventEmitter { constructor(props) { @@ -456,16 +457,22 @@ class ChannelStoreClass extends EventEmitter { const channel = {...this.get(id)}; channel.total_msg_count++; - store.dispatch({ - type: ChannelTypes.RECEIVED_CHANNEL, - data: channel - }); + const actions = []; if (markRead) { - this.resetCounts([id]); - } else { - this.unreadCounts[id].msgs++; + actions.push({ + type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER, + data: {...member, msg_count: channel.total_msg_count} + }); } + + actions.push( + { + type: ChannelTypes.RECEIVED_CHANNEL, + data: channel + } + ); + store.dispatch(batchActions(actions)); } incrementMentionsIfNeeded(id, msgProps) { diff --git a/webapp/utils/channel_utils.jsx b/webapp/utils/channel_utils.jsx index 10d06fbe1..1afce39b4 100644 --- a/webapp/utils/channel_utils.jsx +++ b/webapp/utils/channel_utils.jsx @@ -5,6 +5,8 @@ const Preferences = Constants.Preferences; import * as Utils from 'utils/utils.jsx'; import UserStore from 'stores/user_store.jsx'; +import ChannelStore from 'stores/channel_store.jsx'; +import TeamStore from 'stores/team_store.jsx'; import PreferenceStore from 'stores/preference_store.jsx'; import LocalizationStore from 'stores/localization_store.jsx'; @@ -251,6 +253,29 @@ export function buildGroupChannelName(channelId) { return displayName; } +export function getCountsStateFromStores(team = TeamStore.getCurrent(), teamMembers = TeamStore.getMyTeamMembers(), unreadCounts = ChannelStore.getUnreadCounts()) { + let mentionCount = 0; + let messageCount = 0; + + teamMembers.forEach((member) => { + if (member.team_id !== TeamStore.getCurrentId()) { + mentionCount += (member.mention_count || 0); + messageCount += (member.msg_count || 0); + } + }); + + Object.keys(unreadCounts).forEach((chId) => { + const channel = ChannelStore.get(chId); + + if (channel && (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL || channel.team_id === team.id)) { + messageCount += unreadCounts[chId].msgs; + mentionCount += unreadCounts[chId].mentions; + } + }); + + return {mentionCount, messageCount}; +} + /* * not exported helpers */ -- cgit v1.2.3-1-g7c22