@@ -20,7 +20,16 @@ import { logger } from "matrix-js-sdk/src/logger";
20
20
import { removeDirectionOverrideChars } from 'matrix-js-sdk/src/utils' ;
21
21
import { GuestAccess , HistoryVisibility , JoinRule } from "matrix-js-sdk/src/@types/partials" ;
22
22
import { EventType , MsgType } from "matrix-js-sdk/src/@types/event" ;
23
- import { M_EMOTE , M_NOTICE , M_MESSAGE , MessageEvent } from "matrix-events-sdk" ;
23
+ import {
24
+ M_EMOTE ,
25
+ M_NOTICE ,
26
+ M_MESSAGE ,
27
+ MessageEvent ,
28
+ M_POLL_START ,
29
+ M_POLL_END ,
30
+ PollStartEvent ,
31
+ } from "matrix-events-sdk" ;
32
+ import { LOCATION_EVENT_TYPE } from "matrix-js-sdk/src/@types/location" ;
24
33
25
34
import { _t } from './languageHandler' ;
26
35
import * as Roles from './Roles' ;
@@ -36,12 +45,16 @@ import { ROOM_SECURITY_TAB } from "./components/views/dialogs/RoomSettingsDialog
36
45
import AccessibleButton from './components/views/elements/AccessibleButton' ;
37
46
import RightPanelStore from './stores/right-panel/RightPanelStore' ;
38
47
48
+ export function getSenderName ( event : MatrixEvent ) : string {
49
+ return event . sender ?. name ?? event . getSender ( ) ?? _t ( "Someone" ) ;
50
+ }
51
+
39
52
// These functions are frequently used just to check whether an event has
40
53
// any text to display at all. For this reason they return deferred values
41
54
// to avoid the expense of looking up translations when they're not needed.
42
55
43
56
function textForCallInviteEvent ( event : MatrixEvent ) : ( ) => string | null {
44
- const getSenderName = ( ) => event . sender ? event . sender . name : _t ( 'Someone' ) ;
57
+ const senderName = getSenderName ( event ) ;
45
58
// FIXME: Find a better way to determine this from the event?
46
59
let isVoice = true ;
47
60
if ( event . getContent ( ) . offer && event . getContent ( ) . offer . sdp &&
@@ -55,19 +68,19 @@ function textForCallInviteEvent(event: MatrixEvent): () => string | null {
55
68
// and more accurate, we break out the string-based variables to a couple booleans.
56
69
if ( isVoice && isSupported ) {
57
70
return ( ) => _t ( "%(senderName)s placed a voice call." , {
58
- senderName : getSenderName ( ) ,
71
+ senderName : senderName ,
59
72
} ) ;
60
73
} else if ( isVoice && ! isSupported ) {
61
74
return ( ) => _t ( "%(senderName)s placed a voice call. (not supported by this browser)" , {
62
- senderName : getSenderName ( ) ,
75
+ senderName : senderName ,
63
76
} ) ;
64
77
} else if ( ! isVoice && isSupported ) {
65
78
return ( ) => _t ( "%(senderName)s placed a video call." , {
66
- senderName : getSenderName ( ) ,
79
+ senderName : senderName ,
67
80
} ) ;
68
81
} else if ( ! isVoice && ! isSupported ) {
69
82
return ( ) => _t ( "%(senderName)s placed a video call. (not supported by this browser)" , {
70
- senderName : getSenderName ( ) ,
83
+ senderName : senderName ,
71
84
} ) ;
72
85
}
73
86
}
@@ -325,6 +338,17 @@ function textForServerACLEvent(ev: MatrixEvent): () => string | null {
325
338
}
326
339
327
340
function textForMessageEvent ( ev : MatrixEvent ) : ( ) => string | null {
341
+ const type = ev . getType ( ) ;
342
+ const content = ev . getContent ( ) ;
343
+ const msgtype = content . msgtype ;
344
+
345
+ if (
346
+ ( LOCATION_EVENT_TYPE . matches ( type ) || LOCATION_EVENT_TYPE . matches ( msgtype ) ) &&
347
+ SettingsStore . getValue ( "feature_location_share" )
348
+ ) {
349
+ return textForLocationEvent ( ev ) ;
350
+ }
351
+
328
352
return ( ) => {
329
353
const senderDisplayName = ev . sender && ev . sender . name ? ev . sender . name : ev . getSender ( ) ;
330
354
let message = ev . getContent ( ) . body ;
@@ -418,7 +442,7 @@ function textForCanonicalAliasEvent(ev: MatrixEvent): () => string | null {
418
442
}
419
443
420
444
function textForThreePidInviteEvent ( event : MatrixEvent ) : ( ) => string | null {
421
- const senderName = event . sender ? event . sender . name : event . getSender ( ) ;
445
+ const senderName = getSenderName ( event ) ;
422
446
423
447
if ( ! isValid3pidInvite ( event ) ) {
424
448
return ( ) => _t ( '%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.' , {
@@ -434,7 +458,7 @@ function textForThreePidInviteEvent(event: MatrixEvent): () => string | null {
434
458
}
435
459
436
460
function textForHistoryVisibilityEvent ( event : MatrixEvent ) : ( ) => string | null {
437
- const senderName = event . sender ? event . sender . name : event . getSender ( ) ;
461
+ const senderName = getSenderName ( event ) ;
438
462
switch ( event . getContent ( ) . history_visibility ) {
439
463
case HistoryVisibility . Invited :
440
464
return ( ) => _t ( '%(senderName)s made future room history visible to all room members, '
@@ -456,7 +480,7 @@ function textForHistoryVisibilityEvent(event: MatrixEvent): () => string | null
456
480
457
481
// Currently will only display a change if a user's power level is changed
458
482
function textForPowerEvent ( event : MatrixEvent ) : ( ) => string | null {
459
- const senderName = event . sender ? event . sender . name : event . getSender ( ) ;
483
+ const senderName = getSenderName ( event ) ;
460
484
if ( ! event . getPrevContent ( ) || ! event . getPrevContent ( ) . users ||
461
485
! event . getContent ( ) || ! event . getContent ( ) . users ) {
462
486
return null ;
@@ -523,7 +547,7 @@ const onPinnedMessagesClick = (): void => {
523
547
524
548
function textForPinnedEvent ( event : MatrixEvent , allowJSX : boolean ) : ( ) => string | JSX . Element | null {
525
549
if ( ! SettingsStore . getValue ( "feature_pinning" ) ) return null ;
526
- const senderName = event . sender ? event . sender . name : event . getSender ( ) ;
550
+ const senderName = getSenderName ( event ) ;
527
551
const roomId = event . getRoomId ( ) ;
528
552
529
553
const pinned = event . getContent ( ) . pinned ?? [ ] ;
@@ -729,6 +753,25 @@ function textForMjolnirEvent(event: MatrixEvent): () => string | null {
729
753
"for %(reason)s" , { senderName, oldGlob : prevEntity , newGlob : entity , reason } ) ;
730
754
}
731
755
756
+ export function textForLocationEvent ( event : MatrixEvent ) : ( ) => string | null {
757
+ return ( ) => _t ( "%(senderName)s has shared their location" , {
758
+ senderName : getSenderName ( event ) ,
759
+ } ) ;
760
+ }
761
+
762
+ function textForPollStartEvent ( event : MatrixEvent ) : ( ) => string | null {
763
+ return ( ) => _t ( "%(senderName)s has started a poll - %(pollQuestion)s" , {
764
+ senderName : getSenderName ( event ) ,
765
+ pollQuestion : ( event . unstableExtensibleEvent as PollStartEvent ) ?. question ?. text ,
766
+ } ) ;
767
+ }
768
+
769
+ function textForPollEndEvent ( event : MatrixEvent ) : ( ) => string | null {
770
+ return ( ) => _t ( "%(senderName)s has ended a poll" , {
771
+ senderName : getSenderName ( event ) ,
772
+ } ) ;
773
+ }
774
+
732
775
interface IHandlers {
733
776
[ type : string ] :
734
777
( ev : MatrixEvent , allowJSX : boolean , showHiddenEvents ?: boolean ) =>
@@ -739,6 +782,10 @@ const handlers: IHandlers = {
739
782
[ EventType . RoomMessage ] : textForMessageEvent ,
740
783
[ EventType . Sticker ] : textForMessageEvent ,
741
784
[ EventType . CallInvite ] : textForCallInviteEvent ,
785
+ [ M_POLL_START . name ] : textForPollStartEvent ,
786
+ [ M_POLL_END . name ] : textForPollEndEvent ,
787
+ [ M_POLL_START . altName ] : textForPollStartEvent ,
788
+ [ M_POLL_END . altName ] : textForPollEndEvent ,
742
789
} ;
743
790
744
791
const stateHandlers : IHandlers = {
0 commit comments