From 6191f671da2d4baef1502da3a39a30be847e67dc Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Wed, 13 Aug 2025 12:33:08 -0400 Subject: [PATCH] fix: improve logic for when to request missing activity summary (#3714) --- .../activity_status_message.dart | 7 +- .../load_activity_summary_widget.dart | 66 +++++++++++++++++++ .../activity_summary_model.dart | 2 +- 3 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 lib/pangea/activity_sessions/load_activity_summary_widget.dart diff --git a/lib/pangea/activity_sessions/activity_status_message.dart b/lib/pangea/activity_sessions/activity_status_message.dart index accaf8c35..8b420df4d 100644 --- a/lib/pangea/activity_sessions/activity_status_message.dart +++ b/lib/pangea/activity_sessions/activity_status_message.dart @@ -5,6 +5,7 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart'; import 'package:fluffychat/pangea/activity_sessions/activity_unfinished_status_message.dart'; +import 'package:fluffychat/pangea/activity_sessions/load_activity_summary_widget.dart'; class ActivityStatusMessage extends StatelessWidget { final Room room; @@ -16,10 +17,14 @@ class ActivityStatusMessage extends StatelessWidget { @override Widget build(BuildContext context) { - if (!room.showActivityChatUI || room.activityIsFinished) { + if (!room.showActivityChatUI) { return const SizedBox.shrink(); } + if (room.activityIsFinished) { + return LoadActivitySummaryWidget(room: room); + } + final role = room.ownRole; if (role != null && !role.isFinished) { return const SizedBox.shrink(); diff --git a/lib/pangea/activity_sessions/load_activity_summary_widget.dart b/lib/pangea/activity_sessions/load_activity_summary_widget.dart new file mode 100644 index 000000000..ec627efaa --- /dev/null +++ b/lib/pangea/activity_sessions/load_activity_summary_widget.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart'; +import 'package:fluffychat/pangea/activity_summary/activity_summary_model.dart'; +import 'package:fluffychat/pangea/activity_summary/activity_summary_response_model.dart'; + +class LoadActivitySummaryWidget extends StatefulWidget { + final Room room; + const LoadActivitySummaryWidget({super.key, required this.room}); + + @override + State createState() => + LoadActivitySummaryWidgetState(); +} + +class LoadActivitySummaryWidgetState extends State { + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _loadActivitySummary(); + }); + } + + ActivitySummaryModel? get _summaryEvent => widget.room.activitySummary; + ActivitySummaryResponseModel? get _summary => _summaryEvent?.summary; + + Future _loadActivitySummary() async { + if (_summary != null) return; + + // The summary state event is null + // Wait for 5 seconds. If still null (or not loading), run request. + if (_summaryEvent == null) { + await Future.delayed(const Duration(seconds: 5)); + + if (_summaryEvent == null || !_summaryEvent!.isLoading) { + await widget.room.fetchSummaries(); + } + return; + } + + // The summary state event is waiting (<= 10 seconds since request) + // Wait for 10 seconds (or time remaining until not waiting). If summary still not there, run request. + if (_summaryEvent!.isLoading) { + final remainingTime = + DateTime.now().difference(_summaryEvent!.requestedAt!).inSeconds; + + await Future.delayed( + Duration(seconds: remainingTime < 10 ? 10 - remainingTime : 0), + () async { + if (_summary == null) await widget.room.fetchSummaries(); + }, + ); + return; + } + + // The summary state event has an error (or > 10 seconds since request) + // Re-run immediately + await widget.room.fetchSummaries(); + } + + @override + Widget build(BuildContext context) => const SizedBox(); +} diff --git a/lib/pangea/activity_summary/activity_summary_model.dart b/lib/pangea/activity_summary/activity_summary_model.dart index 6f3ea7abc..5f1a3055f 100644 --- a/lib/pangea/activity_summary/activity_summary_model.dart +++ b/lib/pangea/activity_summary/activity_summary_model.dart @@ -36,7 +36,7 @@ class ActivitySummaryModel { summary == null && requestedAt != null && requestedAt!.isBefore( - DateTime.now().subtract(const Duration(seconds: 30)), + DateTime.now().subtract(const Duration(seconds: 10)), ); bool get hasError => errorAt != null || _hasTimeout;