From fd319aa105292090cbd92a16e6c717f50358dd1e Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Tue, 24 Feb 2026 15:28:17 -0500 Subject: [PATCH] fix: throw exception if no activities can be loaded in analytics practice session (#5799) --- .../analytics_practice_page.dart | 2 ++ .../analytics_practice_session_controller.dart | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/pangea/analytics_practice/analytics_practice_page.dart b/lib/pangea/analytics_practice/analytics_practice_page.dart index 8c7d8a915..43e04099e 100644 --- a/lib/pangea/analytics_practice/analytics_practice_page.dart +++ b/lib/pangea/analytics_practice/analytics_practice_page.dart @@ -313,6 +313,8 @@ class AnalyticsPracticeState extends State Future skipActivity(MessageActivityRequest request) async { // Record a 0 XP use so that activity isn't chosen again soon _sessionController.skipActivity(); + progress.value = _sessionController.progress; + await _analyticsController.addSkippedActivityAnalytics( request.target, _l2!.langCodeShort, diff --git a/lib/pangea/analytics_practice/analytics_practice_session_controller.dart b/lib/pangea/analytics_practice/analytics_practice_session_controller.dart index b86b031cd..f04856051 100644 --- a/lib/pangea/analytics_practice/analytics_practice_session_controller.dart +++ b/lib/pangea/analytics_practice/analytics_practice_session_controller.dart @@ -152,12 +152,18 @@ class PracticeSessionController { Future Function(MessageActivityRequest) onSkip, Future Function(MultipleChoicePracticeActivityModel) onFetch, ) async { + final session = this.session; if (session == null) { throw Exception("Called getNextActivity without loading session"); } - if (!session!.isComplete && _queue.isEmpty) { - return _initActivityData(onSkip, onFetch); + if (!session.isComplete && _queue.isEmpty) { + final initialActivity = await _initActivityData(onSkip, onFetch); + if (initialActivity == null && session.state.currentIndex == 0) { + // No activities were successfully loaded, and we haven't completed any yet, so throw an error + throw Exception("Failed to load any activities"); + } + return initialActivity; } while (_queue.isNotEmpty) { @@ -171,6 +177,12 @@ class PracticeSessionController { continue; } } + + if (session.state.currentIndex == 0) { + // No activities were successfully loaded, and we haven't completed any yet, so throw an error + throw Exception("Failed to load any activities"); + } + return null; } }