diff --git a/lib/pangea/analytics_practice/analytics_practice_session_model.dart b/lib/pangea/analytics_practice/analytics_practice_session_model.dart index 24020a8f1..ebeccdce0 100644 --- a/lib/pangea/analytics_practice/analytics_practice_session_model.dart +++ b/lib/pangea/analytics_practice/analytics_practice_session_model.dart @@ -12,6 +12,42 @@ class MorphExampleInfo { const MorphExampleInfo({ required this.exampleMessage, }); + + Map toJson() { + final segments = >[]; + + for (final span in exampleMessage) { + if (span is TextSpan) { + segments.add({ + 'text': span.text ?? '', + 'isBold': span.style?.fontWeight == FontWeight.bold, + }); + } + } + + return { + 'segments': segments, + }; + } + + factory MorphExampleInfo.fromJson(Map json) { + final segments = json['segments'] as List? ?? []; + + final spans = []; + for (final segment in segments) { + final text = segment['text'] as String? ?? ''; + final isBold = segment['isBold'] as bool? ?? false; + + spans.add( + TextSpan( + text: text, + style: isBold ? const TextStyle(fontWeight: FontWeight.bold) : null, + ), + ); + } + + return MorphExampleInfo(exampleMessage: spans); + } } class AnalyticsActivityTarget { @@ -28,6 +64,7 @@ class AnalyticsActivityTarget { Map toJson() => { 'target': target.toJson(), 'grammarErrorInfo': grammarErrorInfo?.toJson(), + 'morphExampleInfo': morphExampleInfo?.toJson(), }; factory AnalyticsActivityTarget.fromJson(Map json) => @@ -36,6 +73,9 @@ class AnalyticsActivityTarget { grammarErrorInfo: json['grammarErrorInfo'] != null ? GrammarErrorRequestInfo.fromJson(json['grammarErrorInfo']) : null, + morphExampleInfo: json['morphExampleInfo'] != null + ? MorphExampleInfo.fromJson(json['morphExampleInfo']) + : null, ); } diff --git a/lib/pangea/analytics_practice/morph_category_activity_generator.dart b/lib/pangea/analytics_practice/morph_category_activity_generator.dart index 545e466ba..78ef8ba78 100644 --- a/lib/pangea/analytics_practice/morph_category_activity_generator.dart +++ b/lib/pangea/analytics_practice/morph_category_activity_generator.dart @@ -1,3 +1,4 @@ +import 'package:fluffychat/pangea/analytics_practice/analytics_practice_session_model.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/morphs/default_morph_mapping.dart'; import 'package:fluffychat/pangea/morphs/morph_models.dart'; @@ -58,6 +59,8 @@ class MorphCategoryActivityGenerator { choices: choices.toSet(), answers: {morphTag}, ), + morphExampleInfo: + req.morphExampleInfo ?? const MorphExampleInfo(exampleMessage: []), ), ); } diff --git a/lib/pangea/practice_activities/practice_activity_model.dart b/lib/pangea/practice_activities/practice_activity_model.dart index c0531dcba..4e16f1099 100644 --- a/lib/pangea/practice_activities/practice_activity_model.dart +++ b/lib/pangea/practice_activities/practice_activity_model.dart @@ -3,6 +3,7 @@ import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.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_session_model.dart'; import 'package:fluffychat/pangea/events/models/pangea_token_model.dart'; import 'package:fluffychat/pangea/morphs/morph_features_enum.dart'; import 'package:fluffychat/pangea/practice_activities/activity_type_enum.dart'; @@ -111,6 +112,9 @@ sealed class PracticeActivityModel { tokens: tokens, morphFeature: morph!, multipleChoiceContent: multipleChoiceContent!, + morphExampleInfo: json['morph_example_info'] != null + ? MorphExampleInfo.fromJson(json['morph_example_info']) + : const MorphExampleInfo(exampleMessage: []), ); case ActivityTypeEnum.lemmaAudio: assert( @@ -307,6 +311,7 @@ class MorphCategoryPracticeActivityModel extends MorphPracticeActivityModel { required super.langCode, required super.morphFeature, required super.multipleChoiceContent, + required this.morphExampleInfo, }); @override @@ -330,6 +335,13 @@ class MorphCategoryPracticeActivityModel extends MorphPracticeActivityModel { xp: useType.pointValue, ); } + + @override + Map toJson() { + final json = super.toJson(); + json['morph_example_info'] = morphExampleInfo.toJson(); + return json; + } } class MorphMatchPracticeActivityModel extends MorphPracticeActivityModel {