From 0565cee461f857c4e124c8b70acbff74dc7fec94 Mon Sep 17 00:00:00 2001 From: just-stuff-tm Date: Fri, 6 Mar 2026 20:38:03 -0500 Subject: [PATCH] Enhance message merging logic and improve USB port listing --- lib/connector/meshcore_connector.dart | 20 +++++++++++++++----- lib/services/usb_serial_service_web.dart | 5 +---- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/lib/connector/meshcore_connector.dart b/lib/connector/meshcore_connector.dart index 71418a4..4299c43 100644 --- a/lib/connector/meshcore_connector.dart +++ b/lib/connector/meshcore_connector.dart @@ -385,13 +385,23 @@ class MeshCoreConnector extends ChangeNotifier { final currentMessages = _conversations[contactKeyHex] ?? const []; final mergedMessages = [...windowedMessages]; - final existingKeys = { - for (final message in windowedMessages) _messageMergeKey(message), - }; + final persistedKeyCounts = {}; + for (final message in windowedMessages) { + final key = _messageMergeKey(message); + persistedKeyCounts[key] = (persistedKeyCounts[key] ?? 0) + 1; + } + final currentKeyCounts = {}; for (final message in currentMessages) { final key = _messageMergeKey(message); - if (existingKeys.add(key)) { + final currentCount = (currentKeyCounts[key] ?? 0) + 1; + currentKeyCounts[key] = currentCount; + final persistedCount = persistedKeyCounts[key] ?? 0; + + // Preserve distinct duplicates without IDs (for example same text + // received multiple times in the same second) by only skipping the + // overlapping occurrences that already exist in persisted storage. + if (currentCount > persistedCount) { mergedMessages.add(message); } } @@ -413,7 +423,7 @@ class MeshCoreConnector extends ChangeNotifier { if (messageId != null && messageId.isNotEmpty) { return 'id:$messageId'; } - return 'fallback:${message.isOutgoing}:${message.timestamp.millisecondsSinceEpoch}:${message.text}'; + return 'fallback:${message.senderKeyHex}:${message.isOutgoing}:${message.isCli}:${message.timestamp.millisecondsSinceEpoch}:${message.text}'; } /// Load older messages for a contact (pagination) diff --git a/lib/services/usb_serial_service_web.dart b/lib/services/usb_serial_service_web.dart index df5893b..4953cf5 100644 --- a/lib/services/usb_serial_service_web.dart +++ b/lib/services/usb_serial_service_web.dart @@ -57,10 +57,7 @@ class UsbSerialService { _resetPortCache(); final ports = await _getAuthorizedPorts(); - if (ports.isEmpty) { - return [_requestPortListEntry]; - } - return ports.map(_listEntryForPort).toList(growable: false); + return [_requestPortListEntry, ...ports.map(_listEntryForPort)]; } Future connect({