rebuild overlay on reaction event

This commit is contained in:
ggurdin 2024-10-09 11:22:47 -04:00
parent 99fc3fd625
commit f125ed6fd8
No known key found for this signature in database
GPG key ID: A01CB41737CBB478
2 changed files with 35 additions and 5 deletions

View file

@ -1251,7 +1251,14 @@ class ChatController extends State<ChatPageWithRoom>
)) {
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<ChatPageWithRoom>
void sendEmojiAction(String? emoji) async {
final events = List<Event>.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

View file

@ -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<MessageSelectionOverlay>
with SingleTickerProviderStateMixin {
late AnimationController _animationController;
StreamSubscription? _reactionSubscription;
Animation<double>? _overlayPositionAnimation;
MessageMode toolbarMode = MessageMode.translation;
@ -73,6 +75,26 @@ class MessageOverlayController extends State<MessageSelectionOverlay>
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<MessageSelectionOverlay>
@override
void dispose() {
_animationController.dispose();
_reactionSubscription?.cancel();
super.dispose();
}