You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
fluffychat/lib/pangea/activity_sessions/load_activity_summary_widge...

67 lines
2.1 KiB
Dart

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