UNPKG

mattermost-redux

Version:

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

240 lines (239 loc) 12.5 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.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]); }