fix(chat): fix jump-to-oldest-unread scroll not reaching target message

- Pass initialUnreadCount to chat screens before markRead clears it
- Use two-phase scroll: jumpTo estimated offset to build lazy items,
  then ensureVisible for precise positioning
- Await ensureVisible before clearing scroll guard to prevent
  scrollToBottomIfAtBottom from overriding the animation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dmitry Polshakov
2026-04-25 09:00:22 +03:00
parent a4bbeffddc
commit 3ea2e4763e
6 changed files with 107 additions and 33 deletions
+18 -4
View File
@@ -930,10 +930,18 @@ class _ContactsScreenState extends State<ContactsScreen>
} else if (contact.type == advTypeRoom) {
_showRoomLogin(context, contact, RoomLoginDestination.chat);
} else {
context.read<MeshCoreConnector>().markContactRead(contact.publicKeyHex);
final connector = context.read<MeshCoreConnector>();
final unread =
connector.getUnreadCountForContactKey(contact.publicKeyHex);
connector.markContactRead(contact.publicKeyHex);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => ChatScreen(contact: contact)),
MaterialPageRoute(
builder: (context) => ChatScreen(
contact: contact,
initialUnreadCount: unread,
),
),
);
}
}
@@ -988,7 +996,10 @@ class _ContactsScreenState extends State<ContactsScreen>
builder: (context) => RoomLoginDialog(
room: room,
onLogin: (password, isAdmin) {
context.read<MeshCoreConnector>().markContactRead(room.publicKeyHex);
final connector = context.read<MeshCoreConnector>();
final unread =
connector.getUnreadCountForContactKey(room.publicKeyHex);
connector.markContactRead(room.publicKeyHex);
Navigator.push(
context,
MaterialPageRoute(
@@ -999,7 +1010,10 @@ class _ContactsScreenState extends State<ContactsScreen>
password: password,
isAdmin: isAdmin,
)
: ChatScreen(contact: room),
: ChatScreen(
contact: room,
initialUnreadCount: unread,
),
),
);
},