Compare commits

..

No commits in common. "35f5d4e8494c276458960342d4b59e16f3e189b6" and "32aff5b4b1e5b6e598c0d43d6cbe8deb23f9c7d6" have entirely different histories.

4 changed files with 53 additions and 74 deletions

View file

@ -2,7 +2,7 @@ import "package:flutter/material.dart";
import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/models/event.dart"; import "package:nexus/models/event.dart";
import "package:nexus/models/relation_type.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_avatar.dart";
import "package:nexus/widgets/chat_page/lazy_loading/message_displayname.dart"; import "package:nexus/widgets/chat_page/lazy_loading/message_displayname.dart";
@ -55,7 +55,7 @@ class RelationPreview extends ConsumerWidget {
), ),
Expanded( Expanded(
child: IgnorePointer( child: IgnorePointer(
child: EventRenderer( child: RenderEvent(
relatedEvent!, relatedEvent!,
textOnly: true, textOnly: true,
maxLines: 1, maxLines: 1,

View file

@ -8,8 +8,10 @@ import "package:linkify/linkify.dart";
import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/controllers/cross_cache_controller.dart"; import "package:nexus/controllers/cross_cache_controller.dart";
import "package:nexus/helpers/extensions/get_headers.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/mxc_to_https.dart";
import "package:nexus/helpers/extensions/show_context_menu.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/helpers/launch_helper.dart";
import "package:nexus/models/content/avatar.dart"; import "package:nexus/models/content/avatar.dart";
import "package:nexus/models/content/content.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/membership.dart";
import "package:nexus/models/content/message.dart"; import "package:nexus/models/content/message.dart";
import "package:nexus/models/event.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/expandable_image.dart";
import "package:nexus/widgets/chat_page/html/html.dart"; import "package:nexus/widgets/chat_page/html/html.dart";
import "package:nexus/widgets/chat_page/lazy_loading/message_avatar.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/loading.dart";
import "package:nexus/widgets/players/video.dart"; import "package:nexus/widgets/players/video.dart";
import "package:nexus/widgets/players/audio.dart"; import "package:nexus/widgets/players/audio.dart";
import "package:nexus/widgets/renderers/membership.dart";
import "package:timeago/timeago.dart"; import "package:timeago/timeago.dart";
import "package:flutter_linkify/flutter_linkify.dart"; import "package:flutter_linkify/flutter_linkify.dart";
class EventRenderer extends ConsumerWidget { class RenderEvent extends ConsumerWidget {
final Event event; final Event event;
final bool textOnly; final bool textOnly;
final bool isGrouped; final bool isGrouped;
final int? maxLines; final int? maxLines;
final VoidCallback? onTapReply; final VoidCallback? onTapReply;
final IList<PopupMenuEntry> Function(Event event)? getEventOptions; final IList<PopupMenuEntry> Function(Event event)? getEventOptions;
const EventRenderer( const RenderEvent(
this.event, { this.event, {
this.onTapReply, this.onTapReply,
this.textOnly = false, this.textOnly = false,
@ -238,8 +240,10 @@ class EventRenderer extends ConsumerWidget {
:final info, :final info,
) => ) =>
AudioPlayer(url, info), AudioPlayer(url, info),
// FileMessageContent(:final info) => // FileMessageContent(
// FileCard(url, info), // :final info,
// ) =>
// VideoPlayer(url, info),
ImageMessageContent(:final info) => ExpandableImage( ImageMessageContent(:final info) => ExpandableImage(
url.toString(), url.toString(),
child: ClipRRect( child: ClipRRect(
@ -346,7 +350,46 @@ class EventRenderer extends ConsumerWidget {
(event.previousContent as MembershipContent).status == (event.previousContent as MembershipContent).status ==
content.status content.status
? null ? 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( AvatarContent() => Row(
spacing: 4, spacing: 4,
children: [ children: [

View file

@ -18,7 +18,7 @@ import "package:nexus/models/relation_type.dart";
import "package:nexus/models/requests/report_request.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/composer/chat_box.dart";
import "package:nexus/widgets/chat_page/emoji_picker_button.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/member_list.dart";
import "package:nexus/widgets/chat_page/room_appbar.dart"; import "package:nexus/widgets/chat_page/room_appbar.dart";
import "package:nexus/widgets/chat_page/wrappers/event_wrapper.dart"; import "package:nexus/widgets/chat_page/wrappers/event_wrapper.dart";
@ -327,7 +327,7 @@ class RoomChat extends HookConsumerWidget {
itemCount: value.length, itemCount: value.length,
itemBuilder: (_, index) => EventWrapper( itemBuilder: (_, index) => EventWrapper(
value[index], value[index],
EventRenderer( RenderEvent(
value[index], value[index],
onTapReply: () => onTapReply: () =>
listController.value.animateToItem( listController.value.animateToItem(

View file

@ -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(),
};
}
}