ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity

This commit is contained in:
Mike Robbins 2025-10-14 13:55:43 -04:00
parent 9982f24a51
commit bce26c46de
2 changed files with 24 additions and 7 deletions

View file

@ -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,

View file

@ -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,