diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index 3fe9d74..aef5226 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -123,9 +123,9 @@ class RoomChatController extends AsyncNotifier { ref.onDispose(controller.dispose); - // While there are under 20 messages, try up to two times to load more messages. - for (var i = 0; i < 2 && messages.length < 20; i++) { - await loadOlder(controller); + // While there are under 20 messages, try up to load more messages until theres no more or we have 20 messages. + for (var more = true; more == true && controller.messages.length < 20;) { + more = await loadOlder(controller); } return controller; @@ -151,7 +151,7 @@ class RoomChatController extends AsyncNotifier { RedactEventRequest(eventId: message.id, roomId: roomId, reason: reason), ); - Future loadOlder([InMemoryChatController? chatController]) async { + Future loadOlder([InMemoryChatController? chatController]) async { final response = await ref .watch(ClientController.provider.notifier) .paginate( @@ -183,28 +183,30 @@ class RoomChatController extends AsyncNotifier { ), }), const ISet.empty(), + addToNewEvents: false, ); 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( - MessagesController.provider( - MessagesConfig(room: room, events: response.events.reversed), - ).future, - ); - - final controller = chatController ?? await future; - await controller.insertAllMessages( - messages - .where( - (newMessage) => !controller.messages.any( - (message) => message.id == newMessage.id, - ), - ) - .toList(), - index: 0, - ); + final controller = chatController ?? await future; + await controller.insertAllMessages( + messages + .where( + (newMessage) => !controller.messages.any( + (message) => message.id == newMessage.id, + ), + ) + .toList(), + index: 0, + ); + } + return response.hasMore; } Future send( diff --git a/lib/controllers/rooms_controller.dart b/lib/controllers/rooms_controller.dart index 27eb18e..7013de0 100644 --- a/lib/controllers/rooms_controller.dart +++ b/lib/controllers/rooms_controller.dart @@ -11,7 +11,11 @@ class RoomsController extends Notifier> { @override IMap build() => const IMap.empty(); - void update(IMap rooms, ISet leftRooms) { + void update( + IMap rooms, + ISet leftRooms, { + bool addToNewEvents = true, + }) { final homeserver = ref.watch( ClientStateController.provider.select( @@ -29,18 +33,20 @@ class RoomsController extends Notifier> { (item) => item.eventId, ); - ref - .watch(NewEventsController.provider(roomId).notifier) - .add( - incoming.timeline - .map( - (timelineTuple) => events?.firstWhereOrNull( - (event) => timelineTuple.eventRowId == event.rowId, - ), - ) - .nonNulls - .toIList(), - ); + if (addToNewEvents) { + ref + .watch(NewEventsController.provider(roomId).notifier) + .add( + incoming.timeline + .map( + (timelineTuple) => events?.firstWhereOrNull( + (event) => timelineTuple.eventRowId == event.rowId, + ), + ) + .nonNulls + .toIList(), + ); + } return acc.add( roomId,