Compare commits

..
2 changed files with 19 additions and 15 deletions

View file

@ -37,7 +37,8 @@ class RoomChatController extends AsyncNotifier<IList<Event>?> {
room = ref.read(RoomsController.provider)[roomId] ?? room; 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) { if (room.hasMore && room.timeline.length < 20) {
await loadOlder(); await loadOlder();
room = ref.read(RoomsController.provider)[roomId] ?? room; room = ref.read(RoomsController.provider)[roomId] ?? room;

View file

@ -126,6 +126,12 @@ class RoomChat extends HookConsumerWidget {
}); });
} }
Future<void> loadOlder() async {
if (controllerData case AsyncData(value: final _?)) {
await notifier.loadOlder();
}
}
final composerNode = useFocusNode( final composerNode = useFocusNode(
onKeyEvent: (_, event) { onKeyEvent: (_, event) {
if (event is KeyDownEvent && event.logicalKey == .escape) { if (event is KeyDownEvent && event.logicalKey == .escape) {
@ -423,29 +429,26 @@ class RoomChat extends HookConsumerWidget {
final historyLength = boundaryIndex + 1; final historyLength = boundaryIndex + 1;
final liveLength = value.length - historyLength; final liveLength = value.length - historyLength;
int? eventIndexForKey(Key key) {
if (key is! ValueKey<String>) return null;
final index = value.indexWhere(
(event) => event.eventId == key.value,
);
return index < 0 ? null : index;
}
int? historyChildIndex(Key key) { int? historyChildIndex(Key key) {
if (key == const ValueKey("history-loader")) { if (key == const ValueKey("history-loader")) {
return historyLength; return historyLength;
} }
final eventIndex = eventIndexForKey(key); if (key is! ValueKey<String>) return null;
return eventIndex == null || final eventIndex = value.indexWhere(
(event) => event.eventId == key.value,
);
return eventIndex < 0 ||
eventIndex >= historyLength eventIndex >= historyLength
? null ? null
: historyLength - eventIndex - 1; : historyLength - eventIndex - 1;
} }
int? liveChildIndex(Key key) { int? liveChildIndex(Key key) {
final eventIndex = eventIndexForKey(key); if (key is! ValueKey<String>) return null;
return eventIndex == null || final eventIndex = value.indexWhere(
eventIndex < historyLength (event) => event.eventId == key.value,
);
return eventIndex < historyLength
? null ? null
: eventIndex - historyLength; : eventIndex - historyLength;
} }
@ -505,7 +508,7 @@ class RoomChat extends HookConsumerWidget {
hasMore: hasMore, hasMore: hasMore,
isLoading: isLoading:
controllerData is AsyncLoading, controllerData is AsyncLoading,
onLoad: notifier.loadOlder, onLoad: loadOlder,
); );
} }
final event = final event =