From 2b68f4a1fbee3b663de076b1629da192e1a86197 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Tue, 20 Jan 2026 12:56:10 -0500 Subject: [PATCH] fix: disable other practice choices immeadiatley after correct choice made --- .../analytics_practice_page.dart | 8 ++++ .../analytics_practice_view.dart | 47 ++++++++++++------- .../choice_cards/game_choice_card.dart | 3 +- .../choice_cards/grammar_choice_card.dart | 3 ++ 4 files changed, 41 insertions(+), 20 deletions(-) diff --git a/lib/pangea/analytics_practice/analytics_practice_page.dart b/lib/pangea/analytics_practice/analytics_practice_page.dart index 67b7e2d26..d80bd7800 100644 --- a/lib/pangea/analytics_practice/analytics_practice_page.dart +++ b/lib/pangea/analytics_practice/analytics_practice_page.dart @@ -83,6 +83,7 @@ class AnalyticsPracticeState extends State ValueNotifier(null); final ValueNotifier progressNotifier = ValueNotifier(0.0); + final ValueNotifier enableChoicesNotifier = ValueNotifier(true); final Map> _choiceTexts = {}; final Map> _choiceEmojis = {}; @@ -106,6 +107,7 @@ class AnalyticsPracticeState extends State activityState.dispose(); activityTarget.dispose(); progressNotifier.dispose(); + enableChoicesNotifier.dispose(); super.dispose(); } @@ -190,6 +192,7 @@ class AnalyticsPracticeState extends State void _resetActivityState() { activityState.value = const AsyncState.loading(); activityTarget.value = null; + enableChoicesNotifier.value = true; } void _resetSessionState() { @@ -272,6 +275,7 @@ class AnalyticsPracticeState extends State Future _continueSession() async { if (_continuing) return; _continuing = true; + enableChoicesNotifier.value = true; try { if (activityState.value @@ -403,6 +407,10 @@ class AnalyticsPracticeState extends State ) async { if (_currentActivity == null) return; final activity = _currentActivity!; + final isCorrect = activity.multipleChoiceContent.isCorrect(choiceContent); + if (isCorrect) { + enableChoicesNotifier.value = false; + } // Update activity record PracticeRecordController.onSelectChoice( diff --git a/lib/pangea/analytics_practice/analytics_practice_view.dart b/lib/pangea/analytics_practice/analytics_practice_view.dart index 9b46524a9..6cbef9eae 100644 --- a/lib/pangea/analytics_practice/analytics_practice_view.dart +++ b/lib/pangea/analytics_practice/analytics_practice_view.dart @@ -346,25 +346,29 @@ class _ActivityChoicesWidget extends StatelessWidget { return Container( constraints: const BoxConstraints(maxHeight: 400.0), - child: Column( - spacing: 4.0, - mainAxisSize: MainAxisSize.min, - children: choices - .map( - (choice) => _ChoiceCard( - activity: value, - targetId: - controller.choiceTargetId(choice.choiceId), - choiceId: choice.choiceId, - onPressed: () => controller.onSelectChoice( - choice.choiceId, + child: ValueListenableBuilder( + valueListenable: controller.enableChoicesNotifier, + builder: (context, enabled, __) => Column( + spacing: 4.0, + mainAxisSize: MainAxisSize.min, + children: choices + .map( + (choice) => _ChoiceCard( + activity: value, + targetId: + controller.choiceTargetId(choice.choiceId), + choiceId: choice.choiceId, + onPressed: () => controller.onSelectChoice( + choice.choiceId, + ), + cardHeight: cardHeight, + choiceText: choice.choiceText, + choiceEmoji: choice.choiceEmoji, + enabled: enabled, ), - cardHeight: cardHeight, - choiceText: choice.choiceText, - choiceEmoji: choice.choiceEmoji, - ), - ) - .toList(), + ) + .toList(), + ), ), ); }, @@ -390,6 +394,7 @@ class _ChoiceCard extends StatelessWidget { final String choiceText; final String? choiceEmoji; + final bool enabled; const _ChoiceCard({ required this.activity, @@ -399,6 +404,7 @@ class _ChoiceCard extends StatelessWidget { required this.cardHeight, required this.choiceText, required this.choiceEmoji, + this.enabled = true, }); @override @@ -420,6 +426,7 @@ class _ChoiceCard extends StatelessWidget { onPressed: onPressed, isCorrect: isCorrect, height: cardHeight, + isEnabled: enabled, ); case ActivityTypeEnum.lemmaAudio: @@ -432,6 +439,7 @@ class _ChoiceCard extends StatelessWidget { onPressed: onPressed, isCorrect: isCorrect, height: cardHeight, + isEnabled: enabled, ); case ActivityTypeEnum.grammarCategory: @@ -445,6 +453,7 @@ class _ChoiceCard extends StatelessWidget { tag: choiceText, onPressed: onPressed, isCorrect: isCorrect, + enabled: enabled, ); case ActivityTypeEnum.grammarError: @@ -458,6 +467,7 @@ class _ChoiceCard extends StatelessWidget { onPressed: onPressed, isCorrect: isCorrect, height: cardHeight, + isEnabled: enabled, child: Text(choiceText), ); @@ -471,6 +481,7 @@ class _ChoiceCard extends StatelessWidget { onPressed: onPressed, isCorrect: isCorrect, height: cardHeight, + isEnabled: enabled, child: Text(choiceText), ); } diff --git a/lib/pangea/analytics_practice/choice_cards/game_choice_card.dart b/lib/pangea/analytics_practice/choice_cards/game_choice_card.dart index ad2e5c461..58c5095a1 100644 --- a/lib/pangea/analytics_practice/choice_cards/game_choice_card.dart +++ b/lib/pangea/analytics_practice/choice_cards/game_choice_card.dart @@ -62,6 +62,7 @@ class _GameChoiceCardState extends State Future _handleTap() async { if (!widget.isEnabled) return; + widget.onPressed(); if (widget.shouldFlip) { if (_controller.isAnimating || _revealed) return; @@ -73,8 +74,6 @@ class _GameChoiceCardState extends State if (_clicked) return; setState(() => _clicked = true); } - - widget.onPressed(); } @override diff --git a/lib/pangea/analytics_practice/choice_cards/grammar_choice_card.dart b/lib/pangea/analytics_practice/choice_cards/grammar_choice_card.dart index c1299b611..1bfa5c831 100644 --- a/lib/pangea/analytics_practice/choice_cards/grammar_choice_card.dart +++ b/lib/pangea/analytics_practice/choice_cards/grammar_choice_card.dart @@ -15,6 +15,7 @@ class GrammarChoiceCard extends StatelessWidget { final VoidCallback onPressed; final bool isCorrect; final double height; + final bool enabled; const GrammarChoiceCard({ required this.choiceId, @@ -24,6 +25,7 @@ class GrammarChoiceCard extends StatelessWidget { required this.onPressed, required this.isCorrect, this.height = 72.0, + this.enabled = true, super.key, }); @@ -42,6 +44,7 @@ class GrammarChoiceCard extends StatelessWidget { onPressed: onPressed, isCorrect: isCorrect, height: height, + isEnabled: enabled, child: Text(copy), ); }