diff --git a/lib/pangea/toolbar/message_selection_overlay.dart b/lib/pangea/toolbar/message_selection_overlay.dart index 165c795b4..a8fd23a35 100644 --- a/lib/pangea/toolbar/message_selection_overlay.dart +++ b/lib/pangea/toolbar/message_selection_overlay.dart @@ -216,28 +216,35 @@ class MessageOverlayController extends State ); } - if (mounted) { - setState(() {}); - if (selectedToken != null && isNewToken(selectedToken!)) { - final token = selectedToken!; - final constructs = [ - OneConstructUse( - useType: ConstructUseTypeEnum.click, - lemma: token.lemma.text, - constructType: ConstructTypeEnum.vocab, - metadata: ConstructUseMetaData( - roomId: event.room.id, - timeStamp: DateTime.now(), - eventId: event.eventId, - ), - category: token.pos, - form: token.text.content, - xp: ConstructUseTypeEnum.click.pointValue, + if (!mounted) return; + if (selectedToken != null && isNewToken(selectedToken!)) { + TokensUtil.collectToken(event.eventId, selectedToken!.text); + final token = selectedToken!; + final constructs = [ + OneConstructUse( + useType: ConstructUseTypeEnum.click, + lemma: token.lemma.text, + constructType: ConstructTypeEnum.vocab, + metadata: ConstructUseMetaData( + roomId: event.room.id, + timeStamp: DateTime.now(), + eventId: event.eventId, ), - ]; - addAnalytics(constructs, "word-zoom-card-${token.text.uniqueKey}"); - } + category: token.pos, + form: token.text.content, + xp: ConstructUseTypeEnum.click.pointValue, + ), + ]; + + addAnalytics(constructs, "word-zoom-card-${token.text.uniqueKey}") + .then((_) { + TokensUtil.clearNewTokenCache(); + if (mounted) setState(() {}); + }); + return; } + + setState(() {}); } PangeaMessageEvent get pangeaMessageEvent => PangeaMessageEvent( diff --git a/lib/pangea/toolbar/reading_assistance/new_word_overlay.dart b/lib/pangea/toolbar/reading_assistance/new_word_overlay.dart index d5a2ee6be..1bbef81fe 100644 --- a/lib/pangea/toolbar/reading_assistance/new_word_overlay.dart +++ b/lib/pangea/toolbar/reading_assistance/new_word_overlay.dart @@ -74,7 +74,7 @@ class _NewWordOverlayState extends State WidgetsBinding.instance.addPostFrameCallback((_) { _showFlyingWidget(); _controller?.forward().then((_) { - TokensUtil.clearNewTokenCache(); + TokensUtil.clearRecentlyCollected(); widget.onDismiss?.call(); }); }); diff --git a/lib/pangea/toolbar/reading_assistance/tokens_util.dart b/lib/pangea/toolbar/reading_assistance/tokens_util.dart index 134b101d7..61528f80b 100644 --- a/lib/pangea/toolbar/reading_assistance/tokens_util.dart +++ b/lib/pangea/toolbar/reading_assistance/tokens_util.dart @@ -47,6 +47,7 @@ class TokensUtil { /// A cache of calculated adjacent token positions static final Map _tokenPositionCache = {}; static final Map _newTokenCache = {}; + static PangeaTokenText? _lastCollected; static const Duration _cacheDuration = Duration(minutes: 1); @@ -124,10 +125,20 @@ class TokensUtil { return newTokens.any((t) => t == token.text); } - static clearNewTokenCache() { + static void clearNewTokenCache() { _newTokenCache.clear(); } + static void collectToken(String eventId, PangeaTokenText token) { + _newTokenCache[eventId]?.tokens.remove(token); + _lastCollected = token; + } + + static bool isRecentlyCollected(PangeaTokenText token) => + _lastCollected == token; + + static void clearRecentlyCollected() => _lastCollected = null; + static List? _getCachedTokenPositions(String eventID) { final cacheItem = _tokenPositionCache[eventID]; if (cacheItem == null) return null; diff --git a/lib/pangea/toolbar/word_card/reading_assistance_content.dart b/lib/pangea/toolbar/word_card/reading_assistance_content.dart index 71d2e0d97..3096171c5 100644 --- a/lib/pangea/toolbar/word_card/reading_assistance_content.dart +++ b/lib/pangea/toolbar/word_card/reading_assistance_content.dart @@ -47,7 +47,6 @@ class ReadingAssistanceContent extends StatelessWidget { token: overlayController.selectedToken!.text, construct: overlayController.selectedToken!.vocabConstructID, event: overlayController.event, - wordIsNew: overlayController.isNewToken(overlayController.selectedToken!), onClose: () => overlayController.updateSelectedSpan(null), langCode: overlayController.pangeaMessageEvent.messageDisplayLangCode, onDismissNewWordOverlay: () => overlayController.setState(() {}), diff --git a/lib/pangea/toolbar/word_card/word_zoom_widget.dart b/lib/pangea/toolbar/word_card/word_zoom_widget.dart index 161799b9e..98d957cb5 100644 --- a/lib/pangea/toolbar/word_card/word_zoom_widget.dart +++ b/lib/pangea/toolbar/word_card/word_zoom_widget.dart @@ -11,6 +11,7 @@ import 'package:fluffychat/pangea/languages/p_language_store.dart'; import 'package:fluffychat/pangea/lemmas/lemma_info_response.dart'; import 'package:fluffychat/pangea/phonetic_transcription/phonetic_transcription_widget.dart'; import 'package:fluffychat/pangea/toolbar/reading_assistance/new_word_overlay.dart'; +import 'package:fluffychat/pangea/toolbar/reading_assistance/tokens_util.dart'; import 'package:fluffychat/pangea/toolbar/word_card/lemma_meaning_display.dart'; import 'package:fluffychat/pangea/toolbar/word_card/lemma_reaction_picker.dart'; import 'package:fluffychat/pangea/toolbar/word_card/message_unsubscribed_card.dart'; @@ -24,7 +25,6 @@ class WordZoomWidget extends StatelessWidget { final String langCode; final VoidCallback? onClose; - final bool wordIsNew; final Event? event; final VoidCallback? onDismissNewWordOverlay; @@ -36,7 +36,6 @@ class WordZoomWidget extends StatelessWidget { required this.construct, required this.langCode, this.onClose, - this.wordIsNew = false, this.event, this.onDismissNewWordOverlay, this.onFlagTokenInfo, @@ -164,7 +163,7 @@ class WordZoomWidget extends StatelessWidget { ), ), ), - wordIsNew + TokensUtil.isRecentlyCollected(token) ? NewWordOverlay( key: ValueKey(transformTargetId), overlayColor: overlayColor,