diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index 9ee821cd36..8c838557ed 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -923,12 +923,6 @@ final class Chat: ObservableObject, Identifiable, ChatLike { chatStats: chatStats ?? self.chatStats ) } - - func copyFrom(_ c: Chat) { - self.chatInfo = c.chatInfo - self.chatItems = c.chatItems - self.chatStats = c.chatStats - } var userCanSend: Bool { switch chatInfo { diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 04e084af15..b17e0057d8 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -21,7 +21,6 @@ struct ChatView: View { @Environment(\.colorScheme) var colorScheme @Environment(\.presentationMode) var presentationMode @Environment(\.scenePhase) var scenePhase - // chat cannot be assigned, as it breaks observation in chat items @State @ObservedObject var chat: Chat @StateObject private var scrollModel = ReverseListScrollModel() @StateObject private var floatingButtonModel = FloatingButtonModel() @@ -142,8 +141,7 @@ struct ChatView: View { if let cId { selectedChatItems = nil if let c = chatModel.getChat(cId) { - // chat cannot be assigned, as it breaks observation in chat items - chat.copyFrom(c) + chat = c } initChatView() theme = buildTheme() @@ -391,14 +389,22 @@ struct ChatView: View { : voiceNoFrame ? (g.size.width - 32) : (g.size.width - 32) * 0.84 - return chatItemView(ci, maxWidth) - .onAppear { - floatingButtonModel.appeared(viewId: ci.viewId) - } - .onDisappear { - floatingButtonModel.disappeared(viewId: ci.viewId) - } - .id(ci.id) // Required to trigger `onAppear` on iOS15 + return ChatItemWithMenu( + chat: $chat, + chatItem: ci, + maxWidth: maxWidth, + composeState: $composeState, + selectedMember: $selectedMember, + revealedChatItem: $revealedChatItem, + selectedChatItems: $selectedChatItems + ) + .onAppear { + floatingButtonModel.appeared(viewId: ci.viewId) + } + .onDisappear { + floatingButtonModel.disappeared(viewId: ci.viewId) + } + .id(ci.id) // Required to trigger `onAppear` on iOS15 } loadPage: { loadChatItems(cInfo) } @@ -409,8 +415,7 @@ struct ChatView: View { } .onChange(of: chatModel.chatId) { chatId in if let chatId, let c = chatModel.getChat(chatId) { - // chat cannot be assigned, as it breaks observation in chat items - chat.copyFrom(c) + chat = c showChatInfoSheet = false loadChat(chat: c) scrollModel.scrollToBottom() @@ -679,22 +684,10 @@ struct ChatView: View { VoiceItemState.chatView = [:] } - @ViewBuilder private func chatItemView(_ ci: ChatItem, _ maxWidth: CGFloat) -> some View { - ChatItemWithMenu( - chat: chat, - chatItem: ci, - maxWidth: maxWidth, - composeState: $composeState, - selectedMember: $selectedMember, - revealedChatItem: $revealedChatItem, - selectedChatItems: $selectedChatItems - ) - } - private struct ChatItemWithMenu: View { @EnvironmentObject var m: ChatModel @EnvironmentObject var theme: AppTheme - @ObservedObject var chat: Chat + @Binding @ObservedObject var chat: Chat let chatItem: ChatItem let maxWidth: CGFloat @Binding var composeState: ComposeState diff --git a/apps/ios/Shared/Views/Chat/ReverseList.swift b/apps/ios/Shared/Views/Chat/ReverseList.swift index 9430dc04cf..97638a21c7 100644 --- a/apps/ios/Shared/Views/Chat/ReverseList.swift +++ b/apps/ios/Shared/Views/Chat/ReverseList.swift @@ -11,7 +11,6 @@ import Combine /// A List, which displays it's items in reverse order - from bottom to top struct ReverseList: UIViewControllerRepresentable { - let items: Array @Binding var scrollState: ReverseListScrollModel.State