diff --git a/app/definitions/rest/v1/channels.ts b/app/definitions/rest/v1/channels.ts index 42b3edac5..ff0ee4a15 100644 --- a/app/definitions/rest/v1/channels.ts +++ b/app/definitions/rest/v1/channels.ts @@ -52,7 +52,9 @@ export type ChannelsEndpoints = { }; }; 'channels.convertToTeam': { - POST: (params: { channelId: string; channelName: string }) => { team: ITeam }; + POST: (params: { channelId: string } | { channelName: string } | { channelId: string; channelName: string }) => { + team: ITeam; + }; }; 'channels.info': { GET: (params: { roomId: string }) => { channel: IServerRoom }; diff --git a/app/lib/services/restApi.ts b/app/lib/services/restApi.ts index 55a50b841..13067e85e 100644 --- a/app/lib/services/restApi.ts +++ b/app/lib/services/restApi.ts @@ -230,17 +230,23 @@ export const teamListRoomsOfUser = ({ teamId, userId }: { teamId: string; userId sdk.get('teams.listRoomsOfUser', { teamId, userId }); export const convertChannelToTeam = ({ rid, name, type }: { rid: string; name: string; type: 'c' | 'p' }) => { - const params = { - ...(type === 'c' - ? { + const serverVersion = reduxStore.getState().server.version; + let params; + if (type === 'c') { + // https://github.com/RocketChat/Rocket.Chat/pull/25279 + params = compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '4.8.0') + ? { channelId: rid } + : { channelId: rid, channelName: name - } - : { - roomId: rid, - roomName: name - }) - }; + }; + } else { + params = { + roomId: rid, + roomName: name + }; + } + return sdk.post(type === 'c' ? 'channels.convertToTeam' : 'groups.convertToTeam', params); }; diff --git a/e2e/tests/team/03-moveconvert.spec.ts b/e2e/tests/team/03-moveconvert.spec.ts index b2721e6a1..7d3512dd1 100644 --- a/e2e/tests/team/03-moveconvert.spec.ts +++ b/e2e/tests/team/03-moveconvert.spec.ts @@ -6,8 +6,9 @@ import random from '../../helpers/random'; const toBeConverted = `to-be-converted-${random()}`; const toBeMoved = `to-be-moved-${random()}`; +const publicChannelToBeConverted = `channel-public-to-be-converted-${random()}`; -const createChannel = async (room: string) => { +const createChannel = async (room: string, publicChannel?: boolean) => { await waitFor(element(by.id('rooms-list-view-create-channel'))) .toBeVisible() .withTimeout(5000); @@ -28,6 +29,9 @@ const createChannel = async (room: string) => { .withTimeout(10000); await element(by.id('create-channel-name')).replaceText(room); await element(by.id('create-channel-name')).tapReturnKey(); + if (publicChannel) { + await element(by.id('create-channel-type')).tap(); + } await waitFor(element(by.id('create-channel-submit'))) .toExist() .withTimeout(10000); @@ -68,11 +72,28 @@ describe('Move/Convert Team', () => { }); describe('Convert', () => { - beforeAll(async () => { - await createChannel(toBeConverted); + it('should convert public channel to a team', async () => { + await createChannel(publicChannelToBeConverted, true); + await navigateToRoomActions(publicChannelToBeConverted); + await element(by.id('room-actions-scrollview')).scrollTo('bottom'); + await waitFor(element(by.id('room-actions-convert-to-team'))) + .toBeVisible() + .withTimeout(2000); + await element(by.id('room-actions-convert-to-team')).tap(); + await waitFor(element(by[textMatcher]('You are converting this Channel to a Team. All Members will be kept.'))) + .toExist() + .withTimeout(2000); + await element(by[textMatcher]('Convert').and(by.type(alertButtonType))).tap(); + await waitFor(element(by.id('room-view'))) + .toExist() + .withTimeout(20000); + await waitFor(element(by.id(`room-view-title-${publicChannelToBeConverted}`))) + .toExist() + .withTimeout(6000); }); - it('should convert channel to a team', async () => { + it('should convert private channel to a team', async () => { + await createChannel(toBeConverted); await navigateToRoomActions(toBeConverted); await element(by.id('room-actions-scrollview')).scrollTo('bottom'); await waitFor(element(by.id('room-actions-convert-to-team'))) @@ -91,7 +112,7 @@ describe('Move/Convert Team', () => { .withTimeout(6000); }); - afterAll(async () => { + afterEach(async () => { await tapBack(); await waitFor(element(by.id('rooms-list-view'))) .toExist()