refactor membership renderer into its own widget
This commit is contained in:
parent
1cc2c87ae8
commit
35f5d4e849
5 changed files with 68 additions and 45 deletions
|
|
@ -2,7 +2,7 @@ import "package:flutter/material.dart";
|
|||
import "package:hooks_riverpod/hooks_riverpod.dart";
|
||||
import "package:nexus/models/event.dart";
|
||||
import "package:nexus/models/relation_type.dart";
|
||||
import "package:nexus/widgets/chat_page/event_renderer.dart";
|
||||
import "package:nexus/widgets/renderers/event.dart";
|
||||
import "package:nexus/widgets/chat_page/lazy_loading/message_avatar.dart";
|
||||
import "package:nexus/widgets/chat_page/lazy_loading/message_displayname.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ import "package:nexus/models/relation_type.dart";
|
|||
import "package:nexus/models/requests/report_request.dart";
|
||||
import "package:nexus/widgets/chat_page/composer/chat_box.dart";
|
||||
import "package:nexus/widgets/chat_page/emoji_picker_button.dart";
|
||||
import "package:nexus/widgets/chat_page/event_renderer.dart";
|
||||
import "package:nexus/widgets/renderers/event.dart";
|
||||
import "package:nexus/widgets/chat_page/member_list.dart";
|
||||
import "package:nexus/widgets/chat_page/room_appbar.dart";
|
||||
import "package:nexus/widgets/chat_page/wrappers/event_wrapper.dart";
|
||||
|
|
|
|||
|
|
@ -8,10 +8,8 @@ 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";
|
||||
|
|
@ -19,7 +17,6 @@ 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";
|
||||
|
|
@ -28,6 +25,7 @@ import "package:nexus/widgets/link_preview.dart";
|
|||
import "package:nexus/widgets/loading.dart";
|
||||
import "package:nexus/widgets/players/video.dart";
|
||||
import "package:nexus/widgets/players/audio.dart";
|
||||
import "package:nexus/widgets/renderers/membership.dart";
|
||||
import "package:timeago/timeago.dart";
|
||||
import "package:flutter_linkify/flutter_linkify.dart";
|
||||
|
||||
|
|
@ -348,46 +346,7 @@ class EventRenderer extends ConsumerWidget {
|
|||
(event.previousContent as MembershipContent).status ==
|
||||
content.status
|
||||
? null
|
||||
: Row(
|
||||
spacing: 4,
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 4),
|
||||
child: Icon(Icons.people),
|
||||
),
|
||||
InkWell(
|
||||
onTapUp: (details) => context.showUserPopover(
|
||||
content,
|
||||
event.stateKey!,
|
||||
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 == null ? "" : "because ${content.reason}"}${event.sender == event.stateKey ? "" : " by "}",
|
||||
),
|
||||
if (event.sender != event.stateKey)
|
||||
MessageDisplayname(
|
||||
event,
|
||||
style: TextStyle(
|
||||
color: theme.colorScheme.primary,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
: MembershipRenderer(event),
|
||||
AvatarContent() => Row(
|
||||
spacing: 4,
|
||||
children: [
|
||||
64
lib/widgets/renderers/membership.dart
Normal file
64
lib/widgets/renderers/membership.dart
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
import "package:flutter/material.dart";
|
||||
import "package:nexus/helpers/extensions/get_localpart.dart";
|
||||
import "package:nexus/helpers/extensions/show_user_popover.dart";
|
||||
import "package:nexus/models/content/membership.dart";
|
||||
import "package:nexus/models/event.dart";
|
||||
import "package:nexus/models/membership_status.dart";
|
||||
import "package:nexus/widgets/chat_page/lazy_loading/message_displayname.dart";
|
||||
|
||||
class MembershipRenderer extends StatelessWidget {
|
||||
final Event event;
|
||||
const MembershipRenderer(this.event, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
assert(
|
||||
event.content is MembershipContent,
|
||||
"Make sure to only pass membership events to MembershipRenderer",
|
||||
);
|
||||
|
||||
return switch (event.content) {
|
||||
MembershipContent content => Row(
|
||||
spacing: 4,
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 4),
|
||||
child: Icon(Icons.people),
|
||||
),
|
||||
InkWell(
|
||||
onTapUp: (details) => context.showUserPopover(
|
||||
content,
|
||||
event.stateKey!,
|
||||
globalPosition: details.globalPosition,
|
||||
),
|
||||
child: Text(
|
||||
content.displayName ?? event.stateKey!.localpart,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context).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 == null ? "" : "because ${content.reason}"}${event.sender == event.stateKey ? "" : " by "}",
|
||||
),
|
||||
if (event.sender != event.stateKey)
|
||||
MessageDisplayname(
|
||||
event,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
_ => SizedBox.shrink(),
|
||||
};
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue