@@ -13,6 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
13
See the License for the specific language governing permissions and
14
14
limitations under the License.
15
15
*/
16
+
16
17
import React from 'react' ;
17
18
import { _t } from './languageHandler' ;
18
19
import * as Roles from './Roles' ;
@@ -25,7 +26,10 @@ import { Action } from './dispatcher/actions';
25
26
import defaultDispatcher from './dispatcher/dispatcher' ;
26
27
import { SetRightPanelPhasePayload } from './dispatcher/payloads/SetRightPanelPhasePayload' ;
27
28
import { MatrixEvent } from "matrix-js-sdk/src/models/event" ;
29
+ import { GuestAccess , HistoryVisibility , JoinRule } from "matrix-js-sdk/src/@types/partials" ;
30
+ import { EventType , MsgType } from "matrix-js-sdk/src/@types/event" ;
28
31
import { MatrixClientPeg } from "./MatrixClientPeg" ;
32
+ import { ROOM_SECURITY_TAB } from "./components/views/dialogs/RoomSettingsDialog" ;
29
33
30
34
import { logger } from "matrix-js-sdk/src/logger" ;
31
35
import { removeDirectionOverrideChars } from 'matrix-js-sdk/src/utils' ;
@@ -201,17 +205,38 @@ function textForTombstoneEvent(ev: MatrixEvent): () => string | null {
201
205
return ( ) => _t ( '%(senderDisplayName)s upgraded this room.' , { senderDisplayName } ) ;
202
206
}
203
207
204
- function textForJoinRulesEvent ( ev : MatrixEvent ) : ( ) => string | null {
208
+ const onViewJoinRuleSettingsClick = ( ) => {
209
+ defaultDispatcher . dispatch ( {
210
+ action : "open_room_settings" ,
211
+ initial_tab_id : ROOM_SECURITY_TAB ,
212
+ } ) ;
213
+ } ;
214
+
215
+ function textForJoinRulesEvent ( ev : MatrixEvent , allowJSX : boolean ) : ( ) => string | JSX . Element | null {
205
216
const senderDisplayName = ev . sender && ev . sender . name ? ev . sender . name : ev . getSender ( ) ;
206
217
switch ( ev . getContent ( ) . join_rule ) {
207
- case "public" :
218
+ case JoinRule . Public :
208
219
return ( ) => _t ( '%(senderDisplayName)s made the room public to whoever knows the link.' , {
209
220
senderDisplayName,
210
221
} ) ;
211
- case "invite" :
222
+ case JoinRule . Invite :
212
223
return ( ) => _t ( '%(senderDisplayName)s made the room invite only.' , {
213
224
senderDisplayName,
214
225
} ) ;
226
+ case JoinRule . Restricted :
227
+ if ( allowJSX ) {
228
+ return ( ) => < span >
229
+ { _t ( '%(senderDisplayName)s changed who can join this room. <a>View settings</a>.' , {
230
+ senderDisplayName,
231
+ } , {
232
+ "a" : ( sub ) => < a onClick = { onViewJoinRuleSettingsClick } >
233
+ { sub }
234
+ </ a > ,
235
+ } ) }
236
+ </ span > ;
237
+ }
238
+
239
+ return ( ) => _t ( '%(senderDisplayName)s changed who can join this room.' , { senderDisplayName } ) ;
215
240
default :
216
241
// The spec supports "knock" and "private", however nothing implements these.
217
242
return ( ) => _t ( '%(senderDisplayName)s changed the join rule to %(rule)s' , {
@@ -224,9 +249,9 @@ function textForJoinRulesEvent(ev: MatrixEvent): () => string | null {
224
249
function textForGuestAccessEvent ( ev : MatrixEvent ) : ( ) => string | null {
225
250
const senderDisplayName = ev . sender && ev . sender . name ? ev . sender . name : ev . getSender ( ) ;
226
251
switch ( ev . getContent ( ) . guest_access ) {
227
- case "can_join" :
252
+ case GuestAccess . CanJoin :
228
253
return ( ) => _t ( '%(senderDisplayName)s has allowed guests to join the room.' , { senderDisplayName } ) ;
229
- case "forbidden" :
254
+ case GuestAccess . Forbidden :
230
255
return ( ) => _t ( '%(senderDisplayName)s has prevented guests from joining the room.' , { senderDisplayName } ) ;
231
256
default :
232
257
// There's no other options we can expect, however just for safety's sake we'll do this.
@@ -312,11 +337,11 @@ function textForMessageEvent(ev: MatrixEvent): () => string | null {
312
337
|| redactedBecauseUserId } ) ;
313
338
}
314
339
}
315
- if ( ev . getContent ( ) . msgtype === "m.emote" ) {
340
+ if ( ev . getContent ( ) . msgtype === MsgType . Emote ) {
316
341
message = "* " + senderDisplayName + " " + message ;
317
- } else if ( ev . getContent ( ) . msgtype === "m.image" ) {
342
+ } else if ( ev . getContent ( ) . msgtype === MsgType . Image ) {
318
343
message = _t ( '%(senderDisplayName)s sent an image.' , { senderDisplayName } ) ;
319
- } else if ( ev . getType ( ) == "m.sticker" ) {
344
+ } else if ( ev . getType ( ) == EventType . Sticker ) {
320
345
message = _t ( '%(senderDisplayName)s sent a sticker.' , { senderDisplayName } ) ;
321
346
} else {
322
347
// in this case, parse it as a plain text message
@@ -396,15 +421,15 @@ function textForThreePidInviteEvent(event: MatrixEvent): () => string | null {
396
421
function textForHistoryVisibilityEvent ( event : MatrixEvent ) : ( ) => string | null {
397
422
const senderName = event . sender ? event . sender . name : event . getSender ( ) ;
398
423
switch ( event . getContent ( ) . history_visibility ) {
399
- case 'invited' :
424
+ case HistoryVisibility . Invited :
400
425
return ( ) => _t ( '%(senderName)s made future room history visible to all room members, '
401
426
+ 'from the point they are invited.' , { senderName } ) ;
402
- case 'joined' :
427
+ case HistoryVisibility . Joined :
403
428
return ( ) => _t ( '%(senderName)s made future room history visible to all room members, '
404
429
+ 'from the point they joined.' , { senderName } ) ;
405
- case 'shared' :
430
+ case HistoryVisibility . Shared :
406
431
return ( ) => _t ( '%(senderName)s made future room history visible to all room members.' , { senderName } ) ;
407
- case 'world_readable' :
432
+ case HistoryVisibility . WorldReadable :
408
433
return ( ) => _t ( '%(senderName)s made future room history visible to anyone.' , { senderName } ) ;
409
434
default :
410
435
return ( ) => _t ( '%(senderName)s made future room history visible to unknown (%(visibility)s).' , {
@@ -695,25 +720,25 @@ interface IHandlers {
695
720
}
696
721
697
722
const handlers : IHandlers = {
698
- 'm.room.message' : textForMessageEvent ,
699
- 'm.sticker' : textForMessageEvent ,
700
- 'm.call.invite' : textForCallInviteEvent ,
723
+ [ EventType . RoomMessage ] : textForMessageEvent ,
724
+ [ EventType . Sticker ] : textForMessageEvent ,
725
+ [ EventType . CallInvite ] : textForCallInviteEvent ,
701
726
} ;
702
727
703
728
const stateHandlers : IHandlers = {
704
- 'm.room.canonical_alias' : textForCanonicalAliasEvent ,
705
- 'm.room.name' : textForRoomNameEvent ,
706
- 'm.room.topic' : textForTopicEvent ,
707
- 'm.room.member' : textForMemberEvent ,
708
- "m.room.avatar" : textForRoomAvatarEvent ,
709
- 'm.room.third_party_invite' : textForThreePidInviteEvent ,
710
- 'm.room.history_visibility' : textForHistoryVisibilityEvent ,
711
- 'm.room.power_levels' : textForPowerEvent ,
712
- 'm.room.pinned_events' : textForPinnedEvent ,
713
- 'm.room.server_acl' : textForServerACLEvent ,
714
- 'm.room.tombstone' : textForTombstoneEvent ,
715
- 'm.room.join_rules' : textForJoinRulesEvent ,
716
- 'm.room.guest_access' : textForGuestAccessEvent ,
729
+ [ EventType . RoomCanonicalAlias ] : textForCanonicalAliasEvent ,
730
+ [ EventType . RoomName ] : textForRoomNameEvent ,
731
+ [ EventType . RoomTopic ] : textForTopicEvent ,
732
+ [ EventType . RoomMember ] : textForMemberEvent ,
733
+ [ EventType . RoomAvatar ] : textForRoomAvatarEvent ,
734
+ [ EventType . RoomThirdPartyInvite ] : textForThreePidInviteEvent ,
735
+ [ EventType . RoomHistoryVisibility ] : textForHistoryVisibilityEvent ,
736
+ [ EventType . RoomPowerLevels ] : textForPowerEvent ,
737
+ [ EventType . RoomPinnedEvents ] : textForPinnedEvent ,
738
+ [ EventType . RoomServerAcl ] : textForServerACLEvent ,
739
+ [ EventType . RoomTombstone ] : textForTombstoneEvent ,
740
+ [ EventType . RoomJoinRules ] : textForJoinRulesEvent ,
741
+ [ EventType . RoomGuestAccess ] : textForGuestAccessEvent ,
717
742
'm.room.related_groups' : textForRelatedGroupsEvent ,
718
743
719
744
// TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)
0 commit comments