fix: timeline anchoring

This commit is contained in:
Erwan Leboucher 2026-08-09 23:14:02 +02:00
commit 1d6a98f165
No known key found for this signature in database
GPG key ID: E191CC9EB650480E

View file

@ -87,14 +87,7 @@ class RoomChat extends HookConsumerWidget {
);
Future<void> jumpToId(String eventId) async {
var events = ref.read(controllerProvider).value;
while (events?.any((event) => event.eventId == eventId) != true) {
final room = ref.read(RoomsController.provider)[roomId];
if (room == null || !room.hasMore) return;
await notifier.loadOlder();
await WidgetsBinding.instance.endOfFrame;
events = ref.read(controllerProvider).value;
}
final events = controllerData.value;
if (events == null || !scrollController.hasClients) return;
final sourceIndex = events.indexWhere(
@ -126,12 +119,6 @@ class RoomChat extends HookConsumerWidget {
});
}
Future<void> loadOlder() async {
if (controllerData case AsyncData(value: final _?)) {
await notifier.loadOlder();
}
}
final composerNode = useFocusNode(
onKeyEvent: (_, event) {
if (event is KeyDownEvent && event.logicalKey == .escape) {
@ -429,26 +416,29 @@ class RoomChat extends HookConsumerWidget {
final historyLength = boundaryIndex + 1;
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) {
if (key == const ValueKey("history-loader")) {
return historyLength;
}
if (key is! ValueKey<String>) return null;
final eventIndex = value.indexWhere(
(event) => event.eventId == key.value,
);
return eventIndex < 0 ||
final eventIndex = eventIndexForKey(key);
return eventIndex == null ||
eventIndex >= historyLength
? null
: historyLength - eventIndex - 1;
}
int? liveChildIndex(Key key) {
if (key is! ValueKey<String>) return null;
final eventIndex = value.indexWhere(
(event) => event.eventId == key.value,
);
return eventIndex < historyLength
final eventIndex = eventIndexForKey(key);
return eventIndex == null ||
eventIndex < historyLength
? null
: eventIndex - historyLength;
}
@ -508,7 +498,7 @@ class RoomChat extends HookConsumerWidget {
hasMore: hasMore,
isLoading:
controllerData is AsyncLoading,
onLoad: loadOlder,
onLoad: notifier.loadOlder,
);
}
final event =