From f0aa15843b03dd1c482ea1d214d4d3d8cfb1a30c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 27 Feb 2026 19:08:27 +0100 Subject: [PATCH] refactor: Use more robust and performant way to detect single emoji messages --- lib/pages/chat/chat.dart | 10 ++++++++++ lib/pages/chat/chat_event_list.dart | 1 + lib/pages/chat/events/message.dart | 3 +++ lib/pages/chat/events/message_content.dart | 7 ++++--- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 4fa0d5132..afe579207 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -104,6 +104,8 @@ class ChatController extends State String? activeThreadId; + late final Set bigEmojis; + late final String readMarkerEventId; String get roomId => widget.room.id; @@ -360,6 +362,14 @@ class ChatController extends State AppSettings.displayChatDetailsColumn.value, ); + bigEmojis = defaultEmojiSet.fold( + {}, + (emojis, category) => { + ...emojis, + ...(category.emoji.map((emoji) => emoji.emoji)), + }, + ); + sendingClient = Matrix.of(context).client; final lastEventThreadId = room.lastEvent?.relationshipType == RelationshipTypes.thread diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index c05230431..600d0af41 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -144,6 +144,7 @@ class ChatEventList extends StatelessWidget { controller: controller.scrollController, child: Message( event, + bigEmojis: controller.bigEmojis, animateIn: animateIn, resetAnimateIn: () { controller.animateInEventIndex = null; diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index d2835e45a..a350599e6 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -48,6 +48,7 @@ class Message extends StatelessWidget { final List colors; final void Function()? onExpand; final bool isCollapsed; + final Set bigEmojis; const Message( this.event, { @@ -55,6 +56,7 @@ class Message extends StatelessWidget { this.previousEvent, this.displayReadMarker = false, this.longPressSelect = false, + required this.bigEmojis, required this.onSelect, required this.onInfoTab, required this.scrollToEventId, @@ -612,6 +614,7 @@ class Message extends StatelessWidget { borderRadius, timeline: timeline, selected: selected, + bigEmojis: bigEmojis, ), if (event .hasAggregatedEvents( diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index cccd8d1a9..24041eab0 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -35,6 +35,7 @@ class MessageContent extends StatelessWidget { final BorderRadius borderRadius; final Timeline timeline; final bool selected; + final Set bigEmojis; const MessageContent( this.event, { @@ -45,6 +46,7 @@ class MessageContent extends StatelessWidget { required this.linkColor, required this.borderRadius, required this.selected, + required this.bigEmojis, }); Future _verifyOrRequestKey(BuildContext context) async { @@ -258,9 +260,8 @@ class MessageContent extends StatelessWidget { } final bigEmotes = - event.onlyEmotes && - event.numberEmotes > 0 && - event.numberEmotes <= 3; + !event.isRichMessage && bigEmojis.contains(event.body); + return Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), child: HtmlMessage(