mattermost-redux
Version:
Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client
670 lines (669 loc) • 24.1 kB
JavaScript
"use strict";
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.selectTeam = selectTeam;
exports.getMyTeams = getMyTeams;
exports.getMyTeamUnreads = getMyTeamUnreads;
exports.getTeam = getTeam;
exports.getTeamByName = getTeamByName;
exports.getTeams = getTeams;
exports.searchTeams = searchTeams;
exports.createTeam = createTeam;
exports.deleteTeam = deleteTeam;
exports.unarchiveTeam = unarchiveTeam;
exports.updateTeam = updateTeam;
exports.patchTeam = patchTeam;
exports.regenerateTeamInviteId = regenerateTeamInviteId;
exports.getMyTeamMembers = getMyTeamMembers;
exports.getTeamMembers = getTeamMembers;
exports.getTeamMember = getTeamMember;
exports.getTeamMembersByIds = getTeamMembersByIds;
exports.getTeamsForUser = getTeamsForUser;
exports.getTeamMembersForUser = getTeamMembersForUser;
exports.getTeamStats = getTeamStats;
exports.addUserToTeamFromInvite = addUserToTeamFromInvite;
exports.addUserToTeam = addUserToTeam;
exports.addUsersToTeamGracefully = addUsersToTeamGracefully;
exports.removeUserFromTeam = removeUserFromTeam;
exports.sendEmailInvitesToTeam = sendEmailInvitesToTeam;
exports.sendEmailGuestInvitesToChannels = sendEmailGuestInvitesToChannels;
exports.sendEmailInvitesToTeamGracefully = sendEmailInvitesToTeamGracefully;
exports.sendEmailGuestInvitesToChannelsGracefully = sendEmailGuestInvitesToChannelsGracefully;
exports.sendEmailInvitesToTeamAndChannelsGracefully = sendEmailInvitesToTeamAndChannelsGracefully;
exports.getTeamInviteInfo = getTeamInviteInfo;
exports.checkIfTeamExists = checkIfTeamExists;
exports.setTeamIcon = setTeamIcon;
exports.removeTeamIcon = removeTeamIcon;
exports.updateTeamScheme = updateTeamScheme;
exports.updateTeamMemberSchemeRoles = updateTeamMemberSchemeRoles;
exports.invalidateAllEmailInvites = invalidateAllEmailInvites;
exports.membersMinusGroupMembers = membersMinusGroupMembers;
exports.getInProductNotices = getInProductNotices;
exports.updateNoticesAsViewed = updateNoticesAsViewed;
const redux_batched_actions_1 = require("redux-batched-actions");
const action_types_1 = require("mattermost-redux/action_types");
const channels_1 = require("mattermost-redux/actions/channels");
const errors_1 = require("mattermost-redux/actions/errors");
const helpers_1 = require("mattermost-redux/actions/helpers");
const roles_1 = require("mattermost-redux/actions/roles");
const users_1 = require("mattermost-redux/actions/users");
const client_1 = require("mattermost-redux/client");
const constants_1 = require("mattermost-redux/constants");
const common_1 = require("mattermost-redux/selectors/entities/common");
const teams_1 = require("mattermost-redux/selectors/entities/teams");
const users_2 = require("mattermost-redux/selectors/entities/users");
const event_emitter_1 = __importDefault(require("mattermost-redux/utils/event_emitter"));
async function getProfilesAndStatusesForMembers(userIds, dispatch, getState) {
const state = getState();
const { currentUserId, profiles, statuses, } = state.entities.users;
const enabledUserStatuses = (0, common_1.getIsUserStatusesConfigEnabled)(state);
const profilesToLoad = [];
const statusesToLoad = [];
userIds.forEach((userId) => {
if (!profiles[userId] && !profilesToLoad.includes(userId) && userId !== currentUserId) {
profilesToLoad.push(userId);
}
if (!statuses[userId] && !statusesToLoad.includes(userId) && userId !== currentUserId) {
statusesToLoad.push(userId);
}
});
const requests = [];
if (profilesToLoad.length) {
requests.push(dispatch((0, users_1.getProfilesByIds)(profilesToLoad)));
}
if (statusesToLoad.length && enabledUserStatuses) {
requests.push(dispatch((0, users_1.getStatusesByIds)(statusesToLoad)));
}
await Promise.all(requests);
}
function selectTeam(team) {
const teamId = (typeof team === 'string') ? team : team.id;
return {
type: action_types_1.TeamTypes.SELECT_TEAM,
data: teamId,
};
}
function getMyTeams() {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.getMyTeams,
onSuccess: action_types_1.TeamTypes.RECEIVED_TEAMS_LIST,
});
}
function getMyTeamUnreads(collapsedThreads) {
return async (dispatch, getState) => {
let unreads;
try {
unreads = await client_1.Client4.getMyTeamUnreads(collapsedThreads);
}
catch (error) {
(0, helpers_1.forceLogoutIfNecessary)(error, dispatch, getState);
dispatch((0, errors_1.logError)(error));
return { error };
}
dispatch({
type: action_types_1.TeamTypes.RECEIVED_MY_TEAM_UNREADS,
data: unreads,
});
return { data: unreads };
};
}
function getTeam(teamId) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.getTeam,
onSuccess: action_types_1.TeamTypes.RECEIVED_TEAM,
params: [
teamId,
],
});
}
function getTeamByName(teamName) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.getTeamByName,
onSuccess: action_types_1.TeamTypes.RECEIVED_TEAM,
params: [
teamName,
],
});
}
function getTeams(page = 0, perPage = constants_1.General.TEAMS_CHUNK_SIZE, includeTotalCount = false, excludePolicyConstrained = false) {
return async (dispatch, getState) => {
let data;
dispatch({ type: action_types_1.TeamTypes.GET_TEAMS_REQUEST, data });
try {
data = await client_1.Client4.getTeams(page, perPage, includeTotalCount, excludePolicyConstrained);
}
catch (error) {
(0, helpers_1.forceLogoutIfNecessary)(error, dispatch, getState);
dispatch({ type: action_types_1.TeamTypes.GET_TEAMS_FAILURE, data });
dispatch((0, errors_1.logError)(error));
return { error };
}
const actions = [
{
type: action_types_1.TeamTypes.RECEIVED_TEAMS_LIST,
data: includeTotalCount ? data.teams : data,
},
{
type: action_types_1.TeamTypes.GET_TEAMS_SUCCESS,
data,
},
];
if (includeTotalCount) {
actions.push({
type: action_types_1.TeamTypes.RECEIVED_TOTAL_TEAM_COUNT,
data: data.total_count,
});
}
dispatch((0, redux_batched_actions_1.batchActions)(actions));
return { data };
};
}
function searchTeams(term, opts = {}) {
return async (dispatch, getState) => {
dispatch({ type: action_types_1.TeamTypes.GET_TEAMS_REQUEST, data: null });
let response;
try {
response = await client_1.Client4.searchTeams(term, opts);
}
catch (error) {
(0, helpers_1.forceLogoutIfNecessary)(error, dispatch, getState);
dispatch({ type: action_types_1.TeamTypes.GET_TEAMS_FAILURE, error });
dispatch((0, errors_1.logError)(error));
return { error };
}
// The type of the response is determined by whether or not page/perPage were set
let teams;
if (!opts.page || !opts.per_page) {
teams = response;
}
else {
teams = response.teams;
}
dispatch((0, redux_batched_actions_1.batchActions)([
{
type: action_types_1.TeamTypes.RECEIVED_TEAMS_LIST,
data: teams,
},
{
type: action_types_1.TeamTypes.GET_TEAMS_SUCCESS,
},
]));
return { data: response };
};
}
function createTeam(team) {
return async (dispatch, getState) => {
let created;
try {
created = await client_1.Client4.createTeam(team);
}
catch (error) {
(0, helpers_1.forceLogoutIfNecessary)(error, dispatch, getState);
dispatch((0, errors_1.logError)(error));
return { error };
}
const member = {
team_id: created.id,
user_id: getState().entities.users.currentUserId,
roles: `${constants_1.General.TEAM_ADMIN_ROLE} ${constants_1.General.TEAM_USER_ROLE}`,
delete_at: 0,
msg_count: 0,
mention_count: 0,
};
dispatch((0, redux_batched_actions_1.batchActions)([
{
type: action_types_1.TeamTypes.CREATED_TEAM,
data: created,
},
{
type: action_types_1.TeamTypes.RECEIVED_MY_TEAM_MEMBER,
data: member,
},
{
type: action_types_1.TeamTypes.SELECT_TEAM,
data: created.id,
},
]));
dispatch((0, roles_1.loadRolesIfNeeded)(member.roles.split(' ')));
return { data: created };
};
}
function deleteTeam(teamId) {
return async (dispatch, getState) => {
try {
await client_1.Client4.deleteTeam(teamId);
}
catch (error) {
(0, helpers_1.forceLogoutIfNecessary)(error, dispatch, getState);
dispatch((0, errors_1.logError)(error));
return { error };
}
const entities = getState().entities;
const { currentTeamId, } = entities.teams;
const actions = [];
if (teamId === currentTeamId) {
event_emitter_1.default.emit('leave_team');
actions.push({ type: action_types_1.ChannelTypes.SELECT_CHANNEL, data: '' });
}
actions.push({
type: action_types_1.TeamTypes.RECEIVED_TEAM_DELETED,
data: { id: teamId },
});
dispatch((0, redux_batched_actions_1.batchActions)(actions));
return { data: true };
};
}
function unarchiveTeam(teamId) {
return async (dispatch, getState) => {
let team;
try {
team = await client_1.Client4.unarchiveTeam(teamId);
}
catch (error) {
(0, helpers_1.forceLogoutIfNecessary)(error, dispatch, getState);
dispatch((0, errors_1.logError)(error));
return { error };
}
dispatch({
type: action_types_1.TeamTypes.RECEIVED_TEAM_UNARCHIVED,
data: team,
});
return { data: true };
};
}
function updateTeam(team) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.updateTeam,
onSuccess: action_types_1.TeamTypes.UPDATED_TEAM,
params: [
team,
],
});
}
function patchTeam(team) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.patchTeam,
onSuccess: action_types_1.TeamTypes.PATCHED_TEAM,
params: [
team,
],
});
}
function regenerateTeamInviteId(teamId) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.regenerateTeamInviteId,
onSuccess: action_types_1.TeamTypes.REGENERATED_TEAM_INVITE_ID,
params: [
teamId,
],
});
}
function getMyTeamMembers() {
return async (dispatch) => {
const getMyTeamMembersFunc = (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.getMyTeamMembers,
onSuccess: action_types_1.TeamTypes.RECEIVED_MY_TEAM_MEMBERS,
});
const teamMembers = await dispatch(getMyTeamMembersFunc);
if ('data' in teamMembers && teamMembers.data) {
const roles = new Set();
for (const teamMember of teamMembers.data) {
for (const role of teamMember.roles.split(' ')) {
roles.add(role);
}
}
if (roles.size > 0) {
dispatch((0, roles_1.loadRolesIfNeeded)([...roles]));
}
}
return teamMembers;
};
}
function getTeamMembers(teamId, page = 0, perPage = constants_1.General.TEAMS_CHUNK_SIZE, options) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.getTeamMembers,
onRequest: action_types_1.TeamTypes.GET_TEAM_MEMBERS_REQUEST,
onSuccess: [action_types_1.TeamTypes.RECEIVED_MEMBERS_IN_TEAM, action_types_1.TeamTypes.GET_TEAM_MEMBERS_SUCCESS],
onFailure: action_types_1.TeamTypes.GET_TEAM_MEMBERS_FAILURE,
params: [
teamId,
page,
perPage,
options,
],
});
}
function getTeamMember(teamId, userId) {
return async (dispatch, getState) => {
let member;
try {
const memberRequest = client_1.Client4.getTeamMember(teamId, userId);
getProfilesAndStatusesForMembers([userId], dispatch, getState);
member = await memberRequest;
}
catch (error) {
(0, helpers_1.forceLogoutIfNecessary)(error, dispatch, getState);
dispatch((0, errors_1.logError)(error));
return { error };
}
dispatch({
type: action_types_1.TeamTypes.RECEIVED_MEMBERS_IN_TEAM,
data: [member],
});
return { data: member };
};
}
function getTeamMembersByIds(teamId, userIds) {
return async (dispatch, getState) => {
let members;
try {
const membersRequest = client_1.Client4.getTeamMembersByIds(teamId, userIds);
getProfilesAndStatusesForMembers(userIds, dispatch, getState);
members = await membersRequest;
}
catch (error) {
(0, helpers_1.forceLogoutIfNecessary)(error, dispatch, getState);
dispatch((0, errors_1.logError)(error));
return { error };
}
dispatch({
type: action_types_1.TeamTypes.RECEIVED_MEMBERS_IN_TEAM,
data: members,
});
return { data: members };
};
}
function getTeamsForUser(userId) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.getTeamsForUser,
onRequest: action_types_1.TeamTypes.GET_TEAMS_REQUEST,
onSuccess: [action_types_1.TeamTypes.RECEIVED_TEAMS_LIST, action_types_1.TeamTypes.GET_TEAMS_SUCCESS],
onFailure: action_types_1.TeamTypes.GET_TEAMS_FAILURE,
params: [
userId,
],
});
}
function getTeamMembersForUser(userId) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.getTeamMembersForUser,
onSuccess: action_types_1.TeamTypes.RECEIVED_TEAM_MEMBERS,
params: [
userId,
],
});
}
function getTeamStats(teamId) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.getTeamStats,
onSuccess: action_types_1.TeamTypes.RECEIVED_TEAM_STATS,
params: [
teamId,
],
});
}
function addUserToTeamFromInvite(token, inviteId) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.addToTeamFromInvite,
onRequest: action_types_1.TeamTypes.ADD_TO_TEAM_FROM_INVITE_REQUEST,
onSuccess: action_types_1.TeamTypes.ADD_TO_TEAM_FROM_INVITE_SUCCESS,
onFailure: action_types_1.TeamTypes.ADD_TO_TEAM_FROM_INVITE_FAILURE,
params: [
token,
inviteId,
],
});
}
function addUserToTeam(teamId, userId) {
return async (dispatch, getState) => {
let member;
try {
member = await client_1.Client4.addToTeam(teamId, userId);
}
catch (error) {
(0, helpers_1.forceLogoutIfNecessary)(error, dispatch, getState);
dispatch((0, errors_1.logError)(error));
return { error: error };
}
dispatch((0, redux_batched_actions_1.batchActions)([
{
type: action_types_1.UserTypes.RECEIVED_PROFILE_IN_TEAM,
data: { id: teamId, user_id: userId },
},
{
type: action_types_1.TeamTypes.RECEIVED_MEMBER_IN_TEAM,
data: member,
},
]));
return { data: member };
};
}
function addUsersToTeamGracefully(teamId, userIds) {
return async (dispatch, getState) => {
let result;
try {
result = await client_1.Client4.addUsersToTeamGracefully(teamId, userIds);
}
catch (error) {
(0, helpers_1.forceLogoutIfNecessary)(error, dispatch, getState);
dispatch((0, errors_1.logError)(error));
return { error };
}
const addedMembers = result ? result.filter((m) => !m.error) : [];
const profiles = addedMembers.map((m) => ({ id: m.user_id }));
const members = addedMembers.map((m) => m.member);
dispatch((0, redux_batched_actions_1.batchActions)([
{
type: action_types_1.UserTypes.RECEIVED_PROFILES_LIST_IN_TEAM,
data: profiles,
id: teamId,
},
{
type: action_types_1.TeamTypes.RECEIVED_MEMBERS_IN_TEAM,
data: members,
},
]));
return { data: result };
};
}
function removeUserFromTeam(teamId, userId) {
return async (dispatch, getState) => {
try {
await client_1.Client4.removeFromTeam(teamId, userId);
}
catch (error) {
(0, helpers_1.forceLogoutIfNecessary)(error, dispatch, getState);
dispatch((0, errors_1.logError)(error));
return { error };
}
const member = {
team_id: teamId,
user_id: userId,
};
const actions = [
{
type: action_types_1.UserTypes.RECEIVED_PROFILE_NOT_IN_TEAM,
data: { id: teamId, user_id: userId },
},
{
type: action_types_1.TeamTypes.REMOVE_MEMBER_FROM_TEAM,
data: member,
},
];
const state = getState();
const currentUserId = (0, users_2.getCurrentUserId)(state);
if (userId === currentUserId) {
const { channels, myMembers } = state.entities.channels;
for (const channelMember of Object.values(myMembers)) {
const channel = channels[channelMember.channel_id];
if (channel && channel.team_id === teamId) {
actions.push({
type: action_types_1.ChannelTypes.LEAVE_CHANNEL,
data: channel,
});
}
}
if (teamId === (0, teams_1.getCurrentTeamId)(state)) {
actions.push((0, channels_1.selectChannel)(''));
}
}
dispatch((0, redux_batched_actions_1.batchActions)(actions));
return { data: true };
};
}
function sendEmailInvitesToTeam(teamId, emails) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.sendEmailInvitesToTeam,
params: [
teamId,
emails,
],
});
}
function sendEmailGuestInvitesToChannels(teamId, channelIds, emails, message) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.sendEmailGuestInvitesToChannels,
params: [
teamId,
channelIds,
emails,
message,
],
});
}
function sendEmailInvitesToTeamGracefully(teamId, emails) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.sendEmailInvitesToTeamGracefully,
params: [
teamId,
emails,
],
});
}
function sendEmailGuestInvitesToChannelsGracefully(teamId, channelIds, emails, message, guestMagicLink = false) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.sendEmailGuestInvitesToChannelsGracefully,
params: [
teamId,
channelIds,
emails,
message,
guestMagicLink,
],
});
}
function sendEmailInvitesToTeamAndChannelsGracefully(teamId, channelIds, emails, message) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.sendEmailInvitesToTeamAndChannelsGracefully,
params: [
teamId,
channelIds,
emails,
message,
],
});
}
function getTeamInviteInfo(inviteId) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.getTeamInviteInfo,
onRequest: action_types_1.TeamTypes.TEAM_INVITE_INFO_REQUEST,
onSuccess: action_types_1.TeamTypes.TEAM_INVITE_INFO_SUCCESS,
onFailure: action_types_1.TeamTypes.TEAM_INVITE_INFO_FAILURE,
params: [
inviteId,
],
});
}
function checkIfTeamExists(teamName) {
return async (dispatch, getState) => {
let data;
try {
data = await client_1.Client4.checkIfTeamExists(teamName);
}
catch (error) {
(0, helpers_1.forceLogoutIfNecessary)(error, dispatch, getState);
dispatch((0, errors_1.logError)(error));
return { error };
}
return { data: data.exists };
};
}
function setTeamIcon(teamId, imageData) {
return async (dispatch) => {
await client_1.Client4.setTeamIcon(teamId, imageData);
const team = await client_1.Client4.getTeam(teamId);
dispatch({
type: action_types_1.TeamTypes.PATCHED_TEAM,
data: team,
});
return { data: { status: 'OK' } };
};
}
function removeTeamIcon(teamId) {
return async (dispatch) => {
await client_1.Client4.removeTeamIcon(teamId);
const team = await client_1.Client4.getTeam(teamId);
dispatch({
type: action_types_1.TeamTypes.PATCHED_TEAM,
data: team,
});
return { data: { status: 'OK' } };
};
}
function updateTeamScheme(teamId, schemeId) {
return (0, helpers_1.bindClientFunc)({
clientFunc: async () => {
await client_1.Client4.updateTeamScheme(teamId, schemeId);
return { teamId, schemeId };
},
onSuccess: action_types_1.TeamTypes.UPDATED_TEAM_SCHEME,
});
}
function updateTeamMemberSchemeRoles(teamId, userId, isSchemeUser, isSchemeAdmin) {
return (0, helpers_1.bindClientFunc)({
clientFunc: async () => {
await client_1.Client4.updateTeamMemberSchemeRoles(teamId, userId, isSchemeUser, isSchemeAdmin);
return { teamId, userId, isSchemeUser, isSchemeAdmin };
},
onSuccess: action_types_1.TeamTypes.UPDATED_TEAM_MEMBER_SCHEME_ROLES,
});
}
function invalidateAllEmailInvites() {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.invalidateAllEmailInvites,
});
}
function membersMinusGroupMembers(teamID, groupIDs, page = 0, perPage = constants_1.General.PROFILE_CHUNK_SIZE) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.teamMembersMinusGroupMembers,
onSuccess: action_types_1.TeamTypes.RECEIVED_TEAM_MEMBERS_MINUS_GROUP_MEMBERS,
params: [
teamID,
groupIDs,
page,
perPage,
],
});
}
function getInProductNotices(teamId, client, clientVersion) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.getInProductNotices,
params: [
teamId,
client,
clientVersion,
],
});
}
function updateNoticesAsViewed(noticeIds) {
return (0, helpers_1.bindClientFunc)({
clientFunc: client_1.Client4.updateNoticesAsViewed,
params: [
noticeIds,
],
});
}