From 1ff2fc71f6cf9201b05bb1624ace60db41ad1735 Mon Sep 17 00:00:00 2001 From: Zita Szupera Date: Tue, 14 Nov 2023 13:54:24 +0100 Subject: [PATCH 1/2] fix: display thread replies button even if user doesn't have the permission to send reply --- .../src/lib/message/message.component.spec.ts | 12 ------------ .../src/lib/message/message.component.ts | 4 +--- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/projects/stream-chat-angular/src/lib/message/message.component.spec.ts b/projects/stream-chat-angular/src/lib/message/message.component.spec.ts index d053605f..5658dbcf 100644 --- a/projects/stream-chat-angular/src/lib/message/message.component.spec.ts +++ b/projects/stream-chat-angular/src/lib/message/message.component.spec.ts @@ -991,18 +991,6 @@ describe('MessageComponent', () => { expect(setAsActiveParentMessageSpy).toHaveBeenCalledWith(component.message); }); - it(`shouldn't display reply count for parent messages if user doesn't have the necessary capability`, () => { - component.message = { ...message, reply_count: 1 }; - component.enabledMessageActions = []; - component.ngOnChanges({ - message: {} as SimpleChange, - enabledMessageActions: {} as SimpleChange, - }); - fixture.detectChanges(); - - expect(queryReplyCountButton()).toBeNull(); - }); - it('should display reply in thread icon, if user has the necessary capability', () => { expect(queryReplyInThreadIcon()).not.toBeNull(); diff --git a/projects/stream-chat-angular/src/lib/message/message.component.ts b/projects/stream-chat-angular/src/lib/message/message.component.ts index d1de9249..38009bc4 100644 --- a/projects/stream-chat-angular/src/lib/message/message.component.ts +++ b/projects/stream-chat-angular/src/lib/message/message.component.ts @@ -198,9 +198,7 @@ export class MessageComponent } if (changes.message || changes.enabledMessageActions || changes.mode) { this.shouldDisplayThreadLink = - !!this.message?.reply_count && - this.mode !== 'thread' && - this.enabledMessageActions.indexOf('send-reply') !== -1; + !!this.message?.reply_count && this.mode !== 'thread'; } if (changes.message || changes.mode) { this.areOptionsVisible = this.message From 250a3c95dc68deceb33983be94137dcbb82ae928 Mon Sep 17 00:00:00 2001 From: Zita Szupera Date: Tue, 14 Nov 2023 13:54:53 +0100 Subject: [PATCH 2/2] fix: update UI when channel frozen state changes in progress integrate capabilitied.changed event update stream-chat --- package-lock.json | 14 +++++------ package.json | 2 +- .../src/lib/channel.service.spec.ts | 19 +++++++++++++++ .../src/lib/channel.service.ts | 23 ++++++++++++++++++- .../src/lib/mocks/index.ts | 5 +++- 5 files changed, 53 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6c7807dc..ba3ce3e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "ngx-popperjs": "^12.2.2", "pretty-bytes": "^5.6.0", "rxjs": "^7.1.0", - "stream-chat": "^8.14.0", + "stream-chat": "^8.14.2", "ts-node": "^10.2.1", "tslib": "^2.3.0", "uuidv4": "^6.2.12", @@ -24669,9 +24669,9 @@ } }, "node_modules/stream-chat": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/stream-chat/-/stream-chat-8.14.0.tgz", - "integrity": "sha512-WEAssYcY/qSJXVK4B39JZJjyBzLSE4Wn+Gliywm8Nc2cmM0+fJF0853H5jZNy6AEeZhzxzRfxwq71r0FfZKudQ==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/stream-chat/-/stream-chat-8.14.2.tgz", + "integrity": "sha512-9gfnyvAwZNjc7ThTKhTkNDyRoXyZDJjOR1XD04djfIvssq3Ab/lTQuz0J3IekMuvrofchb7ja/TdB69kgyhntw==", "dependencies": { "@babel/runtime": "^7.16.3", "@types/jsonwebtoken": "~9.0.0", @@ -46159,9 +46159,9 @@ "dev": true }, "stream-chat": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/stream-chat/-/stream-chat-8.14.0.tgz", - "integrity": "sha512-WEAssYcY/qSJXVK4B39JZJjyBzLSE4Wn+Gliywm8Nc2cmM0+fJF0853H5jZNy6AEeZhzxzRfxwq71r0FfZKudQ==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/stream-chat/-/stream-chat-8.14.2.tgz", + "integrity": "sha512-9gfnyvAwZNjc7ThTKhTkNDyRoXyZDJjOR1XD04djfIvssq3Ab/lTQuz0J3IekMuvrofchb7ja/TdB69kgyhntw==", "requires": { "@babel/runtime": "^7.16.3", "@types/jsonwebtoken": "~9.0.0", diff --git a/package.json b/package.json index ed2741da..f3983345 100644 --- a/package.json +++ b/package.json @@ -126,7 +126,7 @@ "ngx-popperjs": "^12.2.2", "pretty-bytes": "^5.6.0", "rxjs": "^7.1.0", - "stream-chat": "^8.14.0", + "stream-chat": "^8.14.2", "ts-node": "^10.2.1", "tslib": "^2.3.0", "uuidv4": "^6.2.12", diff --git a/projects/stream-chat-angular/src/lib/channel.service.spec.ts b/projects/stream-chat-angular/src/lib/channel.service.spec.ts index dc29b410..53e42894 100644 --- a/projects/stream-chat-angular/src/lib/channel.service.spec.ts +++ b/projects/stream-chat-angular/src/lib/channel.service.spec.ts @@ -800,6 +800,25 @@ describe('ChannelService', () => { expect(updatedChannel!.data!.hidden).toBeDefined(); }); + it('should emit changed channel if `capabilities.changed` dispatched', async () => { + await init(); + let channel!: Channel; + service.activeChannel$.pipe(first()).subscribe((c) => (channel = c!)); + const spy = jasmine.createSpy(); + service.channels$.subscribe(spy); + channel.data!.own_capabilities = ['send-message']; + (channel as MockChannel).handleEvent('capabilities.changed', { + type: 'capabilities.changed', + cid: channel.cid, + }); + + const channels = spy.calls.mostRecent().args[0] as Channel[]; + + const updatedChannel = channels.find((c) => c.cid === channel.cid); + + expect(updatedChannel!.data!.own_capabilities).toEqual(['send-message']); + }); + it('should call #customChannelUpdatedHandler, if updated and handler is provided', async () => { await init(); let channel!: Channel; diff --git a/projects/stream-chat-angular/src/lib/channel.service.ts b/projects/stream-chat-angular/src/lib/channel.service.ts index fa477a67..5c0a62fd 100644 --- a/projects/stream-chat-angular/src/lib/channel.service.ts +++ b/projects/stream-chat-angular/src/lib/channel.service.ts @@ -15,6 +15,7 @@ import { ChannelResponse, ChannelSort, Event, + EventTypes, FormatMessageResponse, Message, MessageResponse, @@ -1521,7 +1522,9 @@ export class ChannelService< private watchForChannelEvents(channel: Channel) { const unsubscribe = channel.on((event: Event) => { - switch (event.type) { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + const type = event.type as EventTypes | 'capabilities.changed'; + switch (type) { case 'message.new': { this.ngZone.run(() => { if (this.customNewMessageHandler) { @@ -1624,6 +1627,24 @@ export class ChannelService< }); break; } + case 'capabilities.changed': { + this.ngZone.run(() => { + const cid = event.cid; + if (cid) { + const currentChannels = this.channelsSubject.getValue(); + const index = currentChannels?.findIndex((c) => c.cid === cid); + if (index !== -1 && index !== undefined) { + this.channelsSubject.next([...currentChannels!]); + if (cid === this.activeChannelSubject.getValue()?.cid) { + this.activeChannelSubject.next( + this.activeChannelSubject.getValue() + ); + } + } + } + }); + break; + } } }); this.channelSubscriptions[channel.cid] = unsubscribe.unsubscribe; diff --git a/projects/stream-chat-angular/src/lib/mocks/index.ts b/projects/stream-chat-angular/src/lib/mocks/index.ts index ba31c510..b866f3aa 100644 --- a/projects/stream-chat-angular/src/lib/mocks/index.ts +++ b/projects/stream-chat-angular/src/lib/mocks/index.ts @@ -49,7 +49,10 @@ export const generateMockMessages = (offset = 0, isOlder = false) => { }; export type MockChannel = Channel & { - handleEvent: (name: EventTypes, payload?: any) => void; + handleEvent: ( + name: EventTypes | 'capabilities.changed', + payload?: any + ) => void; }; export const generateMockChannels = (length = 25) => {