From 1f5908721b8aa169ddaa396b5133f98dd0d4cd21 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:46:37 -0500 Subject: [PATCH] fix: update activity session progress value on complete session, add cutoff times for recent practice uses to all target generators (#5889) --- .../analytics_practice/analytics_practice_page.dart | 1 + .../grammar_match_target_generator.dart | 9 +++++++++ .../vocab_audio_target_generator.dart | 10 ++++++++++ .../vocab_meaning_target_generator.dart | 11 +++++++++++ 4 files changed, 31 insertions(+) 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(