From f9b1960cf809323a1653bcb54905348bbef8a477 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Tue, 19 May 2026 11:23:38 -0400 Subject: [PATCH] support for m.emote msgtype --- lib/models/content/message.dart | 7 +++++++ lib/widgets/chat_page/render_event.dart | 26 ++++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/models/content/message.dart b/lib/models/content/message.dart index 1140809..35802ed 100644 --- a/lib/models/content/message.dart +++ b/lib/models/content/message.dart @@ -25,6 +25,13 @@ abstract class MessageContent extends Content with _$MessageContent { String? formattedBody, }) = NoticeMessageContent; + @FreezedUnionValue("m.emote") + factory MessageContent.emote({ + required String body, + String? format, + String? formattedBody, + }) = EmoteMessageContent; + @FreezedUnionValue("m.image") factory MessageContent.image({ required String body, diff --git a/lib/widgets/chat_page/render_event.dart b/lib/widgets/chat_page/render_event.dart index 84b95fc..3902c3d 100644 --- a/lib/widgets/chat_page/render_event.dart +++ b/lib/widgets/chat_page/render_event.dart @@ -62,6 +62,11 @@ class RenderEvent extends ConsumerWidget { children: getEventOptions!(event).toList(), ); + final textStyle = TextStyle( + fontSize: event.localContent?.bigEmoji == true ? 32 : null, + fontStyle: event.content is EmoteMessageContent ? FontStyle.italic : null, + ); + if (event.redactedBy != null) return SizedBox.shrink(); final child = switch (event.content) { @@ -132,6 +137,11 @@ class RenderEvent extends ConsumerWidget { :final formattedBody, :final format, ) || + EmoteMessageContent( + :final body, + :final formattedBody, + :final format, + ) || ImageMessageContent( :final body, :final formattedBody, @@ -141,10 +151,7 @@ class RenderEvent extends ConsumerWidget { children: [ format == "org.matrix.custom.html" && !textOnly ? Html( - textStyle: - event.localContent?.bigEmoji == true - ? TextStyle(fontSize: 32) - : null, + textStyle: textStyle, formattedBody!.replaceAllMapped( RegExp( "(]*>.*?<\\/a>)|(\\bhttps?:\\/\\/[^\\s<]+)", @@ -164,6 +171,7 @@ class RenderEvent extends ConsumerWidget { ), ) : Linkify( + style: textStyle, text: body, maxLines: maxLines, overflow: TextOverflow.ellipsis, @@ -263,7 +271,15 @@ class RenderEvent extends ConsumerWidget { LinkPreview(link.url), ], ), - _ => Text("Unknown message type", style: errorStyle), + MessageContent(:final body) => Row( + spacing: 8, + mainAxisSize: MainAxisSize.min, + children: [ + Text("Unknown message type:", style: errorStyle), + Text(body), + ], + ), + _ => throw Exception("This is impossible"), }, ], ),