From 350c9e6840888c3867c709ec0e9eb7efb32757a9 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Tue, 7 Jan 2025 09:07:20 -0500 Subject: [PATCH] 1371 staging bug or maybe technical design issue with morph choices (#1372) * fix: don't show morph activity if no distractors are available * mend --- lib/pangea/models/pangea_token_model.dart | 27 ++++++++--- .../widgets/word_zoom/word_zoom_widget.dart | 47 +++++++++++-------- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/lib/pangea/models/pangea_token_model.dart b/lib/pangea/models/pangea_token_model.dart index 7b01c2a72..0a5961780 100644 --- a/lib/pangea/models/pangea_token_model.dart +++ b/lib/pangea/models/pangea_token_model.dart @@ -351,32 +351,47 @@ class PangeaToken { ?.value; } - Future canGenerateDistractors( + /// Syncronously determine if a distractor can be generated for a given activity type. + /// WARNING - do not use this function to determine if lemma activities can be generated. + /// Use [canGenerateLemmaDistractors] instead. + bool canGenerateDistractors( ActivityTypeEnum type, { String? morphFeature, String? morphTag, - }) async { + }) { final constructListModel = MatrixState.pangeaController.getAnalytics.constructListModel; switch (type) { case ActivityTypeEnum.lemmaId: - final distractors = - await constructListModel.lemmaActivityDistractors(this); - return distractors.isNotEmpty; + // the function to determine this for lemmas is async + // do not use this function for lemma activities + debugger(when: kDebugMode); + return false; case ActivityTypeEnum.morphId: final distractors = constructListModel.morphActivityDistractors( morphFeature!, morphTag!, ); return distractors.isNotEmpty; + case ActivityTypeEnum.wordMeaning: + return LemmaDictionaryRepo.getDistractorDefinitions( + lemma.text, + 1, + ).isNotEmpty; case ActivityTypeEnum.emoji: case ActivityTypeEnum.wordFocusListening: - case ActivityTypeEnum.wordMeaning: case ActivityTypeEnum.hiddenWordListening: return true; } } + Future canGenerateLemmaDistractors() async { + final constructListModel = + MatrixState.pangeaController.getAnalytics.constructListModel; + final distractors = await constructListModel.lemmaActivityDistractors(this); + return distractors.isNotEmpty; + } + // maybe for every 5 points of xp for a particular activity, increment the days between uses by 2 bool shouldDoActivity({ required ActivityTypeEnum a, diff --git a/lib/pangea/widgets/word_zoom/word_zoom_widget.dart b/lib/pangea/widgets/word_zoom/word_zoom_widget.dart index 6fedb5c64..a1f2e505f 100644 --- a/lib/pangea/widgets/word_zoom/word_zoom_widget.dart +++ b/lib/pangea/widgets/word_zoom/word_zoom_widget.dart @@ -7,7 +7,6 @@ import 'package:fluffychat/pangea/controllers/message_analytics_controller.dart' import 'package:fluffychat/pangea/enum/activity_type_enum.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/models/pangea_token_model.dart'; -import 'package:fluffychat/pangea/repo/lemma_definition_repo.dart'; import 'package:fluffychat/pangea/utils/grammar/get_grammar_copy.dart'; import 'package:fluffychat/pangea/widgets/chat/message_selection_overlay.dart'; import 'package:fluffychat/pangea/widgets/chat/toolbar_content_loading_indicator.dart'; @@ -79,12 +78,6 @@ class WordZoomWidgetState extends State { // is computationally expensive, so we only do it once bool _canGenerateLemmaActivity = false; - bool get _canGenerateDefintionActivity => - LemmaDictionaryRepo.getDistractorDefinitions( - widget.token.lemma.text, - 1, - ).isNotEmpty; - @override void initState() { super.initState(); @@ -111,8 +104,7 @@ class WordZoomWidgetState extends State { } Future _setCanGenerateLemmaActivity() async { - final canGenerate = - await widget.token.canGenerateDistractors(ActivityTypeEnum.lemmaId); + final canGenerate = await widget.token.canGenerateLemmaDistractors(); if (mounted) setState(() => _canGenerateLemmaActivity = canGenerate); } @@ -181,17 +173,32 @@ class WordZoomWidgetState extends State { }); } - bool _shouldShowActivity(WordZoomSelection selection) => - widget.token.shouldDoActivity( - a: selection.activityType, - feature: _selectedMorphFeature, - tag: _selectedMorphFeature == null - ? null - : widget.token.morph[_selectedMorphFeature], - ) && - (selection != WordZoomSelection.lemma || _canGenerateLemmaActivity) && - (selection != WordZoomSelection.translation || - _canGenerateDefintionActivity); + bool _shouldShowActivity(WordZoomSelection selection) { + final shouldDo = widget.token.shouldDoActivity( + a: selection.activityType, + feature: _selectedMorphFeature, + tag: _selectedMorphFeature == null + ? null + : widget.token.morph[_selectedMorphFeature], + ); + if (!shouldDo) return false; + + switch (selection) { + case WordZoomSelection.lemma: + return _canGenerateLemmaActivity; + case WordZoomSelection.translation: + case WordZoomSelection.morph: + return widget.token.canGenerateDistractors( + selection.activityType, + morphFeature: _selectedMorphFeature, + morphTag: _selectedMorphFeature == null + ? null + : widget.token.morph[_selectedMorphFeature], + ); + case WordZoomSelection.emoji: + return true; + } + } @override Widget build(BuildContext context) {