chore: Follow up jump to unread message

This commit is contained in:
Krille 2023-03-25 15:23:14 +01:00
commit 14c2bf0508
4 changed files with 60 additions and 37 deletions

View file

@ -276,6 +276,8 @@ class ChatController extends State<ChatPageWithRoom> {
_loadDraft();
super.initState();
sendingClient = Matrix.of(context).client;
readMarkerEventId = room.fullyRead;
loadTimelineFuture = _getTimeline();
}
void updateView() {
@ -283,33 +285,34 @@ class ChatController extends State<ChatPageWithRoom> {
setState(() {});
}
Future<void> getTimeline([String? eventContextId]) async {
if (timeline == null) {
await Matrix.of(context).client.roomsLoading;
await Matrix.of(context).client.accountDataLoading;
timeline = await room.getTimeline(
onUpdate: updateView,
eventContextId: eventContextId,
);
if (timeline!.events.isNotEmpty) {
if (room.markedUnread) room.markUnread(false);
setReadMarker();
}
Future<void>? loadTimelineFuture;
// when the scroll controller is attached we want to scroll to an event id, if specified
// and update the scroll controller...which will trigger a request history, if the
// "load more" button is visible on the screen
SchedulerBinding.instance.addPostFrameCallback((_) async {
if (mounted) {
final event = VRouter.of(context).queryParameters['event'];
if (event != null) {
scrollToEventId(event);
}
_updateScrollController();
}
});
Future<void> _getTimeline([String? eventContextId]) async {
await Matrix.of(context).client.roomsLoading;
await Matrix.of(context).client.accountDataLoading;
final timeline = this.timeline = await room.getTimeline(
onUpdate: updateView,
eventContextId: eventContextId,
);
if (timeline.events.isNotEmpty) {
if (room.markedUnread) room.markUnread(false);
setReadMarker();
}
timeline!.requestKeys(onlineKeyBackupOnly: false);
// when the scroll controller is attached we want to scroll to an event id, if specified
// and update the scroll controller...which will trigger a request history, if the
// "load more" button is visible on the screen
SchedulerBinding.instance.addPostFrameCallback((_) async {
if (mounted) {
final event = VRouter.of(context).queryParameters['event'];
if (event != null) {
scrollToEventId(event);
}
_updateScrollController();
}
});
timeline.requestKeys(onlineKeyBackupOnly: false);
return;
}
@ -317,7 +320,8 @@ class ChatController extends State<ChatPageWithRoom> {
void setReadMarker({String? eventId}) {
if (_setReadMarkerFuture != null) return;
if (lastReadEventVisible &&
if (eventId == null &&
lastReadEventVisible &&
!room.hasNewMessages &&
room.notificationCount == 0) {
return;
@ -784,8 +788,9 @@ class ChatController extends State<ChatPageWithRoom> {
if (eventIndex == -1) {
setState(() {
timeline = null;
loadTimelineFuture = _getTimeline(eventId);
});
await getTimeline(eventId);
await loadTimelineFuture;
eventIndex = timeline!.events.indexWhere((e) => e.eventId == eventId);
}
if (!mounted) {
@ -802,8 +807,9 @@ class ChatController extends State<ChatPageWithRoom> {
if (!timeline!.allowNewEvent) {
setState(() {
timeline = null;
loadTimelineFuture = _getTimeline();
});
await getTimeline();
await loadTimelineFuture;
setReadMarker(eventId: timeline!.events.first.eventId);
}
scrollController.jumpTo(0);