refactor: More reliable request history/future timeline mechanism

This commit is contained in:
Krille 2023-06-13 08:41:49 +02:00
parent 4d84a7456f
commit c0da82f1c9
2 changed files with 26 additions and 16 deletions

View file

@ -204,6 +204,7 @@ class ChatController extends State<ChatPageWithRoom> {
void requestHistory() async { void requestHistory() async {
if (!timeline!.canRequestHistory) return; if (!timeline!.canRequestHistory) return;
Logs().v('Requesting history...');
try { try {
await timeline!.requestHistory(historyCount: _loadHistoryCount); await timeline!.requestHistory(historyCount: _loadHistoryCount);
} catch (err) { } catch (err) {
@ -222,6 +223,7 @@ class ChatController extends State<ChatPageWithRoom> {
final timeline = this.timeline; final timeline = this.timeline;
if (timeline == null) return; if (timeline == null) return;
if (!timeline.canRequestFuture) return; if (!timeline.canRequestFuture) return;
Logs().v('Requesting future...');
try { try {
final mostRecentEventId = timeline.events.first.eventId; final mostRecentEventId = timeline.events.first.eventId;
await timeline.requestFuture(historyCount: _loadHistoryCount); await timeline.requestFuture(historyCount: _loadHistoryCount);
@ -244,12 +246,6 @@ class ChatController extends State<ChatPageWithRoom> {
} }
setReadMarker(); setReadMarker();
if (!scrollController.hasClients) return; if (!scrollController.hasClients) return;
if (scrollController.position.pixels ==
scrollController.position.maxScrollExtent) {
requestHistory();
} else if (scrollController.position.pixels == 0) {
requestFuture();
}
if (timeline?.allowNewEvent == false || if (timeline?.allowNewEvent == false ||
scrollController.position.pixels > 0 && _scrolledUp == false) { scrollController.position.pixels > 0 && _scrolledUp == false) {
setState(() => _scrolledUp = true); setState(() => _scrolledUp = true);

View file

@ -53,11 +53,18 @@ class ChatEventList extends StatelessWidget {
); );
} }
if (controller.timeline!.canRequestFuture) { if (controller.timeline!.canRequestFuture) {
return Center( return Builder(
child: IconButton( builder: (context) {
onPressed: controller.requestFuture, WidgetsBinding.instance.addPostFrameCallback(
icon: const Icon(Icons.refresh_outlined), (_) => controller.requestFuture(),
), );
return Center(
child: IconButton(
onPressed: controller.requestFuture,
icon: const Icon(Icons.refresh_outlined),
),
);
},
); );
} }
return Column( return Column(
@ -77,11 +84,18 @@ class ChatEventList extends StatelessWidget {
); );
} }
if (controller.timeline!.canRequestHistory) { if (controller.timeline!.canRequestHistory) {
return Center( return Builder(
child: IconButton( builder: (context) {
onPressed: controller.requestHistory, WidgetsBinding.instance.addPostFrameCallback(
icon: const Icon(Icons.refresh_outlined), (_) => controller.requestHistory(),
), );
return Center(
child: IconButton(
onPressed: controller.requestHistory,
icon: const Icon(Icons.refresh_outlined),
),
);
},
); );
} }
return const SizedBox.shrink(); return const SizedBox.shrink();