Skip to content

Commit 83e2fd1

Browse files
committed
fix: show all group app participants
Remove protocol-specific participant filtering so legacy bots and newer apps stay visible in group details across Proteus, mixed, and MLS conversations. Add regression coverage for each protocol state.
1 parent 5d87418 commit 83e2fd1

2 files changed

Lines changed: 57 additions & 16 deletions

File tree

apps/webapp/src/script/page/rightSidebar/conversationDetails/conversationDetails.test.tsx

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import {act, render} from '@testing-library/react';
2121
import {CONVERSATION_TYPE} from '@wireapp/api-client/lib/conversation';
2222
import {CONVERSATION_PROTOCOL} from '@wireapp/api-client/lib/team';
23+
import {UserType} from '@wireapp/api-client/lib/user';
2324

2425
import {CellsRepository} from 'Repositories/cells/cellsRepository';
2526
import {ConnectionRepository} from 'Repositories/connection/connectionRepository';
@@ -29,6 +30,7 @@ import {MessageRepository} from 'Repositories/conversation/MessageRepository';
2930
import {Conversation} from 'Repositories/entity/Conversation';
3031
import {User} from 'Repositories/entity/User';
3132
import {IntegrationRepository} from 'Repositories/integration/IntegrationRepository';
33+
import {ServiceEntity} from 'Repositories/integration/ServiceEntity';
3234
import {SearchRepository} from 'Repositories/search/searchRepository';
3335
import {SelfRepository} from 'Repositories/self/SelfRepository';
3436
import {TeamEntity} from 'Repositories/team/TeamEntity';
@@ -39,16 +41,16 @@ import {
3941
createRootContextValueForTest,
4042
createRootProviderWrapperForTest,
4143
} from 'src/script/page/testSupport/rootContextTestSupport';
42-
import {translate} from 'Util/localizerUtil';
4344
import 'src/script/util/test/mock/localStorageMock';
45+
import {translate} from 'Util/localizerUtil';
46+
import {translateForTest} from 'Util/test/translateForTest';
4447
import {createUuid} from 'Util/uuid';
4548

4649
import {ConversationDetails} from './conversationDetails';
4750

4851
import {TestFactory} from '../../../../../test/helper/TestFactory';
4952
import {ActionsViewModel} from '../../../view_model/ActionsViewModel';
5053
import {MainViewModel} from '../../../view_model/MainViewModel';
51-
import {translateForTest} from 'Util/test/translateForTest';
5254

5355
jest.mock('Components/panel/enrichedFields', () => ({
5456
useEnrichedFields: (): never[] => [],
@@ -120,6 +122,48 @@ const getDefaultParams = () => {
120122
};
121123

122124
describe('ConversationDetails', () => {
125+
it.each([CONVERSATION_PROTOCOL.PROTEUS, CONVERSATION_PROTOCOL.MIXED, CONVERSATION_PROTOCOL.MLS])(
126+
'shows legacy bots and apps in %s groups',
127+
protocol => {
128+
const conversation = new Conversation(createUuid(), '', protocol, translateForTest);
129+
const regularUser = new User('regular-user', '', translateForTest);
130+
const legacyBot = new User('legacy-bot', '', translateForTest);
131+
const app = new User('app', '', translateForTest);
132+
133+
regularUser.name('Regular user');
134+
legacyBot.name('Legacy bot');
135+
legacyBot.isService = true;
136+
legacyBot.type = UserType.BOT;
137+
app.name('App');
138+
app.type = UserType.APP;
139+
conversation.participating_user_ets([regularUser, legacyBot, app]);
140+
141+
const defaultProps = getDefaultParams();
142+
const integrationRepository = {
143+
...defaultProps.integrationRepository,
144+
mapServiceFromUser: (user: User) =>
145+
new ServiceEntity({
146+
id: user.id,
147+
name: user.name(),
148+
qualifiedId: user.qualifiedId,
149+
type: 'App',
150+
}),
151+
} as IntegrationRepository;
152+
153+
const {getByTestId} = render(
154+
<ConversationDetails
155+
{...defaultProps}
156+
activeConversation={conversation}
157+
integrationRepository={integrationRepository}
158+
/>,
159+
{wrapper: rootProviderWrapper},
160+
);
161+
162+
expect(getByTestId(`service-list-service-${legacyBot.id}`)).not.toBeNull();
163+
expect(getByTestId(`service-list-service-${app.id}`)).not.toBeNull();
164+
},
165+
);
166+
123167
it("returns the right actions depending on the conversation's type for non group creators", () => {
124168
const conversation = new Conversation('', '', CONVERSATION_PROTOCOL.PROTEUS, translateForTest);
125169
const otherUser = new User('other-user', '', translateForTest);

apps/webapp/src/script/page/rightSidebar/conversationDetails/conversationDetails.tsx

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import {forwardRef, useEffect, useMemo, useState} from 'react';
2121

2222
import {CONVERSATION_ACCESS, CONVERSATION_CELLS_STATE} from '@wireapp/api-client/lib/conversation';
2323
import {RECEIPT_MODE} from '@wireapp/api-client/lib/conversation/data/';
24-
import {CONVERSATION_PROTOCOL} from '@wireapp/api-client/lib/team';
2524
import {UserType} from '@wireapp/api-client/lib/user';
2625

2726
import {TabIndex} from '@wireapp/react-ui-kit';
@@ -200,20 +199,18 @@ const ConversationDetails = forwardRef<HTMLDivElement, ConversationDetailsProps>
200199
const allUsersCount = exceedsMaxUserCount ? usersCount : 0;
201200

202201
const serviceParticipants: ServiceEntity[] = useMemo(() => {
203-
const services = new Array<ServiceEntity>();
204-
205-
if (activeConversation.protocol === CONVERSATION_PROTOCOL.PROTEUS) {
206-
services.push(...participatingUserEts.filter(service => isServiceEntity(service)));
207-
} else {
208-
services.push(
209-
...participatingUserEts
210-
.filter(user => user.type === UserType.APP)
211-
.map(user => integrationRepository.mapServiceFromUser(user)),
212-
);
213-
}
202+
return participatingUserEts.flatMap(participant => {
203+
if (isServiceEntity(participant)) {
204+
return [participant];
205+
}
214206

215-
return services;
216-
}, [activeConversation.protocol, integrationRepository, participatingUserEts]);
207+
if (participant.type === UserType.APP) {
208+
return [integrationRepository.mapServiceFromUser(participant)];
209+
}
210+
211+
return [];
212+
});
213+
}, [integrationRepository, participatingUserEts]);
217214

218215
const toggleMute = () => actionsViewModel.toggleMuteConversation(activeConversation);
219216

0 commit comments

Comments
 (0)