ios: fix group replaced in the list of chats with direct chat (#4655)

* add viewbuilder

* fix

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
This commit is contained in:
Arturs Krumins
2024-08-11 14:06:25 +03:00
committed by GitHub
parent 9b70599cc5
commit 35c37263b8
3 changed files with 19 additions and 33 deletions
-6
View File
@@ -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 {
+19 -26
View File
@@ -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<ChatItem>()
@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
@@ -11,7 +11,6 @@ import Combine
/// A List, which displays it's items in reverse order - from bottom to top
struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIViewControllerRepresentable {
let items: Array<Item>
@Binding var scrollState: ReverseListScrollModel<Item>.State