mattermost-mobile/app/actions/views/channel.js
Chris Duarte d180f324c5 Select last channel viewed (#172)
* Select last channel viewed

Now saving last channel id to local storage

Reworked local storage saving

* Feedback review
2017-01-23 16:20:11 -03:00

161 lines
5.5 KiB
JavaScript

// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import {batchActions} from 'redux-batched-actions';
import {ViewTypes} from 'app/constants';
import {updateStorage} from 'app/actions/storage';
import {fetchMyChannelsAndMembers, getMyChannelMembers, selectChannel} from 'service/actions/channels';
import {getPosts} from 'service/actions/posts';
import {savePreferences, deletePreferences} from 'service/actions/preferences';
import {getTeamMembersByIds} from 'service/actions/teams';
import {Constants, UsersTypes} from 'service/constants';
import {getChannelByName, getDirectChannelName} from 'service/utils/channel_utils';
import {getPreferencesByCategory} from 'service/utils/preference_utils';
export function loadChannelsIfNecessary(teamId) {
return async (dispatch, getState) => {
const channels = getState().entities.channels.channels;
let hasChannelsForTeam = false;
for (const channel of Object.values(channels)) {
if (channel.team_id === teamId) {
// If we have one channel, assume we have all of them
hasChannelsForTeam = true;
break;
}
}
if (hasChannelsForTeam) {
await getMyChannelMembers(teamId)(dispatch, getState);
} else {
await fetchMyChannelsAndMembers(teamId)(dispatch, getState);
}
};
}
export function loadProfilesAndTeamMembersForDMSidebar(teamId) {
return async (dispatch, getState) => {
const state = getState();
const currentUserId = state.entities.users.currentId;
const {channels} = state.entities.channels;
const {myPreferences} = state.entities.preferences;
const {membersInTeam} = state.entities.teams;
const dmPrefs = getPreferencesByCategory(myPreferences, Constants.CATEGORY_DIRECT_CHANNEL_SHOW);
const members = [];
for (const [key, pref] of dmPrefs) {
if (pref.value === 'true') {
members.push(key);
}
}
let membersToLoad = members;
if (membersInTeam[teamId]) {
membersToLoad = members.filter((m) => !membersInTeam[teamId].has(m));
}
if (membersToLoad.length) {
await getTeamMembersByIds(teamId, membersToLoad)(dispatch, getState);
}
const actions = [];
for (let i = 0; i < members.length; i++) {
const channelName = getDirectChannelName(currentUserId, members[i]);
const channel = getChannelByName(channels, channelName);
if (channel) {
actions.push({
type: UsersTypes.RECEIVED_PROFILE_IN_CHANNEL,
data: {user_id: members[i]},
id: channel.id
});
}
}
if (actions.length) {
dispatch(batchActions(actions), getState);
}
};
}
export function loadPostsIfNecessary(channel) {
return async (dispatch, getState) => {
const postsInChannel = getState().entities.posts.postsByChannel[channel.id];
if (!postsInChannel) {
let teamId = channel.team_id;
if (!teamId) {
teamId = getState().entities.teams.currentId;
}
await getPosts(teamId, channel.id)(dispatch, getState);
}
};
}
export function selectInitialChannel(teamId) {
return async (dispatch, getState) => {
const state = getState();
const channels = state.entities.channels.channels;
const currentChannelId = state.entities.channels.currentId;
if (channels[currentChannelId] && channels[currentChannelId].team_id === teamId) {
await selectChannel(currentChannelId)(dispatch, getState);
return;
}
const channel = Object.values(channels).find((c) => c.team_id === teamId && c.name === Constants.DEFAULT_CHANNEL);
if (channel) {
await selectChannel(channel.id)(dispatch, getState);
} else {
// Handle case when the default channel cannot be found
const firstChannel = Object.values(channels)[0];
await selectChannel(firstChannel.id)(dispatch, getState);
}
};
}
export function handleSelectChannel(channelId) {
return async (dispatch, getState) => {
const currentTeamId = getState().entities.teams.currentId;
await updateStorage(currentTeamId, {currentChannelId: channelId});
await selectChannel(channelId)(dispatch, getState);
};
}
export function handlePostDraftChanged(postDraft) {
return async (dispatch, getState) => {
dispatch({
type: ViewTypes.POST_DRAFT_CHANGED,
postDraft
}, getState);
};
}
export function closeDMChannel(channel) {
return async(dispatch, getState) => {
const state = getState();
const userId = state.entities.users.currentId;
const dm = [{
user_id: userId,
category: Constants.CATEGORY_DIRECT_CHANNEL_SHOW,
name: channel.teammate_id,
value: 'false'
}];
if (channel.isFavorite) {
const fav = [{
user_id: userId,
category: Constants.CATEGORY_FAVORITE_CHANNEL,
name: channel.id
}];
deletePreferences(fav)(dispatch, getState);
}
savePreferences(dm)(dispatch, getState).then(() => {
if (channel.isCurrent) {
selectInitialChannel(state.entities.teams.currentId)(dispatch, getState);
}
});
};
}