From e85e290265645c744dd61fd0f62069149859aee6 Mon Sep 17 00:00:00 2001 From: Janez T Date: Mon, 2 Mar 2026 10:33:49 +0100 Subject: [PATCH] Update MeshCoreBleService calls --- .../messages/image_message_bubble.dart | 26 +++++++++++++++++-- .../messages/voice_message_bubble.dart | 19 +++++++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/lib/widgets/messages/image_message_bubble.dart b/lib/widgets/messages/image_message_bubble.dart index dce6a59..75a4d86 100644 --- a/lib/widgets/messages/image_message_bubble.dart +++ b/lib/widgets/messages/image_message_bubble.dart @@ -173,7 +173,15 @@ class _ImageMessageBubbleState extends State { Future _requestAndFetch(ImageEnvelope envelope) async { if (_isRequesting) return; - final sender = _resolveSender(envelope); + var sender = _resolveSender(envelope); + if (sender == null) { + final conn = context.read(); + // Retry once after refreshing contacts; resumable sessions may outlive + // the in-memory contact cache. + await conn.getContacts(); + if (!mounted) return; + sender = _resolveSender(envelope); + } if (sender == null) { setState(() => _errorText = 'Sender not reachable'); return; @@ -223,7 +231,21 @@ class _ImageMessageBubbleState extends State { ); if (c != null) return c; } - return contactsProvider.findContactByPrefixHex(envelope.senderKey6); + final contact = contactsProvider.findContactByPrefixHex( + envelope.senderKey6, + ); + if (contact != null) return contact; + + final senderName = widget.message.senderName?.trim(); + if (senderName != null && senderName.isNotEmpty) { + for (final c in contactsProvider.contacts) { + if (c.advName.trim().toLowerCase() == senderName.toLowerCase()) { + return c; + } + } + } + + return null; } static String _statusText({ diff --git a/lib/widgets/messages/voice_message_bubble.dart b/lib/widgets/messages/voice_message_bubble.dart index cd131c3..52beec9 100644 --- a/lib/widgets/messages/voice_message_bubble.dart +++ b/lib/widgets/messages/voice_message_bubble.dart @@ -176,7 +176,15 @@ class _VoiceMessageBubbleState extends State { Future _requestAndPlayVoice(String sessionId) async { if (_isRequesting) return; - final sender = _resolveSenderContact(); + var sender = _resolveSenderContact(); + if (sender == null) { + final connectionProvider = context.read(); + // Retry once after refreshing contacts; resumable sessions may outlive + // the in-memory contact cache. + await connectionProvider.getContacts(); + if (!mounted) return; + sender = _resolveSenderContact(); + } if (sender == null) { _setUnavailable(); return; @@ -243,6 +251,15 @@ class _VoiceMessageBubbleState extends State { if (contact != null) return contact; } + final senderName = widget.message.senderName?.trim(); + if (senderName != null && senderName.isNotEmpty) { + for (final contact in contactsProvider.contacts) { + if (contact.advName.trim().toLowerCase() == senderName.toLowerCase()) { + return contact; + } + } + } + return null; }