diff options
-rw-r--r-- | api/command_msg.go | 1 | ||||
-rw-r--r-- | api/post_test.go | 36 | ||||
-rw-r--r-- | app/channel.go | 55 | ||||
-rw-r--r-- | app/post.go | 8 | ||||
-rw-r--r-- | webapp/actions/post_actions.jsx | 5 | ||||
-rw-r--r-- | webapp/actions/user_actions.jsx | 46 | ||||
-rw-r--r-- | webapp/root.jsx | 5 | ||||
-rw-r--r-- | webapp/routes/route_team.jsx | 9 |
8 files changed, 61 insertions, 104 deletions
diff --git a/api/command_msg.go b/api/command_msg.go index f7f31ed9a..0520bf7f6 100644 --- a/api/command_msg.go +++ b/api/command_msg.go @@ -80,7 +80,6 @@ func (me *msgProvider) DoCommand(c *Context, args *model.CommandArgs, message st targetChannelId = channel.Data.(*model.Channel).Id } - app.MakeDirectChannelVisible(targetChannelId) if len(parsedMessage) > 0 { post := &model.Post{} post.Message = parsedMessage diff --git a/api/post_test.go b/api/post_test.go index 260a4eb2c..ddcce2e59 100644 --- a/api/post_test.go +++ b/api/post_test.go @@ -1058,42 +1058,6 @@ func TestFuzzyPosts(t *testing.T) { } } -func TestMakeDirectChannelVisible(t *testing.T) { - th := Setup().InitBasic() - Client := th.BasicClient - team := th.BasicTeam - user1 := th.BasicUser - user2 := th.BasicUser2 - - th.LoginBasic2() - - preferences := &model.Preferences{ - { - UserId: user2.Id, - Category: model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW, - Name: user1.Id, - Value: "false", - }, - } - Client.Must(Client.SetPreferences(preferences)) - - Client.Must(Client.Logout()) - th.LoginBasic() - th.BasicClient.SetTeamId(team.Id) - - channel := Client.Must(Client.CreateDirectChannel(user2.Id)).Data.(*model.Channel) - - if err := app.MakeDirectChannelVisible(channel.Id); err != nil { - t.Fatal(err) - } - - if result, err := Client.GetPreference(model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW, user2.Id); err != nil { - t.Fatal("Errored trying to set direct channel to be visible for user1") - } else if pref := result.Data.(*model.Preference); pref.Value != "true" { - t.Fatal("Failed to set direct channel to be visible for user1") - } -} - func TestGetFlaggedPosts(t *testing.T) { th := Setup().InitBasic() Client := th.BasicClient diff --git a/app/channel.go b/app/channel.go index a95a38327..4d02817f6 100644 --- a/app/channel.go +++ b/app/channel.go @@ -14,61 +14,6 @@ import ( "github.com/mattermost/platform/utils" ) -func MakeDirectChannelVisible(channelId string) *model.AppError { - var members model.ChannelMembers - if result := <-Srv.Store.Channel().GetMembers(channelId, 0, 100); result.Err != nil { - return result.Err - } else { - members = *(result.Data.(*model.ChannelMembers)) - } - - if len(members) != 2 { - return model.NewLocAppError("MakeDirectChannelVisible", "api.post.make_direct_channel_visible.get_2_members.error", map[string]interface{}{"ChannelId": channelId}, "") - } - - // make sure the channel is visible to both members - for i, member := range members { - otherUserId := members[1-i].UserId - - if result := <-Srv.Store.Preference().Get(member.UserId, model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW, otherUserId); result.Err != nil { - // create a new preference since one doesn't exist yet - preference := &model.Preference{ - UserId: member.UserId, - Category: model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW, - Name: otherUserId, - Value: "true", - } - - if saveResult := <-Srv.Store.Preference().Save(&model.Preferences{*preference}); saveResult.Err != nil { - return saveResult.Err - } else { - message := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_PREFERENCE_CHANGED, "", "", member.UserId, nil) - message.Add("preference", preference.ToJson()) - - go Publish(message) - } - } else { - preference := result.Data.(model.Preference) - - if preference.Value != "true" { - // update the existing preference to make the channel visible - preference.Value = "true" - - if updateResult := <-Srv.Store.Preference().Save(&model.Preferences{preference}); updateResult.Err != nil { - return updateResult.Err - } else { - message := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_PREFERENCE_CHANGED, "", "", member.UserId, nil) - message.Add("preference", preference.ToJson()) - - go Publish(message) - } - } - } - } - - return nil -} - func CreateDefaultChannels(teamId string) ([]*model.Channel, *model.AppError) { townSquare := &model.Channel{DisplayName: utils.T("api.channel.create_default_channels.town_square"), Name: "town-square", Type: model.CHANNEL_OPEN, TeamId: teamId} diff --git a/app/post.go b/app/post.go index dd8712e85..da4aa506b 100644 --- a/app/post.go +++ b/app/post.go @@ -166,14 +166,6 @@ func handlePostEvents(post *model.Post, teamId string, triggerWebhooks bool) *mo }() } - if channel.Type == model.CHANNEL_DIRECT { - go func() { - if err := MakeDirectChannelVisible(post.ChannelId); err != nil { - l4g.Error(err.Error()) - } - }() - } - return nil } diff --git a/webapp/actions/post_actions.jsx b/webapp/actions/post_actions.jsx index 633a6f66a..81ef73fc5 100644 --- a/webapp/actions/post_actions.jsx +++ b/webapp/actions/post_actions.jsx @@ -8,6 +8,7 @@ import PostStore from 'stores/post_store.jsx'; import UserStore from 'stores/user_store.jsx'; import {loadStatusesForChannel} from 'actions/status_actions.jsx'; +import {loadNewDMIfNeeded} from 'actions/user_actions.jsx'; import Client from 'client/web_client.jsx'; import * as AsyncClient from 'utils/async_client.jsx'; @@ -22,6 +23,10 @@ export function handleNewPost(post, msg) { websocketMessageProps = msg.data; } + if (msg && msg.data && msg.data.channel_type === Constants.DM_CHANNEL) { + loadNewDMIfNeeded(post.user_id); + } + if (post.root_id && PostStore.getPost(post.channel_id, post.root_id) == null) { Client.getPost( post.channel_id, diff --git a/webapp/actions/user_actions.jsx b/webapp/actions/user_actions.jsx index 94777bc45..43881a188 100644 --- a/webapp/actions/user_actions.jsx +++ b/webapp/actions/user_actions.jsx @@ -16,7 +16,7 @@ import {getDirectChannelName} from 'utils/utils.jsx'; import * as AsyncClient from 'utils/async_client.jsx'; import Client from 'client/web_client.jsx'; -import {ActionTypes, Preferences} from 'utils/constants.jsx'; +import {Constants, ActionTypes, Preferences} from 'utils/constants.jsx'; import {browserHistory} from 'react-router/es6'; export function switchFromLdapToEmail(email, password, token, ldapPassword, onSuccess, onError) { @@ -225,6 +225,19 @@ function populateDMChannelsWithProfiles(userIds) { } } +export function loadNewDMIfNeeded(userId) { + if (userId === UserStore.getCurrentId()) { + return; + } + + const pref = PreferenceStore.get(Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, userId, 'false'); + if (pref === 'false') { + PreferenceStore.setPreference(Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, userId, 'true'); + AsyncClient.savePreference(Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, userId, 'true'); + loadProfilesAndTeamMembersForDMSidebar(); + } +} + export function loadProfilesAndTeamMembersForDMSidebar() { const dmPrefs = PreferenceStore.getCategory(Preferences.CATEGORY_DIRECT_CHANNEL_SHOW); const teamId = TeamStore.getCurrentId(); @@ -240,6 +253,37 @@ export function loadProfilesAndTeamMembersForDMSidebar() { } } + const channelMembers = ChannelStore.getMyMembers(); + const channels = ChannelStore.getChannels(); + const newPreferences = []; + for (let i = 0; i < channels.length; i++) { + const channel = channels[i]; + if (channel.type !== Constants.DM_CHANNEL) { + continue; + } + + const member = channelMembers[channel.id]; + if (!member) { + continue; + } + + const teammateId = channel.name.replace(member.user_id, '').replace('__', ''); + + if (member.mention_count > 0 && membersToLoad.indexOf(teammateId) === -1) { + membersToLoad.push(teammateId); + newPreferences.push({ + user_id: UserStore.getCurrentId(), + category: Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, + name: teammateId, + value: 'true' + }); + } + } + + if (newPreferences.length > 0) { + AsyncClient.savePreferences(newPreferences); + } + if (profilesToLoad.length > 0) { Client.getProfilesByIds( profilesToLoad, diff --git a/webapp/root.jsx b/webapp/root.jsx index 93cfa5a38..98c744477 100644 --- a/webapp/root.jsx +++ b/webapp/root.jsx @@ -12,6 +12,7 @@ import * as GlobalActions from 'actions/global_actions.jsx'; import * as Websockets from 'actions/websocket_actions.jsx'; import BrowserStore from 'stores/browser_store.jsx'; import ChannelStore from 'stores/channel_store.jsx'; +import UserStore from 'stores/user_store.jsx'; import * as I18n from 'i18n/i18n.jsx'; import * as AsyncClient from 'utils/async_client.jsx'; @@ -60,7 +61,9 @@ function preRenderSetup(callwhendone) { $(window).on('beforeunload', () => { BrowserStore.setLastServerVersion(''); - AsyncClient.viewChannel('', ChannelStore.getCurrentId() || ''); + if (UserStore.getCurrentUser()) { + AsyncClient.viewChannel('', ChannelStore.getCurrentId() || ''); + } Websockets.close(); } ); diff --git a/webapp/routes/route_team.jsx b/webapp/routes/route_team.jsx index cacb8dd20..44a8c1eb6 100644 --- a/webapp/routes/route_team.jsx +++ b/webapp/routes/route_team.jsx @@ -13,6 +13,7 @@ import AppDispatcher from 'dispatcher/app_dispatcher.jsx'; import Constants from 'utils/constants.jsx'; const ActionTypes = Constants.ActionTypes; import * as AsyncClient from 'utils/async_client.jsx'; +import * as Utils from 'utils/utils.jsx'; import Client from 'client/web_client.jsx'; import ChannelStore from 'stores/channel_store.jsx'; import BrowserStore from 'stores/browser_store.jsx'; @@ -20,7 +21,7 @@ import BrowserStore from 'stores/browser_store.jsx'; import emojiRoute from 'routes/route_emoji.jsx'; import integrationsRoute from 'routes/route_integrations.jsx'; -import {loadProfilesAndTeamMembersForDMSidebar} from 'actions/user_actions.jsx'; +import {loadNewDMIfNeeded, loadProfilesAndTeamMembersForDMSidebar} from 'actions/user_actions.jsx'; function onChannelEnter(nextState, replace, callback) { doChannelChange(nextState, replace, callback); @@ -33,6 +34,10 @@ function doChannelChange(state, replace, callback) { } else { channel = ChannelStore.getByName(state.params.channel); + if (channel.type === Constants.DM_CHANNEL) { + loadNewDMIfNeeded(Utils.getUserIdFromChannelName(channel)); + } + if (!channel) { Client.joinChannelByName( state.params.channel, @@ -100,7 +105,6 @@ function preNeedsTeam(nextState, replace, callback) { if (nextState.location.pathname.indexOf('/channels/') > -1 || nextState.location.pathname.indexOf('/pl/') > -1) { - loadProfilesAndTeamMembersForDMSidebar(); AsyncClient.getMyTeamsUnread(); const teams = TeamStore.getAll(); for (const id in teams) { @@ -120,6 +124,7 @@ function preNeedsTeam(nextState, replace, callback) { }); loadStatusesForChannelAndSidebar(); + loadProfilesAndTeamMembersForDMSidebar(); d1.resolve(); }, |