fix: improve logic for when to request missing activity summary (#3714)
parent
fe7e5385e8
commit
6191f671da
@ -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();
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue