Skip to content

Commit 8664b16

Browse files
authored
Merge pull request #381 from GetStream/display-other-user-image-for-one-to-one-chat
feat: Display other user's image in 1:1 channels #380
2 parents aa834c0 + ca9facb commit 8664b16

File tree

3 files changed

+68
-9
lines changed

3 files changed

+68
-9
lines changed

projects/stream-chat-angular/src/lib/avatar/avatar.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
}"
1313
>
1414
<img
15-
*ngIf="imageUrl && !isError; else fallback"
15+
*ngIf="(imageUrl || fallbackChannelImage) && !isError; else fallback"
1616
class="str-chat__avatar-image str-chat__avatar-image{{
1717
isLoaded ? ' str-chat__avatar-image--loaded' : ''
1818
}}"
19-
src="{{ imageUrl }}"
19+
src="{{ imageUrl || fallbackChannelImage }}"
2020
alt="{{ initials }}"
2121
data-testid="avatar-img"
2222
(load)="isLoaded = true"

projects/stream-chat-angular/src/lib/avatar/avatar.component.spec.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,43 @@ describe('AvatarComponent', () => {
169169

170170
expect(component.initials).toBe('#');
171171
});
172+
173+
it(`should display other user's image in 1:1 chats`, () => {
174+
const channel = generateMockChannels()[0];
175+
channel.state.members = {
176+
otheruser: {
177+
user_id: 'otheruser',
178+
user: { id: 'otheruser', name: 'Jack', image: 'url/to/img' },
179+
},
180+
[chatClientServiceMock.chatClient.user.id]: {
181+
user_id: chatClientServiceMock.chatClient.user.id,
182+
user: { id: chatClientServiceMock.chatClient.user.id, name: 'Sara' },
183+
},
184+
};
185+
component.imageUrl = undefined;
186+
component.channel = channel;
187+
component.type = 'channel';
188+
fixture.detectChanges();
189+
190+
expect(queryImg()?.src).toContain('url/to/img');
191+
192+
component.imageUrl = 'channel/img';
193+
fixture.detectChanges();
194+
195+
expect(queryImg()?.src).toContain('channel/img');
196+
197+
channel.state.members.otheruser.user!.image = undefined;
198+
component.imageUrl = undefined;
199+
fixture.detectChanges();
200+
201+
expect(queryImg()).toBeNull();
202+
203+
channel.state.members['thirduser'] = {
204+
user_id: 'thirduser',
205+
user: { id: 'thirduser', image: 'profile/img' },
206+
};
207+
fixture.detectChanges();
208+
209+
expect(queryImg()).toBeNull();
210+
});
172211
});

projects/stream-chat-angular/src/lib/avatar/avatar.component.ts

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,9 @@ export class AvatarComponent {
5757
if (this.channel?.data?.name) {
5858
result = this.channel?.data?.name;
5959
} else {
60-
const otherMembers = Object.values(
61-
this.channel?.state?.members || {}
62-
).filter(
63-
(m) => m.user_id !== this.chatClientService.chatClient.user?.id
64-
);
65-
if (otherMembers.length === 1) {
66-
result = otherMembers[0].user?.name || otherMembers[0].user?.id || '';
60+
const otherMember = this.getOtherMemberIfOneToOneChannel();
61+
if (otherMember) {
62+
result = otherMember.name || otherMember.id || '';
6763
} else {
6864
result = '#';
6965
}
@@ -72,4 +68,28 @@ export class AvatarComponent {
7268

7369
return result.charAt(0) || '';
7470
}
71+
72+
get fallbackChannelImage() {
73+
if (this.type !== 'channel') {
74+
return undefined;
75+
} else {
76+
const otherMember = this.getOtherMemberIfOneToOneChannel();
77+
if (otherMember) {
78+
return otherMember.image;
79+
} else {
80+
return undefined;
81+
}
82+
}
83+
}
84+
85+
private getOtherMemberIfOneToOneChannel() {
86+
const otherMembers = Object.values(
87+
this.channel?.state?.members || {}
88+
).filter((m) => m.user_id !== this.chatClientService.chatClient.user?.id);
89+
if (otherMembers.length === 1) {
90+
return otherMembers[0].user;
91+
} else {
92+
return undefined;
93+
}
94+
}
7595
}

0 commit comments

Comments
 (0)