fluffychat/lib/pangea/analytics_practice/vocab_meaning_target_generator.dart
ggurdin f7539c184f
5721 practice example message improvements (#5748)
* organized analytics practice session repo

* refactor target generation for grammar error activities

* improve grammar error target generation

* more improvements to target generation
2026-02-18 14:55:54 -05:00

45 lines
1.7 KiB
Dart

import 'package:fluffychat/pangea/analytics_misc/construct_practice_extension.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_use_model.dart';
import 'package:fluffychat/pangea/analytics_practice/analytics_practice_constants.dart';
import 'package:fluffychat/pangea/analytics_practice/analytics_practice_session_model.dart';
import 'package:fluffychat/pangea/practice_activities/activity_type_enum.dart';
import 'package:fluffychat/pangea/practice_activities/practice_target.dart';
class VocabMeaningTargetGenerator {
static ActivityTypeEnum activityType = ActivityTypeEnum.lemmaMeaning;
static Future<List<AnalyticsActivityTarget>> get(
List<ConstructUses> constructs,
) async {
// Score and sort by priority (highest first). Uses shared scorer for
// consistent prioritization with message practice.
final sortedConstructs = constructs.practiceSort(activityType);
final Set<String> seenLemmas = {};
final targets = <AnalyticsActivityTarget>[];
for (final construct in sortedConstructs) {
if (seenLemmas.contains(construct.lemma)) continue;
seenLemmas.add(construct.lemma);
if (!construct.cappedUses.any(
(u) => u.metadata.eventId != null && u.metadata.roomId != null,
)) {
// Skip if no uses have eventId + roomId, so example message can be fetched.
continue;
}
targets.add(
AnalyticsActivityTarget(
target: PracticeTarget(
tokens: [construct.id.asToken],
activityType: activityType,
),
),
);
if (targets.length >= AnalyticsPracticeConstants.targetsToGenerate) {
break;
}
}
return targets;
}
}