fix: show screen loading in course settings until activity roles are … (#4374)

* 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>
This commit is contained in:
ggurdin 2025-10-14 11:57:34 -04:00 committed by GitHub
parent 5609632641
commit 615c3e9601
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 32 additions and 9 deletions

View file

@ -53,12 +53,13 @@ class ChatDetails extends StatefulWidget {
class ChatDetailsController extends State<ChatDetails>
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<ChatDetails>
super.didUpdateWidget(oldWidget);
if (oldWidget.roomId != widget.roomId) {
_loadCourseInfo();
_loadSummaries();
}
}
@ -394,11 +396,11 @@ class ChatDetailsController extends State<ChatDetails>
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<ChatDetails>
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<String>().toList(),
);
@ -419,6 +423,8 @@ class ChatDetailsController extends State<ChatDetails>
"roomId": roomId,
},
);
} finally {
if (mounted) setState(() => loadingCourseSummary = false);
}
}
// Pangea#

View file

@ -196,10 +196,12 @@ class CourseChatsController extends State<CourseChats>
try {
await _loadHierarchy(activeSpace: room, reload: reload);
await _joinDefaultChats();
await loadRoomSummaries(
room.spaceChildren.map((c) => c.roomId).whereType<String>().toList(),
);
if (mounted) await _joinDefaultChats();
if (mounted) {
await loadRoomSummaries(
room.spaceChildren.map((c) => c.roomId).whereType<String>().toList(),
);
}
} catch (e, s) {
Logs().w('Unable to load hierarchy', e, s);
if (mounted) {

View file

@ -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<String, ActivityPlanModel> 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<TopicActivitiesList> {
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,