diff --git a/service/actions/channels.js b/service/actions/channels.js index 948778099..2c03b1fd7 100644 --- a/service/actions/channels.js +++ b/service/actions/channels.js @@ -366,27 +366,39 @@ export function deleteChannel(teamId, channelId) { }; } -export function updateLastViewedAt(teamId, channelId, active) { +export function viewChannel(teamId, channelId, prevChannelId = '') { return async (dispatch, getState) => { dispatch({type: ChannelTypes.UPDATE_LAST_VIEWED_REQUEST}, getState); try { // this API should return the timestamp that was set - await Client.updateLastViewedAt(teamId, channelId, active); + await Client.viewChannel(teamId, channelId, prevChannelId); } catch (error) { forceLogoutIfNecessary(error, dispatch); dispatch({type: ChannelTypes.UPDATE_LAST_VIEWED_FAILURE, error}, getState); return; } - dispatch(batchActions([ - { + const actions = [{ + type: ChannelTypes.RECEIVED_LAST_VIEWED, + data: { + channel_id: channelId, + last_viewed_at: new Date().getTime() + } + }]; + + if (prevChannelId) { + actions.push({ type: ChannelTypes.RECEIVED_LAST_VIEWED, data: { - channel_id: channelId, + channel_id: prevChannelId, last_viewed_at: new Date().getTime() } - }, + }); + } + + dispatch(batchActions([ + ...actions, { type: ChannelTypes.UPDATE_LAST_VIEWED_SUCCESS } @@ -505,7 +517,7 @@ export default { leaveChannel, joinChannel, deleteChannel, - updateLastViewedAt, + viewChannel, getMoreChannels, getChannelStats, addChannelMember, diff --git a/service/actions/websocket.js b/service/actions/websocket.js index 563888dd8..58e5f8ec3 100644 --- a/service/actions/websocket.js +++ b/service/actions/websocket.js @@ -19,7 +19,7 @@ import { fetchMyChannelsAndMembers, getChannel, getChannelStats, - updateLastViewedAt + viewChannel } from 'service/actions/channels'; import { @@ -158,7 +158,7 @@ function handleNewPostEvent(msg, dispatch, getState) { if (post.channel_id === channels.currentId) { if (isActive) { - updateLastViewedAt(teamId, post.channel_id)(dispatch, getState); + viewChannel(teamId, post.channel_id)(dispatch, getState); } else { getChannel(teamId, post.channel_id)(dispatch, getState); } @@ -208,7 +208,7 @@ function handlePostEdited(msg, dispatch, getState) { if (msg.broadcast.channel_id === channels.currentId && isActive) { // FIXME: Update post should include team_id in the message cause its not always the current team - // updateLastViewedAt(msg.data.team_id, data.channel_id)(dispatch, getState); + // viewChannel(msg.data.team_id, data.channel_id)(dispatch, getState); } } diff --git a/service/client/client.js b/service/client/client.js index 2adce34f2..a1ab2415e 100644 --- a/service/client/client.js +++ b/service/client/client.js @@ -486,10 +486,15 @@ export default class Client { ); }; - updateLastViewedAt = async (teamId, channelId, active) => { + viewChannel = async (teamId, channelId, prevChannelId = '') => { + const data = { + channel_id: channelId, + prev_channel_id: prevChannelId + }; + return this.doFetch( - `${this.getChannelNeededRoute(teamId, channelId)}/update_last_viewed_at`, - {method: 'post', body: JSON.stringify({active})} + `${this.getChannelsRoute(teamId)}/view`, + {method: 'post', body: JSON.stringify(data)} ); }; diff --git a/service/reducers/entities/channels.js b/service/reducers/entities/channels.js index 2ee895882..f656d1ea8 100644 --- a/service/reducers/entities/channels.js +++ b/service/reducers/entities/channels.js @@ -72,6 +72,8 @@ function myMembers(state = {}, action) { case ChannelTypes.RECEIVED_LAST_VIEWED: { const member = {...state[action.data.channel_id]}; member.last_viewed_at = action.data.last_viewed_at; + member.mention_count = 0; + member.msg_count = 0; return { ...state, diff --git a/test/service/actions/channels.test.js b/test/service/actions/channels.test.js index 992ec0204..866ad4d55 100644 --- a/test/service/actions/channels.test.js +++ b/test/service/actions/channels.test.js @@ -257,16 +257,23 @@ describe('Actions.Channels', () => { assert.ifError(myMembers[secondChannel.id]); }); - it('updateLastViewedAt', async () => { + it('viewChannel', async () => { + const userChannel = await Client.createChannel( + TestHelper.fakeChannel(TestHelper.basicTeam.id) + ); await Actions.fetchMyChannelsAndMembers(TestHelper.basicTeam.id)(store.dispatch, store.getState); let members = store.getState().entities.channels.myMembers; let member = members[TestHelper.basicChannel.id]; + let otherMember = members[userChannel.id]; assert.ok(member); + assert.ok(otherMember); const lastViewed = member.last_viewed_at; - await Actions.updateLastViewedAt( + await Actions.viewChannel( TestHelper.basicTeam.id, - TestHelper.basicChannel.id, true)(store.dispatch, store.getState); + TestHelper.basicChannel.id, + userChannel.id + )(store.dispatch, store.getState); const updateRequest = store.getState().requests.channels.updateLastViewedAt; if (updateRequest.status === RequestStatus.FAILURE) { @@ -275,7 +282,9 @@ describe('Actions.Channels', () => { members = store.getState().entities.channels.myMembers; member = members[TestHelper.basicChannel.id]; + otherMember = members[userChannel.id]; assert.ok(member.last_viewed_at > lastViewed); + assert.ok(otherMember.last_viewed_at > lastViewed); }); it('getMoreChannels', async () => { diff --git a/test/service/actions/websocket.test.js b/test/service/actions/websocket.test.js index e958c534a..4558fb362 100644 --- a/test/service/actions/websocket.test.js +++ b/test/service/actions/websocket.test.js @@ -208,10 +208,9 @@ describe('Actions.Websocket', () => { async function test() { await TeamActions.selectTeam(TestHelper.basicTeam)(store.dispatch, store.getState); - await Client.updateLastViewedAt( + await Client.viewChannel( TestHelper.basicTeam.id, - TestHelper.basicChannel.id, - false + TestHelper.basicChannel.id ); setTimeout(() => {