Skip to content

Commit 7c3d4f0

Browse files
committed
fix: Custom message edit input send working
1 parent d133454 commit 7c3d4f0

File tree

7 files changed

+46
-23
lines changed

7 files changed

+46
-23
lines changed

projects/customizations-example/src/app/app.component.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
let-mode="mode"
7878
let-isMultipleFileUploadEnabled="isMultipleFileUploadEnabled"
7979
let-messageUpdateHandler="messageUpdateHandler"
80+
let-sendMessage$="sendMessage$"
8081
>
8182
<stream-message-input
8283
style="--grey-whisper: rgba(165, 214, 167, 0.4); --primary-color: #8bc34a"
@@ -87,6 +88,7 @@
8788
[mode]="mode"
8889
[isMultipleFileUploadEnabled]="isMultipleFileUploadEnabled"
8990
(messageUpdate)="messageUpdateHandler ? messageUpdateHandler() : null"
91+
[sendMessage$]="sendMessage$"
9092
></stream-message-input>
9193
</ng-template>
9294

projects/stream-chat-angular/src/lib/message-actions-box/message-actions-box.component.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,12 @@
5858
#defaultInput
5959
let-messageInput="message"
6060
let-messageUpdateHandler="messageUpdateHandler"
61+
let-sendMessage$Input="sendMessage$"
6162
>
6263
<stream-message-input
6364
[message]="messageInput"
6465
(messageUpdate)="messageUpdateHandler()"
66+
[sendMessage$]="sendMessage$Input"
6567
></stream-message-input>
6668
</ng-template>
6769
<ng-container

projects/stream-chat-angular/src/lib/message-actions-box/message-actions-box.component.spec.ts

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ describe('MessageActionsBoxComponent', () => {
3939
let queryDeleteAction: () => HTMLElement | null;
4040
let queryEditModal: () => ModalComponent;
4141
let queryModalCancelButton: () => HTMLElement | null;
42-
let queryModalSendButton: () => HTMLElement | null;
4342
let queryMessageInputComponent: () => MessageInputComponent;
4443
let message: StreamMessage;
4544
let nativeElement: HTMLElement;
@@ -107,8 +106,6 @@ describe('MessageActionsBoxComponent', () => {
107106
.componentInstance as ModalComponent;
108107
queryModalCancelButton = () =>
109108
nativeElement.querySelector('[data-testid="cancel-button"]');
110-
queryModalSendButton = () =>
111-
nativeElement.querySelector('[data-testid="send-button"]');
112109
queryMessageInputComponent = () =>
113110
fixture.debugElement.query(By.directive(MessageInputComponent))
114111
.componentInstance as MessageInputComponent;
@@ -439,23 +436,17 @@ describe('MessageActionsBoxComponent', () => {
439436
fixture.detectChanges();
440437

441438
expect(queryMessageInputComponent().message).toBe(component.message);
439+
expect(queryMessageInputComponent().sendMessage$).toBe(
440+
component.sendMessage$
441+
);
442442
});
443443

444-
it('should call update message if "Send" button is clicked', () => {
445-
component.enabledActions = ['update-any-message'];
446-
component.isEditModalOpen = true;
447-
component.ngOnChanges({
448-
enabledActions: {} as SimpleChange,
449-
});
450-
fixture.detectChanges();
451-
const messageInputComponent = queryMessageInputComponent();
452-
spyOn(messageInputComponent, 'messageSent');
453-
queryEditAction()?.click();
454-
fixture.detectChanges();
455-
queryModalSendButton()?.click();
456-
fixture.detectChanges();
444+
it('should trigger message if "Send" button is clicked', () => {
445+
const spy = jasmine.createSpy();
446+
component.sendMessage$.subscribe(spy);
447+
component.sendClicked();
457448

458-
expect(messageInputComponent.messageSent).toHaveBeenCalledWith();
449+
expect(spy).toHaveBeenCalledWith(undefined);
459450
});
460451

461452
it('should close modal with "Cancel" button', () => {

projects/stream-chat-angular/src/lib/message-actions-box/message-actions-box.component.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@ import {
99
TemplateRef,
1010
ViewChild,
1111
} from '@angular/core';
12-
import { Subscription } from 'rxjs';
12+
import { Observable, Subject, Subscription } from 'rxjs';
1313
import { ChannelService } from '../channel.service';
1414
import { ChatClientService } from '../chat-client.service';
1515
import { CustomTemplatesService } from '../custom-templates.service';
16-
import { MessageInputComponent } from '../message-input/message-input.component';
1716
import { NotificationService } from '../notification.service';
1817
import {
1918
MessageActionBoxItemContext,
@@ -63,12 +62,11 @@ export class MessageActionsBoxComponent implements OnChanges, OnDestroy {
6362
modalTemplate: TemplateRef<ModalContext> | undefined;
6463
subscriptions: Subscription[] = [];
6564
visibleMessageActionItems: MessageActionItem[] = [];
65+
sendMessage$: Observable<void>;
6666
private readonly messageActionItems: MessageActionItem[];
67-
@ViewChild(MessageInputComponent) private messageInput:
68-
| MessageInputComponent
69-
| undefined;
7067
@ViewChild('modalContent', { static: true })
7168
private modalContent!: TemplateRef<void>;
69+
private sendMessageSubject = new Subject<void>();
7270
constructor(
7371
private chatClientService: ChatClientService,
7472
private notificationService: NotificationService,
@@ -161,6 +159,7 @@ export class MessageActionsBoxComponent implements OnChanges, OnDestroy {
161159
enabledActions.indexOf('delete-any-message') !== -1,
162160
},
163161
];
162+
this.sendMessage$ = this.sendMessageSubject.asObservable();
164163
}
165164

166165
ngOnChanges(changes: SimpleChanges): void {
@@ -191,7 +190,7 @@ export class MessageActionsBoxComponent implements OnChanges, OnDestroy {
191190
}
192191

193192
sendClicked() {
194-
this.messageInput?.messageSent();
193+
this.sendMessageSubject.next();
195194
}
196195

197196
modalClosed = () => {
@@ -208,6 +207,7 @@ export class MessageActionsBoxComponent implements OnChanges, OnDestroy {
208207
isMultipleFileUploadEnabled: undefined,
209208
mentionScope: undefined,
210209
mode: undefined,
210+
sendMessage$: this.sendMessage$,
211211
};
212212
}
213213

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,4 +934,13 @@ describe('MessageInputComponent', () => {
934934

935935
expect(attachmentService.retryAttachmentUpload).toHaveBeenCalledWith(file);
936936
});
937+
938+
it('should trigger message send by #sendMessage$', () => {
939+
const sendMessage$ = new Subject<void>();
940+
component.sendMessage$ = sendMessage$;
941+
component.ngOnChanges({ sendMessage$: {} as SimpleChange });
942+
sendMessage$.next();
943+
944+
expect(component.messageSent).toHaveBeenCalledWith();
945+
});
937946
});

projects/stream-chat-angular/src/lib/message-input/message-input.component.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ export class MessageInputComponent
7575
* The message to edit
7676
*/
7777
@Input() message: StreamMessage | undefined;
78+
/**
79+
* An observable that can be used to trigger message sending from the outside
80+
*/
81+
@Input() sendMessage$: Observable<void> | undefined;
7882
/**
7983
* Emits when a message was successfuly sent or updated
8084
*/
@@ -102,6 +106,7 @@ export class MessageInputComponent
102106
private isViewInited = false;
103107
private appSettings: AppSettings | undefined;
104108
private channel: Channel<DefaultStreamChatGenerics> | undefined;
109+
private sendMessageSubcription: Subscription | undefined;
105110
constructor(
106111
private channelService: ChannelService,
107112
private notificationService: NotificationService,
@@ -251,9 +256,22 @@ export class MessageInputComponent
251256
if (changes.mode) {
252257
this.setCanSendMessages();
253258
}
259+
if (changes.sendMessage$) {
260+
if (this.sendMessageSubcription) {
261+
this.sendMessageSubcription.unsubscribe();
262+
}
263+
if (this.sendMessage$) {
264+
this.sendMessageSubcription = this.sendMessage$.subscribe(
265+
() => void this.messageSent()
266+
);
267+
}
268+
}
254269
}
255270

256271
ngOnDestroy(): void {
272+
if (this.sendMessageSubcription) {
273+
this.sendMessageSubcription.unsubscribe();
274+
}
257275
this.subscriptions.forEach((s) => s.unsubscribe());
258276
}
259277

projects/stream-chat-angular/src/lib/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ export type MessageInputContext = {
125125
isMultipleFileUploadEnabled: boolean | undefined;
126126
message: StreamMessage | undefined;
127127
messageUpdateHandler: Function | undefined;
128+
sendMessage$: Observable<void>;
128129
};
129130

130131
export type MentionTemplateContext = {

0 commit comments

Comments
 (0)