From 749517fafb606883249aa4ba4a122f1574d64c5e Mon Sep 17 00:00:00 2001 From: ggurdin Date: Tue, 28 Oct 2025 14:45:34 -0400 Subject: [PATCH] clean up models --- lib/pages/chat/chat.dart | 2 +- lib/pages/chat/input_bar.dart | 2 +- .../controllers/choreographer.dart | 2 +- .../pangea_text_controller.dart | 2 +- .../choreographer/models/choreo_record.dart | 76 +++++++------------ lib/pangea/choreographer/models/it_step.dart | 32 ++------ .../models/pangea_match_model.dart | 32 +------- .../choreographer/models/span_data.dart | 8 -- .../utils/input_paste_listener.dart | 2 +- .../choreographer/widgets/choice_array.dart | 3 - .../choreographer/widgets/igc/span_card.dart | 2 - lib/pangea/choreographer/widgets/it_bar.dart | 2 - .../choreographer/widgets/it_shimmer.dart | 4 +- .../event_wrappers/pangea_choreo_event.dart | 4 +- .../pangea_representation_event.dart | 2 +- .../models/representation_content_model.dart | 3 +- .../multiple_choice_activity.dart | 1 - 17 files changed, 44 insertions(+), 135 deletions(-) rename lib/pangea/choreographer/{utils => controllers}/pangea_text_controller.dart (99%) rename lib/pangea/{choreographer => events}/event_wrappers/pangea_choreo_event.dart (89%) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 396599fc4..298a4e35a 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -40,10 +40,10 @@ import 'package:fluffychat/pangea/bot/utils/bot_name.dart'; import 'package:fluffychat/pangea/chat/utils/unlocked_morphs_snackbar.dart'; import 'package:fluffychat/pangea/chat/widgets/event_too_large_dialog.dart'; import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; +import 'package:fluffychat/pangea/choreographer/controllers/pangea_text_controller.dart'; import 'package:fluffychat/pangea/choreographer/enums/edit_type.dart'; import 'package:fluffychat/pangea/choreographer/models/choreo_record.dart'; import 'package:fluffychat/pangea/choreographer/repo/language_mismatch_repo.dart'; -import 'package:fluffychat/pangea/choreographer/utils/pangea_text_controller.dart'; import 'package:fluffychat/pangea/choreographer/widgets/igc/language_mismatch_popup.dart'; import 'package:fluffychat/pangea/choreographer/widgets/igc/message_analytics_feedback.dart'; import 'package:fluffychat/pangea/common/constants/model_keys.dart'; diff --git a/lib/pages/chat/input_bar.dart b/lib/pages/chat/input_bar.dart index b1a6281c3..a0fff1bce 100644 --- a/lib/pages/chat/input_bar.dart +++ b/lib/pages/chat/input_bar.dart @@ -8,7 +8,7 @@ import 'package:matrix/matrix.dart'; import 'package:slugify/slugify.dart'; import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pangea/choreographer/utils/pangea_text_controller.dart'; +import 'package:fluffychat/pangea/choreographer/controllers/pangea_text_controller.dart'; import 'package:fluffychat/pangea/toolbar/utils/shrinkable_text.dart'; import 'package:fluffychat/utils/markdown_context_builder.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index b64d82cb8..8a9abe734 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -8,6 +8,7 @@ import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/pangea/choreographer/controllers/igc_controller.dart'; +import 'package:fluffychat/pangea/choreographer/controllers/pangea_text_controller.dart'; import 'package:fluffychat/pangea/choreographer/enums/assistance_state_enum.dart'; import 'package:fluffychat/pangea/choreographer/enums/edit_type.dart'; import 'package:fluffychat/pangea/choreographer/enums/pangea_match_status.dart'; @@ -15,7 +16,6 @@ import 'package:fluffychat/pangea/choreographer/models/choreo_record.dart'; import 'package:fluffychat/pangea/choreographer/models/it_step.dart'; import 'package:fluffychat/pangea/choreographer/models/pangea_match_state.dart'; import 'package:fluffychat/pangea/choreographer/utils/input_paste_listener.dart'; -import 'package:fluffychat/pangea/choreographer/utils/pangea_text_controller.dart'; import 'package:fluffychat/pangea/choreographer/widgets/igc/paywall_card.dart'; import 'package:fluffychat/pangea/common/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/common/utils/any_state_holder.dart'; diff --git a/lib/pangea/choreographer/utils/pangea_text_controller.dart b/lib/pangea/choreographer/controllers/pangea_text_controller.dart similarity index 99% rename from lib/pangea/choreographer/utils/pangea_text_controller.dart rename to lib/pangea/choreographer/controllers/pangea_text_controller.dart index 309f14b3d..5e3ba7cfa 100644 --- a/lib/pangea/choreographer/utils/pangea_text_controller.dart +++ b/lib/pangea/choreographer/controllers/pangea_text_controller.dart @@ -13,8 +13,8 @@ import 'package:fluffychat/pangea/choreographer/widgets/igc/span_card.dart'; import 'package:fluffychat/pangea/subscription/controllers/subscription_controller.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../../common/utils/overlay.dart'; -import '../controllers/choreographer.dart'; import '../enums/edit_type.dart'; +import 'choreographer.dart'; class PangeaTextController extends TextEditingController { Choreographer choreographer; diff --git a/lib/pangea/choreographer/models/choreo_record.dart b/lib/pangea/choreographer/models/choreo_record.dart index c9f58fe29..ffb91555d 100644 --- a/lib/pangea/choreographer/models/choreo_record.dart +++ b/lib/pangea/choreographer/models/choreo_record.dart @@ -139,7 +139,6 @@ class ChoreoRecord { static const _stepsKey = "stps"; static const _openMatchesKey = "mtchs"; static const _originalTextKey = "ogtxt_v2"; - // static const _currentKey = "crnt"; Map toJson() { final data = {}; @@ -147,27 +146,23 @@ class ChoreoRecord { data[_openMatchesKey] = jsonEncode(openMatches.map((e) => e.toJson()).toList()); data[_originalTextKey] = originalText; - // data[_currentKey] = current; return data; } - void addRecord(String text, {PangeaMatch? match, ITStep? step}) { - if (match != null && step != null) { - throw Exception("match and step should not both be defined"); - } + bool get includedIT => choreoSteps.any((step) { + return step.acceptedOrIgnoredMatch?.status == + PangeaMatchStatus.accepted && + (step.acceptedOrIgnoredMatch?.isOutOfTargetMatch ?? false); + }); - final edit = ChoreoEdit.fromText( - originalText: stepText(), - editedText: text, - ); + bool get includedIGC => choreoSteps.any((step) { + return step.acceptedOrIgnoredMatch?.status == + PangeaMatchStatus.accepted && + (step.acceptedOrIgnoredMatch?.isGrammarMatch ?? false); + }); - choreoSteps.add( - ChoreoRecordStep( - edits: edit, - acceptedOrIgnoredMatch: match, - itStep: step, - ), - ); + bool endedWithIT(String sent) { + return includedIT && stepText() == sent; } /// Get the text at [stepIndex] @@ -195,40 +190,23 @@ class ChoreoRecord { return text; } - bool get hasAcceptedMatches => choreoSteps.any( - (element) => - element.acceptedOrIgnoredMatch?.status == - PangeaMatchStatus.accepted, - ); + void addRecord(String text, {PangeaMatch? match, ITStep? step}) { + if (match != null && step != null) { + throw Exception("match and step should not both be defined"); + } - bool get hasIgnoredMatches => choreoSteps.any( - (element) => - element.acceptedOrIgnoredMatch?.status == PangeaMatchStatus.ignored, - ); + final edit = ChoreoEdit.fromText( + originalText: stepText(), + editedText: text, + ); - // bool get includedIT => choreoSteps.any((step) { - // return step.acceptedOrIgnoredMatch?.status == - // PangeaMatchStatus.accepted && - // (step.acceptedOrIgnoredMatch?.isITStart ?? false); - // }); - - bool get includedIT => choreoSteps.any((step) { - return step.acceptedOrIgnoredMatch?.status == - PangeaMatchStatus.accepted && - (step.acceptedOrIgnoredMatch?.isOutOfTargetMatch ?? false); - }); - - bool get includedIGC => choreoSteps.any((step) { - return step.acceptedOrIgnoredMatch?.status == - PangeaMatchStatus.accepted && - (step.acceptedOrIgnoredMatch?.isGrammarMatch ?? false); - }); - - List get itSteps => - choreoSteps.where((e) => e.itStep != null).map((e) => e.itStep!).toList(); - - bool endedWithIT(String sent) { - return includedIT && stepText() == sent; + choreoSteps.add( + ChoreoRecordStep( + edits: edit, + acceptedOrIgnoredMatch: match, + itStep: step, + ), + ); } } diff --git a/lib/pangea/choreographer/models/it_step.dart b/lib/pangea/choreographer/models/it_step.dart index cf0cbbd0f..258a81cc2 100644 --- a/lib/pangea/choreographer/models/it_step.dart +++ b/lib/pangea/choreographer/models/it_step.dart @@ -22,32 +22,6 @@ class ITStep { } } - Continuance? get chosenContinuance { - if (chosen == null) return null; - return continuances[chosen!]; - } - - String choiceFeedback(BuildContext context) { - if (continuances.length == 1) return ''; - return chosenContinuance?.feedbackText(context) ?? ""; - } - - bool get isCorrect => - chosenContinuance != null && - (chosenContinuance!.level == ChoreoConstants.levelThresholdForGreen || - chosenContinuance!.gold); - - bool get isYellow => - chosenContinuance != null && - chosenContinuance!.level == ChoreoConstants.levelThresholdForYellow; - - bool get isWrong { - return chosenContinuance != null && - chosenContinuance!.level == ChoreoConstants.levelThresholdForRed; - } - - bool get isCustom => chosenContinuance == null; - Map toJson() { final Map data = {}; data['continuances'] = continuances.map((e) => e.toJson(true)).toList(); @@ -67,6 +41,11 @@ class ITStep { customInput: json['custom_input'], ); } + + Continuance? get chosenContinuance { + if (chosen == null) return null; + return continuances[chosen!]; + } } class Continuance { @@ -113,7 +92,6 @@ class Continuance { data['level'] = level; data['text'] = text; data['clkd'] = wasClicked; - // data[ModelKey.tokens] = tokens.map((e) => e.toJson()).toList(); if (!condensed) { data['description'] = description; diff --git a/lib/pangea/choreographer/models/pangea_match_model.dart b/lib/pangea/choreographer/models/pangea_match_model.dart index 8bdcea049..fd7a410a3 100644 --- a/lib/pangea/choreographer/models/pangea_match_model.dart +++ b/lib/pangea/choreographer/models/pangea_match_model.dart @@ -1,10 +1,5 @@ -import 'dart:developer'; - -import 'package:flutter/foundation.dart'; - import 'package:fluffychat/pangea/choreographer/enums/pangea_match_status.dart'; import 'package:fluffychat/pangea/choreographer/enums/span_data_type.dart'; -import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import '../constants/match_rule_ids.dart'; import 'span_data.dart'; @@ -39,40 +34,17 @@ class PangeaMatch { [SpanDataTypeEnum.itStart, SpanDataTypeEnum.itStart.name] .contains(match.type.typeName); - bool get needsTranslation => match.rule?.id != null + bool get _needsTranslation => match.rule?.id != null ? [ MatchRuleIds.tokenNeedsTranslation, MatchRuleIds.tokenSpanNeedsTranslation, ].contains(match.rule!.id) : false; - bool get isOutOfTargetMatch => isITStart || needsTranslation; + bool get isOutOfTargetMatch => isITStart || _needsTranslation; bool get isGrammarMatch => !isOutOfTargetMatch; - String get matchContent { - late int beginning; - late int end; - if (match.offset < 0) { - beginning = 0; - debugger(when: kDebugMode); - ErrorHandler.logError(m: "match.offset < 0", data: match.toJson()); - } else { - beginning = match.offset; - } - if (match.offset + match.length > match.fullText.length) { - end = match.fullText.length; - debugger(when: kDebugMode); - ErrorHandler.logError( - m: "match.offset + match.length > match.fullText.length", - data: match.toJson(), - ); - } else { - end = match.offset + match.length; - } - return match.fullText.substring(beginning, end); - } - @override bool operator ==(Object other) { if (identical(this, other)) return true; diff --git a/lib/pangea/choreographer/models/span_data.dart b/lib/pangea/choreographer/models/span_data.dart index 860f00911..21a0fb75d 100644 --- a/lib/pangea/choreographer/models/span_data.dart +++ b/lib/pangea/choreographer/models/span_data.dart @@ -1,9 +1,3 @@ -//Possible actions/effects from cards -// Nothing -// useType of viewed definitions -// SpanChoice of text in message from options -// Call to server for additional/followup info - import 'package:flutter/material.dart'; import 'package:collection/collection.dart'; @@ -246,8 +240,6 @@ class SpanChoice { return feedback!; } - bool get isDistractor => type == SpanChoiceType.distractor; - bool get isBestCorrection => type == SpanChoiceType.bestCorrection; Color get color => type.color; diff --git a/lib/pangea/choreographer/utils/input_paste_listener.dart b/lib/pangea/choreographer/utils/input_paste_listener.dart index de2d0122a..5aa234c6a 100644 --- a/lib/pangea/choreographer/utils/input_paste_listener.dart +++ b/lib/pangea/choreographer/utils/input_paste_listener.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:fluffychat/pangea/choreographer/controllers/pangea_text_controller.dart'; import 'package:fluffychat/pangea/choreographer/enums/edit_type.dart'; -import 'package:fluffychat/pangea/choreographer/utils/pangea_text_controller.dart'; class InputPasteListener { final PangeaTextController controller; diff --git a/lib/pangea/choreographer/widgets/choice_array.dart b/lib/pangea/choreographer/widgets/choice_array.dart index 3c5e87c9a..bb672d4c9 100644 --- a/lib/pangea/choreographer/widgets/choice_array.dart +++ b/lib/pangea/choreographer/widgets/choice_array.dart @@ -27,7 +27,6 @@ class ChoicesArray extends StatefulWidget { final ChoiceCallback onPressed; final ChoiceCallback? onLongPress; final int? selectedChoiceIndex; - final String originalSpan; final bool enableAudio; @@ -56,7 +55,6 @@ class ChoicesArray extends StatefulWidget { required this.isLoading, required this.choices, required this.onPressed, - required this.originalSpan, required this.selectedChoiceIndex, this.enableAudio = true, this.langCode, @@ -132,7 +130,6 @@ class ChoicesArrayState extends State { return widget.isLoading && (widget.choices == null || widget.choices!.length <= 1) ? ItShimmer( - originalSpan: widget.originalSpan, fontSize: widget.fontSize ?? Theme.of(context).textTheme.bodyMedium?.fontSize ?? 16, diff --git a/lib/pangea/choreographer/widgets/igc/span_card.dart b/lib/pangea/choreographer/widgets/igc/span_card.dart index 49fa74ba9..85376de78 100644 --- a/lib/pangea/choreographer/widgets/igc/span_card.dart +++ b/lib/pangea/choreographer/widgets/igc/span_card.dart @@ -150,8 +150,6 @@ class WordMatchContent extends StatelessWidget { children: [ const SizedBox(height: 8), ChoicesArray( - originalSpan: - controller.widget.match.updatedMatch.matchContent, isLoading: controller.fetchingData, choices: controller.widget.match.updatedMatch.match.choices diff --git a/lib/pangea/choreographer/widgets/it_bar.dart b/lib/pangea/choreographer/widgets/it_bar.dart index db23a3e1f..feea6fb3f 100644 --- a/lib/pangea/choreographer/widgets/it_bar.dart +++ b/lib/pangea/choreographer/widgets/it_bar.dart @@ -368,8 +368,6 @@ class ITChoices extends StatelessWidget { isLoading: controller.isLoading || controller.choreographer.isFetching || controller.currentITStep == null, - //TODO - pass current span being translated - originalSpan: "dummy", choices: controller.currentITStep!.continuances.map((e) { try { return Choice( diff --git a/lib/pangea/choreographer/widgets/it_shimmer.dart b/lib/pangea/choreographer/widgets/it_shimmer.dart index 37d0d6df6..2ad0616f7 100644 --- a/lib/pangea/choreographer/widgets/it_shimmer.dart +++ b/lib/pangea/choreographer/widgets/it_shimmer.dart @@ -5,11 +5,9 @@ import 'package:flutter/material.dart'; class ItShimmer extends StatelessWidget { const ItShimmer({ super.key, - required this.originalSpan, required this.fontSize, }); - final String originalSpan; final double fontSize; Iterable renderShimmerIfListEmpty( @@ -18,7 +16,7 @@ class ItShimmer extends StatelessWidget { }) { final List dummyStrings = []; for (int i = 0; i < noOfBars; i++) { - dummyStrings.add(originalSpan); + dummyStrings.add(" " * 10); } return dummyStrings.map( (e) => ITShimmerElement( diff --git a/lib/pangea/choreographer/event_wrappers/pangea_choreo_event.dart b/lib/pangea/events/event_wrappers/pangea_choreo_event.dart similarity index 89% rename from lib/pangea/choreographer/event_wrappers/pangea_choreo_event.dart rename to lib/pangea/events/event_wrappers/pangea_choreo_event.dart index e92c8fdf2..67d96b577 100644 --- a/lib/pangea/choreographer/event_wrappers/pangea_choreo_event.dart +++ b/lib/pangea/events/event_wrappers/pangea_choreo_event.dart @@ -6,8 +6,8 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/events/extensions/pangea_event_extension.dart'; -import '../../events/constants/pangea_event_types.dart'; -import '../models/choreo_record.dart'; +import '../../choreographer/models/choreo_record.dart'; +import '../constants/pangea_event_types.dart'; class ChoreoEvent { Event event; diff --git a/lib/pangea/events/event_wrappers/pangea_representation_event.dart b/lib/pangea/events/event_wrappers/pangea_representation_event.dart index 0962faabd..e2c68557d 100644 --- a/lib/pangea/events/event_wrappers/pangea_representation_event.dart +++ b/lib/pangea/events/event_wrappers/pangea_representation_event.dart @@ -10,12 +10,12 @@ import 'package:matrix/src/utils/markdown.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart'; -import 'package:fluffychat/pangea/choreographer/event_wrappers/pangea_choreo_event.dart'; import 'package:fluffychat/pangea/choreographer/models/choreo_record.dart'; import 'package:fluffychat/pangea/choreographer/models/language_detection_model.dart'; import 'package:fluffychat/pangea/choreographer/repo/full_text_translation_request_model.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart'; +import 'package:fluffychat/pangea/events/event_wrappers/pangea_choreo_event.dart'; import 'package:fluffychat/pangea/events/extensions/pangea_event_extension.dart'; import 'package:fluffychat/pangea/events/models/pangea_token_model.dart'; import 'package:fluffychat/pangea/events/models/representation_content_model.dart'; diff --git a/lib/pangea/events/models/representation_content_model.dart b/lib/pangea/events/models/representation_content_model.dart index f6b5d0e99..dc6ce4244 100644 --- a/lib/pangea/events/models/representation_content_model.dart +++ b/lib/pangea/events/models/representation_content_model.dart @@ -132,8 +132,7 @@ class PangeaRepresentation { .toList(); } - if (choreo == null || - (choreo.choreoSteps.isEmpty && choreo.itSteps.isEmpty)) { + if (choreo == null || choreo.choreoSteps.isEmpty) { for (final token in tokensToSave) { uses.addAll( token.allUses( diff --git a/lib/pangea/toolbar/widgets/practice_activity/multiple_choice_activity.dart b/lib/pangea/toolbar/widgets/practice_activity/multiple_choice_activity.dart index 4bec6d586..5e2a7d290 100644 --- a/lib/pangea/toolbar/widgets/practice_activity/multiple_choice_activity.dart +++ b/lib/pangea/toolbar/widgets/practice_activity/multiple_choice_activity.dart @@ -234,7 +234,6 @@ class MultipleChoiceActivityState extends State { ), ChoicesArray( isLoading: false, - originalSpan: "placeholder", onPressed: updateChoice, selectedChoiceIndex: selectedChoiceIndex, choices: choices(context),