@@ -28,7 +28,7 @@ import {
28
28
CustomMetadataContext ,
29
29
MessageTextContext ,
30
30
} from '../types' ;
31
- import { Observable , Subscription , take } from 'rxjs' ;
31
+ import { fromEvent , Observable , Subscription , take } from 'rxjs' ;
32
32
import { CustomTemplatesService } from '../custom-templates.service' ;
33
33
import { listUsers } from '../list-users' ;
34
34
import { DateParserService } from '../date-parser.service' ;
@@ -112,10 +112,12 @@ export class MessageComponent
112
112
messageMenuFloat ! : NgxFloatUiContentComponent ;
113
113
@ViewChild ( 'messageTextElement' ) messageTextElement ?: ElementRef < HTMLElement > ;
114
114
@ViewChild ( 'messageBubble' ) messageBubble ?: ElementRef < HTMLElement > ;
115
+ @ViewChild ( 'container' ) messageContainer ?: ElementRef < HTMLElement > ;
115
116
private showMessageMenuTimeout ?: ReturnType < typeof setTimeout > ;
116
117
private shouldPreventMessageMenuClose = false ;
117
118
private _visibleMessageActionsCount = 0 ;
118
119
private channelMemberCount ?: number ;
120
+ private touchOutsideMessageSubscriptions : Subscription [ ] = [ ] ;
119
121
120
122
constructor (
121
123
private chatClientService : ChatClientService ,
@@ -294,6 +296,14 @@ export class MessageComponent
294
296
295
297
ngOnDestroy ( ) : void {
296
298
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 ( ) ) ;
297
307
}
298
308
299
309
mousePushedDown ( event : MouseEvent ) {
@@ -540,7 +550,22 @@ export class MessageComponent
540
550
'undefined'
541
551
)
542
552
( 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
+ ) ;
544
569
}
545
570
if ( this . isViewInited ) {
546
571
this . cdRef . detectChanges ( ) ;
0 commit comments