From bce26c46de093f4957317bf2c83869a64bb72bc7 Mon Sep 17 00:00:00 2001 From: Mike Robbins Date: Tue, 14 Oct 2025 13:55:43 -0400 Subject: [PATCH] ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity --- .../Views/Messages/ChannelMessageList.swift | 16 +++++++++++++--- Meshtastic/Views/Messages/UserMessageList.swift | 15 +++++++++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index 681c3a46..4134d4ec 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -60,12 +60,22 @@ struct ChannelMessageList: View { } var body: some View { + // Cast allPrivateMessages to an array for easier indexing and ForEach. + let messages: [MessageEntity] = Array(allPrivateMessages) + + // Precompute previous message + let previousByID: [Int64: MessageEntity?] = { + var dict = [Int64: MessageEntity?]() + var prev: MessageEntity? + for m in messages { dict[m.messageId] = prev; prev = m } + return dict + }() + ScrollViewReader { scrollView in ScrollView { LazyVStack { - ForEach(allPrivateMessages.indices, id: \.self) { index in - let message = allPrivateMessages[index] - let previousMessage = index > 0 ? allPrivateMessages[index - 1] : nil + ForEach(messages, id: \.messageId) { message in + let previousMessage: MessageEntity? = previousByID[message.messageId] ?? nil ChannelMessageRow( message: message, diff --git a/Meshtastic/Views/Messages/UserMessageList.swift b/Meshtastic/Views/Messages/UserMessageList.swift index ba741f90..79cc4b38 100644 --- a/Meshtastic/Views/Messages/UserMessageList.swift +++ b/Meshtastic/Views/Messages/UserMessageList.swift @@ -58,15 +58,22 @@ struct UserMessageList: View { var body: some View { // Cast user.messageList to an array for easier indexing and ForEach. - let messages = allPrivateMessages.compactMap { $0 as MessageEntity } + let messages: [MessageEntity] = Array(allPrivateMessages) + + // Precompute previous message + let previousByID: [Int64: MessageEntity?] = { + var dict = [Int64: MessageEntity?]() + var prev: MessageEntity? + for m in messages { dict[m.messageId] = prev; prev = m } + return dict + }() VStack { ScrollViewReader { scrollView in ScrollView { LazyVStack { - ForEach(messages.indices, id: \.self) { index in - let message = messages[index] - let previousMessage = index > 0 ? messages[index - 1] : nil + ForEach(messages, id: \.messageId) { message in + let previousMessage: MessageEntity? = previousByID[message.messageId] ?? nil UserMessageRow( message: message,