fix: improve logic for when to request missing activity summary (#3714)

pull/2245/head
ggurdin 3 months ago committed by GitHub
parent fe7e5385e8
commit 6191f671da
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -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();

@ -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<LoadActivitySummaryWidget> createState() =>
LoadActivitySummaryWidgetState();
}
class LoadActivitySummaryWidgetState extends State<LoadActivitySummaryWidget> {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
_loadActivitySummary();
});
}
ActivitySummaryModel? get _summaryEvent => widget.room.activitySummary;
ActivitySummaryResponseModel? get _summary => _summaryEvent?.summary;
Future<void> _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();
}

@ -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;

Loading…
Cancel
Save