diff --git a/lib/pangea/analytics_practice/analytics_practice_page.dart b/lib/pangea/analytics_practice/analytics_practice_page.dart index 065cb4874..e218ebd6c 100644 --- a/lib/pangea/analytics_practice/analytics_practice_page.dart +++ b/lib/pangea/analytics_practice/analytics_practice_page.dart @@ -239,6 +239,7 @@ class AnalyticsPracticeState extends State Future _completeSession() async { _sessionController.completeSession(); + progress.value = _sessionController.progress; setState(() {}); final bonus = _sessionController.bonusUses; diff --git a/lib/pangea/analytics_practice/grammar_match_target_generator.dart b/lib/pangea/analytics_practice/grammar_match_target_generator.dart index 4b37528bb..3464598ba 100644 --- a/lib/pangea/analytics_practice/grammar_match_target_generator.dart +++ b/lib/pangea/analytics_practice/grammar_match_target_generator.dart @@ -26,6 +26,7 @@ class GrammarMatchTargetGenerator { final sortedConstructs = constructs.practiceSort(activityType); final Set seenForms = {}; + final cutoffTime = DateTime.now().subtract(const Duration(hours: 24)); final morphInfoResult = await MorphsRepo.get( MatrixState.pangeaController.userController.userL2, @@ -52,6 +53,14 @@ class GrammarMatchTargetGenerator { continue; } + final lastPracticeUse = construct.lastUseByTypes( + activityType.associatedUseTypes, + ); + + if (lastPracticeUse != null && lastPracticeUse.isAfter(cutoffTime)) { + continue; + } + List? exampleMessage; final constructForms = construct.cappedUses .where((u) => u.form != null) diff --git a/lib/pangea/analytics_practice/vocab_audio_target_generator.dart b/lib/pangea/analytics_practice/vocab_audio_target_generator.dart index c518b8287..b376070ac 100644 --- a/lib/pangea/analytics_practice/vocab_audio_target_generator.dart +++ b/lib/pangea/analytics_practice/vocab_audio_target_generator.dart @@ -18,6 +18,8 @@ class VocabAudioTargetGenerator { final Set seenLemmas = {}; final Set seenEventIds = {}; + final cutoffTime = DateTime.now().subtract(const Duration(hours: 24)); + final targets = []; for (final construct in sortedConstructs) { @@ -27,6 +29,14 @@ class VocabAudioTargetGenerator { if (seenLemmas.contains(construct.lemma)) continue; + final lastPracticeUse = construct.lastUseByTypes( + activityType.associatedUseTypes, + ); + + if (lastPracticeUse != null && lastPracticeUse.isAfter(cutoffTime)) { + continue; + } + // Try to get an audio example message with token data for this lemma final exampleMessage = await ExampleMessageUtil.getAudioExampleMessage( construct, diff --git a/lib/pangea/analytics_practice/vocab_meaning_target_generator.dart b/lib/pangea/analytics_practice/vocab_meaning_target_generator.dart index b5de0800d..992341883 100644 --- a/lib/pangea/analytics_practice/vocab_meaning_target_generator.dart +++ b/lib/pangea/analytics_practice/vocab_meaning_target_generator.dart @@ -16,9 +16,20 @@ class VocabMeaningTargetGenerator { final sortedConstructs = constructs.practiceSort(activityType); final Set seenLemmas = {}; + final cutoffTime = DateTime.now().subtract(const Duration(hours: 24)); + final targets = []; for (final construct in sortedConstructs) { if (seenLemmas.contains(construct.lemma)) continue; + + final lastPracticeUse = construct.lastUseByTypes( + activityType.associatedUseTypes, + ); + + if (lastPracticeUse != null && lastPracticeUse.isAfter(cutoffTime)) { + continue; + } + seenLemmas.add(construct.lemma); if (!construct.cappedUses.any(