Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit a4e20c7

Browse files
authored
Improve timeline message for restricted join rule changes (#6984)
1 parent 166fba6 commit a4e20c7

File tree

2 files changed

+55
-28
lines changed

2 files changed

+55
-28
lines changed

Diff for: src/TextForEvent.tsx

+53-28
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313
See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
16+
1617
import React from 'react';
1718
import { _t } from './languageHandler';
1819
import * as Roles from './Roles';
@@ -25,7 +26,10 @@ import { Action } from './dispatcher/actions';
2526
import defaultDispatcher from './dispatcher/dispatcher';
2627
import { SetRightPanelPhasePayload } from './dispatcher/payloads/SetRightPanelPhasePayload';
2728
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";
2831
import { MatrixClientPeg } from "./MatrixClientPeg";
32+
import { ROOM_SECURITY_TAB } from "./components/views/dialogs/RoomSettingsDialog";
2933

3034
import { logger } from "matrix-js-sdk/src/logger";
3135
import { 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 {
224249
function 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 {
396421
function 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

697722
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,
701726
};
702727

703728
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,
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)

Diff for: src/i18n/strings/en_EN.json

+2
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,8 @@
517517
"%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s upgraded this room.",
518518
"%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s made the room public to whoever knows the link.",
519519
"%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s made the room invite only.",
520+
"%(senderDisplayName)s changed who can join this room. <a>View settings</a>.": "%(senderDisplayName)s changed who can join this room. <a>View settings</a>.",
521+
"%(senderDisplayName)s changed who can join this room.": "%(senderDisplayName)s changed who can join this room.",
520522
"%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s changed the join rule to %(rule)s",
521523
"%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s has allowed guests to join the room.",
522524
"%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s has prevented guests from joining the room.",

0 commit comments

Comments
 (0)