diff --git a/lib/pangea/widgets/chat/message_selection_overlay.dart b/lib/pangea/widgets/chat/message_selection_overlay.dart index 6254db276..5b4928fdb 100644 --- a/lib/pangea/widgets/chat/message_selection_overlay.dart +++ b/lib/pangea/widgets/chat/message_selection_overlay.dart @@ -62,6 +62,9 @@ class MessageOverlayController extends State MessageMode toolbarMode = MessageMode.translation; PangeaTokenText? _selectedSpan; + List? tokens; + bool initialized = false; + /// The number of activities that need to be completed before the toolbar is unlocked /// If we don't have any good activities for them, we'll decrease this number static const int neededActivities = 3; @@ -101,8 +104,6 @@ class MessageOverlayController extends State : null; } - List? tokens; - @override void initState() { super.initState(); @@ -113,17 +114,12 @@ class MessageOverlayController extends State ); debugPrint( - "selected token: ${widget._initialSelectedToken?.toJson()} total_xp:${widget._initialSelectedToken?.xp} vocab_construct_xp: ${widget._initialSelectedToken?.vocabConstruct.points} daysSincelastUseInWordMeaning ${widget._initialSelectedToken?.daysSinceLastUseByType(ActivityTypeEnum.wordMeaning)}", + "selected token: ${widget._initialSelectedToken?.text.content} total_xp:${widget._initialSelectedToken?.xp} vocab_construct_xp: ${widget._initialSelectedToken?.vocabConstruct.points} daysSincelastUseInWordMeaning ${widget._initialSelectedToken?.daysSinceLastUseByType(ActivityTypeEnum.wordMeaning)}", ); debugPrint( "${widget._initialSelectedToken?.vocabConstruct.uses.map((u) => "${u.useType} ${u.timeStamp}").join(", ")}", ); - _getTokens(); - - activitiesLeftToComplete = activitiesLeftToComplete - - widget._pangeaMessageEvent.numberOfActivitiesCompleted; - _reactionSubscription = widget.chatController.room.client.onSync.stream.where( (update) { @@ -146,7 +142,30 @@ class MessageOverlayController extends State tts.setupTTS(); - _setInitialToolbarModeAndSelectedSpan(); + activitiesLeftToComplete = activitiesLeftToComplete - + widget._pangeaMessageEvent.numberOfActivitiesCompleted; + + if (pangeaMessageEvent.originalSent != null) { + pangeaMessageEvent.originalSent! + .tokensGlobal( + pangeaMessageEvent.senderId, + pangeaMessageEvent.originServerTs, + ) + .then( + (tokens) { + this.tokens = tokens; + _setInitialToolbarModeAndSelectedSpan(); + initialized = true; + }, + ).onError((e, stackTrace) { + ErrorHandler.logError(e: "Error getting tokens: $e", s: stackTrace); + _setInitialToolbarModeAndSelectedSpan(); + initialized = true; + }); + } else { + _setInitialToolbarModeAndSelectedSpan(); + initialized = true; + } } MessageAnalyticsEntry? get messageAnalyticsEntry => tokens != null @@ -158,24 +177,6 @@ class MessageOverlayController extends State ) : null; - Future _getTokens() async { - tokens = pangeaMessageEvent.originalSent?.tokens; - - if (pangeaMessageEvent.originalSent != null && tokens == null) { - debugPrint("fetching tokens"); - pangeaMessageEvent.originalSent! - .tokensGlobal( - pangeaMessageEvent.senderId, - pangeaMessageEvent.originServerTs, - ) - .then((tokens) { - // this isn't currently working because originalSent's _event is null - this.tokens = tokens; - _setInitialToolbarModeAndSelectedSpan(); - }); - } - } - /// We need to check if the setState call is safe to call immediately /// Kept getting the error: setState() or markNeedsBuild() called during build. /// This is a workaround to prevent that error diff --git a/lib/pangea/widgets/chat/message_toolbar.dart b/lib/pangea/widgets/chat/message_toolbar.dart index 63261ddde..647dc5737 100644 --- a/lib/pangea/widgets/chat/message_toolbar.dart +++ b/lib/pangea/widgets/chat/message_toolbar.dart @@ -145,6 +145,8 @@ class MessageToolbar extends StatelessWidget { @override Widget build(BuildContext context) { + if (!overLayController.initialized) return const SizedBox(); + return Container( decoration: BoxDecoration( color: Theme.of(context).cardColor,