fix: canRequestHistory doesn't reflect reality

canRequestHistory could become false, even though you didn't load all
events from the database yet. So you had to either rely on fetching
until the requestHistory method throws or rely on other workarounds.

This makes requestHistory not throw, when the prev_batch is null, but
also makes canRequestHistory return sane values (but might require an
extra request, that does nothing).
This commit is contained in:
Nicolas Werner 2024-05-16 19:08:43 +02:00
parent 5a4b5741e4
commit 51dbb90436
No known key found for this signature in database
GPG Key ID: B38119FF80087618
1 changed files with 20 additions and 8 deletions

View File

@ -75,9 +75,13 @@ class Timeline {
// even if /sync's complete while history is being proccessed.
bool _collectHistoryUpdates = false;
// We confirmed, that there are no more events to load from the database.
bool _fetchedAllDatabaseEvents = false;
bool get canRequestHistory {
if (events.isEmpty) return true;
return room.prev_batch != null && events.last.type != EventTypes.RoomCreate;
return !_fetchedAllDatabaseEvents ||
(room.prev_batch != null && events.last.type != EventTypes.RoomCreate);
}
Future<void> requestHistory(
@ -147,20 +151,26 @@ class Timeline {
}
}
} else {
_fetchedAllDatabaseEvents = true;
Logs().i('No more events found in the store. Request from server...');
if (isFragmentedTimeline) {
await getRoomEvents(
historyCount: historyCount,
direction: direction,
);
} else {
await room.requestHistory(
historyCount: historyCount,
direction: direction,
onHistoryReceived: () {
_collectHistoryUpdates = true;
},
);
if (room.prev_batch == null) {
Logs().i('No more events to request from server...');
} else {
await room.requestHistory(
historyCount: historyCount,
direction: direction,
onHistoryReceived: () {
_collectHistoryUpdates = true;
},
);
}
}
}
} finally {
@ -291,6 +301,8 @@ class Timeline {
if (chunk.nextBatch != '') {
allowNewEvent = false;
isFragmentedTimeline = true;
// fragmented timelines never read from the database.
_fetchedAllDatabaseEvents = true;
}
}