diff --git a/lib/widgets/chat_page/composer/relation_preview.dart b/lib/widgets/chat_page/composer/relation_preview.dart index fff95b2..2df8a3d 100644 --- a/lib/widgets/chat_page/composer/relation_preview.dart +++ b/lib/widgets/chat_page/composer/relation_preview.dart @@ -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/renderers/event.dart"; +import "package:nexus/widgets/chat_page/render_event.dart"; import "package:nexus/widgets/chat_page/lazy_loading/message_avatar.dart"; import "package:nexus/widgets/chat_page/lazy_loading/message_displayname.dart"; @@ -55,7 +55,7 @@ class RelationPreview extends ConsumerWidget { ), Expanded( child: IgnorePointer( - child: EventRenderer( + child: RenderEvent( relatedEvent!, textOnly: true, maxLines: 1, diff --git a/lib/widgets/renderers/event.dart b/lib/widgets/chat_page/render_event.dart similarity index 88% rename from lib/widgets/renderers/event.dart rename to lib/widgets/chat_page/render_event.dart index 860e07f..747c3b7 100644 --- a/lib/widgets/renderers/event.dart +++ b/lib/widgets/chat_page/render_event.dart @@ -8,8 +8,10 @@ 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"; @@ -17,6 +19,7 @@ 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"; @@ -25,18 +28,17 @@ 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"; -class EventRenderer extends ConsumerWidget { +class RenderEvent extends ConsumerWidget { final Event event; final bool textOnly; final bool isGrouped; final int? maxLines; final VoidCallback? onTapReply; final IList Function(Event event)? getEventOptions; - const EventRenderer( + const RenderEvent( this.event, { this.onTapReply, this.textOnly = false, @@ -238,8 +240,10 @@ class EventRenderer extends ConsumerWidget { :final info, ) => AudioPlayer(url, info), - // FileMessageContent(:final info) => - // FileCard(url, info), + // FileMessageContent( + // :final info, + // ) => + // VideoPlayer(url, info), ImageMessageContent(:final info) => ExpandableImage( url.toString(), child: ClipRRect( @@ -346,7 +350,46 @@ class EventRenderer extends ConsumerWidget { (event.previousContent as MembershipContent).status == content.status ? null - : MembershipRenderer(event), + : 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, + ), + ), + ], + ), AvatarContent() => Row( spacing: 4, children: [ diff --git a/lib/widgets/chat_page/room_chat.dart b/lib/widgets/chat_page/room_chat.dart index 0876982..a9383f9 100644 --- a/lib/widgets/chat_page/room_chat.dart +++ b/lib/widgets/chat_page/room_chat.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/renderers/event.dart"; +import "package:nexus/widgets/chat_page/render_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"; @@ -327,7 +327,7 @@ class RoomChat extends HookConsumerWidget { itemCount: value.length, itemBuilder: (_, index) => EventWrapper( value[index], - EventRenderer( + RenderEvent( value[index], onTapReply: () => listController.value.animateToItem( diff --git a/lib/widgets/renderers/membership.dart b/lib/widgets/renderers/membership.dart deleted file mode 100644 index 37c61c4..0000000 --- a/lib/widgets/renderers/membership.dart +++ /dev/null @@ -1,64 +0,0 @@ -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(), - }; - } -}