From 615c3e9601782777b1b778b67e826e3307f7f48a Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Tue, 14 Oct 2025 11:57:34 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20show=20screen=20loading=20in=20course=20?= =?UTF-8?q?settings=20until=20activity=20roles=20are=20=E2=80=A6=20(#4374)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: show screen loading in course settings until activity roles are completly loaded * show loading indicator over activity card on load course summary * Update lib/pages/chat_details/chat_details.dart Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- lib/pages/chat_details/chat_details.dart | 14 ++++++++++---- lib/pangea/course_chats/course_chats_page.dart | 10 ++++++---- lib/pangea/course_settings/course_settings.dart | 17 ++++++++++++++++- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index 64696bc3d..df5fa727f 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -53,12 +53,13 @@ class ChatDetails extends StatefulWidget { class ChatDetailsController extends State with ActivitySummariesProvider, CoursePlanProvider { bool loadingActivities = true; + bool loadingCourseSummary = true; @override void initState() { super.initState(); - _loadSummaries(); _loadCourseInfo(); + _loadSummaries(); } @override @@ -66,6 +67,7 @@ class ChatDetailsController extends State super.didUpdateWidget(oldWidget); if (oldWidget.roomId != widget.roomId) { _loadCourseInfo(); + _loadSummaries(); } } @@ -394,11 +396,11 @@ class ChatDetailsController extends State return; } - setState(() => loadingActivities = true); + if (mounted) setState(() => loadingActivities = true); await loadCourse(room.coursePlan!.uuid); if (course != null) { - await loadTopics(); - await loadAllActivities(); + if (mounted) await loadTopics(); + if (mounted) await loadAllActivities(); } if (mounted) setState(() => loadingActivities = false); } @@ -407,6 +409,8 @@ class ChatDetailsController extends State try { final room = Matrix.of(context).client.getRoomById(roomId!); if (room == null || !room.isSpace) return; + + if (mounted) setState(() => loadingCourseSummary = true); await loadRoomSummaries( room.spaceChildren.map((c) => c.roomId).whereType().toList(), ); @@ -419,6 +423,8 @@ class ChatDetailsController extends State "roomId": roomId, }, ); + } finally { + if (mounted) setState(() => loadingCourseSummary = false); } } // Pangea# diff --git a/lib/pangea/course_chats/course_chats_page.dart b/lib/pangea/course_chats/course_chats_page.dart index a3bb9b4c6..da3dc3469 100644 --- a/lib/pangea/course_chats/course_chats_page.dart +++ b/lib/pangea/course_chats/course_chats_page.dart @@ -196,10 +196,12 @@ class CourseChatsController extends State try { await _loadHierarchy(activeSpace: room, reload: reload); - await _joinDefaultChats(); - await loadRoomSummaries( - room.spaceChildren.map((c) => c.roomId).whereType().toList(), - ); + if (mounted) await _joinDefaultChats(); + if (mounted) { + await loadRoomSummaries( + room.spaceChildren.map((c) => c.roomId).whereType().toList(), + ); + } } catch (e, s) { Logs().w('Unable to load hierarchy', e, s); if (mounted) { diff --git a/lib/pangea/course_settings/course_settings.dart b/lib/pangea/course_settings/course_settings.dart index ed712ea0f..14e7494b6 100644 --- a/lib/pangea/course_settings/course_settings.dart +++ b/lib/pangea/course_settings/course_settings.dart @@ -250,6 +250,7 @@ class CourseSettings extends StatelessWidget { child: TopicActivitiesList( room: room, activities: topic.loadedActivities, + loading: controller.loadingCourseSummary, hasCompletedActivity: controller.hasCompletedActivity, ), @@ -267,12 +268,14 @@ class CourseSettings extends StatelessWidget { class TopicActivitiesList extends StatefulWidget { final Room room; final Map activities; + final bool loading; final bool Function(String userId, String activityId) hasCompletedActivity; const TopicActivitiesList({ super.key, required this.room, required this.activities, + required this.loading, required this.hasCompletedActivity, }); @override @@ -339,7 +342,19 @@ class TopicActivitiesListState extends State { fontSizeSmall: isColumnMode ? 12.0 : 8.0, iconSize: isColumnMode ? 12.0 : 8.0, ), - if (complete) + if (widget.loading) + Container( + width: isColumnMode ? 160.0 : 120.0, + height: isColumnMode ? 280.0 : 200.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12.0), + color: theme.colorScheme.surface.withAlpha(180), + ), + child: const Center( + child: CircularProgressIndicator.adaptive(), + ), + ) + else if (complete) Container( width: isColumnMode ? 160.0 : 120.0, height: isColumnMode ? 280.0 : 200.0,