refactor: Use more robust and performant way to detect single emoji messages

This commit is contained in:
Christian Kußowski 2026-02-27 19:08:27 +01:00
parent 29fcc223d6
commit f0aa15843b
No known key found for this signature in database
GPG key ID: E067ECD60F1A0652
4 changed files with 18 additions and 3 deletions

View file

@ -104,6 +104,8 @@ class ChatController extends State<ChatPageWithRoom>
String? activeThreadId;
late final Set<String> bigEmojis;
late final String readMarkerEventId;
String get roomId => widget.room.id;
@ -360,6 +362,14 @@ class ChatController extends State<ChatPageWithRoom>
AppSettings.displayChatDetailsColumn.value,
);
bigEmojis = defaultEmojiSet.fold(
<String>{},
(emojis, category) => {
...emojis,
...(category.emoji.map((emoji) => emoji.emoji)),
},
);
sendingClient = Matrix.of(context).client;
final lastEventThreadId =
room.lastEvent?.relationshipType == RelationshipTypes.thread

View file

@ -144,6 +144,7 @@ class ChatEventList extends StatelessWidget {
controller: controller.scrollController,
child: Message(
event,
bigEmojis: controller.bigEmojis,
animateIn: animateIn,
resetAnimateIn: () {
controller.animateInEventIndex = null;

View file

@ -48,6 +48,7 @@ class Message extends StatelessWidget {
final List<Color> colors;
final void Function()? onExpand;
final bool isCollapsed;
final Set<String> 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(

View file

@ -35,6 +35,7 @@ class MessageContent extends StatelessWidget {
final BorderRadius borderRadius;
final Timeline timeline;
final bool selected;
final Set<String> 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<void> _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(