Compare commits
No commits in common. "35f5d4e8494c276458960342d4b59e16f3e189b6" and "32aff5b4b1e5b6e598c0d43d6cbe8deb23f9c7d6" have entirely different histories.
35f5d4e849
...
32aff5b4b1
4 changed files with 53 additions and 74 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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: [
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue