@ -48,8 +48,13 @@ import 'telemetry_screen.dart';
class ChatScreen extends StatefulWidget {
class ChatScreen extends StatefulWidget {
final Contact contact ;
final Contact contact ;
final int initialUnreadCount ;
const ChatScreen ( { super . key , required this . contact } ) ;
const ChatScreen ( {
super . key ,
required this . contact ,
this . initialUnreadCount = 0 ,
} ) ;
@ override
@ override
State < ChatScreen > createState ( ) = > _ChatScreenState ( ) ;
State < ChatScreen > createState ( ) = > _ChatScreenState ( ) ;
@ -75,13 +80,11 @@ class _ChatScreenState extends State<ChatScreen> {
final connector = context . read < MeshCoreConnector > ( ) ;
final connector = context . read < MeshCoreConnector > ( ) ;
final settings = context . read < AppSettingsService > ( ) . settings ;
final settings = context . read < AppSettingsService > ( ) . settings ;
final keyHex = widget . contact . publicKeyHex ;
final keyHex = widget . contact . publicKeyHex ;
final unread = connector . getUnreadCountForContactKey ( keyHex ) ;
final unread = widget . initialUnreadCount ;
final messages = connector . getMessages ( widget . contact ) ;
Message ? anchor ;
Message ? anchor ;
if ( settings . jumpToOldestUnread & & unread > 0 ) {
if ( settings . jumpToOldestUnread & & unread > 0 ) {
anchor = _findOldestUnreadAnchor (
anchor = _findOldestUnreadAnchor ( messages , unread ) ;
connector . getMessages ( widget . contact ) ,
unread ,
) ;
}
}
connector . setActiveContact ( keyHex ) ;
connector . setActiveContact ( keyHex ) ;
_connector = connector ;
_connector = connector ;
@ -89,15 +92,24 @@ class _ChatScreenState extends State<ChatScreen> {
setState ( ( ) = > _pendingUnreadScrollTarget = anchor ) ;
setState ( ( ) = > _pendingUnreadScrollTarget = anchor ) ;
WidgetsBinding . instance . addPostFrameCallback ( ( _ ) {
WidgetsBinding . instance . addPostFrameCallback ( ( _ ) {
if ( ! mounted ) return ;
if ( ! mounted ) return ;
final ctx = _unreadScrollKey . currentContext ;
_scrollController . jumpToEstimatedOffset (
if ( ctx ! = null ) {
unreadCount: unread ,
Scrollable . ensureVisible (
totalMessages: messages . length ,
ctx ,
onJumped: ( ) async {
duration: const Duration ( milliseconds: 350 ) ,
if ( ! mounted ) return ;
alignment: 0.15 ,
final ctx = _unreadScrollKey . currentContext ;
) ;
if ( ctx ! = null ) {
}
await Scrollable . ensureVisible (
setState ( ( ) = > _pendingUnreadScrollTarget = null ) ;
ctx ,
duration: const Duration ( milliseconds: 350 ) ,
alignment: 0.15 ,
) ;
}
if ( mounted ) {
setState ( ( ) = > _pendingUnreadScrollTarget = null ) ;
}
} ,
) ;
} ) ;
} ) ;
}
}
} ) ;
} ) ;
@ -1305,11 +1317,18 @@ class _ChatScreenState extends State<ChatScreen> {
}
}
void _openChat ( BuildContext context , Contact contact ) {
void _openChat ( BuildContext context , Contact contact ) {
/ / Check if this is a repeater
final connector = context . read < MeshCoreConnector > ( ) ;
context . read < MeshCoreConnector > ( ) . markContactRead ( contact . publicKeyHex ) ;
final unread =
connector . getUnreadCountForContactKey ( contact . publicKeyHex ) ;
connector . markContactRead ( contact . publicKeyHex ) ;
Navigator . push (
Navigator . push (
context ,
context ,
MaterialPageRoute ( builder: ( context ) = > ChatScreen ( contact: contact ) ) ,
MaterialPageRoute (
builder: ( context ) = > ChatScreen (
contact: contact ,
initialUnreadCount: unread ,
) ,
) ,
) ;
) ;
}
}