diff --git a/lib/controllers/room_chat.dart b/lib/controllers/room_chat.dart index 75ce7d8..98a3fd9 100644 --- a/lib/controllers/room_chat.dart +++ b/lib/controllers/room_chat.dart @@ -37,7 +37,8 @@ class RoomChatController extends AsyncNotifier?> { room = ref.read(RoomsController.provider)[roomId] ?? room; } - // Load one more page when the initial timeline is short. + // 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) { await loadOlder(); room = ref.read(RoomsController.provider)[roomId] ?? room; diff --git a/lib/widgets/room_chat.dart b/lib/widgets/room_chat.dart index 5926844..97afca2 100644 --- a/lib/widgets/room_chat.dart +++ b/lib/widgets/room_chat.dart @@ -126,6 +126,12 @@ class RoomChat extends HookConsumerWidget { }); } + Future loadOlder() async { + if (controllerData case AsyncData(value: final _?)) { + await notifier.loadOlder(); + } + } + final composerNode = useFocusNode( onKeyEvent: (_, event) { if (event is KeyDownEvent && event.logicalKey == .escape) { @@ -423,29 +429,26 @@ class RoomChat extends HookConsumerWidget { final historyLength = boundaryIndex + 1; final liveLength = value.length - historyLength; - int? eventIndexForKey(Key key) { - if (key is! ValueKey) return null; - final index = value.indexWhere( - (event) => event.eventId == key.value, - ); - return index < 0 ? null : index; - } - int? historyChildIndex(Key key) { if (key == const ValueKey("history-loader")) { return historyLength; } - final eventIndex = eventIndexForKey(key); - return eventIndex == null || + if (key is! ValueKey) return null; + final eventIndex = value.indexWhere( + (event) => event.eventId == key.value, + ); + return eventIndex < 0 || eventIndex >= historyLength ? null : historyLength - eventIndex - 1; } int? liveChildIndex(Key key) { - final eventIndex = eventIndexForKey(key); - return eventIndex == null || - eventIndex < historyLength + if (key is! ValueKey) return null; + final eventIndex = value.indexWhere( + (event) => event.eventId == key.value, + ); + return eventIndex < historyLength ? null : eventIndex - historyLength; } @@ -505,7 +508,7 @@ class RoomChat extends HookConsumerWidget { hasMore: hasMore, isLoading: controllerData is AsyncLoading, - onLoad: notifier.loadOlder, + onLoad: loadOlder, ); } final event =