diff --git a/lib/pangea/analytics_misc/emoji_analytics_controller.dart b/lib/pangea/analytics_misc/lemma_emoji_setter_mixin.dart similarity index 72% rename from lib/pangea/analytics_misc/emoji_analytics_controller.dart rename to lib/pangea/analytics_misc/lemma_emoji_setter_mixin.dart index 7896201af..bccb467a3 100644 --- a/lib/pangea/analytics_misc/emoji_analytics_controller.dart +++ b/lib/pangea/analytics_misc/lemma_emoji_setter_mixin.dart @@ -4,13 +4,30 @@ import 'package:fluffychat/pangea/analytics_misc/put_analytics_controller.dart'; import 'package:fluffychat/pangea/constructs/construct_identifier.dart'; import 'package:fluffychat/widgets/matrix.dart'; -class EmojiAnalyticsController { - void sendEmojiAnalytics( +mixin LemmaEmojiSetter { + Future setLemmaEmoji( ConstructIdentifier constructId, + String emoji, + String? targetId, + ) async { + if (constructId.userSetEmoji.isEmpty) { + _sendEmojiAnalytics( + constructId, + targetId: targetId, + ); + } + + await constructId.setUserLemmaInfo( + constructId.userLemmaInfo.copyWith(emojis: [emoji]), + ); + } + + void _sendEmojiAnalytics( + ConstructIdentifier constructId, { String? eventId, String? roomId, String? targetId, - ) { + }) { MatrixState.pangeaController.putAnalytics.setState( AnalyticsStream( eventId: eventId, diff --git a/lib/pangea/common/utils/any_state_holder.dart b/lib/pangea/common/utils/any_state_holder.dart index 30e10d502..a2f8d4c61 100644 --- a/lib/pangea/common/utils/any_state_holder.dart +++ b/lib/pangea/common/utils/any_state_holder.dart @@ -84,6 +84,7 @@ class PangeaAnyState { if (entry != null) { try { entry.entry.remove(); + entry.entry.dispose(); } catch (err, s) { ErrorHandler.logError( e: err, @@ -117,6 +118,7 @@ class PangeaAnyState { for (int i = 0; i < shouldRemove.length; i++) { try { shouldRemove[i].entry.remove(); + shouldRemove[i].entry.dispose(); } catch (err, s) { ErrorHandler.logError( e: err, diff --git a/lib/pangea/lemmas/lemma_highlight_emoji_row.dart b/lib/pangea/lemmas/lemma_highlight_emoji_row.dart index 8efcba756..3109a851e 100644 --- a/lib/pangea/lemmas/lemma_highlight_emoji_row.dart +++ b/lib/pangea/lemmas/lemma_highlight_emoji_row.dart @@ -7,8 +7,8 @@ import 'package:flutter/material.dart'; import 'package:shimmer/shimmer.dart'; import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/pangea/analytics_misc/emoji_analytics_controller.dart'; import 'package:fluffychat/pangea/analytics_misc/get_analytics_controller.dart'; +import 'package:fluffychat/pangea/analytics_misc/lemma_emoji_setter_mixin.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/common/utils/overlay.dart'; import 'package:fluffychat/pangea/constructs/construct_identifier.dart'; @@ -29,7 +29,8 @@ class LemmaHighlightEmojiRow extends StatefulWidget { LemmaHighlightEmojiRowState createState() => LemmaHighlightEmojiRowState(); } -class LemmaHighlightEmojiRowState extends State { +class LemmaHighlightEmojiRowState extends State + with LemmaEmojiSetter { bool _showShimmer = true; String? _selectedEmoji; @@ -87,12 +88,10 @@ class LemmaHighlightEmojiRowState extends State { Future _setEmoji(String emoji, BuildContext context) async { try { setState(() => _selectedEmoji = emoji); - await widget.cId.setUserLemmaInfo( - widget.cId.userLemmaInfo.copyWith(emojis: [emoji]), - ); - EmojiAnalyticsController.sendEmojiAnalytics( + await setLemmaEmoji( widget.cId, emoji, + "emoji-choice-item-$emoji-${widget.cId.lemma}", ); } catch (e, s) { debugger(when: kDebugMode); diff --git a/lib/pangea/message_token_text/token_emoji_button.dart b/lib/pangea/message_token_text/token_emoji_button.dart index cc1b7bfcd..f0e1210a8 100644 --- a/lib/pangea/message_token_text/token_emoji_button.dart +++ b/lib/pangea/message_token_text/token_emoji_button.dart @@ -2,12 +2,13 @@ import 'package:flutter/material.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pangea/analytics_misc/lemma_emoji_setter_mixin.dart'; +import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/common/utils/overlay.dart'; import 'package:fluffychat/pangea/events/models/pangea_token_model.dart'; import 'package:fluffychat/pangea/lemmas/lemma_emoji_picker.dart'; import 'package:fluffychat/pangea/toolbar/widgets/select_mode_buttons.dart'; import 'package:fluffychat/pangea/toolbar/widgets/word_zoom/lemma_meaning_builder.dart'; -import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; class TokenEmojiButton extends StatefulWidget { @@ -32,15 +33,19 @@ class TokenEmojiButton extends StatefulWidget { } class TokenEmojiButtonState extends State - with TickerProviderStateMixin { + with TickerProviderStateMixin, LemmaEmojiSetter { final double buttonSize = 20.0; SelectMode? _prevMode; AnimationController? _controller; Animation? _sizeAnimation; + String? _emoji; + @override void initState() { super.initState(); + _emoji = widget.token?.vocabConstructID.userSetEmoji.firstOrNull; + _initAnimation(); _prevMode = widget.selectModeNotifier.value; widget.selectModeNotifier.addListener(_onUpdateSelectMode); @@ -55,8 +60,6 @@ class TokenEmojiButtonState extends State super.dispose(); } - String? get _emoji => widget.token?.vocabConstructID.userSetEmoji.firstOrNull; - void _initAnimation() { if (MatrixState.pangeaController.subscriptionController.isSubscribed == false) { @@ -94,7 +97,7 @@ class TokenEmojiButtonState extends State void showTokenEmojiPopup() { if (widget.targetId == null || widget.token == null) return; OverlayUtil.showPositionedCard( - overlayKey: "overlay_emoji_selector_${widget.targetId}", + overlayKey: "overlay_emoji_selector", context: context, cardToShow: LemmaMeaningBuilder( langCode: @@ -112,16 +115,9 @@ class TokenEmojiButtonState extends State ), child: LemmaEmojiPicker( emojis: controller.lemmaInfo?.emoji ?? [], - onSelect: (emoji) async { - final resp = await showFutureLoadingDialog( - context: context, - future: () => _setTokenEmoji(emoji), - ); - if (mounted && !resp.isError) { - MatrixState.pAnyState.closeOverlay( - "overlay_emoji_selector_${widget.targetId}", - ); - } + onSelect: (emoji) { + _setTokenEmoji(emoji); + MatrixState.pAnyState.closeOverlay("overlay_emoji_selector"); }, loading: controller.isLoading, ), @@ -137,18 +133,21 @@ class TokenEmojiButtonState extends State ); } - Future _setTokenEmoji(String emoji) async { + void _setTokenEmoji(String emoji) { + setState(() => _emoji = emoji); + if (widget.targetId == null || widget.token == null) return; - // await widget.token!.vocabConstructID.setEmojiWithXP( - // emoji: emoji, - // targetId: widget.targetId!, - // ); - await widget.token!.vocabConstructID.setUserLemmaInfo( - widget.token!.vocabConstructID.userLemmaInfo.copyWith( - emojis: [emoji], - ), - ); - if (mounted) setState(() {}); + setLemmaEmoji( + widget.token!.vocabConstructID, + emoji, + widget.targetId, + ).catchError((e, s) { + ErrorHandler.logError( + data: widget.token!.toJson(), + e: e, + s: s, + ); + }); } @override