Continuously load more messages until there are 20 or no more
This commit is contained in:
parent
639d27a5fc
commit
aac843d793
2 changed files with 43 additions and 35 deletions
|
|
@ -123,9 +123,9 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
|
||||||
|
|
||||||
ref.onDispose(controller.dispose);
|
ref.onDispose(controller.dispose);
|
||||||
|
|
||||||
// While there are under 20 messages, try up to two times to load more messages.
|
// While there are under 20 messages, try up to load more messages until theres no more or we have 20 messages.
|
||||||
for (var i = 0; i < 2 && messages.length < 20; i++) {
|
for (var more = true; more == true && controller.messages.length < 20;) {
|
||||||
await loadOlder(controller);
|
more = await loadOlder(controller);
|
||||||
}
|
}
|
||||||
|
|
||||||
return controller;
|
return controller;
|
||||||
|
|
@ -151,7 +151,7 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
|
||||||
RedactEventRequest(eventId: message.id, roomId: roomId, reason: reason),
|
RedactEventRequest(eventId: message.id, roomId: roomId, reason: reason),
|
||||||
);
|
);
|
||||||
|
|
||||||
Future<void> loadOlder([InMemoryChatController? chatController]) async {
|
Future<bool> loadOlder([InMemoryChatController? chatController]) async {
|
||||||
final response = await ref
|
final response = await ref
|
||||||
.watch(ClientController.provider.notifier)
|
.watch(ClientController.provider.notifier)
|
||||||
.paginate(
|
.paginate(
|
||||||
|
|
@ -183,28 +183,30 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
|
||||||
),
|
),
|
||||||
}),
|
}),
|
||||||
const ISet.empty(),
|
const ISet.empty(),
|
||||||
|
addToNewEvents: false,
|
||||||
);
|
);
|
||||||
|
|
||||||
final room = ref.read(RoomsController.provider)[roomId];
|
final room = ref.read(RoomsController.provider)[roomId];
|
||||||
if (room == null) return;
|
if (room != null) {
|
||||||
|
final messages = await ref.watch(
|
||||||
|
MessagesController.provider(
|
||||||
|
MessagesConfig(room: room, events: response.events.reversed),
|
||||||
|
).future,
|
||||||
|
);
|
||||||
|
|
||||||
final messages = await ref.watch(
|
final controller = chatController ?? await future;
|
||||||
MessagesController.provider(
|
await controller.insertAllMessages(
|
||||||
MessagesConfig(room: room, events: response.events.reversed),
|
messages
|
||||||
).future,
|
.where(
|
||||||
);
|
(newMessage) => !controller.messages.any(
|
||||||
|
(message) => message.id == newMessage.id,
|
||||||
final controller = chatController ?? await future;
|
),
|
||||||
await controller.insertAllMessages(
|
)
|
||||||
messages
|
.toList(),
|
||||||
.where(
|
index: 0,
|
||||||
(newMessage) => !controller.messages.any(
|
);
|
||||||
(message) => message.id == newMessage.id,
|
}
|
||||||
),
|
return response.hasMore;
|
||||||
)
|
|
||||||
.toList(),
|
|
||||||
index: 0,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> send(
|
Future<void> send(
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,11 @@ class RoomsController extends Notifier<IMap<String, Room>> {
|
||||||
@override
|
@override
|
||||||
IMap<String, Room> build() => const IMap.empty();
|
IMap<String, Room> build() => const IMap.empty();
|
||||||
|
|
||||||
void update(IMap<String, Room> rooms, ISet<String> leftRooms) {
|
void update(
|
||||||
|
IMap<String, Room> rooms,
|
||||||
|
ISet<String> leftRooms, {
|
||||||
|
bool addToNewEvents = true,
|
||||||
|
}) {
|
||||||
final homeserver =
|
final homeserver =
|
||||||
ref.watch(
|
ref.watch(
|
||||||
ClientStateController.provider.select(
|
ClientStateController.provider.select(
|
||||||
|
|
@ -29,18 +33,20 @@ class RoomsController extends Notifier<IMap<String, Room>> {
|
||||||
(item) => item.eventId,
|
(item) => item.eventId,
|
||||||
);
|
);
|
||||||
|
|
||||||
ref
|
if (addToNewEvents) {
|
||||||
.watch(NewEventsController.provider(roomId).notifier)
|
ref
|
||||||
.add(
|
.watch(NewEventsController.provider(roomId).notifier)
|
||||||
incoming.timeline
|
.add(
|
||||||
.map(
|
incoming.timeline
|
||||||
(timelineTuple) => events?.firstWhereOrNull(
|
.map(
|
||||||
(event) => timelineTuple.eventRowId == event.rowId,
|
(timelineTuple) => events?.firstWhereOrNull(
|
||||||
),
|
(event) => timelineTuple.eventRowId == event.rowId,
|
||||||
)
|
),
|
||||||
.nonNulls
|
)
|
||||||
.toIList(),
|
.nonNulls
|
||||||
);
|
.toIList(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return acc.add(
|
return acc.add(
|
||||||
roomId,
|
roomId,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue