@@ -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' ;
3232import { CustomTemplatesService } from '../custom-templates.service' ;
3333import { listUsers } from '../list-users' ;
3434import { 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