Add load more button

This commit is contained in:
Henry Hiles 2026-05-21 16:28:47 -04:00
commit 228ff1051f
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
2 changed files with 21 additions and 10 deletions

View file

@ -6,7 +6,6 @@ import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:fluttertagger/fluttertagger.dart"; import "package:fluttertagger/fluttertagger.dart";
import "package:nexus/controllers/client_controller.dart"; import "package:nexus/controllers/client_controller.dart";
import "package:nexus/controllers/rooms_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/content/reaction.dart";
import "package:nexus/models/event.dart"; import "package:nexus/models/event.dart";
import "package:nexus/models/requests/get_related_events_request.dart"; import "package:nexus/models/requests/get_related_events_request.dart";
@ -38,14 +37,9 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
await ref.read(RoomsController.provider.notifier).addState(roomId, state); await ref.read(RoomsController.provider.notifier).addState(roomId, state);
} }
// While there are under 5 messages or under 20 events, try to load // While there are under 20 events, try to load more
// more messages until there's no more or the conditions are met. // until there's no more or the conditions are met.
if (room.hasMore && if (room.hasMore && room.timeline.length < 20) {
(room.events.values
.where((event) => event.content is MessageContent)
.length <
5 ||
room.timeline.length < 20)) {
loadOlder(); loadOlder();
} }

View file

@ -319,6 +319,8 @@ class RoomChat extends HookConsumerWidget {
].toIList(); ].toIList();
} }
final controllerData = ref.watch(controllerProvider);
return Scaffold( return Scaffold(
appBar: RoomAppbar( appBar: RoomAppbar(
roomId: roomId, roomId: roomId,
@ -337,7 +339,7 @@ class RoomChat extends HookConsumerWidget {
Positioned.fill( Positioned.fill(
child: Padding( child: Padding(
padding: EdgeInsets.symmetric(horizontal: 12), padding: EdgeInsets.symmetric(horizontal: 12),
child: switch (ref.watch(controllerProvider)) { child: switch (controllerData) {
AsyncData(:final value) || AsyncData(:final value) ||
AsyncLoading(:final value?) => CustomScrollView( AsyncLoading(:final value?) => CustomScrollView(
reverse: true, reverse: true,
@ -346,6 +348,7 @@ class RoomChat extends HookConsumerWidget {
SliverPadding( SliverPadding(
padding: EdgeInsetsGeometry.only(bottom: 64), padding: EdgeInsetsGeometry.only(bottom: 64),
), ),
SuperSliverList.builder( SuperSliverList.builder(
listController: listController.value, listController: listController.value,
itemCount: value.length, 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(), AsyncLoading() => Loading(),