Skip to content

Commit 46ef749

Browse files
committed
fix: multiple message menus can be opened on mobile
1 parent 44fa54f commit 46ef749

File tree

1 file changed

+27
-2
lines changed

1 file changed

+27
-2
lines changed

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

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
CustomMetadataContext,
2929
MessageTextContext,
3030
} from '../types';
31-
import { Observable, Subscription, take } from 'rxjs';
31+
import { fromEvent, Observable, Subscription, take } from 'rxjs';
3232
import { CustomTemplatesService } from '../custom-templates.service';
3333
import { listUsers } from '../list-users';
3434
import { DateParserService } from '../date-parser.service';
@@ -112,10 +112,12 @@ export class MessageComponent
112112
messageMenuFloat!: NgxFloatUiContentComponent;
113113
@ViewChild('messageTextElement') messageTextElement?: ElementRef<HTMLElement>;
114114
@ViewChild('messageBubble') messageBubble?: ElementRef<HTMLElement>;
115+
@ViewChild('container') messageContainer?: ElementRef<HTMLElement>;
115116
private showMessageMenuTimeout?: ReturnType<typeof setTimeout>;
116117
private shouldPreventMessageMenuClose = false;
117118
private _visibleMessageActionsCount = 0;
118119
private channelMemberCount?: number;
120+
private touchOutsideMessageSubscriptions: Subscription[] = [];
119121

120122
constructor(
121123
private chatClientService: ChatClientService,
@@ -294,6 +296,14 @@ export class MessageComponent
294296

295297
ngOnDestroy(): void {
296298
this.subscriptions.forEach((s) => s.unsubscribe());
299+
this.messageMenuHidden();
300+
}
301+
302+
messageMenuHidden() {
303+
if (this.showMessageMenuTimeout) {
304+
clearTimeout(this.showMessageMenuTimeout);
305+
}
306+
this.touchOutsideMessageSubscriptions.forEach((s) => s.unsubscribe());
297307
}
298308

299309
mousePushedDown(event: MouseEvent) {
@@ -540,7 +550,22 @@ export class MessageComponent
540550
'undefined'
541551
)
542552
(document.activeElement as HTMLInputElement).blur();
543-
this.messageMenuTrigger?.show();
553+
this.messageMenuTrigger.show();
554+
// click event is handled by ngx-float-ui SDK, but long tap won't trigger click handler
555+
this.touchOutsideMessageSubscriptions.push(
556+
fromEvent(document, 'touchstart').subscribe((event) => {
557+
if (
558+
event.target === this.messageContainer?.nativeElement ||
559+
this.messageContainer?.nativeElement.contains(
560+
event.target as Node
561+
)
562+
) {
563+
return;
564+
}
565+
this.messageMenuTrigger.hide();
566+
this.messageMenuHidden();
567+
})
568+
);
544569
}
545570
if (this.isViewInited) {
546571
this.cdRef.detectChanges();

0 commit comments

Comments
 (0)