mattermost-redux
Version:
Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client
240 lines (239 loc) • 12.5 kB
JavaScript
;
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.isTeamSameWithCurrentTeam = exports.getChannelDrawerBadgeCount = exports.getMySortedTeamIds = exports.getSortedJoinableTeams = exports.getJoinableTeams = exports.getJoinableTeamIds = exports.getSortedListableTeams = exports.getListableTeamIds = exports.getMembersInTeam = exports.getMembersInCurrentTeam = exports.getMyTeamMember = exports.getMyDeletedTeams = exports.getMyTeams = exports.getCurrentTeamStats = exports.getCurrentRelativeTeamUrl = exports.getCurrentTeamUrl = exports.isCurrentUserCurrentTeamAdmin = exports.getCurrentTeamMembership = exports.getCurrentTeam = exports.getActiveTeamsList = exports.getTeamsList = void 0;
exports.getCurrentTeamId = getCurrentTeamId;
exports.getTeamByName = getTeamByName;
exports.getTeams = getTeams;
exports.getTeamsInPolicy = getTeamsInPolicy;
exports.getTeamStats = getTeamStats;
exports.getTeamMemberships = getTeamMemberships;
exports.getMembersInTeams = getMembersInTeams;
exports.getTeam = getTeam;
exports.getRelativeTeamUrl = getRelativeTeamUrl;
exports.getTeamMember = getTeamMember;
exports.getMyTeamsCount = getMyTeamsCount;
exports.makeGetBadgeCountForTeamId = makeGetBadgeCountForTeamId;
exports.searchTeamsInPolicy = searchTeamsInPolicy;
exports.getTeamIdByChannelId = getTeamIdByChannelId;
exports.contentFlaggingEnabledInTeam = contentFlaggingEnabledInTeam;
const constants_1 = require("mattermost-redux/constants");
const create_selector_1 = require("mattermost-redux/selectors/create_selector");
const admin_1 = require("mattermost-redux/selectors/entities/admin");
const content_flagging_1 = require("mattermost-redux/selectors/entities/content_flagging");
const general_1 = require("mattermost-redux/selectors/entities/general");
const roles_helpers_1 = require("mattermost-redux/selectors/entities/roles_helpers");
const helpers_1 = require("mattermost-redux/utils/helpers");
const team_utils_1 = require("mattermost-redux/utils/team_utils");
const user_utils_1 = require("mattermost-redux/utils/user_utils");
const preferences_1 = require("./preferences");
function getCurrentTeamId(state) {
return state.entities.teams.currentTeamId;
}
function getTeamByName(state, name) {
const teams = getTeams(state);
return Object.values(teams).find((team) => team.name === name);
}
function getTeams(state) {
return state.entities.teams.teams;
}
function getTeamsInPolicy() {
return (0, create_selector_1.createSelector)('getTeamsInPolicy', getTeams, (state, props) => (0, admin_1.getDataRetentionCustomPolicy)(state, props.policyId), (allTeams, policy) => {
if (!policy) {
return [];
}
const policyTeams = [];
Object.entries(allTeams).forEach((item) => {
const [, team] = item;
if (team.policy_id === policy.id) {
policyTeams.push(team);
}
});
return policyTeams;
});
}
function getTeamStats(state) {
return state.entities.teams.stats;
}
function getTeamMemberships(state) {
return state.entities.teams.myMembers;
}
function getMembersInTeams(state) {
return state.entities.teams.membersInTeam;
}
exports.getTeamsList = (0, create_selector_1.createSelector)('getTeamsList', getTeams, (teams) => {
return Object.values(teams);
});
exports.getActiveTeamsList = (0, create_selector_1.createSelector)('getActiveTeamsList', exports.getTeamsList, (teams) => {
return teams.filter((team) => team.delete_at === 0);
});
exports.getCurrentTeam = (0, create_selector_1.createSelector)('getCurrentTeam', getTeams, getCurrentTeamId, (teams, currentTeamId) => {
return teams[currentTeamId];
});
function getTeam(state, id) {
const teams = getTeams(state);
return teams[id];
}
exports.getCurrentTeamMembership = (0, create_selector_1.createSelector)('getCurrentTeamMembership', getCurrentTeamId, getTeamMemberships, (currentTeamId, teamMemberships) => {
return teamMemberships[currentTeamId];
});
exports.isCurrentUserCurrentTeamAdmin = (0, create_selector_1.createSelector)('isCurrentUserCurrentTeamAdmin', exports.getCurrentTeamMembership, (member) => {
if (member) {
const roles = member.roles || '';
return (0, user_utils_1.isTeamAdmin)(roles);
}
return false;
});
exports.getCurrentTeamUrl = (0, create_selector_1.createSelector)('getCurrentTeamUrl', exports.getCurrentTeam, (state) => (0, general_1.getConfig)(state).SiteURL, (currentTeam, siteURL) => {
if (!currentTeam) {
return siteURL;
}
return `${siteURL}/${currentTeam.name}`;
});
exports.getCurrentRelativeTeamUrl = (0, create_selector_1.createSelector)('getCurrentRelativeTeamUrl', exports.getCurrentTeam, (currentTeam) => {
if (!currentTeam) {
return '/';
}
return `/${currentTeam.name}`;
});
function getRelativeTeamUrl(state, teamId) {
const team = getTeam(state, teamId);
if (!team) {
return '/';
}
return `/${team.name}`;
}
exports.getCurrentTeamStats = (0, create_selector_1.createSelector)('getCurrentTeamStats', getCurrentTeamId, getTeamStats, (currentTeamId, teamStats) => {
return teamStats[currentTeamId];
});
exports.getMyTeams = (0, create_selector_1.createSelector)('getMyTeams', getTeams, getTeamMemberships, (teams, members) => {
return Object.values(teams).filter((t) => members[t.id] && t.delete_at === 0);
});
exports.getMyDeletedTeams = (0, create_selector_1.createSelector)('getMyDeletedTeams', getTeams, getTeamMemberships, (teams, members) => {
return Object.values(teams).filter((t) => members[t.id] && t.delete_at !== 0);
});
exports.getMyTeamMember = (0, create_selector_1.createSelector)('getMyTeamMember', getTeamMemberships, (state, teamId) => teamId, (teamMemberships, teamId) => {
return teamMemberships[teamId];
});
exports.getMembersInCurrentTeam = (0, create_selector_1.createSelector)('getMembersInCurrentTeam', getCurrentTeamId, getMembersInTeams, (currentTeamId, teamMembers) => {
return teamMembers[currentTeamId];
});
exports.getMembersInTeam = (0, create_selector_1.createSelector)('getMembersInTeam', (state, teamId) => teamId, getMembersInTeams, (teamId, teamMembers) => {
return teamMembers[teamId];
});
function getTeamMember(state, teamId, userId) {
return getMembersInTeams(state)[teamId]?.[userId];
}
exports.getListableTeamIds = (0, helpers_1.createIdsSelector)('getListableTeamIds', getTeams, getTeamMemberships, (state) => (0, roles_helpers_1.haveISystemPermission)(state, { permission: constants_1.Permissions.LIST_PUBLIC_TEAMS }), (state) => (0, roles_helpers_1.haveISystemPermission)(state, { permission: constants_1.Permissions.LIST_PRIVATE_TEAMS }), general_1.isCompatibleWithJoinViewTeamPermissions, (teams, myMembers, canListPublicTeams, canListPrivateTeams, compatibleWithJoinViewTeamPermissions) => {
return Object.keys(teams).filter((id) => {
const team = teams[id];
const member = myMembers[id];
let canList = team.allow_open_invite;
if (compatibleWithJoinViewTeamPermissions) {
canList = (canListPrivateTeams && !team.allow_open_invite) || (canListPublicTeams && team.allow_open_invite);
}
return team.delete_at === 0 && canList && !member;
});
});
exports.getSortedListableTeams = (0, create_selector_1.createSelector)('getSortedListableTeams', getTeams, exports.getListableTeamIds, (state, locale) => locale, (teams, listableTeamIds, locale) => {
const listableTeams = {};
for (const id of listableTeamIds) {
listableTeams[id] = teams[id];
}
return Object.values(listableTeams).sort((0, team_utils_1.sortTeamsWithLocale)(locale));
});
exports.getJoinableTeamIds = (0, helpers_1.createIdsSelector)('getJoinableTeamIds', getTeams, getTeamMemberships, (state) => (0, roles_helpers_1.haveISystemPermission)(state, { permission: constants_1.Permissions.JOIN_PUBLIC_TEAMS }), (state) => (0, roles_helpers_1.haveISystemPermission)(state, { permission: constants_1.Permissions.JOIN_PRIVATE_TEAMS }), general_1.isCompatibleWithJoinViewTeamPermissions, (teams, myMembers, canJoinPublicTeams, canJoinPrivateTeams, compatibleWithJoinViewTeamPermissions) => {
return Object.keys(teams).filter((id) => {
const team = teams[id];
const member = myMembers[id];
let canJoin = team.allow_open_invite;
if (compatibleWithJoinViewTeamPermissions) {
canJoin = (canJoinPrivateTeams && !team.allow_open_invite) || (canJoinPublicTeams && team.allow_open_invite);
}
return team.delete_at === 0 && canJoin && !member;
});
});
exports.getJoinableTeams = (0, create_selector_1.createSelector)('getJoinableTeams', getTeams, exports.getJoinableTeamIds, (teams, joinableTeamIds) => {
return joinableTeamIds.map((id) => teams[id]);
});
exports.getSortedJoinableTeams = (0, create_selector_1.createSelector)('getSortedJoinableTeams', getTeams, exports.getJoinableTeamIds, (state, locale) => locale, (teams, joinableTeamIds, locale) => {
const joinableTeams = {};
for (const id of joinableTeamIds) {
joinableTeams[id] = teams[id];
}
return Object.values(joinableTeams).sort((0, team_utils_1.sortTeamsWithLocale)(locale));
});
exports.getMySortedTeamIds = (0, helpers_1.createIdsSelector)('getMySortedTeamIds', exports.getMyTeams, (state, locale) => locale, (teams, locale) => {
return teams.sort((0, team_utils_1.sortTeamsWithLocale)(locale)).map((t) => t.id);
});
function getMyTeamsCount(state) {
return (0, exports.getMyTeams)(state).length;
}
// returns the badge number to show (excluding the current team)
// > 0 means is returning the mention count
// 0 means that there are no unread messages
// -1 means that there are unread messages but no mentions
exports.getChannelDrawerBadgeCount = (0, create_selector_1.createSelector)('getChannelDrawerBadgeCount', getCurrentTeamId, getTeamMemberships, preferences_1.isCollapsedThreadsEnabled, (currentTeamId, teamMembers, collapsed) => {
let mentionCount = 0;
let messageCount = 0;
Object.values(teamMembers).forEach((m) => {
if (m.team_id !== currentTeamId) {
mentionCount += collapsed ? (m.mention_count_root || 0) : (m.mention_count || 0);
messageCount += collapsed ? (m.msg_count_root || 0) : (m.msg_count || 0);
}
});
let badgeCount = 0;
if (mentionCount) {
badgeCount = mentionCount;
}
else if (messageCount) {
badgeCount = -1;
}
return badgeCount;
});
const isTeamSameWithCurrentTeam = (state, teamName) => {
const targetTeam = getTeamByName(state, teamName);
const currentTeam = (0, exports.getCurrentTeam)(state);
return Boolean(targetTeam && targetTeam.id === currentTeam?.id);
};
exports.isTeamSameWithCurrentTeam = isTeamSameWithCurrentTeam;
// returns the badge for a team
// > 0 means is returning the mention count
// 0 means that there are no unread messages
// -1 means that there are unread messages but no mentions
function makeGetBadgeCountForTeamId() {
return (0, create_selector_1.createSelector)('makeGetBadgeCountForTeamId', getTeamMemberships, (state, id) => id, preferences_1.isCollapsedThreadsEnabled, (members, teamId, collapsed) => {
const member = members[teamId];
let badgeCount = 0;
if (member) {
const mentionCount = collapsed ? member.mention_count_root : member.mention_count;
const msgCount = collapsed ? member.msg_count_root : member.msg_count;
if (mentionCount) {
badgeCount = mentionCount;
}
else if (msgCount) {
badgeCount = -1;
}
}
return badgeCount;
});
}
function searchTeamsInPolicy(teams, term) {
return (0, team_utils_1.filterTeamsStartingWithTerm)(teams, term);
}
function getTeamIdByChannelId(state, channelId) {
const channels = state.entities.channels.channels;
if (!channels) {
return undefined;
}
const channel = channels[channelId];
return channel ? channel.team_id : undefined;
}
function contentFlaggingEnabledInTeam(state, teamId) {
const featureEnabled = (0, content_flagging_1.contentFlaggingFeatureEnabled)(state);
if (!featureEnabled) {
return false;
}
return Boolean(state.entities.teams.contentFlaggingStatus[teamId]);
}