Improve timeline message for restricted join rule changes (#6984)

pull/21833/head
Michael Telatynski 2021-10-26 15:28:22 +01:00 committed by GitHub
parent 166fba6428
commit a4e20c7b41
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 28 deletions

View File

@ -13,6 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import React from 'react'; import React from 'react';
import { _t } from './languageHandler'; import { _t } from './languageHandler';
import * as Roles from './Roles'; import * as Roles from './Roles';
@ -25,7 +26,10 @@ import { Action } from './dispatcher/actions';
import defaultDispatcher from './dispatcher/dispatcher'; import defaultDispatcher from './dispatcher/dispatcher';
import { SetRightPanelPhasePayload } from './dispatcher/payloads/SetRightPanelPhasePayload'; import { SetRightPanelPhasePayload } from './dispatcher/payloads/SetRightPanelPhasePayload';
import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { MatrixEvent } from "matrix-js-sdk/src/models/event";
import { GuestAccess, HistoryVisibility, JoinRule } from "matrix-js-sdk/src/@types/partials";
import { EventType, MsgType } from "matrix-js-sdk/src/@types/event";
import { MatrixClientPeg } from "./MatrixClientPeg"; import { MatrixClientPeg } from "./MatrixClientPeg";
import { ROOM_SECURITY_TAB } from "./components/views/dialogs/RoomSettingsDialog";
import { logger } from "matrix-js-sdk/src/logger"; import { logger } from "matrix-js-sdk/src/logger";
import { removeDirectionOverrideChars } from 'matrix-js-sdk/src/utils'; import { removeDirectionOverrideChars } from 'matrix-js-sdk/src/utils';
@ -201,17 +205,38 @@ function textForTombstoneEvent(ev: MatrixEvent): () => string | null {
return () => _t('%(senderDisplayName)s upgraded this room.', { senderDisplayName }); return () => _t('%(senderDisplayName)s upgraded this room.', { senderDisplayName });
} }
function textForJoinRulesEvent(ev: MatrixEvent): () => string | null { const onViewJoinRuleSettingsClick = () => {
defaultDispatcher.dispatch({
action: "open_room_settings",
initial_tab_id: ROOM_SECURITY_TAB,
});
};
function textForJoinRulesEvent(ev: MatrixEvent, allowJSX: boolean): () => string | JSX.Element | null {
const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
switch (ev.getContent().join_rule) { switch (ev.getContent().join_rule) {
case "public": case JoinRule.Public:
return () => _t('%(senderDisplayName)s made the room public to whoever knows the link.', { return () => _t('%(senderDisplayName)s made the room public to whoever knows the link.', {
senderDisplayName, senderDisplayName,
}); });
case "invite": case JoinRule.Invite:
return () => _t('%(senderDisplayName)s made the room invite only.', { return () => _t('%(senderDisplayName)s made the room invite only.', {
senderDisplayName, senderDisplayName,
}); });
case JoinRule.Restricted:
if (allowJSX) {
return () => <span>
{ _t('%(senderDisplayName)s changed who can join this room. <a>View settings</a>.', {
senderDisplayName,
}, {
"a": (sub) => <a onClick={onViewJoinRuleSettingsClick}>
{ sub }
</a>,
}) }
</span>;
}
return () => _t('%(senderDisplayName)s changed who can join this room.', { senderDisplayName });
default: default:
// The spec supports "knock" and "private", however nothing implements these. // The spec supports "knock" and "private", however nothing implements these.
return () => _t('%(senderDisplayName)s changed the join rule to %(rule)s', { return () => _t('%(senderDisplayName)s changed the join rule to %(rule)s', {
@ -224,9 +249,9 @@ function textForJoinRulesEvent(ev: MatrixEvent): () => string | null {
function textForGuestAccessEvent(ev: MatrixEvent): () => string | null { function textForGuestAccessEvent(ev: MatrixEvent): () => string | null {
const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
switch (ev.getContent().guest_access) { switch (ev.getContent().guest_access) {
case "can_join": case GuestAccess.CanJoin:
return () => _t('%(senderDisplayName)s has allowed guests to join the room.', { senderDisplayName }); return () => _t('%(senderDisplayName)s has allowed guests to join the room.', { senderDisplayName });
case "forbidden": case GuestAccess.Forbidden:
return () => _t('%(senderDisplayName)s has prevented guests from joining the room.', { senderDisplayName }); return () => _t('%(senderDisplayName)s has prevented guests from joining the room.', { senderDisplayName });
default: default:
// There's no other options we can expect, however just for safety's sake we'll do this. // 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 {
|| redactedBecauseUserId }); || redactedBecauseUserId });
} }
} }
if (ev.getContent().msgtype === "m.emote") { if (ev.getContent().msgtype === MsgType.Emote) {
message = "* " + senderDisplayName + " " + message; message = "* " + senderDisplayName + " " + message;
} else if (ev.getContent().msgtype === "m.image") { } else if (ev.getContent().msgtype === MsgType.Image) {
message = _t('%(senderDisplayName)s sent an image.', { senderDisplayName }); message = _t('%(senderDisplayName)s sent an image.', { senderDisplayName });
} else if (ev.getType() == "m.sticker") { } else if (ev.getType() == EventType.Sticker) {
message = _t('%(senderDisplayName)s sent a sticker.', { senderDisplayName }); message = _t('%(senderDisplayName)s sent a sticker.', { senderDisplayName });
} else { } else {
// in this case, parse it as a plain text message // in this case, parse it as a plain text message
@ -396,15 +421,15 @@ function textForThreePidInviteEvent(event: MatrixEvent): () => string | null {
function textForHistoryVisibilityEvent(event: MatrixEvent): () => string | null { function textForHistoryVisibilityEvent(event: MatrixEvent): () => string | null {
const senderName = event.sender ? event.sender.name : event.getSender(); const senderName = event.sender ? event.sender.name : event.getSender();
switch (event.getContent().history_visibility) { switch (event.getContent().history_visibility) {
case 'invited': case HistoryVisibility.Invited:
return () => _t('%(senderName)s made future room history visible to all room members, ' return () => _t('%(senderName)s made future room history visible to all room members, '
+ 'from the point they are invited.', { senderName }); + 'from the point they are invited.', { senderName });
case 'joined': case HistoryVisibility.Joined:
return () => _t('%(senderName)s made future room history visible to all room members, ' return () => _t('%(senderName)s made future room history visible to all room members, '
+ 'from the point they joined.', { senderName }); + 'from the point they joined.', { senderName });
case 'shared': case HistoryVisibility.Shared:
return () => _t('%(senderName)s made future room history visible to all room members.', { senderName }); return () => _t('%(senderName)s made future room history visible to all room members.', { senderName });
case 'world_readable': case HistoryVisibility.WorldReadable:
return () => _t('%(senderName)s made future room history visible to anyone.', { senderName }); return () => _t('%(senderName)s made future room history visible to anyone.', { senderName });
default: default:
return () => _t('%(senderName)s made future room history visible to unknown (%(visibility)s).', { return () => _t('%(senderName)s made future room history visible to unknown (%(visibility)s).', {
@ -695,25 +720,25 @@ interface IHandlers {
} }
const handlers: IHandlers = { const handlers: IHandlers = {
'm.room.message': textForMessageEvent, [EventType.RoomMessage]: textForMessageEvent,
'm.sticker': textForMessageEvent, [EventType.Sticker]: textForMessageEvent,
'm.call.invite': textForCallInviteEvent, [EventType.CallInvite]: textForCallInviteEvent,
}; };
const stateHandlers: IHandlers = { const stateHandlers: IHandlers = {
'm.room.canonical_alias': textForCanonicalAliasEvent, [EventType.RoomCanonicalAlias]: textForCanonicalAliasEvent,
'm.room.name': textForRoomNameEvent, [EventType.RoomName]: textForRoomNameEvent,
'm.room.topic': textForTopicEvent, [EventType.RoomTopic]: textForTopicEvent,
'm.room.member': textForMemberEvent, [EventType.RoomMember]: textForMemberEvent,
"m.room.avatar": textForRoomAvatarEvent, [EventType.RoomAvatar]: textForRoomAvatarEvent,
'm.room.third_party_invite': textForThreePidInviteEvent, [EventType.RoomThirdPartyInvite]: textForThreePidInviteEvent,
'm.room.history_visibility': textForHistoryVisibilityEvent, [EventType.RoomHistoryVisibility]: textForHistoryVisibilityEvent,
'm.room.power_levels': textForPowerEvent, [EventType.RoomPowerLevels]: textForPowerEvent,
'm.room.pinned_events': textForPinnedEvent, [EventType.RoomPinnedEvents]: textForPinnedEvent,
'm.room.server_acl': textForServerACLEvent, [EventType.RoomServerAcl]: textForServerACLEvent,
'm.room.tombstone': textForTombstoneEvent, [EventType.RoomTombstone]: textForTombstoneEvent,
'm.room.join_rules': textForJoinRulesEvent, [EventType.RoomJoinRules]: textForJoinRulesEvent,
'm.room.guest_access': textForGuestAccessEvent, [EventType.RoomGuestAccess]: textForGuestAccessEvent,
'm.room.related_groups': textForRelatedGroupsEvent, 'm.room.related_groups': textForRelatedGroupsEvent,
// TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111) // TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)

View File

@ -517,6 +517,8 @@
"%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s upgraded this room.", "%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s upgraded this room.",
"%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s made the room public to whoever knows the link.", "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s made the room public to whoever knows the link.",
"%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s made the room invite only.", "%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s made the room invite only.",
"%(senderDisplayName)s changed who can join this room. <a>View settings</a>.": "%(senderDisplayName)s changed who can join this room. <a>View settings</a>.",
"%(senderDisplayName)s changed who can join this room.": "%(senderDisplayName)s changed who can join this room.",
"%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s changed the join rule to %(rule)s", "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s changed the join rule to %(rule)s",
"%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s has allowed guests to join the room.", "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s has allowed guests to join the room.",
"%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s has prevented guests from joining the room.", "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s has prevented guests from joining the room.",