add knock support

Fixes #123
This commit is contained in:
Henry Hiles 2026-10-21 12:32:02 -04:00
commit 427e06be3e
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
2 changed files with 399 additions and 194 deletions

View file

@ -86,7 +86,12 @@ class const EventRenderer(
data: (settings) => settings.hideMembershipEvents,
));
if (event.content is MembershipContent && hideMembershipEvents) {
// Knocks and their outcomes stay visible, as moderators need to act on them
if (hideMembershipEvents &&
event.content is MembershipContent &&
![event.content, event.previousContent].any(
(content) => content is MembershipContent && content.status == .knock,
)) {
return SizedBox.shrink();
}

View file

@ -19,6 +19,11 @@ class const MembershipRenderer(
"Make sure to only pass membership events to MembershipRenderer",
);
final previous = switch (event.previousContent) {
MembershipContent(:final status) => status,
_ => null,
};
return switch (event.content) {
MembershipContent content => GenericEventRenderer(
Icons.people,
@ -28,7 +33,6 @@ class const MembershipRenderer(
alignment: .middle,
child: InkWell(
onTap: () => context.showUserPopover(
content,
event.stateKey!,
roomId: event.roomId,
),
@ -43,9 +47,10 @@ class const MembershipRenderer(
TextSpan(
text:
"${switch (content.status) {
.invite => "was invited to",
.invite => previous == .knock ? "was accepted into" : "was invited to",
.join => "joined",
.leave => event.sender == event.stateKey ? "left" : (event.unsigned["prev_content"]?["membership"] == "ban" ? "was unbanned from" : "was kicked from"),
.leave when previous == .knock => event.sender == event.stateKey ? "retracted their knock on" : "had their knock denied in",
.leave => event.sender == event.stateKey ? "left" : (previous == .ban ? "was unbanned from" : "was kicked from"),
.ban => "was banned from",
.knock => "asked to join",
}} the room${event.sender == event.stateKey ? "" : " by"}",