Skip to content

Commit c17db10

Browse files
authored
Merge pull request #493 from GetStream/online-indicator-fix
fix: remove unnecessary user queries from avatar, properly bind showO…
2 parents 55a3d31 + 8c6cef3 commit c17db10

File tree

3 files changed

+38
-50
lines changed

3 files changed

+38
-50
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
</ng-template>
4343
<div
4444
data-testid="online-indicator"
45-
*ngIf="isOnline"
45+
*ngIf="isOnline && showOnlineIndicator"
4646
class="str-chat__avatar--online-indicator"
4747
></div>
4848
</div>

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

Lines changed: 35 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,16 @@ describe('AvatarComponent', () => {
1414
let queryImg: () => HTMLImageElement | null;
1515
let queryFallbackImg: () => HTMLImageElement | null;
1616
let queryOnlineIndicator: () => HTMLElement | null;
17-
let queryUsersMock: jasmine.Spy;
1817
let events$: Subject<ClientEvent>;
1918
let chatClientServiceMock: {
20-
chatClient: { user: { id: string }; queryUsers: jasmine.Spy };
19+
chatClient: { user: { id: string } };
2120
events$: Subject<ClientEvent>;
2221
};
2322

2423
beforeEach(() => {
25-
queryUsersMock = jasmine.createSpy();
2624
events$ = new Subject();
2725
chatClientServiceMock = {
28-
chatClient: { user: { id: 'current-user' }, queryUsers: queryUsersMock },
26+
chatClient: { user: { id: 'current-user' } },
2927
events$,
3028
};
3129
TestBed.configureTestingModule({
@@ -230,14 +228,18 @@ describe('AvatarComponent', () => {
230228
channel.state.members = {
231229
otheruser: {
232230
user_id: 'otheruser',
233-
user: { id: 'otheruser', name: 'Jack', image: 'url/to/img' },
231+
user: {
232+
id: 'otheruser',
233+
name: 'Jack',
234+
image: 'url/to/img',
235+
online: true,
236+
},
234237
},
235238
[chatClientServiceMock.chatClient.user.id]: {
236239
user_id: chatClientServiceMock.chatClient.user.id,
237240
user: { id: chatClientServiceMock.chatClient.user.id, name: 'Sara' },
238241
},
239242
};
240-
queryUsersMock.and.resolveTo({ users: [{ online: true }] });
241243
component.channel = channel;
242244
void component.ngOnChanges({ channel: {} as SimpleChange });
243245
await fixture.whenStable();
@@ -251,14 +253,18 @@ describe('AvatarComponent', () => {
251253
channel.state.members = {
252254
otheruser: {
253255
user_id: 'otheruser',
254-
user: { id: 'otheruser', name: 'Jack', image: 'url/to/img' },
256+
user: {
257+
id: 'otheruser',
258+
name: 'Jack',
259+
image: 'url/to/img',
260+
online: false,
261+
},
255262
},
256263
[chatClientServiceMock.chatClient.user.id]: {
257264
user_id: chatClientServiceMock.chatClient.user.id,
258265
user: { id: chatClientServiceMock.chatClient.user.id, name: 'Sara' },
259266
},
260267
};
261-
queryUsersMock.and.resolveTo({ users: [{ online: false }] });
262268
component.channel = channel;
263269
void component.ngOnChanges({ channel: {} as SimpleChange });
264270
await fixture.whenStable();
@@ -272,14 +278,18 @@ describe('AvatarComponent', () => {
272278
channel.state.members = {
273279
otheruser: {
274280
user_id: 'otheruser',
275-
user: { id: 'otheruser', name: 'Jack', image: 'url/to/img' },
281+
user: {
282+
id: 'otheruser',
283+
name: 'Jack',
284+
image: 'url/to/img',
285+
online: false,
286+
},
276287
},
277288
[chatClientServiceMock.chatClient.user.id]: {
278289
user_id: chatClientServiceMock.chatClient.user.id,
279290
user: { id: chatClientServiceMock.chatClient.user.id, name: 'Sara' },
280291
},
281292
};
282-
queryUsersMock.and.resolveTo({ users: [{ online: false }] });
283293
component.channel = channel;
284294
void component.ngOnChanges({ channel: {} as SimpleChange });
285295
await fixture.whenStable();
@@ -299,7 +309,7 @@ describe('AvatarComponent', () => {
299309
expect(queryOnlineIndicator()).not.toBeNull();
300310
});
301311

302-
it(`should handle query users error when displaying the online indicator`, async () => {
312+
it(`shouldn't display online indicator in not 1:1 channels`, async () => {
303313
const channel = generateMockChannels()[0];
304314
channel.state.members = {
305315
otheruser: {
@@ -311,37 +321,20 @@ describe('AvatarComponent', () => {
311321
online: true,
312322
},
313323
},
314-
[chatClientServiceMock.chatClient.user.id]: {
315-
user_id: chatClientServiceMock.chatClient.user.id,
316-
user: { id: chatClientServiceMock.chatClient.user.id, name: 'Sara' },
317-
},
318-
};
319-
queryUsersMock.and.rejectWith(new Error('Permission denied'));
320-
component.channel = channel;
321-
void component.ngOnChanges({ channel: {} as SimpleChange });
322-
await fixture.whenStable();
323-
fixture.detectChanges();
324-
325-
expect(queryOnlineIndicator()).not.toBeNull();
326-
});
327-
328-
it(`shouldn't display online indicator in not 1:1 channels`, async () => {
329-
const channel = generateMockChannels()[0];
330-
channel.state.members = {
331-
otheruser: {
332-
user_id: 'otheruser',
333-
user: { id: 'otheruser', name: 'Jack', image: 'url/to/img' },
334-
},
335324
thirduser: {
336325
user_id: 'thirduser',
337-
user: { id: 'thirduser', name: 'John', image: 'url/to/img' },
326+
user: {
327+
id: 'thirduser',
328+
name: 'John',
329+
image: 'url/to/img',
330+
online: true,
331+
},
338332
},
339333
[chatClientServiceMock.chatClient.user.id]: {
340334
user_id: chatClientServiceMock.chatClient.user.id,
341335
user: { id: chatClientServiceMock.chatClient.user.id, name: 'Sara' },
342336
},
343337
};
344-
queryUsersMock.and.resolveTo({ users: [{ online: true }] });
345338
component.channel = channel;
346339
void component.ngOnChanges({ channel: {} as SimpleChange });
347340
await fixture.whenStable();
@@ -355,20 +348,25 @@ describe('AvatarComponent', () => {
355348
channel.state.members = {
356349
otheruser: {
357350
user_id: 'otheruser',
358-
user: { id: 'otheruser', name: 'Jack', image: 'url/to/img' },
351+
user: {
352+
id: 'otheruser',
353+
name: 'Jack',
354+
image: 'url/to/img',
355+
online: true,
356+
},
359357
},
360358
[chatClientServiceMock.chatClient.user.id]: {
361359
user_id: chatClientServiceMock.chatClient.user.id,
362360
user: { id: chatClientServiceMock.chatClient.user.id, name: 'Sara' },
363361
},
364362
};
365-
queryUsersMock.and.resolveTo({ users: [{ online: true }] });
366363
component.channel = channel;
364+
component.showOnlineIndicator = false;
367365
void component.ngOnChanges({ channel: {} as SimpleChange });
368366
await fixture.whenStable();
369367
fixture.detectChanges();
370368

371-
expect(queryOnlineIndicator()).not.toBeNull();
369+
expect(queryOnlineIndicator()).toBeNull();
372370
});
373371

374372
it('should display initials correctly, #initialsType is "first-letter-of-each-word"', () => {

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

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,12 @@ export class AvatarComponent implements OnChanges {
7272
private ngZone: NgZone
7373
) {}
7474

75-
async ngOnChanges(changes: SimpleChanges) {
75+
ngOnChanges(changes: SimpleChanges) {
7676
if (changes['channel']) {
7777
if (this.channel) {
7878
const otherMember = this.getOtherMemberIfOneToOneChannel();
7979
if (otherMember) {
80+
this.isOnline = otherMember.online || false;
8081
this.isOnlineSubscription = this.chatClientService.events$
8182
.pipe(filter((e) => e.eventType === 'user.presence.changed'))
8283
.subscribe((event) => {
@@ -86,17 +87,6 @@ export class AvatarComponent implements OnChanges {
8687
});
8788
}
8889
});
89-
try {
90-
const response = await this.chatClientService.chatClient.queryUsers(
91-
{
92-
id: { $eq: otherMember.id },
93-
}
94-
);
95-
this.isOnline = response.users[0]?.online || false;
96-
} catch (error) {
97-
// Fallback if we can't query user -> for example due to permission problems
98-
this.isOnline = otherMember.online || false;
99-
}
10090
} else {
10191
this.isOnlineSubscription?.unsubscribe();
10292
}

0 commit comments

Comments
 (0)