From 96906482cecb0df21c8e1a40a2ba00c13c0182a7 Mon Sep 17 00:00:00 2001 From: Joram Wilander Date: Fri, 28 Apr 2017 13:16:03 -0400 Subject: PLT-6214 Move channel store and actions over to redux (#6235) * Move channel store and actions over to redux * Fix style errors * Fix unit test * Various fixes * More fixes * Revert config changes --- webapp/stores/channel_store.jsx | 171 +++++++++++++++++++++++++--------------- 1 file changed, 108 insertions(+), 63 deletions(-) (limited to 'webapp/stores') diff --git a/webapp/stores/channel_store.jsx b/webapp/stores/channel_store.jsx index 8530d0620..d33f3ac9a 100644 --- a/webapp/stores/channel_store.jsx +++ b/webapp/stores/channel_store.jsx @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See License.txt for license information. -import AppDispatcher from '../dispatcher/app_dispatcher.jsx'; +import AppDispatcher from 'dispatcher/app_dispatcher.jsx'; import EventEmitter from 'events'; import TeamStore from 'stores/team_store.jsx'; @@ -17,21 +17,44 @@ const CHANGE_EVENT = 'change'; const STATS_EVENT = 'stats'; 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'; + class ChannelStoreClass extends EventEmitter { constructor(props) { super(props); this.setMaxListeners(600); this.clear(); + + this.entities = store.getState().entities.channels; + + store.subscribe(() => { + const newEntities = store.getState().entities.channels; + + if (newEntities.currentTeamId !== this.entities.currentChannelId) { + this.emitChange(); + } + if (newEntities.channels !== this.entities.channels) { + this.emitChange(); + } + if (newEntities.myMembers !== this.entities.myMembers) { + this.setUnreadCountsByMembers(Object.values(newEntities.myMembers)); + this.emitChange(); + } + if (newEntities.membersInChannel !== this.entities.membersInChannel) { + this.emitChange(); + } + if (newEntities.stats !== this.entities.stats) { + this.emitStatsChange(); + } + + this.entities = newEntities; + }); } clear() { - this.currentId = null; this.postMode = this.POST_MODE_CHANNEL; - this.channels = []; - this.members_in_channel = {}; - this.myChannelMembers = {}; - this.moreChannels = {}; - this.stats = {}; this.unreadCounts = {}; } @@ -126,17 +149,25 @@ class ChannelStoreClass extends EventEmitter { } setCurrentId(id) { - this.currentId = id; + store.dispatch({ + type: ChannelTypes.SELECT_CHANNEL, + data: id + }); } resetCounts(id) { - const cm = this.myChannelMembers; - for (const cmid in cm) { - if (cm[cmid].channel_id === id) { + const members = Object.assign({}, this.getMyMembers()); + for (const cmid in members) { + if (!members.hasOwnProperty(cmid)) { + continue; + } + const member = {...members[cmid]}; + if (member.channel_id === id) { const channel = this.get(id); if (channel) { - cm[cmid].msg_count = channel.total_msg_count; - cm[cmid].mention_count = 0; + member.msg_count = channel.total_msg_count; + member.mention_count = 0; + this.storeMyChannelMember(member); this.setUnreadCountByChannel(id); } break; @@ -145,7 +176,7 @@ class ChannelStoreClass extends EventEmitter { } getCurrentId() { - return this.currentId; + return Selectors.getCurrentChannelId(store.getState()); } getCurrent() { @@ -176,7 +207,7 @@ class ChannelStoreClass extends EventEmitter { let stats; if (channelId) { - stats = this.stats[channelId]; + stats = Selectors.getAllChannelStats(store.getState())[channelId]; } if (stats) { @@ -214,54 +245,67 @@ class ChannelStoreClass extends EventEmitter { } storeChannels(channels) { - this.channels = channels; + store.dispatch({ + type: ChannelTypes.RECEIVED_CHANNELS, + data: channels, + teamId: channels[0].team_id + }); } getChannels() { - return this.channels; + return Selectors.getMyChannels(store.getState()); } getChannelById(id) { - return this.channels.filter((c) => c.id === id)[0]; + return Selectors.getChannelsInCurrentTeam(store.getState())[id]; } storeMyChannelMember(channelMember) { - const members = Object.assign({}, this.getMyMembers()); - members[channelMember.channel_id] = channelMember; - this.storeMyChannelMembers(members); + store.dispatch({ + type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER, + data: channelMember + }); } storeMyChannelMembers(channelMembers) { - this.myChannelMembers = channelMembers; + store.dispatch({ + type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBERS, + data: Object.values(channelMembers) + }); } storeMyChannelMembersList(channelMembers) { - channelMembers.forEach((m) => { - this.myChannelMembers[m.channel_id] = m; + store.dispatch({ + type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBERS, + data: channelMembers }); } getMyMembers() { - return this.myChannelMembers; + return Selectors.getMyChannelMemberships(store.getState()); } saveMembersInChannel(channelId = this.getCurrentId(), members) { - const oldMembers = this.members_in_channel[channelId] || {}; - this.members_in_channel[channelId] = Object.assign({}, oldMembers, members); + store.dispatch({ + type: ChannelTypes.RECEIVED_CHANNEL_MEMBERS, + data: Object.values(members) + }); } removeMemberInChannel(channelId = this.getCurrentId(), userId) { - if (this.members_in_channel[channelId]) { - Reflect.deleteProperty(this.members_in_channel[channelId], userId); - } + store.dispatch({ + type: UserTypes.RECEIVED_PROFILE_NOT_IN_CHANNEL, + data: {id: channelId, user_id: userId} + }); } getMembersInChannel(channelId = this.getCurrentId()) { - return Object.assign({}, this.members_in_channel[channelId]) || {}; + return Selectors.getChannelMembersInChannels(store.getState())[channelId] || {}; } hasActiveMemberInChannel(channelId = this.getCurrentId(), userId) { - if (this.members_in_channel[channelId] && this.members_in_channel[channelId][userId]) { + const members = this.getMembersInChannel(channelId); + if (members && members[userId]) { return true; } @@ -269,33 +313,24 @@ class ChannelStoreClass extends EventEmitter { } storeMoreChannels(channels, teamId = TeamStore.getCurrentId()) { - const newChannels = {}; - for (let i = 0; i < channels.length; i++) { - newChannels[channels[i].id] = channels[i]; - } - this.moreChannels[teamId] = Object.assign({}, this.moreChannels[teamId], newChannels); - } - - removeMoreChannel(channelId, teamId = TeamStore.getCurrentId()) { - Reflect.deleteProperty(this.moreChannels[teamId], channelId); - } - - getMoreChannels(teamId = TeamStore.getCurrentId()) { - return Object.assign({}, this.moreChannels[teamId]); + store.dispatch({ + type: ChannelTypes.RECEIVED_CHANNELS, + data: channels, + teamId + }); } - getMoreChannelsList(teamId = TeamStore.getCurrentId()) { - const teamChannels = this.moreChannels[teamId] || {}; - - if (!ChannelUtils) { - ChannelUtils = require('utils/channel_utils.jsx'); //eslint-disable-line global-require - } - - return Object.keys(teamChannels).map((cid) => teamChannels[cid]).sort(ChannelUtils.sortChannelsByDisplayName); + getMoreChannels() { + const channels = Selectors.getOtherChannels(store.getState()); + const channelMap = {}; + channels.forEach((c) => { + channelMap[c.id] = c; + }); + return channelMap; } - storeStats(stats) { - this.stats = stats; + getMoreChannelsList() { + return Selectors.getOtherChannels(store.getState()); } isDefault(channel) { @@ -317,8 +352,8 @@ class ChannelStoreClass extends EventEmitter { } setUnreadCountsByCurrentMembers() { - Object.keys(this.myChannelMembers).forEach((key) => { - this.setUnreadCountByChannel(this.myChannelMembers[key].channel_id); + Object.keys(this.getMyMembers()).forEach((key) => { + this.setUnreadCountByChannel(this.getMyMember(key).channel_id); }); } @@ -415,7 +450,12 @@ class ChannelStoreClass extends EventEmitter { return; } - this.get(id).total_msg_count++; + const channel = {...this.get(id)}; + channel.total_msg_count++; + store.dispatch({ + type: ChannelTypes.RECEIVED_CHANNEL, + data: channel + }); if (markRead) { this.resetCounts(id); @@ -436,7 +476,12 @@ class ChannelStoreClass extends EventEmitter { if (mentions.indexOf(UserStore.getCurrentId()) !== -1) { this.unreadCounts[id].mentions++; - this.getMyMember(id).mention_count++; + const member = {...this.getMyMember(id)}; + member.mention_count++; + store.dispatch({ + type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER, + data: member + }); } } } @@ -510,10 +555,10 @@ ChannelStore.dispatchToken = AppDispatcher.register((payload) => { ChannelStore.emitChange(); break; case ActionTypes.RECEIVED_CHANNEL_STATS: - var stats = Object.assign({}, ChannelStore.getStats()); - stats[action.stats.channel_id] = action.stats; - ChannelStore.storeStats(stats); - ChannelStore.emitStatsChange(); + store.dispatch({ + type: ChannelTypes.RECEIVED_CHANNEL_STATS, + data: action.stats + }); break; case ActionTypes.RECEIVED_POST: -- cgit v1.2.3-1-g7c22