From d8d867d798f4423bfab0a7e69d397751121ee37d Mon Sep 17 00:00:00 2001 From: Benoit Martins Date: Thu, 29 Feb 2024 17:28:11 +0100 Subject: [PATCH] Fix messages list in conversation --- .../Fragments/ChatBubbleView.swift | 40 ++-- .../Fragments/ConversationFragment.swift | 198 ++++++++++++++---- .../ConversationsListBottomSheet.swift | 3 +- .../Fragments/ConversationsListFragment.swift | 3 +- .../Model/ConversationModel.swift | 11 + .../ViewModel/ConversationViewModel.swift | 72 +++++-- 6 files changed, 250 insertions(+), 77 deletions(-) diff --git a/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift b/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift index 7789984ae..0c029a7dc 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift @@ -28,26 +28,34 @@ struct ChatBubbleView: View { var body: some View { if index < conversationViewModel.conversationMessagesList.count && conversationViewModel.conversationMessagesList[index].eventLog.chatMessage != nil { - HStack { - if conversationViewModel.conversationMessagesList[index].eventLog.chatMessage!.isOutgoing { - Spacer() + VStack { + if index == 0 && conversationViewModel.displayedConversationHistorySize > conversationViewModel.conversationMessagesList.count { + ProgressView() + .frame(idealWidth: .infinity, maxWidth: .infinity, alignment: .center) + .id(UUID()) } - VStack { - Text(conversationViewModel.conversationMessagesList[index].eventLog.chatMessage!.utf8Text ?? "") - .foregroundStyle(Color.grayMain2c700) - .default_text_style(styleSize: 16) - } - .padding(.all, 15) - .background(conversationViewModel.conversationMessagesList[index].eventLog.chatMessage!.isOutgoing ? Color.orangeMain100 : Color.grayMain2c100) - .clipShape(RoundedRectangle(cornerRadius: 16)) - - if !conversationViewModel.conversationMessagesList[index].eventLog.chatMessage!.isOutgoing { - Spacer() + HStack { + if conversationViewModel.conversationMessagesList[index].eventLog.chatMessage!.isOutgoing { + Spacer() + } + + VStack { + Text(conversationViewModel.conversationMessagesList[index].eventLog.chatMessage!.utf8Text ?? "") + .foregroundStyle(Color.grayMain2c700) + .default_text_style(styleSize: 16) + } + .padding(.all, 15) + .background(conversationViewModel.conversationMessagesList[index].eventLog.chatMessage!.isOutgoing ? Color.orangeMain100 : Color.grayMain2c100) + .clipShape(RoundedRectangle(cornerRadius: 16)) + + if !conversationViewModel.conversationMessagesList[index].eventLog.chatMessage!.isOutgoing { + Spacer() + } } + .padding(.leading, conversationViewModel.conversationMessagesList[index].eventLog.chatMessage!.isOutgoing ? 40 : 0) + .padding(.trailing, !conversationViewModel.conversationMessagesList[index].eventLog.chatMessage!.isOutgoing ? 40 : 0) } - .padding(.leading, conversationViewModel.conversationMessagesList[index].eventLog.chatMessage!.isOutgoing ? 40 : 0) - .padding(.trailing, !conversationViewModel.conversationMessagesList[index].eventLog.chatMessage!.isOutgoing ? 40 : 0) } } } diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift index 05df3a93f..adf475fbd 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift @@ -32,6 +32,8 @@ struct ConversationFragment: View { @FocusState var isMessageTextFocused: Bool + @State var offset: CGPoint = .zero + var body: some View { NavigationView { GeometryReader { geometry in @@ -140,64 +142,169 @@ struct ConversationFragment: View { .padding(.bottom, 4) .background(.white) + /* + List { + ForEach(0.. conversationViewModel.conversationMessagesList.count { + //DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + conversationViewModel.getOldMessages() + //} + } + } + } + } + .listStyle(.plain) + .onTapGesture { + UIApplication.shared.endEditing() + } + .onAppear { + conversationViewModel.getMessages() + } + .onChange(of: conversationViewModel.conversationMessagesList) { _ in + if conversationViewModel.conversationMessagesList.count <= 30 { + proxy.scrollTo( + conversationViewModel.conversationMessagesList.last, anchor: .top + ) + } else if conversationViewModel.conversationMessagesList.count >= conversationViewModel.displayedConversationHistorySize { + print("ChatBubbleViewChatBubbleView 1 " + + "\(conversationViewModel.conversationMessagesList.count) " + + "\(conversationViewModel.displayedConversationHistorySize - 30) " + + "\(conversationViewModel.conversationMessagesList.first?.eventLog.chatMessage!.utf8Text ?? "") " + + "\(conversationViewModel.conversationMessagesList[29].eventLog.chatMessage!.utf8Text ?? "")" + ) + + proxy.scrollTo( + conversationViewModel.conversationMessagesList[conversationViewModel.displayedConversationHistorySize%30], anchor: .top + ) + } else { + print("ChatBubbleViewChatBubbleView 2 " + + "\(conversationViewModel.conversationMessagesList.count) " + + "\(conversationViewModel.displayedConversationHistorySize - 30) " + + "\(conversationViewModel.conversationMessagesList.first?.eventLog.chatMessage!.utf8Text ?? "") " + + "\(conversationViewModel.conversationMessagesList[29].eventLog.chatMessage!.utf8Text ?? "")" + ) + + proxy.scrollTo(30, anchor: .top) + } + } + .onDisappear { + conversationViewModel.resetMessage() } } - .scaleEffect(x: 1, y: -1, anchor: .center) - .listStyle(.plain) - .frame(maxWidth: .infinity) - .background(.white) - .onTapGesture { - UIApplication.shared.endEditing() - } - .onDisappear { - conversationViewModel.resetMessage() - } - - - /* - ScrollViewReader { proxy in - ScrollView { - LazyVStack { - ForEach(0.. Color in + DispatchQueue.main.async { + //self.offset = -geometry.frame(in: .named("scroll")).origin.y + let offsetMax = geometry.size.height - reader.size.height + //print("ScrollOffsetPreferenceKey >> \(self.offset) \(offsetMax)") + if -geometry.frame(in: .named("scroll")).origin.y <= 0 && self.offset > 0 { + conversationViewModel.getOldMessages() + print("ScrollOffsetPreferenceKey >> \(self.offset) \(-geometry.frame(in: .named("scroll")).origin.y) \(offsetMax)") + //proxy.scrollTo(conversationViewModel.conversationMessagesList[19], anchor: .top) + } + self.offset = -geometry.frame(in: .named("scroll")).origin.y + } + return Color.clear + }) + /*/ + .background(GeometryReader { geometry in + Color.clear + .preference(key: ScrollOffsetPreferenceKey.self, value: (geometry.frame(in: .named("scroll")).origin)) + }) + .onPreferenceChange(ScrollOffsetPreferenceKey.self) { value in + //self.scrollOffset = value + print("ScrollOffsetPreferenceKey \(value)") + if value.y > 0 { + print("ScrollOffsetPreferenceKey \(value) \(conversationViewModel.conversationMessagesList.count)") + conversationViewModel.getOldMessages() + } + } + */ } - } - .frame(maxWidth: .infinity) - .background(.white) - .onTapGesture { - UIApplication.shared.endEditing() - } - .onAppear { - if conversationViewModel.conversationMessagesList.last != nil { - proxy.scrollTo(conversationViewModel.conversationMessagesList.last!, anchor: .bottom) + .coordinateSpace(name: "scroll") + .onTapGesture { + UIApplication.shared.endEditing() + } + .onAppear { + conversationViewModel.getMessages() + } + .onDisappear { + conversationViewModel.resetMessage() + } + .defaultScrollAnchor(.bottom) + } else { + ScrollView(.vertical) { + VStack { + ForEach(0..