diff --git a/app/actions/remote/groups.ts b/app/actions/remote/groups.ts index 01487aaeb9..64d1fa99b3 100644 --- a/app/actions/remote/groups.ts +++ b/app/actions/remote/groups.ts @@ -17,6 +17,17 @@ export const fetchGroupsForChannel = async (serverUrl: string, channelId: string } }; +export const fetchGroupsForMembership = async (serverUrl: string, userId: string) => { + let client: Client; + try { + client = NetworkManager.getClient(serverUrl); + return client.getAllGroupsAssociatedToMembership(userId); + } catch (error) { + forceLogoutIfNecessary(serverUrl, error as ClientErrorProps); + return {error}; + } +}; + export const fetchGroupsForTeam = async (serverUrl: string, teamId: string) => { let client: Client; try { @@ -38,3 +49,56 @@ export const fetchGroupsForAutocomplete = async (serverUrl: string, query: strin return {error}; } }; + +export const fetchMembershipsForGroup = async (serverUrl: string, groupId: string) => { + let client: Client; + try { + client = NetworkManager.getClient(serverUrl); + return client.getAllMembershipsAssociatedToGroup(groupId); + } catch (error) { + forceLogoutIfNecessary(serverUrl, error as ClientErrorProps); + return {error}; + } +}; + +export const fetchTeamsForGroup = async (serverUrl: string, groupId: string) => { + let client: Client; + try { + client = NetworkManager.getClient(serverUrl); + return client.getAllTeamsAssociatedToGroup(groupId); + } catch (error) { + forceLogoutIfNecessary(serverUrl, error as ClientErrorProps); + return {error}; + } +}; + +export const fetchChannelsForGroup = async (serverUrl: string, groupId: string) => { + let client: Client; + try { + client = NetworkManager.getClient(serverUrl); + return client.getAllChannelsAssociatedToGroup(groupId); + } catch (error) { + forceLogoutIfNecessary(serverUrl, error as ClientErrorProps); + return {error}; + } +}; + +export const fetchFilteredTeamGroups = async (serverUrl: string, teamId: string, searchTerm: string) => { + const response = await fetchGroupsForTeam(serverUrl, teamId); + + if (response && 'groups' in response) { + return response.groups.filter((g) => g.name.toLowerCase().includes(searchTerm.toLowerCase())); + } + + return []; +}; + +export const fetchFilteredChannelGroups = async (serverUrl: string, channelId: string, searchTerm: string) => { + const response = await fetchGroupsForChannel(serverUrl, channelId); + + if (response && 'groups' in response) { + return response.groups.filter((g) => g.name.toLowerCase().includes(searchTerm.toLowerCase())); + } + + return []; +}; diff --git a/app/client/rest/groups.ts b/app/client/rest/groups.ts index f431af77ca..f0e6a5740c 100644 --- a/app/client/rest/groups.ts +++ b/app/client/rest/groups.ts @@ -7,8 +7,12 @@ import {PER_PAGE_DEFAULT} from './constants'; export interface ClientGroupsMix { getGroups: (query?: string, filterAllowReference?: boolean, page?: number, perPage?: number, since?: number) => Promise; - getAllGroupsAssociatedToTeam: (teamID: string, filterAllowReference?: boolean) => Promise<{groups: Group[]; total_group_count: number}>; - getAllGroupsAssociatedToChannel: (channelID: string, filterAllowReference?: boolean) => Promise<{groups: Group[]; total_group_count: number}>; + getAllGroupsAssociatedToChannel: (channelId: string, filterAllowReference?: boolean) => Promise<{groups: Group[]; total_group_count: number}>; + getAllGroupsAssociatedToMembership: (userId: string, filterAllowReference?: boolean) => Promise<{groups: Group[]; total_group_count: number}>; + getAllGroupsAssociatedToTeam: (teamId: string, filterAllowReference?: boolean) => Promise<{groups: Group[]; total_group_count: number}>; + getAllChannelsAssociatedToGroup: (groupId: string, filterAllowReference?: boolean) => Promise<{groupChannels: GroupChannel[]}>; + getAllMembershipsAssociatedToGroup: (groupId: string, filterAllowReference?: boolean) => Promise<{groupMemberships: GroupMembership; total_member_count: number}>; + getAllTeamsAssociatedToGroup: (groupId: string, filterAllowReference?: boolean) => Promise<{groupTeams: GroupTeam[]}>; } const ClientGroups = (superclass: any) => class extends superclass { @@ -19,16 +23,44 @@ const ClientGroups = (superclass: any) => class extends superclass { ); }; - getAllGroupsAssociatedToTeam = async (teamID: string, filterAllowReference = false) => { + getAllGroupsAssociatedToChannel = async (channelId: string, filterAllowReference = false) => { return this.doFetch( - `${this.urlVersion}/teams/${teamID}/groups${buildQueryString({paginate: false, filter_allow_reference: filterAllowReference})}`, + `${this.urlVersion}/channels/${channelId}/groups${buildQueryString({paginate: false, filter_allow_reference: filterAllowReference})}`, {method: 'get'}, ); }; - getAllGroupsAssociatedToChannel = async (channelID: string, filterAllowReference = false) => { + getAllGroupsAssociatedToTeam = async (teamId: string, filterAllowReference = false) => { return this.doFetch( - `${this.urlVersion}/channels/${channelID}/groups${buildQueryString({paginate: false, filter_allow_reference: filterAllowReference})}`, + `${this.urlVersion}/teams/${teamId}/groups${buildQueryString({paginate: false, filter_allow_reference: filterAllowReference})}`, + {method: 'get'}, + ); + }; + + getAllGroupsAssociatedToMembership = async (userId: string, filterAllowReference = false) => { + return this.doFetch( + `${this.urlVersion}/users/${userId}/groups${buildQueryString({paginate: false, filter_allow_reference: filterAllowReference})}`, + {method: 'get'}, + ); + }; + + getAllTeamsAssociatedToGroup = async (groupId: string, filterAllowReference = false) => { + return this.doFetch( + `${this.urlVersion}/groups/${groupId}/teams${buildQueryString({filter_allow_reference: filterAllowReference})}`, + {method: 'get'}, + ); + }; + + getAllChannelsAssociatedToGroup = async (groupId: string, filterAllowReference = false) => { + return this.doFetch( + `${this.urlVersion}/groups/${groupId}/channels${buildQueryString({filter_allow_reference: filterAllowReference})}`, + {method: 'get'}, + ); + }; + + getAllMembershipsAssociatedToGroup = async (groupId: string, filterAllowReference = false) => { + return this.doFetch( + `${this.urlVersion}/groups/${groupId}/members${buildQueryString({filter_allow_reference: filterAllowReference})}`, {method: 'get'}, ); }; diff --git a/app/components/autocomplete/at_mention/at_mention.tsx b/app/components/autocomplete/at_mention/at_mention.tsx index 2e6715d032..0dd747fa7d 100644 --- a/app/components/autocomplete/at_mention/at_mention.tsx +++ b/app/components/autocomplete/at_mention/at_mention.tsx @@ -5,7 +5,7 @@ import {debounce} from 'lodash'; import React, {useCallback, useEffect, useMemo, useState} from 'react'; import {Platform, SectionList, SectionListData, SectionListRenderItemInfo} from 'react-native'; -import {fetchGroupsForAutocomplete, fetchGroupsForChannel, fetchGroupsForTeam} from '@actions/remote/groups'; +import {fetchFilteredChannelGroups, fetchFilteredTeamGroups, fetchGroupsForAutocomplete} from '@actions/remote/groups'; import {searchUsers} from '@actions/remote/user'; import GroupMentionItem from '@components/autocomplete/at_mention_group/at_mention_group'; import AtMentionItem from '@components/autocomplete/at_mention_item'; @@ -172,26 +172,6 @@ const makeSections = (teamMembers: Array, usersInChanne return newSections; }; -const getFilteredTeamGroups = async (serverUrl: string, teamId: string, searchTerm: string) => { - const response = await fetchGroupsForTeam(serverUrl, teamId); - - if (response && 'groups' in response) { - return response.groups.filter((g) => g.name.toLowerCase().includes(searchTerm.toLowerCase())); - } - - return []; -}; - -const getFilteredChannelGroups = async (serverUrl: string, channelId: string, searchTerm: string) => { - const response = await fetchGroupsForChannel(serverUrl, channelId); - - if (response && 'groups' in response) { - return response.groups.filter((g) => g.name.toLowerCase().includes(searchTerm.toLowerCase())); - } - - return []; -}; - type Props = { channelId?: string; teamId?: string; @@ -383,7 +363,7 @@ const AtMention = ({ if (useGroupMentions && matchTerm && matchTerm !== '') { // If the channel is constrained, we only show groups for that channel if (isChannelConstrained && channelId) { - getFilteredChannelGroups(serverUrl, channelId, matchTerm).then((g) => { + fetchFilteredChannelGroups(serverUrl, channelId, matchTerm).then((g) => { setGroups(g.length ? g : emptyGroupList); }).catch(() => { setGroups(emptyGroupList); @@ -392,7 +372,7 @@ const AtMention = ({ // If there is no channel constraint, but a team constraint - only show groups for team if (isTeamConstrained && !isChannelConstrained) { - getFilteredTeamGroups(serverUrl, teamId!, matchTerm).then((g) => { + fetchFilteredTeamGroups(serverUrl, teamId!, matchTerm).then((g) => { setGroups(g.length ? g : emptyGroupList); }).catch(() => { setGroups(emptyGroupList);