From 228ff1051f54ab34793ee2765fbf1497bee8066f Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Thu, 21 May 2026 16:28:47 -0400 Subject: [PATCH] Add load more button --- lib/controllers/room_chat_controller.dart | 12 +++--------- lib/widgets/room_chat.dart | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index a750e53..5a6741e 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -6,7 +6,6 @@ import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:fluttertagger/fluttertagger.dart"; import "package:nexus/controllers/client_controller.dart"; import "package:nexus/controllers/rooms_controller.dart"; -import "package:nexus/models/content/message.dart"; import "package:nexus/models/content/reaction.dart"; import "package:nexus/models/event.dart"; import "package:nexus/models/requests/get_related_events_request.dart"; @@ -38,14 +37,9 @@ class RoomChatController extends AsyncNotifier> { await ref.read(RoomsController.provider.notifier).addState(roomId, state); } - // While there are under 5 messages or under 20 events, try to load - // more messages until there's no more or the conditions are met. - if (room.hasMore && - (room.events.values - .where((event) => event.content is MessageContent) - .length < - 5 || - room.timeline.length < 20)) { + // While there are under 20 events, try to load more + // until there's no more or the conditions are met. + if (room.hasMore && room.timeline.length < 20) { loadOlder(); } diff --git a/lib/widgets/room_chat.dart b/lib/widgets/room_chat.dart index 1bff9fa..249f2d2 100644 --- a/lib/widgets/room_chat.dart +++ b/lib/widgets/room_chat.dart @@ -319,6 +319,8 @@ class RoomChat extends HookConsumerWidget { ].toIList(); } + final controllerData = ref.watch(controllerProvider); + return Scaffold( appBar: RoomAppbar( roomId: roomId, @@ -337,7 +339,7 @@ class RoomChat extends HookConsumerWidget { Positioned.fill( child: Padding( padding: EdgeInsets.symmetric(horizontal: 12), - child: switch (ref.watch(controllerProvider)) { + child: switch (controllerData) { AsyncData(:final value) || AsyncLoading(:final value?) => CustomScrollView( reverse: true, @@ -346,6 +348,7 @@ class RoomChat extends HookConsumerWidget { SliverPadding( padding: EdgeInsetsGeometry.only(bottom: 64), ), + SuperSliverList.builder( listController: listController.value, itemCount: value.length, @@ -391,6 +394,20 @@ class RoomChat extends HookConsumerWidget { ); }, ), + + SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(bottom: 36), + child: Center( + child: controllerData is AsyncLoading + ? Loading() + : ElevatedButton( + onPressed: notifier.loadOlder, + child: Text("Load More"), + ), + ), + ), + ), ], ), AsyncLoading() => Loading(),