From b877aafc3f5fe8df7cd84a6421da16b9e6b475dd Mon Sep 17 00:00:00 2001 From: Mathew Kamkar <578302+matkam@users.noreply.github.com> Date: Sat, 5 Jul 2025 08:22:24 -0700 Subject: [PATCH 1/4] only hide unmonitored nodes when no messages --- Meshtastic/Views/Messages/UserList.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Meshtastic/Views/Messages/UserList.swift b/Meshtastic/Views/Messages/UserList.swift index 41642582..bd93b495 100644 --- a/Meshtastic/Views/Messages/UserList.swift +++ b/Meshtastic/Views/Messages/UserList.swift @@ -337,7 +337,8 @@ struct FilteredUserList: View { } } // Always apply unmessagable and connected node filters - let isUnmessagablePredicate = NSPredicate(format: "unmessagable == NO") + // Only hide unmessagable nodes if they have 0 messages + let isUnmessagablePredicate = NSPredicate(format: "unmessagable == NO AND (SUBQUERY(messageList, $msg, $msg.messageId != nil).@count == 0)") predicates.append(isUnmessagablePredicate) let isIgnoredPredicate = NSPredicate(format: "userNode.ignored == NO") predicates.append(isIgnoredPredicate) From 1e6cbcf06f2c19c7fa8a23f13b7329ecc500b3b2 Mon Sep 17 00:00:00 2001 From: Mathew Kamkar <578302+matkam@users.noreply.github.com> Date: Sat, 5 Jul 2025 10:49:10 -0700 Subject: [PATCH 2/4] fix crash --- Meshtastic/Views/Messages/UserList.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Meshtastic/Views/Messages/UserList.swift b/Meshtastic/Views/Messages/UserList.swift index bd93b495..0798ffbf 100644 --- a/Meshtastic/Views/Messages/UserList.swift +++ b/Meshtastic/Views/Messages/UserList.swift @@ -337,8 +337,8 @@ struct FilteredUserList: View { } } // Always apply unmessagable and connected node filters - // Only hide unmessagable nodes if they have 0 messages - let isUnmessagablePredicate = NSPredicate(format: "unmessagable == NO AND (SUBQUERY(messageList, $msg, $msg.messageId != nil).@count == 0)") + // Show unmessagable nodes only if they have messages, otherwise hide them + let isUnmessagablePredicate = NSPredicate(format: "unmessagable == NO OR ((SUBQUERY(receivedMessages, $msg, $msg.messageId != nil).@count > 0) OR (SUBQUERY(sentMessages, $msg, $msg.messageId != nil).@count > 0))") predicates.append(isUnmessagablePredicate) let isIgnoredPredicate = NSPredicate(format: "userNode.ignored == NO") predicates.append(isIgnoredPredicate) From 1d34f3293adad8ce294735d37fc5b76561256153 Mon Sep 17 00:00:00 2001 From: Mathew Kamkar <578302+matkam@users.noreply.github.com> Date: Mon, 7 Jul 2025 21:52:45 -0700 Subject: [PATCH 3/4] simplify Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Meshtastic/Views/Messages/UserList.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Meshtastic/Views/Messages/UserList.swift b/Meshtastic/Views/Messages/UserList.swift index 0798ffbf..4fd30445 100644 --- a/Meshtastic/Views/Messages/UserList.swift +++ b/Meshtastic/Views/Messages/UserList.swift @@ -338,7 +338,7 @@ struct FilteredUserList: View { } // Always apply unmessagable and connected node filters // Show unmessagable nodes only if they have messages, otherwise hide them - let isUnmessagablePredicate = NSPredicate(format: "unmessagable == NO OR ((SUBQUERY(receivedMessages, $msg, $msg.messageId != nil).@count > 0) OR (SUBQUERY(sentMessages, $msg, $msg.messageId != nil).@count > 0))") + let isUnmessagablePredicate = NSPredicate(format: "unmessagable == NO OR (receivedMessages.@count > 0 OR sentMessages.@count > 0)") predicates.append(isUnmessagablePredicate) let isIgnoredPredicate = NSPredicate(format: "userNode.ignored == NO") predicates.append(isIgnoredPredicate) From b2961edc533a301d1eb8f0046f883fc6ec65ed93 Mon Sep 17 00:00:00 2001 From: Mathew Kamkar <578302+matkam@users.noreply.github.com> Date: Mon, 7 Jul 2025 21:57:04 -0700 Subject: [PATCH 4/4] improved readability Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Meshtastic/Views/Messages/UserList.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Meshtastic/Views/Messages/UserList.swift b/Meshtastic/Views/Messages/UserList.swift index 4fd30445..6d20ec23 100644 --- a/Meshtastic/Views/Messages/UserList.swift +++ b/Meshtastic/Views/Messages/UserList.swift @@ -338,7 +338,9 @@ struct FilteredUserList: View { } // Always apply unmessagable and connected node filters // Show unmessagable nodes only if they have messages, otherwise hide them - let isUnmessagablePredicate = NSPredicate(format: "unmessagable == NO OR (receivedMessages.@count > 0 OR sentMessages.@count > 0)") + let unmessagablePredicate = NSPredicate(format: "unmessagable == NO") + let hasMessagesPredicate = NSPredicate(format: "receivedMessages.@count > 0 OR sentMessages.@count > 0") + let isUnmessagablePredicate = NSCompoundPredicate(type: .or, subpredicates: [unmessagablePredicate, hasMessagesPredicate]) predicates.append(isUnmessagablePredicate) let isIgnoredPredicate = NSPredicate(format: "userNode.ignored == NO") predicates.append(isIgnoredPredicate)