mattermost-redux
Version:
Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client
213 lines (212 loc) • 13.8 kB
JavaScript
;
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.searchArchivedGroups = exports.getArchivedGroups = exports.isMyGroup = exports.searchMyAllowReferencedGroups = exports.searchAllowReferencedGroups = exports.getMyGroupMentionKeysForChannel = exports.getMyGroupMentionKeys = exports.getMyGroupsAssociatedToChannelForReference = exports.makeGetMyAllowReferencedGroups = exports.getAllGroupsForReferenceByName = exports.makeGetAllAssociatedGroupsForReference = exports.getGroupsAssociatedToChannelForReference = exports.getGroupsAssociatedToChannel = exports.getGroupsNotAssociatedToChannel = exports.getGroupsAssociatedToTeam = exports.getGroupsNotAssociatedToTeam = exports.getMyGroups = exports.getAssociatedGroupsForReferenceByMention = exports.getAssociatedGroupsByName = exports.getAssociatedGroupsForReference = exports.getGroupsAssociatedToTeamForReference = exports.getAllCustomGroups = exports.getAllGroupsByName = void 0;
exports.getAllGroups = getAllGroups;
exports.getMyGroupIds = getMyGroupIds;
exports.getAllGroupStats = getAllGroupStats;
exports.getGroupStats = getGroupStats;
exports.getGroup = getGroup;
exports.getGroupMemberCount = getGroupMemberCount;
exports.getGroupTeams = getGroupTeams;
exports.getGroupChannels = getGroupChannels;
exports.searchAssociatedGroupsForReferenceLocal = searchAssociatedGroupsForReferenceLocal;
const groups_1 = require("@mattermost/types/groups");
const create_selector_1 = require("mattermost-redux/selectors/create_selector");
const channels_1 = require("mattermost-redux/selectors/entities/channels");
const teams_1 = require("mattermost-redux/selectors/entities/teams");
const group_utils_1 = require("mattermost-redux/utils/group_utils");
const i18n_1 = require("./i18n");
const emptyList = [];
const emptySyncables = {
teams: [],
channels: [],
};
function getGroupInfoForIds(groupsSet, groupIds) {
const groups = [];
for (let i = 0; i < groupIds.length; i++) {
const id = groupIds[i];
groups.push(groupsSet[id]);
}
return groups;
}
function getAllGroups(state) {
return state.entities.groups.groups;
}
exports.getAllGroupsByName = (0, create_selector_1.createSelector)('getAllGroupsByName', getAllGroups, (groups) => {
const groupsByName = {};
for (const id in groups) {
if (Object.hasOwn(groups, id)) {
const group = groups[id];
groupsByName[group.name] = group;
}
}
return groupsByName;
});
function getMyGroupIds(state) {
return state.entities.groups.myGroups;
}
function getAllGroupStats(state) {
return state.entities.groups.stats;
}
function getGroupStats(state, id) {
return getAllGroupStats(state)[id] || {};
}
function getGroup(state, id) {
return getAllGroups(state)[id];
}
function getGroupMemberCount(state, id) {
return getGroupStats(state, id).total_member_count;
}
function getGroupSyncables(state, id) {
return state.entities.groups.syncables[id] || emptySyncables;
}
function getGroupTeams(state, id) {
return getGroupSyncables(state, id).teams;
}
function getGroupChannels(state, id) {
return getGroupSyncables(state, id).channels;
}
exports.getAllCustomGroups = (0, create_selector_1.createSelector)('getAllCustomGroups', getAllGroups, (groups) => {
return Object.entries(groups).filter((entry) => (entry[1].allow_reference && entry[1].delete_at === 0 && entry[1].source === groups_1.GroupSource.Custom)).map((entry) => entry[1]);
});
exports.getGroupsAssociatedToTeamForReference = (0, create_selector_1.createSelector)('getGroupsAssociatedToTeamForReference', getAllGroups, (state, teamID) => getTeamGroupIDSet(state, teamID), (allGroups, teamGroupIDSet) => {
return Object.entries(allGroups).filter(([groupID]) => teamGroupIDSet.has(groupID)).filter((entry) => (entry[1].allow_reference && entry[1].delete_at === 0)).map((entry) => entry[1]);
});
exports.getAssociatedGroupsForReference = (0, create_selector_1.createSelector)('getAssociatedGroupsForReference', (state, teamId) => Boolean((0, teams_1.getTeam)(state, teamId)?.group_constrained), (state, _, channelId) => Boolean((0, channels_1.getChannel)(state, channelId)?.group_constrained), exports.getGroupsAssociatedToTeamForReference, (state, _, channelId) => (channelId ? (0, exports.getGroupsAssociatedToChannelForReference)(state, channelId) : undefined), exports.getAllCustomGroups, (state) => getAllAssociatedGroupsForReference(state, false), (teamConstrained, channelConstrained, groupsFromTeam, groupsFromChannel, customGroups, allGroups) => {
if (teamConstrained && channelConstrained) {
const groupSet = new Set(groupsFromChannel);
return [...(groupsFromChannel || []), ...(groupsFromTeam.filter((item) => !groupSet.has(item))), ...customGroups];
}
if (teamConstrained) {
return [...customGroups, ...groupsFromTeam];
}
if (channelConstrained) {
return [...customGroups, ...(groupsFromChannel || [])];
}
return allGroups;
});
exports.getAssociatedGroupsByName = (0, create_selector_1.createSelector)('getAssociatedGroupsByName', exports.getAssociatedGroupsForReference, (groups) => {
const groupsByName = {};
for (const id in groups) {
if (Object.hasOwn(groups, id)) {
const group = groups[id];
groupsByName[group.name] = group;
}
}
return groupsByName;
});
exports.getAssociatedGroupsForReferenceByMention = (0, create_selector_1.createSelector)('getAssociatedGroupsForReferenceByMention', exports.getAssociatedGroupsForReference, (groups) => {
return new Map(groups.map((group) => [`@${group.name}`, group]));
});
function searchAssociatedGroupsForReferenceLocal(state, term, teamId, channelId) {
const groups = (0, exports.getAssociatedGroupsForReference)(state, teamId, channelId);
if (!groups) {
return emptyList;
}
const filteredGroups = (0, group_utils_1.filterGroupsMatchingTerm)(groups, term);
return filteredGroups;
}
const teamGroupIDs = (state, teamID) => state.entities.teams.groupsAssociatedToTeam[teamID]?.ids || [];
const channelGroupIDs = (state, channelID) => state.entities.channels.groupsAssociatedToChannel[channelID]?.ids || [];
const getTeamGroupIDSet = (0, create_selector_1.createSelector)('getTeamGroupIDSet', teamGroupIDs, (teamIDs) => new Set(teamIDs));
const getChannelGroupIDSet = (0, create_selector_1.createSelector)('getChannelGroupIDSet', channelGroupIDs, (channelIDs) => new Set(channelIDs));
exports.getMyGroups = (0, create_selector_1.createSelector)('getGroupsNotAssociatedToTeam', getAllGroups, getMyGroupIds, (allGroups, myGroupIds) => {
return (0, group_utils_1.sortGroups)(getGroupInfoForIds(allGroups, myGroupIds));
});
exports.getGroupsNotAssociatedToTeam = (0, create_selector_1.createSelector)('getGroupsNotAssociatedToTeam', getAllGroups, (state, teamID) => getTeamGroupIDSet(state, teamID), (allGroups, teamGroupIDSet) => {
return Object.entries(allGroups).filter(([groupID, group]) => !teamGroupIDSet.has(groupID) && (0, group_utils_1.isSyncableSource)(group.source)).map((entry) => entry[1]);
});
exports.getGroupsAssociatedToTeam = (0, create_selector_1.createSelector)('getGroupsAssociatedToTeam', getAllGroups, (state, teamID) => getTeamGroupIDSet(state, teamID), (allGroups, teamGroupIDSet) => {
return Object.entries(allGroups).filter(([groupID]) => teamGroupIDSet.has(groupID)).map((entry) => entry[1]);
});
exports.getGroupsNotAssociatedToChannel = (0, create_selector_1.createSelector)('getGroupsNotAssociatedToChannel', getAllGroups, (state, channelID) => getChannelGroupIDSet(state, channelID), (state, channelID, teamID) => (0, teams_1.getTeam)(state, teamID), (state, channelID, teamID) => (0, exports.getGroupsAssociatedToTeam)(state, teamID), (allGroups, channelGroupIDSet, team, teamGroups) => {
let result = Object.values(allGroups).filter((group) => !channelGroupIDSet.has(group.id) && (0, group_utils_1.isSyncableSource)(group.source));
if (team?.group_constrained) {
const gids = teamGroups.map((group) => group.id);
result = result.filter((group) => gids?.includes(group.id));
}
return result;
});
exports.getGroupsAssociatedToChannel = (0, create_selector_1.createSelector)('getGroupsAssociatedToChannel', getAllGroups, (state, channelID) => getChannelGroupIDSet(state, channelID), (allGroups, channelGroupIDSet) => {
return Object.entries(allGroups).filter(([groupID]) => channelGroupIDSet.has(groupID)).map((entry) => entry[1]);
});
exports.getGroupsAssociatedToChannelForReference = (0, create_selector_1.createSelector)('getGroupsAssociatedToChannelForReference', getAllGroups, (state, channelID) => getChannelGroupIDSet(state, channelID), (allGroups, channelGroupIDSet) => {
return Object.entries(allGroups).filter(([groupID]) => channelGroupIDSet.has(groupID)).filter((entry) => (entry[1].allow_reference && entry[1].delete_at === 0)).map((entry) => entry[1]);
});
const makeGetAllAssociatedGroupsForReference = () => {
return (0, create_selector_1.createSelector)('makeGetAllAssociatedGroupsForReference', (state) => getAllGroups(state), (state) => (0, i18n_1.getCurrentUserLocale)(state), (_, includeArchived) => includeArchived, (allGroups, locale, includeArchived) => {
const groups = Object.entries(allGroups).filter((entry) => {
if (includeArchived) {
return entry[1].allow_reference;
}
return entry[1].allow_reference && entry[1].delete_at === 0;
}).map((entry) => entry[1]);
return (0, group_utils_1.sortGroups)(groups, locale);
});
};
exports.makeGetAllAssociatedGroupsForReference = makeGetAllAssociatedGroupsForReference;
const getAllAssociatedGroupsForReference = (0, exports.makeGetAllAssociatedGroupsForReference)();
exports.getAllGroupsForReferenceByName = (0, create_selector_1.createSelector)('getAllGroupsForReferenceByName', (state) => getAllAssociatedGroupsForReference(state, false), (groups) => {
const groupsByName = {};
for (const id in groups) {
if (Object.hasOwn(groups, id)) {
const group = groups[id];
groupsByName[group.name] = group;
}
}
return groupsByName;
});
const makeGetMyAllowReferencedGroups = () => {
return (0, create_selector_1.createSelector)('makeGetMyAllowReferencedGroups', (state) => (0, exports.getMyGroups)(state), (state) => (0, i18n_1.getCurrentUserLocale)(state), (_, includeArchived) => includeArchived, (myGroups, locale, includeArchived) => {
const groups = myGroups.filter((group) => {
if (includeArchived) {
return group.allow_reference;
}
return group.allow_reference && group.delete_at === 0;
});
return (0, group_utils_1.sortGroups)(groups, locale);
});
};
exports.makeGetMyAllowReferencedGroups = makeGetMyAllowReferencedGroups;
exports.getMyGroupsAssociatedToChannelForReference = (0, create_selector_1.createSelector)('getMyGroupsAssociatedToChannelForReference', exports.getMyGroups, exports.getAssociatedGroupsByName, (myGroups, groups) => {
return myGroups.filter((group) => group.allow_reference && group.delete_at === 0 && groups[group.name]);
});
const getMyAllowReferencedGroups = (0, exports.makeGetMyAllowReferencedGroups)();
exports.getMyGroupMentionKeys = (0, create_selector_1.createSelector)('getMyGroupMentionKeys', (state, includeArchived) => getMyAllowReferencedGroups(state, includeArchived), (groups) => {
const keys = [];
groups.forEach((group) => keys.push({ key: `@${group.name}` }));
return keys;
});
exports.getMyGroupMentionKeysForChannel = (0, create_selector_1.createSelector)('getMyGroupMentionKeysForChannel', exports.getMyGroupsAssociatedToChannelForReference, (groups) => {
const keys = [];
groups.forEach((group) => keys.push({ key: `@${group.name}` }));
return keys;
});
const searchGetAllAssociatedGroupsForReference = (0, exports.makeGetAllAssociatedGroupsForReference)();
exports.searchAllowReferencedGroups = (0, create_selector_1.createSelector)('searchAllowReferencedGroups', (state, term) => term, (state, term, includeArchived) => searchGetAllAssociatedGroupsForReference(state, includeArchived), (term, groups) => {
return (0, group_utils_1.filterGroupsMatchingTerm)(groups, term);
});
const searchGetMyAllowReferencedGroups = (0, exports.makeGetMyAllowReferencedGroups)();
exports.searchMyAllowReferencedGroups = (0, create_selector_1.createSelector)('searchMyAllowReferencedGroups', (state, term) => term, (state, term, includeArchived) => searchGetMyAllowReferencedGroups(state, includeArchived), (term, groups) => {
return (0, group_utils_1.filterGroupsMatchingTerm)(groups, term);
});
exports.isMyGroup = (0, create_selector_1.createSelector)('isMyGroup', getMyGroupIds, (state, groupId) => groupId, (myGroupIDs, groupId) => {
let isMyGroup = false;
myGroupIDs.forEach((myGroupId) => {
if (myGroupId === groupId) {
isMyGroup = true;
}
});
return isMyGroup;
});
exports.getArchivedGroups = (0, create_selector_1.createSelector)('getArchivedGroups', (state) => getAllGroups(state), (state) => (0, i18n_1.getCurrentUserLocale)(state), (allGroups, locale) => {
const groups = Object.entries(allGroups).filter((entry) => {
return entry[1].allow_reference && entry[1].delete_at > 0;
}).map((entry) => entry[1]);
return (0, group_utils_1.sortGroups)(groups, locale);
});
exports.searchArchivedGroups = (0, create_selector_1.createSelector)('searchArchivedGroups', exports.getArchivedGroups, (state, term) => term, (groups, term) => {
return (0, group_utils_1.filterGroupsMatchingTerm)(groups, term);
});