Merge pull request #6280 from robintown/group-acls
Group ACLs with MELS
This commit is contained in:
commit
14ef38e057
3 changed files with 24 additions and 6 deletions
|
@ -38,6 +38,7 @@ import defaultDispatcher from '../../dispatcher/dispatcher';
|
||||||
|
|
||||||
const CONTINUATION_MAX_INTERVAL = 5 * 60 * 1000; // 5 minutes
|
const CONTINUATION_MAX_INTERVAL = 5 * 60 * 1000; // 5 minutes
|
||||||
const continuedTypes = ['m.sticker', 'm.room.message'];
|
const continuedTypes = ['m.sticker', 'm.room.message'];
|
||||||
|
const membershipTypes = ['m.room.member', 'm.room.third_party_invite', 'm.room.server_acl'];
|
||||||
|
|
||||||
// check if there is a previous event and it has the same sender as this event
|
// check if there is a previous event and it has the same sender as this event
|
||||||
// and the types are the same/is in continuedTypes and the time between them is <= CONTINUATION_MAX_INTERVAL
|
// and the types are the same/is in continuedTypes and the time between them is <= CONTINUATION_MAX_INTERVAL
|
||||||
|
@ -66,8 +67,6 @@ function shouldFormContinuation(prevEvent, mxEvent) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isMembershipChange = (e) => e.getType() === 'm.room.member' || e.getType() === 'm.room.third_party_invite';
|
|
||||||
|
|
||||||
/* (almost) stateless UI component which builds the event tiles in the room timeline.
|
/* (almost) stateless UI component which builds the event tiles in the room timeline.
|
||||||
*/
|
*/
|
||||||
@replaceableComponent("structures.MessagePanel")
|
@replaceableComponent("structures.MessagePanel")
|
||||||
|
@ -1144,7 +1143,7 @@ class RedactionGrouper {
|
||||||
// Wrap consecutive member events in a ListSummary, ignore if redacted
|
// Wrap consecutive member events in a ListSummary, ignore if redacted
|
||||||
class MemberGrouper {
|
class MemberGrouper {
|
||||||
static canStartGroup = function(panel, ev) {
|
static canStartGroup = function(panel, ev) {
|
||||||
return panel._shouldShowEvent(ev) && isMembershipChange(ev);
|
return panel._shouldShowEvent(ev) && membershipTypes.includes(ev.getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(panel, ev, prevEvent, lastShownEvent) {
|
constructor(panel, ev, prevEvent, lastShownEvent) {
|
||||||
|
@ -1162,7 +1161,7 @@ class MemberGrouper {
|
||||||
if (this.panel._wantsDateSeparator(this.events[0], ev.getDate())) {
|
if (this.panel._wantsDateSeparator(this.events[0], ev.getDate())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return isMembershipChange(ev);
|
return membershipTypes.includes(ev.getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
add(ev) {
|
add(ev) {
|
||||||
|
|
|
@ -66,6 +66,7 @@ enum TransitionType {
|
||||||
ChangedName = "changed_name",
|
ChangedName = "changed_name",
|
||||||
ChangedAvatar = "changed_avatar",
|
ChangedAvatar = "changed_avatar",
|
||||||
NoChange = "no_change",
|
NoChange = "no_change",
|
||||||
|
ServerAcl = "server_acl",
|
||||||
}
|
}
|
||||||
|
|
||||||
const SEP = ",";
|
const SEP = ",";
|
||||||
|
@ -298,6 +299,12 @@ export default class MemberEventListSummary extends React.Component<IProps> {
|
||||||
? _t("%(severalUsers)smade no changes %(count)s times", { severalUsers: "", count: repeats })
|
? _t("%(severalUsers)smade no changes %(count)s times", { severalUsers: "", count: repeats })
|
||||||
: _t("%(oneUser)smade no changes %(count)s times", { oneUser: "", count: repeats });
|
: _t("%(oneUser)smade no changes %(count)s times", { oneUser: "", count: repeats });
|
||||||
break;
|
break;
|
||||||
|
case "server_acl":
|
||||||
|
res = (userCount > 1)
|
||||||
|
? _t("%(severalUsers)schanged the server ACLs %(count)s times",
|
||||||
|
{ severalUsers: "", count: repeats })
|
||||||
|
: _t("%(oneUser)schanged the server ACLs %(count)s times", { oneUser: "", count: repeats });
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
@ -324,6 +331,10 @@ export default class MemberEventListSummary extends React.Component<IProps> {
|
||||||
return TransitionType.Invited;
|
return TransitionType.Invited;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (e.mxEvent.getType() === 'm.room.server_acl') {
|
||||||
|
return TransitionType.ServerAcl;
|
||||||
|
}
|
||||||
|
|
||||||
switch (e.mxEvent.getContent().membership) {
|
switch (e.mxEvent.getContent().membership) {
|
||||||
case 'invite': return TransitionType.Invited;
|
case 'invite': return TransitionType.Invited;
|
||||||
case 'ban': return TransitionType.Banned;
|
case 'ban': return TransitionType.Banned;
|
||||||
|
@ -410,19 +421,23 @@ export default class MemberEventListSummary extends React.Component<IProps> {
|
||||||
// Object mapping user IDs to an array of IUserEvents
|
// Object mapping user IDs to an array of IUserEvents
|
||||||
const userEvents: Record<string, IUserEvents[]> = {};
|
const userEvents: Record<string, IUserEvents[]> = {};
|
||||||
eventsToRender.forEach((e, index) => {
|
eventsToRender.forEach((e, index) => {
|
||||||
const userId = e.getStateKey();
|
const userId = e.getType() === 'm.room.server_acl' ? e.getSender() : e.getStateKey();
|
||||||
// Initialise a user's events
|
// Initialise a user's events
|
||||||
if (!userEvents[userId]) {
|
if (!userEvents[userId]) {
|
||||||
userEvents[userId] = [];
|
userEvents[userId] = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e.target) {
|
if (e.getType() === 'm.room.server_acl') {
|
||||||
|
latestUserAvatarMember.set(userId, e.sender);
|
||||||
|
} else if (e.target) {
|
||||||
latestUserAvatarMember.set(userId, e.target);
|
latestUserAvatarMember.set(userId, e.target);
|
||||||
}
|
}
|
||||||
|
|
||||||
let displayName = userId;
|
let displayName = userId;
|
||||||
if (e.getType() === 'm.room.third_party_invite') {
|
if (e.getType() === 'm.room.third_party_invite') {
|
||||||
displayName = e.getContent().display_name;
|
displayName = e.getContent().display_name;
|
||||||
|
} else if (e.getType() === 'm.room.server_acl') {
|
||||||
|
displayName = e.sender.name;
|
||||||
} else if (e.target) {
|
} else if (e.target) {
|
||||||
displayName = e.target.name;
|
displayName = e.target.name;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2050,6 +2050,10 @@
|
||||||
"%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)smade no changes",
|
"%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)smade no changes",
|
||||||
"%(oneUser)smade no changes %(count)s times|other": "%(oneUser)smade no changes %(count)s times",
|
"%(oneUser)smade no changes %(count)s times|other": "%(oneUser)smade no changes %(count)s times",
|
||||||
"%(oneUser)smade no changes %(count)s times|one": "%(oneUser)smade no changes",
|
"%(oneUser)smade no changes %(count)s times|one": "%(oneUser)smade no changes",
|
||||||
|
"%(severalUsers)schanged the server ACLs %(count)s times|other": "%(severalUsers)schanged the server ACLs %(count)s times",
|
||||||
|
"%(severalUsers)schanged the server ACLs %(count)s times|one": "%(severalUsers)schanged the server ACLs",
|
||||||
|
"%(oneUser)schanged the server ACLs %(count)s times|other": "%(oneUser)schanged the server ACLs %(count)s times",
|
||||||
|
"%(oneUser)schanged the server ACLs %(count)s times|one": "%(oneUser)schanged the server ACLs",
|
||||||
"Power level": "Power level",
|
"Power level": "Power level",
|
||||||
"Custom level": "Custom level",
|
"Custom level": "Custom level",
|
||||||
"QR Code": "QR Code",
|
"QR Code": "QR Code",
|
||||||
|
|
Loading…
Reference in a new issue