UNPKG

mattermost-redux

Version:

Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client

983 lines (982 loc) 93.4 kB
"use strict"; // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. Object.defineProperty(exports, "__esModule", { value: true }); exports.patchChannelModerations = exports.getChannelModerations = exports.membersMinusGroupMembers = exports.updateChannelMemberSchemeRoles = exports.updateChannelScheme = exports.unfavoriteChannel = exports.favoriteChannel = exports.getMyChannelMember = exports.getChannelMember = exports.getChannelMembersByIds = exports.markChannelAsUnread = exports.markChannelAsRead = exports.updateChannelPurpose = exports.updateChannelHeader = exports.updateChannelMemberRoles = exports.removeChannelMember = exports.addChannelMember = exports.getChannelStats = exports.searchGroupChannels = exports.searchAllChannels = exports.searchChannels = exports.autocompleteChannelsForSearch = exports.autocompleteChannels = exports.getAllChannels = exports.getAllChannelsWithCount = exports.getArchivedChannels = exports.getChannels = exports.markChannelAsViewed = exports.viewChannel = exports.unarchiveChannel = exports.deleteChannel = exports.joinChannel = exports.leaveChannel = exports.getChannelMembers = exports.getMyChannelMembers = exports.fetchMyChannelsAndMembers = exports.getChannelTimezones = exports.getChannelAndMyMember = exports.getChannel = exports.getChannelByNameAndTeamName = exports.updateChannelNotifyProps = exports.convertChannelToPrivate = exports.updateChannelPrivacy = exports.updateChannel = exports.patchChannel = exports.createGroupChannel = exports.markGroupChannelOpen = exports.createDirectChannel = exports.createChannel = exports.selectChannel = void 0; exports.getChannelMemberCountsByGroup = void 0; var tslib_1 = require("tslib"); var action_types_1 = require("../action_types"); var client_1 = require("../client"); var constants_1 = require("../constants"); var channel_categories_1 = require("../constants/channel_categories"); var channels_1 = require("../constants/channels"); var channel_categories_2 = require("../selectors/entities/channel_categories"); var channels_2 = require("../selectors/entities/channels"); var general_1 = require("../selectors/entities/general"); var teams_1 = require("../selectors/entities/teams"); var users_1 = require("../selectors/entities/users"); var actions_1 = require("../types/actions"); var channel_utils_1 = require("../utils/channel_utils"); var helpers_1 = require("../utils/helpers"); var channel_categories_3 = require("./channel_categories"); var errors_1 = require("./errors"); var helpers_2 = require("./helpers"); var preferences_1 = require("./preferences"); var roles_1 = require("./roles"); var users_2 = require("./users"); function selectChannel(channelId) { return { type: action_types_1.ChannelTypes.SELECT_CHANNEL, data: channelId, }; } exports.selectChannel = selectChannel; function createChannel(channel, userId) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var created, error_1, member, actions, _a, channels, myMembers; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: _b.trys.push([0, 2, , 3]); return [4 /*yield*/, client_1.Client4.createChannel(channel)]; case 1: created = _b.sent(); return [3 /*break*/, 3]; case 2: error_1 = _b.sent(); helpers_2.forceLogoutIfNecessary(error_1, dispatch, getState); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.CREATE_CHANNEL_FAILURE, error: error_1, }, errors_1.logError(error_1), ])); return [2 /*return*/, { error: error_1 }]; case 3: member = { channel_id: created.id, user_id: userId, roles: constants_1.General.CHANNEL_USER_ROLE + " " + constants_1.General.CHANNEL_ADMIN_ROLE, last_viewed_at: 0, msg_count: 0, mention_count: 0, notify_props: { desktop: 'default', mark_unread: 'all' }, last_update_at: created.create_at, }; actions = []; _a = getState().entities.channels, channels = _a.channels, myMembers = _a.myMembers; if (!channels[created.id]) { actions.push({ type: action_types_1.ChannelTypes.RECEIVED_CHANNEL, data: created }); } if (!myMembers[created.id]) { actions.push({ type: action_types_1.ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER, data: member }); dispatch(roles_1.loadRolesIfNeeded(member.roles.split(' '))); } dispatch(actions_1.batchActions(tslib_1.__spread(actions, [ { type: action_types_1.ChannelTypes.CREATE_CHANNEL_SUCCESS, }, ]))); dispatch(channel_categories_3.addChannelToInitialCategory(created, true)); return [2 /*return*/, { data: created }]; } }); }); }; } exports.createChannel = createChannel; function createDirectChannel(userId, otherUserId) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var created, error_2, member, preferences; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: dispatch({ type: action_types_1.ChannelTypes.CREATE_CHANNEL_REQUEST, data: null }); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, client_1.Client4.createDirectChannel([userId, otherUserId])]; case 2: created = _a.sent(); return [3 /*break*/, 4]; case 3: error_2 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_2, dispatch, getState); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.CREATE_CHANNEL_FAILURE, error: error_2 }, errors_1.logError(error_2), ])); return [2 /*return*/, { error: error_2 }]; case 4: member = { channel_id: created.id, user_id: userId, roles: "" + constants_1.General.CHANNEL_USER_ROLE, last_viewed_at: 0, msg_count: 0, mention_count: 0, notify_props: { desktop: 'default', mark_unread: 'all' }, last_update_at: created.create_at, }; preferences = [ { user_id: userId, category: constants_1.Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, name: otherUserId, value: 'true' }, { user_id: userId, category: constants_1.Preferences.CATEGORY_CHANNEL_OPEN_TIME, name: created.id, value: new Date().getTime().toString() }, ]; preferences_1.savePreferences(userId, preferences)(dispatch); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.RECEIVED_CHANNEL, data: created, }, { type: action_types_1.ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER, data: member, }, { type: action_types_1.PreferenceTypes.RECEIVED_PREFERENCES, data: preferences, }, { type: action_types_1.ChannelTypes.CREATE_CHANNEL_SUCCESS, }, { type: action_types_1.UserTypes.RECEIVED_PROFILES_LIST_IN_CHANNEL, id: created.id, data: [{ id: userId }, { id: otherUserId }], }, ])); dispatch(channel_categories_3.addChannelToInitialCategory(created)); dispatch(roles_1.loadRolesIfNeeded(member.roles.split(' '))); return [2 /*return*/, { data: created }]; } }); }); }; } exports.createDirectChannel = createDirectChannel; function markGroupChannelOpen(channelId) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var currentUserId, preferences; return tslib_1.__generator(this, function (_a) { currentUserId = getState().entities.users.currentUserId; preferences = [ { user_id: currentUserId, category: constants_1.Preferences.CATEGORY_GROUP_CHANNEL_SHOW, name: channelId, value: 'true' }, { user_id: currentUserId, category: constants_1.Preferences.CATEGORY_CHANNEL_OPEN_TIME, name: channelId, value: new Date().getTime().toString() }, ]; return [2 /*return*/, dispatch(preferences_1.savePreferences(currentUserId, preferences))]; }); }); }; } exports.markGroupChannelOpen = markGroupChannelOpen; function createGroupChannel(userIds) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var currentUserId, created, error_3, member, storeMember, error_4, profilesInChannel; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: dispatch({ type: action_types_1.ChannelTypes.CREATE_CHANNEL_REQUEST, data: null }); currentUserId = getState().entities.users.currentUserId; _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, client_1.Client4.createGroupChannel(userIds)]; case 2: created = _a.sent(); return [3 /*break*/, 4]; case 3: error_3 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_3, dispatch, getState); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.CREATE_CHANNEL_FAILURE, error: error_3 }, errors_1.logError(error_3), ])); return [2 /*return*/, { error: error_3 }]; case 4: member = { channel_id: created.id, user_id: currentUserId, roles: "" + constants_1.General.CHANNEL_USER_ROLE, last_viewed_at: 0, msg_count: 0, mention_count: 0, notify_props: { desktop: 'default', mark_unread: 'all' }, last_update_at: created.create_at, }; if (!(created.total_msg_count > 0)) return [3 /*break*/, 10]; storeMember = channels_2.getMyChannelMember(getState(), created.id); if (!(storeMember === null)) return [3 /*break*/, 9]; _a.label = 5; case 5: _a.trys.push([5, 7, , 8]); return [4 /*yield*/, client_1.Client4.getMyChannelMember(created.id)]; case 6: member = _a.sent(); return [3 /*break*/, 8]; case 7: error_4 = _a.sent(); // Log the error and keep going with the generated membership. dispatch(errors_1.logError(error_4)); return [3 /*break*/, 8]; case 8: return [3 /*break*/, 10]; case 9: member = storeMember; _a.label = 10; case 10: dispatch(markGroupChannelOpen(created.id)); profilesInChannel = userIds.map(function (id) { return ({ id: id }); }); profilesInChannel.push({ id: currentUserId }); // currentUserId is optionally in userIds, but the reducer will get rid of a duplicate dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.RECEIVED_CHANNEL, data: created, }, { type: action_types_1.ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER, data: member, }, { type: action_types_1.ChannelTypes.CREATE_CHANNEL_SUCCESS, }, { type: action_types_1.UserTypes.RECEIVED_PROFILES_LIST_IN_CHANNEL, id: created.id, data: profilesInChannel, }, ])); dispatch(channel_categories_3.addChannelToInitialCategory(created)); dispatch(roles_1.loadRolesIfNeeded((member && member.roles && member.roles.split(' ')) || [])); return [2 /*return*/, { data: created }]; } }); }); }; } exports.createGroupChannel = createGroupChannel; function patchChannel(channelId, patch) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var updated, error_5; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: dispatch({ type: action_types_1.ChannelTypes.UPDATE_CHANNEL_REQUEST, data: null }); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, client_1.Client4.patchChannel(channelId, patch)]; case 2: updated = _a.sent(); return [3 /*break*/, 4]; case 3: error_5 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_5, dispatch, getState); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.UPDATE_CHANNEL_FAILURE, error: error_5 }, errors_1.logError(error_5), ])); return [2 /*return*/, { error: error_5 }]; case 4: dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.RECEIVED_CHANNEL, data: updated, }, { type: action_types_1.ChannelTypes.UPDATE_CHANNEL_SUCCESS, }, ])); return [2 /*return*/, { data: updated }]; } }); }); }; } exports.patchChannel = patchChannel; function updateChannel(channel) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var updated, error_6; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: dispatch({ type: action_types_1.ChannelTypes.UPDATE_CHANNEL_REQUEST, data: null }); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, client_1.Client4.updateChannel(channel)]; case 2: updated = _a.sent(); return [3 /*break*/, 4]; case 3: error_6 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_6, dispatch, getState); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.UPDATE_CHANNEL_FAILURE, error: error_6 }, errors_1.logError(error_6), ])); return [2 /*return*/, { error: error_6 }]; case 4: dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.RECEIVED_CHANNEL, data: updated, }, { type: action_types_1.ChannelTypes.UPDATE_CHANNEL_SUCCESS, }, ])); return [2 /*return*/, { data: updated }]; } }); }); }; } exports.updateChannel = updateChannel; function updateChannelPrivacy(channelId, privacy) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var updatedChannel, error_7; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: dispatch({ type: action_types_1.ChannelTypes.UPDATE_CHANNEL_REQUEST, data: null }); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, client_1.Client4.updateChannelPrivacy(channelId, privacy)]; case 2: updatedChannel = _a.sent(); return [3 /*break*/, 4]; case 3: error_7 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_7, dispatch, getState); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.UPDATE_CHANNEL_FAILURE, error: error_7 }, errors_1.logError(error_7), ])); return [2 /*return*/, { error: error_7 }]; case 4: dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.RECEIVED_CHANNEL, data: updatedChannel, }, { type: action_types_1.ChannelTypes.UPDATE_CHANNEL_SUCCESS, }, ])); return [2 /*return*/, { data: updatedChannel }]; } }); }); }; } exports.updateChannelPrivacy = updateChannelPrivacy; function convertChannelToPrivate(channelId) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var convertedChannel, error_8; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: dispatch({ type: action_types_1.ChannelTypes.UPDATE_CHANNEL_REQUEST, data: null }); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, client_1.Client4.convertChannelToPrivate(channelId)]; case 2: convertedChannel = _a.sent(); return [3 /*break*/, 4]; case 3: error_8 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_8, dispatch, getState); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.UPDATE_CHANNEL_FAILURE, error: error_8 }, errors_1.logError(error_8), ])); return [2 /*return*/, { error: error_8 }]; case 4: dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.RECEIVED_CHANNEL, data: convertedChannel, }, { type: action_types_1.ChannelTypes.UPDATE_CHANNEL_SUCCESS, }, ])); return [2 /*return*/, { data: convertedChannel }]; } }); }); }; } exports.convertChannelToPrivate = convertChannelToPrivate; function updateChannelNotifyProps(userId, channelId, props) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var notifyProps, error_9, member, currentNotifyProps; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: notifyProps = tslib_1.__assign({ user_id: userId, channel_id: channelId }, props); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, client_1.Client4.updateChannelNotifyProps(notifyProps)]; case 2: _a.sent(); return [3 /*break*/, 4]; case 3: error_9 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_9, dispatch, getState); dispatch(errors_1.logError(error_9)); return [2 /*return*/, { error: error_9 }]; case 4: member = getState().entities.channels.myMembers[channelId] || {}; currentNotifyProps = member.notify_props || {}; dispatch({ type: action_types_1.ChannelTypes.RECEIVED_CHANNEL_PROPS, data: { channel_id: channelId, notifyProps: tslib_1.__assign(tslib_1.__assign({}, currentNotifyProps), notifyProps), }, }); return [2 /*return*/, { data: true }]; } }); }); }; } exports.updateChannelNotifyProps = updateChannelNotifyProps; function getChannelByNameAndTeamName(teamName, channelName, includeDeleted) { var _this = this; if (includeDeleted === void 0) { includeDeleted = false; } return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var data, error_10; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, client_1.Client4.getChannelByNameAndTeamName(teamName, channelName, includeDeleted)]; case 1: data = _a.sent(); return [3 /*break*/, 3]; case 2: error_10 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_10, dispatch, getState); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.CHANNELS_FAILURE, error: error_10 }, errors_1.logError(error_10), ])); return [2 /*return*/, { error: error_10 }]; case 3: dispatch({ type: action_types_1.ChannelTypes.RECEIVED_CHANNEL, data: data, }); return [2 /*return*/, { data: data }]; } }); }); }; } exports.getChannelByNameAndTeamName = getChannelByNameAndTeamName; function getChannel(channelId) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var data, error_11; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, client_1.Client4.getChannel(channelId)]; case 1: data = _a.sent(); return [3 /*break*/, 3]; case 2: error_11 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_11, dispatch, getState); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.CHANNELS_FAILURE, error: error_11 }, errors_1.logError(error_11), ])); return [2 /*return*/, { error: error_11 }]; case 3: dispatch({ type: action_types_1.ChannelTypes.RECEIVED_CHANNEL, data: data, }); return [2 /*return*/, { data: data }]; } }); }); }; } exports.getChannel = getChannel; function getChannelAndMyMember(channelId) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var channel, member, channelRequest, memberRequest, error_12; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 3, , 4]); channelRequest = client_1.Client4.getChannel(channelId); memberRequest = client_1.Client4.getMyChannelMember(channelId); return [4 /*yield*/, channelRequest]; case 1: channel = _a.sent(); return [4 /*yield*/, memberRequest]; case 2: member = _a.sent(); return [3 /*break*/, 4]; case 3: error_12 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_12, dispatch, getState); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.CHANNELS_FAILURE, error: error_12 }, errors_1.logError(error_12), ])); return [2 /*return*/, { error: error_12 }]; case 4: dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.RECEIVED_CHANNEL, data: channel, }, { type: action_types_1.ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER, data: member, }, ])); dispatch(roles_1.loadRolesIfNeeded(member.roles.split(' '))); return [2 /*return*/, { data: { channel: channel, member: member } }]; } }); }); }; } exports.getChannelAndMyMember = getChannelAndMyMember; function getChannelTimezones(channelId) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var channelTimezones, channelTimezonesRequest, error_13; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); channelTimezonesRequest = client_1.Client4.getChannelTimezones(channelId); return [4 /*yield*/, channelTimezonesRequest]; case 1: channelTimezones = _a.sent(); return [3 /*break*/, 3]; case 2: error_13 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_13, dispatch, getState); dispatch(errors_1.logError(error_13)); return [2 /*return*/, { error: error_13 }]; case 3: return [2 /*return*/, { data: channelTimezones }]; } }); }); }; } exports.getChannelTimezones = getChannelTimezones; function fetchMyChannelsAndMembers(teamId) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var channels, channelMembers, state, shouldFetchArchived, channelRequest, memberRequest, error_14, currentUserId, currentChannelId, roles, channelMembers_1, channelMembers_1_1, member, _a, _b, role; var e_1, _c, e_2, _d; return tslib_1.__generator(this, function (_e) { switch (_e.label) { case 0: dispatch({ type: action_types_1.ChannelTypes.CHANNELS_REQUEST, data: null, }); state = getState(); shouldFetchArchived = helpers_1.isMinimumServerVersion(general_1.getServerVersion(state), 5, 21); _e.label = 1; case 1: _e.trys.push([1, 4, , 5]); channelRequest = client_1.Client4.getMyChannels(teamId, shouldFetchArchived); memberRequest = client_1.Client4.getMyChannelMembers(teamId); return [4 /*yield*/, channelRequest]; case 2: channels = _e.sent(); return [4 /*yield*/, memberRequest]; case 3: channelMembers = _e.sent(); return [3 /*break*/, 5]; case 4: error_14 = _e.sent(); helpers_2.forceLogoutIfNecessary(error_14, dispatch, getState); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.CHANNELS_FAILURE, error: error_14 }, errors_1.logError(error_14), ])); return [2 /*return*/, { error: error_14 }]; case 5: currentUserId = state.entities.users.currentUserId; currentChannelId = state.entities.channels.currentChannelId; dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.RECEIVED_CHANNELS, teamId: teamId, data: channels, currentChannelId: currentChannelId, }, { type: action_types_1.ChannelTypes.CHANNELS_SUCCESS, }, { type: action_types_1.ChannelTypes.RECEIVED_MY_CHANNEL_MEMBERS, data: channelMembers, sync: !shouldFetchArchived, channels: channels, remove: channel_utils_1.getChannelsIdForTeam(state, teamId), currentUserId: currentUserId, currentChannelId: currentChannelId, }, ])); roles = new Set(); try { for (channelMembers_1 = tslib_1.__values(channelMembers), channelMembers_1_1 = channelMembers_1.next(); !channelMembers_1_1.done; channelMembers_1_1 = channelMembers_1.next()) { member = channelMembers_1_1.value; try { for (_a = (e_2 = void 0, tslib_1.__values(member.roles.split(' '))), _b = _a.next(); !_b.done; _b = _a.next()) { role = _b.value; roles.add(role); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_b && !_b.done && (_d = _a.return)) _d.call(_a); } finally { if (e_2) throw e_2.error; } } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (channelMembers_1_1 && !channelMembers_1_1.done && (_c = channelMembers_1.return)) _c.call(channelMembers_1); } finally { if (e_1) throw e_1.error; } } if (roles.size > 0) { dispatch(roles_1.loadRolesIfNeeded(roles)); } return [2 /*return*/, { data: { channels: channels, members: channelMembers } }]; } }); }); }; } exports.fetchMyChannelsAndMembers = fetchMyChannelsAndMembers; function getMyChannelMembers(teamId) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var channelMembers, channelMembersRequest, error_15, state, currentUserId, currentChannelId, roles, channelMembers_2, channelMembers_2_1, member, _a, _b, role; var e_3, _c, e_4, _d; return tslib_1.__generator(this, function (_e) { switch (_e.label) { case 0: _e.trys.push([0, 2, , 3]); channelMembersRequest = client_1.Client4.getMyChannelMembers(teamId); return [4 /*yield*/, channelMembersRequest]; case 1: channelMembers = _e.sent(); return [3 /*break*/, 3]; case 2: error_15 = _e.sent(); helpers_2.forceLogoutIfNecessary(error_15, dispatch, getState); dispatch(errors_1.logError(error_15)); return [2 /*return*/, { error: error_15 }]; case 3: state = getState(); currentUserId = state.entities.users.currentUserId; currentChannelId = state.entities.channels.currentChannelId; dispatch({ type: action_types_1.ChannelTypes.RECEIVED_MY_CHANNEL_MEMBERS, data: channelMembers, remove: channel_utils_1.getChannelsIdForTeam(getState(), teamId), currentUserId: currentUserId, currentChannelId: currentChannelId, }); roles = new Set(); try { for (channelMembers_2 = tslib_1.__values(channelMembers), channelMembers_2_1 = channelMembers_2.next(); !channelMembers_2_1.done; channelMembers_2_1 = channelMembers_2.next()) { member = channelMembers_2_1.value; try { for (_a = (e_4 = void 0, tslib_1.__values(member.roles.split(' '))), _b = _a.next(); !_b.done; _b = _a.next()) { role = _b.value; roles.add(role); } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (_b && !_b.done && (_d = _a.return)) _d.call(_a); } finally { if (e_4) throw e_4.error; } } } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (channelMembers_2_1 && !channelMembers_2_1.done && (_c = channelMembers_2.return)) _c.call(channelMembers_2); } finally { if (e_3) throw e_3.error; } } if (roles.size > 0) { dispatch(roles_1.loadRolesIfNeeded(roles)); } return [2 /*return*/, { data: channelMembers }]; } }); }); }; } exports.getMyChannelMembers = getMyChannelMembers; function getChannelMembers(channelId, page, perPage) { var _this = this; if (page === void 0) { page = 0; } if (perPage === void 0) { perPage = constants_1.General.CHANNELS_CHUNK_SIZE; } return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var channelMembers, channelMembersRequest, error_16, userIds; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); channelMembersRequest = client_1.Client4.getChannelMembers(channelId, page, perPage); return [4 /*yield*/, channelMembersRequest]; case 1: channelMembers = _a.sent(); return [3 /*break*/, 3]; case 2: error_16 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_16, dispatch, getState); dispatch(errors_1.logError(error_16)); return [2 /*return*/, { error: error_16 }]; case 3: userIds = channelMembers.map(function (cm) { return cm.user_id; }); users_2.getMissingProfilesByIds(userIds)(dispatch, getState); dispatch({ type: action_types_1.ChannelTypes.RECEIVED_CHANNEL_MEMBERS, data: channelMembers, }); return [2 /*return*/, { data: channelMembers }]; } }); }); }; } exports.getChannelMembers = getChannelMembers; function leaveChannel(channelId) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var state, currentUserId, _a, channels, myMembers, channel, member; return tslib_1.__generator(this, function (_b) { state = getState(); currentUserId = state.entities.users.currentUserId; _a = state.entities.channels, channels = _a.channels, myMembers = _a.myMembers; channel = channels[channelId]; member = myMembers[channelId]; client_1.Client4.trackEvent('action', 'action_channels_leave', { channel_id: channelId }); dispatch({ type: action_types_1.ChannelTypes.LEAVE_CHANNEL, data: { id: channelId, user_id: currentUserId, team_id: channel.team_id, type: channel.type, }, meta: { offline: { effect: function () { return client_1.Client4.removeFromChannel(currentUserId, channelId); }, commit: { type: 'do_nothing' }, rollback: function () { dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.RECEIVED_CHANNEL, data: channel, }, { type: action_types_1.ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER, data: member, }, ])); }, }, }, }); return [2 /*return*/, { data: true }]; }); }); }; } exports.leaveChannel = leaveChannel; function joinChannel(userId, teamId, channelId, channelName) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var member, channel, error_17; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (!channelId && !channelName) { return [2 /*return*/, { data: null }]; } _a.label = 1; case 1: _a.trys.push([1, 10, , 11]); if (!channelId) return [3 /*break*/, 4]; return [4 /*yield*/, client_1.Client4.addToChannel(userId, channelId)]; case 2: member = _a.sent(); return [4 /*yield*/, client_1.Client4.getChannel(channelId)]; case 3: channel = _a.sent(); return [3 /*break*/, 9]; case 4: return [4 /*yield*/, client_1.Client4.getChannelByName(teamId, channelName, true)]; case 5: channel = _a.sent(); if (!((channel.type === constants_1.General.GM_CHANNEL) || (channel.type === constants_1.General.DM_CHANNEL))) return [3 /*break*/, 7]; return [4 /*yield*/, client_1.Client4.getChannelMember(channel.id, userId)]; case 6: member = _a.sent(); return [3 /*break*/, 9]; case 7: return [4 /*yield*/, client_1.Client4.addToChannel(userId, channel.id)]; case 8: member = _a.sent(); _a.label = 9; case 9: return [3 /*break*/, 11]; case 10: error_17 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_17, dispatch, getState); dispatch(errors_1.logError(error_17)); return [2 /*return*/, { error: error_17 }]; case 11: client_1.Client4.trackEvent('action', 'action_channels_join', { channel_id: channelId }); dispatch(actions_1.batchActions([ { type: action_types_1.ChannelTypes.RECEIVED_CHANNEL, data: channel, }, { type: action_types_1.ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER, data: member, }, ])); dispatch(channel_categories_3.addChannelToInitialCategory(channel)); if (member) { dispatch(roles_1.loadRolesIfNeeded(member.roles.split(' '))); } return [2 /*return*/, { data: { channel: channel, member: member } }]; } }); }); }; } exports.joinChannel = joinChannel; function deleteChannel(channelId) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var state, viewArchivedChannels, error_18, currentChannelId, teamId, channelsInTeam, channel; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: state = getState(); viewArchivedChannels = state.entities.general.config.ExperimentalViewArchivedChannels === 'true'; _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, client_1.Client4.deleteChannel(channelId)]; case 2: _a.sent(); return [3 /*break*/, 4]; case 3: error_18 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_18, dispatch, getState); dispatch(errors_1.logError(error_18)); return [2 /*return*/, { error: error_18 }]; case 4: state = getState(); currentChannelId = state.entities.channels.currentChannelId; if (channelId === currentChannelId && !viewArchivedChannels) { teamId = teams_1.getCurrentTeamId(state); channelsInTeam = channels_2.getChannelsNameMapInTeam(state, teamId); channel = channel_utils_1.getChannelByName(channelsInTeam, channels_2.getRedirectChannelNameForTeam(state, teamId)); if (channel && channel.id) { dispatch({ type: action_types_1.ChannelTypes.SELECT_CHANNEL, data: channel.id }); } } dispatch({ type: action_types_1.ChannelTypes.DELETE_CHANNEL_SUCCESS, data: { id: channelId, viewArchivedChannels: viewArchivedChannels } }); return [2 /*return*/, { data: true }]; } }); }); }; } exports.deleteChannel = deleteChannel; function unarchiveChannel(channelId) { var _this = this; return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var error_19, state, config, viewArchivedChannels; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, client_1.Client4.unarchiveChannel(channelId)]; case 1: _a.sent(); return [3 /*break*/, 3]; case 2: error_19 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_19, dispatch, getState); dispatch(errors_1.logError(error_19)); return [2 /*return*/, { error: error_19 }]; case 3: state = getState(); config = general_1.getConfig(state); viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true'; dispatch({ type: action_types_1.ChannelTypes.UNARCHIVED_CHANNEL_SUCCESS, data: { id: channelId, viewArchivedChannels: viewArchivedChannels } }); return [2 /*return*/, { data: true }]; } }); }); }; } exports.unarchiveChannel = unarchiveChannel; function viewChannel(channelId, prevChannelId) { var _this = this; if (prevChannelId === void 0) { prevChannelId = ''; } return function (dispatch, getState) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var currentUserId, myPreferences, viewTimePref, viewTime, prevChanManuallyUnread, preferences, error_20, actions, myMembers, member, prevMember; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: currentUserId = getState().entities.users.currentUserId; myPreferences = getState().entities.preferences.myPreferences; viewTimePref = myPreferences[constants_1.Preferences.CATEGORY_CHANNEL_APPROXIMATE_VIEW_TIME + "--" + channelId]; viewTime = viewTimePref ? parseInt(viewTimePref.value, 10) : 0; prevChanManuallyUnread = channels_2.isManuallyUnread(getState(), prevChannelId); if (viewTime < new Date().getTime() - (3 * 60 * 60 * 1000)) { preferences = [ { user_id: currentUserId, category: constants_1.Preferences.CATEGORY_CHANNEL_APPROXIMATE_VIEW_TIME, name: channelId, value: new Date().getTime().toString() }, ]; preferences_1.savePreferences(currentUserId, preferences)(dispatch); } _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, client_1.Client4.viewMyChannel(channelId, prevChanManuallyUnread ? '' : prevChannelId)]; case 2: _a.sent(); return [3 /*break*/, 4]; case 3: error_20 = _a.sent(); helpers_2.forceLogoutIfNecessary(error_20, dispatch, getState); dispatch(errors_1.logError(error_20)); return [2 /*return*/, { error: error_20 }]; case 4: actions = []; myMembers = getState().entities.channels.myMembers; member = myMembers[channelId]; if (member) { if (channels_2.isManuallyUnread(getState(), channelId)) { actions.push({ type: action_types_1.ChannelTypes.REMOVE_MANUALLY_UNREAD, data: { channelId: channelId }, }); } actions.push({