Add load more button
This commit is contained in:
parent
2451555479
commit
228ff1051f
2 changed files with 21 additions and 10 deletions
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue