diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 2dd0ae476..c44796e47 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -1251,7 +1251,14 @@ class ChatController extends State )) { return; } - return sendEmojiAction(emoji.emoji); + // #Pangea + // return sendEmojiAction(emoji.emoji); + sendEmojiAction(emoji.emoji); + + // don't need to clear these when sending while in select mode, + // but do need to clear these when reacting from the large emoji picker + setState(() => selectedEvents.clear()); + // Pangea# } void typeEmoji(Emoji? emoji) { @@ -1298,16 +1305,16 @@ class ChatController extends State void sendEmojiAction(String? emoji) async { final events = List.from(selectedEvents); - setState(() => selectedEvents.clear()); + // #Pangea + // keep this event selected in case the user wants to send another emoji + // setState(() => selectedEvents.clear()); + // Pangea# for (final event in events) { await room.sendReaction( event.eventId, emoji!, ); } - // #Pangea - clearSelectedEvents(); - // Pangea# } // #Pangea diff --git a/lib/pangea/widgets/chat/message_selection_overlay.dart b/lib/pangea/widgets/chat/message_selection_overlay.dart index 57f6bbcd9..428d36e79 100644 --- a/lib/pangea/widgets/chat/message_selection_overlay.dart +++ b/lib/pangea/widgets/chat/message_selection_overlay.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:developer'; import 'package:fluffychat/config/app_config.dart'; @@ -49,6 +50,7 @@ class MessageSelectionOverlay extends StatefulWidget { class MessageOverlayController extends State with SingleTickerProviderStateMixin { late AnimationController _animationController; + StreamSubscription? _reactionSubscription; Animation? _overlayPositionAnimation; MessageMode toolbarMode = MessageMode.translation; @@ -73,6 +75,26 @@ class MessageOverlayController extends State activitiesLeftToComplete = activitiesLeftToComplete - widget._pangeaMessageEvent.numberOfActivitiesCompleted; + _reactionSubscription = + widget.chatController.room.client.onSync.stream.where( + (update) { + // check if this sync update has a reaction event or a + // redaction (of a reaction event). If so, rebuild the overlay + final room = widget.chatController.room; + final timelineEvents = update.rooms?.join?[room.id]?.timeline?.events; + if (timelineEvents == null) return false; + + final eventID = widget._pangeaMessageEvent.event.eventId; + return timelineEvents.any( + (e) => + e.type == EventTypes.Redaction || + (e.type == EventTypes.Reaction && + Event.fromMatrixEvent(e, room).relationshipEventId == + eventID), + ); + }, + ).listen((_) => setState(() {})); + setInitialToolbarMode(); } @@ -315,6 +337,7 @@ class MessageOverlayController extends State @override void dispose() { _animationController.dispose(); + _reactionSubscription?.cancel(); super.dispose(); }