diff --git a/lib/pangea/toolbar/word_card/lemma_reaction_picker.dart b/lib/pangea/toolbar/word_card/lemma_reaction_picker.dart index ce42e1da6..b396b5bdc 100644 --- a/lib/pangea/toolbar/word_card/lemma_reaction_picker.dart +++ b/lib/pangea/toolbar/word_card/lemma_reaction_picker.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:collection/collection.dart'; @@ -29,14 +31,47 @@ class LemmaReactionPicker extends StatefulWidget with LemmaEmojiSetter { class LemmaReactionPickerState extends State { ScaffoldMessengerState? messenger; + StreamSubscription? _emojiSub; + String? _selectedEmoji; + + @override + void initState() { + super.initState(); + _selectedEmoji = widget.constructId.userSetEmoji; + _setEmojiSub(); + } + + @override + void didUpdateWidget(LemmaReactionPicker oldWidget) { + if (oldWidget.constructId != widget.constructId) { + setState(() => _selectedEmoji = widget.constructId.userSetEmoji); + _emojiSub?.cancel(); + _setEmojiSub(); + } + super.didUpdateWidget(oldWidget); + } @override void dispose() { messenger?.hideCurrentSnackBar(); messenger = null; + _emojiSub?.cancel(); super.dispose(); } + void _setEmojiSub() { + _emojiSub?.cancel(); + _emojiSub = Matrix.of(context) + .analyticsDataService + .updateDispatcher + .lemmaUpdateStream(widget.constructId) + .listen((update) => _setSelectedEmoji(update.emojis?.firstOrNull)); + } + + void _setSelectedEmoji(String? emoji) { + setState(() => _selectedEmoji = emoji); + } + Event? _sentReaction(String emoji) { final userSentEmojis = widget.event! .aggregatedEvents( @@ -93,38 +128,25 @@ class LemmaReactionPickerState extends State { @override Widget build(BuildContext context) { - final stream = Matrix.of(context) - .analyticsDataService - .updateDispatcher - .lemmaUpdateStream(widget.constructId); - final targetId = "emoji-choice-item-${widget.constructId.lemma}-$hashCode"; - return StreamBuilder( - stream: stream, - builder: (context, snapshot) { - final selectedEmoji = snapshot.data?.emojis?.firstOrNull ?? - widget.constructId.userSetEmoji; - - return LemmaHighlightEmojiRow( - cId: widget.constructId, - langCode: widget.langCode, - targetId: targetId, - onEmojiSelected: (emoji, target) => emoji != selectedEmoji - ? _setEmoji(emoji, target) - : _sendOrRedactReaction(emoji), - emoji: selectedEmoji, - messageInfo: widget.event?.content ?? {}, - selectedEmojiBadge: widget.event != null && - selectedEmoji != null && - _sentReaction(selectedEmoji) == null - ? const Icon( - Icons.add_reaction, - size: 12.0, - ) - : null, - enabled: widget.enabled, - ); - }, + return LemmaHighlightEmojiRow( + cId: widget.constructId, + langCode: widget.langCode, + targetId: targetId, + onEmojiSelected: (emoji, target) => emoji != _selectedEmoji + ? _setEmoji(emoji, target) + : _sendOrRedactReaction(emoji), + emoji: _selectedEmoji, + messageInfo: widget.event?.content ?? {}, + selectedEmojiBadge: widget.event != null && + _selectedEmoji != null && + _sentReaction(_selectedEmoji!) == null + ? const Icon( + Icons.add_reaction, + size: 12.0, + ) + : null, + enabled: widget.enabled, ); } }