fix: add exampleMessage to AnalyticsActivityTarget

and remove it from PracticeTarget
This commit is contained in:
Ava Shilling 2026-01-30 12:41:46 -05:00
parent a84ded27af
commit 3cf6918394
6 changed files with 25 additions and 14 deletions

View file

@ -23,7 +23,6 @@ import 'package:fluffychat/pangea/morphs/morph_features_enum.dart';
import 'package:fluffychat/pangea/practice_activities/message_activity_request.dart';
import 'package:fluffychat/pangea/practice_activities/practice_activity_model.dart';
import 'package:fluffychat/pangea/practice_activities/practice_generation_repo.dart';
import 'package:fluffychat/pangea/practice_activities/practice_target.dart';
import 'package:fluffychat/pangea/text_to_speech/tts_controller.dart';
import 'package:fluffychat/pangea/toolbar/message_practice/practice_record_controller.dart';
import 'package:fluffychat/widgets/future_loading_dialog.dart';
@ -538,20 +537,19 @@ class AnalyticsPracticeState extends State<AnalyticsPractice>
}
Future<List<InlineSpan>?> getExampleMessage(
PracticeTarget target,
MessageActivityRequest activityRequest,
) async {
final target = activityRequest.target;
final token = target.tokens.first;
final construct = target.targetTokenConstructID(token);
String? form;
if (widget.type == ConstructTypeEnum.morph) {
return target.exampleMessage;
return activityRequest.morphExampleInfo?.exampleMessage;
}
return ExampleMessageUtil.getExampleMessage(
await _analyticsService.getConstructUse(construct),
Matrix.of(context).client,
form: form,
);
}

View file

@ -1,16 +1,28 @@
import 'package:flutter/painting.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_use_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart';
import 'package:fluffychat/pangea/analytics_practice/analytics_practice_constants.dart';
import 'package:fluffychat/pangea/practice_activities/message_activity_request.dart';
import 'package:fluffychat/pangea/practice_activities/practice_target.dart';
class MorphExampleInfo {
final List<InlineSpan> exampleMessage;
const MorphExampleInfo({
required this.exampleMessage,
});
}
class AnalyticsActivityTarget {
final PracticeTarget target;
final GrammarErrorRequestInfo? grammarErrorInfo;
final MorphExampleInfo? morphExampleInfo;
AnalyticsActivityTarget({
required this.target,
this.grammarErrorInfo,
this.morphExampleInfo,
});
Map<String, dynamic> toJson() => {
@ -79,6 +91,7 @@ class AnalyticsPracticeSessionModel {
activityQualityFeedback: null,
target: target.target,
grammarErrorInfo: target.grammarErrorInfo,
morphExampleInfo: target.morphExampleInfo,
);
}).toList();
}

View file

@ -73,6 +73,8 @@ class AnalyticsPracticeSessionRepo {
tokens: [entry.token],
activityType: ActivityTypeEnum.grammarCategory,
morphFeature: entry.feature,
),
morphExampleInfo: MorphExampleInfo(
exampleMessage: entry.exampleMessage,
),
),
@ -371,11 +373,11 @@ class AnalyticsPracticeSessionRepo {
class MorphPracticeTarget {
final PangeaToken token;
final MorphFeaturesEnum feature;
final List<InlineSpan>? exampleMessage;
final List<InlineSpan> exampleMessage;
MorphPracticeTarget({
required this.token,
required this.feature,
this.exampleMessage,
required this.exampleMessage,
});
}

View file

@ -213,7 +213,7 @@ class _AnalyticsPracticeCenterContent extends StatelessWidget {
children: [
_CorrectAnswerHint(controller: controller),
_ExampleMessageWidget(
controller.getExampleMessage(target!.target),
controller.getExampleMessage(target!),
),
const SizedBox(height: 12),
ValueListenableBuilder(
@ -232,7 +232,7 @@ class _AnalyticsPracticeCenterContent extends StatelessWidget {
height: 100.0,
child: Center(
child: _ExampleMessageWidget(
controller.getExampleMessage(target!.target),
controller.getExampleMessage(target!),
),
),
),

View file

@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pangea/analytics_practice/analytics_practice_session_model.dart';
import 'package:fluffychat/pangea/choreographer/choreo_record_model.dart';
import 'package:fluffychat/pangea/morphs/morph_features_enum.dart';
import 'package:fluffychat/pangea/practice_activities/activity_type_enum.dart';
@ -79,6 +80,7 @@ class MessageActivityRequest {
final PracticeTarget target;
final ActivityQualityFeedback? activityQualityFeedback;
final GrammarErrorRequestInfo? grammarErrorInfo;
final MorphExampleInfo? morphExampleInfo;
MessageActivityRequest({
required this.userL1,
@ -86,6 +88,7 @@ class MessageActivityRequest {
required this.activityQualityFeedback,
required this.target,
this.grammarErrorInfo,
this.morphExampleInfo,
}) {
if (target.tokens.isEmpty) {
throw Exception('Target tokens must not be empty');

View file

@ -1,5 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
@ -25,14 +24,10 @@ class PracticeTarget {
/// this is only defined for morphId activities
final MorphFeaturesEnum? morphFeature;
/// Generated example message for the target, if applicable
final List<InlineSpan>? exampleMessage;
PracticeTarget({
required this.tokens,
required this.activityType,
this.morphFeature,
this.exampleMessage,
}) {
if (ActivityTypeEnum.morphId == activityType && morphFeature == null) {
throw Exception("morphFeature must be defined for morphId activities");