@@ -13,6 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313See the License for the specific language governing permissions and
1414limitations under the License.
1515*/
16+
1617import React from 'react' ;
1718import { _t } from './languageHandler' ;
1819import * as Roles from './Roles' ;
@@ -25,7 +26,10 @@ import { Action } from './dispatcher/actions';
2526import defaultDispatcher from './dispatcher/dispatcher' ;
2627import { SetRightPanelPhasePayload } from './dispatcher/payloads/SetRightPanelPhasePayload' ;
2728import { 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" ;
2831import { MatrixClientPeg } from "./MatrixClientPeg" ;
32+ import { ROOM_SECURITY_TAB } from "./components/views/dialogs/RoomSettingsDialog" ;
2933
3034import { logger } from "matrix-js-sdk/src/logger" ;
3135import { removeDirectionOverrideChars } from 'matrix-js-sdk/src/utils' ;
@@ -201,17 +205,38 @@ function textForTombstoneEvent(ev: MatrixEvent): () => string | null {
201205 return ( ) => _t ( '%(senderDisplayName)s upgraded this room.' , { senderDisplayName } ) ;
202206}
203207
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 {
205216 const senderDisplayName = ev . sender && ev . sender . name ? ev . sender . name : ev . getSender ( ) ;
206217 switch ( ev . getContent ( ) . join_rule ) {
207- case "public" :
218+ case JoinRule . Public :
208219 return ( ) => _t ( '%(senderDisplayName)s made the room public to whoever knows the link.' , {
209220 senderDisplayName,
210221 } ) ;
211- case "invite" :
222+ case JoinRule . Invite :
212223 return ( ) => _t ( '%(senderDisplayName)s made the room invite only.' , {
213224 senderDisplayName,
214225 } ) ;
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 } ) ;
215240 default :
216241 // The spec supports "knock" and "private", however nothing implements these.
217242 return ( ) => _t ( '%(senderDisplayName)s changed the join rule to %(rule)s' , {
@@ -224,9 +249,9 @@ function textForJoinRulesEvent(ev: MatrixEvent): () => string | null {
224249function textForGuestAccessEvent ( ev : MatrixEvent ) : ( ) => string | null {
225250 const senderDisplayName = ev . sender && ev . sender . name ? ev . sender . name : ev . getSender ( ) ;
226251 switch ( ev . getContent ( ) . guest_access ) {
227- case "can_join" :
252+ case GuestAccess . CanJoin :
228253 return ( ) => _t ( '%(senderDisplayName)s has allowed guests to join the room.' , { senderDisplayName } ) ;
229- case "forbidden" :
254+ case GuestAccess . Forbidden :
230255 return ( ) => _t ( '%(senderDisplayName)s has prevented guests from joining the room.' , { senderDisplayName } ) ;
231256 default :
232257 // 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 {
312337 || redactedBecauseUserId } ) ;
313338 }
314339 }
315- if ( ev . getContent ( ) . msgtype === "m.emote" ) {
340+ if ( ev . getContent ( ) . msgtype === MsgType . Emote ) {
316341 message = "* " + senderDisplayName + " " + message ;
317- } else if ( ev . getContent ( ) . msgtype === "m.image" ) {
342+ } else if ( ev . getContent ( ) . msgtype === MsgType . Image ) {
318343 message = _t ( '%(senderDisplayName)s sent an image.' , { senderDisplayName } ) ;
319- } else if ( ev . getType ( ) == "m.sticker" ) {
344+ } else if ( ev . getType ( ) == EventType . Sticker ) {
320345 message = _t ( '%(senderDisplayName)s sent a sticker.' , { senderDisplayName } ) ;
321346 } else {
322347 // in this case, parse it as a plain text message
@@ -396,15 +421,15 @@ function textForThreePidInviteEvent(event: MatrixEvent): () => string | null {
396421function textForHistoryVisibilityEvent ( event : MatrixEvent ) : ( ) => string | null {
397422 const senderName = event . sender ? event . sender . name : event . getSender ( ) ;
398423 switch ( event . getContent ( ) . history_visibility ) {
399- case 'invited' :
424+ case HistoryVisibility . Invited :
400425 return ( ) => _t ( '%(senderName)s made future room history visible to all room members, '
401426 + 'from the point they are invited.' , { senderName } ) ;
402- case 'joined' :
427+ case HistoryVisibility . Joined :
403428 return ( ) => _t ( '%(senderName)s made future room history visible to all room members, '
404429 + 'from the point they joined.' , { senderName } ) ;
405- case 'shared' :
430+ case HistoryVisibility . Shared :
406431 return ( ) => _t ( '%(senderName)s made future room history visible to all room members.' , { senderName } ) ;
407- case 'world_readable' :
432+ case HistoryVisibility . WorldReadable :
408433 return ( ) => _t ( '%(senderName)s made future room history visible to anyone.' , { senderName } ) ;
409434 default :
410435 return ( ) => _t ( '%(senderName)s made future room history visible to unknown (%(visibility)s).' , {
@@ -695,25 +720,25 @@ interface IHandlers {
695720}
696721
697722const 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 ,
701726} ;
702727
703728const 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 ,
717742 'm.room.related_groups' : textForRelatedGroupsEvent ,
718743
719744 // TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)
0 commit comments