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,