diff --git a/lib/models/membership_status.dart b/lib/models/membership_status.dart index bc85e22..ba7a241 100644 --- a/lib/models/membership_status.dart +++ b/lib/models/membership_status.dart @@ -1,4 +1,4 @@ import "package:freezed_annotation/freezed_annotation.dart"; @JsonEnum() -enum MembershipStatus { leave, invite, ban, join } +enum MembershipStatus { leave, invite, ban, join, knock } diff --git a/lib/widgets/chat_page/render_event.dart b/lib/widgets/chat_page/render_event.dart index 3902c3d..3062068 100644 --- a/lib/widgets/chat_page/render_event.dart +++ b/lib/widgets/chat_page/render_event.dart @@ -8,14 +8,18 @@ import "package:linkify/linkify.dart"; import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/cross_cache_controller.dart"; import "package:nexus/helpers/extensions/get_headers.dart"; +import "package:nexus/helpers/extensions/get_localpart.dart"; import "package:nexus/helpers/extensions/mxc_to_https.dart"; import "package:nexus/helpers/extensions/show_context_menu.dart"; +import "package:nexus/helpers/extensions/show_user_popover.dart"; import "package:nexus/helpers/launch_helper.dart"; import "package:nexus/models/content/avatar.dart"; import "package:nexus/models/content/content.dart"; import "package:nexus/models/content/encrypted.dart"; +import "package:nexus/models/content/membership.dart"; import "package:nexus/models/content/message.dart"; import "package:nexus/models/event.dart"; +import "package:nexus/models/membership_status.dart"; import "package:nexus/widgets/chat_page/expandable_image.dart"; import "package:nexus/widgets/chat_page/html/html.dart"; import "package:nexus/widgets/chat_page/lazy_loading/message_avatar.dart"; @@ -290,6 +294,36 @@ class RenderEvent extends ConsumerWidget { ), ], ), + MembershipContent content => Row( + spacing: 4, + children: [ + SizedBox(width: 4), + Icon(Icons.people), + InkWell( + onTapUp: (details) => context.showUserPopover( + content, + event.sender, + globalPosition: details.globalPosition, + ), + child: Text( + content.displayName ?? event.stateKey!.localpart, + style: TextStyle( + color: theme.colorScheme.primary, + fontWeight: FontWeight.bold, + ), + ), + ), + Text( + "${switch (content.status) { + MembershipStatus.invite => "was invited to", + MembershipStatus.join => "joined", + MembershipStatus.leave => event.sender == event.stateKey ? "left" : (event.unsigned["prev_content"]?["membership"] == "ban" ? "was unbanned from" : "was kicked from"), + MembershipStatus.ban => "was banned from", + MembershipStatus.knock => "asked to join", + }} the room. ${content.reason ?? ""}", + ), + ], + ), AvatarContent() => Row( spacing: 4, children: [