From be66446e85f845523b8ea48e240c2afb297a2cf7 Mon Sep 17 00:00:00 2001 From: Kieran Date: Thu, 15 May 2025 11:22:56 +0100 Subject: [PATCH] feat: render custom emoji reactions ref #14 --- lib/widgets/chat_message.dart | 38 ++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/lib/widgets/chat_message.dart b/lib/widgets/chat_message.dart index 4ebac2e..c08ee8d 100644 --- a/lib/widgets/chat_message.dart +++ b/lib/widgets/chat_message.dart @@ -1,5 +1,8 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:ndk/ndk.dart'; +import 'package:zap_stream_flutter/imgproxy.dart'; import 'package:zap_stream_flutter/main.dart'; import 'package:zap_stream_flutter/rx_filter.dart'; import 'package:zap_stream_flutter/theme.dart'; @@ -79,11 +82,11 @@ class ChatReactions extends StatelessWidget { filters: [ Filter(kinds: [9735, 7], eTags: [msg.id]), ], - builder: (ctx, data) => _chatReactions(data), + builder: (ctx, data) => _chatReactions(ctx, data), ); } - Widget _chatReactions(List? events) { + Widget _chatReactions(BuildContext context, List? events) { if ((events?.length ?? 0) == 0) return SizedBox.shrink(); // reactions must have e tag pointing to msg @@ -113,24 +116,49 @@ class ChatReactions extends StatelessWidget { ), if (reactions.isNotEmpty) ...reactions - .fold(>{}, (acc, v) { + .fold(>{}, (acc, v) { // ignore: prefer_collection_literals acc[v.content] ??= Set(); - acc[v.content]!.add(v.pubKey); + acc[v.content]!.add(v); return acc; }) .entries .map( (v) => Container( padding: EdgeInsets.symmetric(horizontal: 4, vertical: 2), + clipBehavior: Clip.antiAlias, decoration: BoxDecoration( color: LAYER_2, borderRadius: DEFAULT_BR, ), - child: Center(child: Text(v.key)), + child: Center( + child: _rectionContent(context, v.key, v.value.first), + ), ), ), ], ); } + + Widget _rectionContent( + BuildContext context, + String reaction, + Nip01Event event, + ) { + final customEmoji = + event.tags.firstWhereOrNull( + (t) => + t[0] == "emoji" && + t[1] == reaction.substring(1, reaction.length - 1), + )?[2]; + if (customEmoji != null) { + return CachedNetworkImage( + imageUrl: proxyImg(context, customEmoji), + height: 15, + width: 15, + ); + } else { + return Text(reaction); + } + } }