From 4fe2b80705998c9b8e011296a7883dbc90521d70 Mon Sep 17 00:00:00 2001 From: Diogo Date: Wed, 16 Oct 2024 16:20:01 +0100 Subject: [PATCH] simplify jump to quote --- .../Views/Chat/ChatItem/FramedItemView.swift | 18 ++- apps/ios/Shared/Views/Chat/ChatView.swift | 111 ++++++++---------- apps/ios/Shared/Views/Chat/ReverseList.swift | 9 -- 3 files changed, 65 insertions(+), 73 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift index d82bcf0065..5efd68b3e0 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift @@ -50,8 +50,22 @@ struct FramedItemView: View { ciQuoteView(qi) .onTapGesture { if let itemId = qi.itemId { - withAnimation { - scrollModel.scrollToItem(id: itemId) + Task { + if let reversedPage = await loadItemsAround(chat.chatInfo, itemId) { + await MainActor.run { + let im = ItemsModel.shared + let reversedPageToAppend = self.sectionModel.handleSectionInsertion( + candidateSection: .destination, + reversedPage: reversedPage, + allItems: im.reversedChatItems + ) + im.reversedChatItems.append(contentsOf: reversedPageToAppend) + + withAnimation { + scrollModel.scrollToItem(id: itemId) + } + } + } } } } diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 913e66f7f4..f48c73dc6b 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -197,6 +197,7 @@ struct ChatView: View { } } .environmentObject(scrollModel) + .environmentObject(sectionModel) .onDisappear { VideoPlayerView.players.removeAll() stopAudioPlayer() @@ -407,20 +408,6 @@ struct ChatView: View { ci.content.msgContent?.isVoice == true && ci.content.text.count == 0 && ci.quotedItem == nil && ci.meta.itemForwarded == nil } - private func filtered(_ reversedChatItems: Array) -> Array { - reversedChatItems - .enumerated() - .filter { (index, chatItem) in - if let mergeCategory = chatItem.mergeCategory, index > 0 { - mergeCategory != reversedChatItems[index - 1].mergeCategory - } else { - true - } - } - .map { $0.element } - } - - private func chatItemsList() -> some View { let cInfo = chat.chatInfo let mergedItems = filtered(im.reversedChatItems) @@ -447,8 +434,6 @@ struct ChatView: View { .id(ci.id) // Required to trigger `onAppear` on iOS15 } loadPage: { (direction, section, chatItemId) in loadChatItems(cInfo, direction, section, chatItemId) - } loadItemsAround: { chatItemId in - loadItemsAround(cInfo, chatItemId) } .opacity(ItemsModel.shared.isLoading ? 0 : 1) .padding(.vertical, -InvertedTableView.inset) @@ -914,52 +899,6 @@ struct ChatView: View { } } } - - private func loadItemsAround(_ cInfo: ChatInfo, _ chatItemId: Int64) { - Task { - if loadingItems || sectionModel.getItemSection(chatItemId) != nil { return } - loadingItems = true - do { - var reversedPage = Array() - var chatItemsAvailable = true - // Load additional items until the page is +50 large after merging - while chatItemsAvailable && filtered(reversedPage).count < loadItemsPerPage { - let pagination: ChatPagination = .before(chatItemId: chatItemId, count: loadItemsPerPage / 2) - var chatItems = try await apiGetChatItems( - type: cInfo.chatType, - id: cInfo.apiId, - pagination: pagination, - search: searchText - ) - if let lastItem = chatItems.last { - let pagination: ChatPagination = .after(chatItemId: lastItem.id, count: loadItemsPerPage / 2) - let afterItems = try await apiGetChatItems( - type: cInfo.chatType, - id: cInfo.apiId, - pagination: pagination, - search: searchText - ) - chatItems.append(contentsOf: afterItems) - } - - chatItemsAvailable = !chatItems.isEmpty - reversedPage.append(contentsOf: chatItems.reversed()) - } - await MainActor.run { - let reversedPageToAppend = self.sectionModel.handleSectionInsertion( - candidateSection: .destination, - reversedPage: reversedPage, - allItems: im.reversedChatItems - ) - im.reversedChatItems.append(contentsOf: reversedPageToAppend) - loadingItems = false - } - } catch let error { - logger.error("apiGetChat error: \(responseError(error))") - await MainActor.run { loadingItems = false } - } - } - } func stopAudioPlayer() { VoiceItemState.chatView.values.forEach { $0.audioPlayer?.stop() } @@ -1969,6 +1908,54 @@ func updateChatSettings(_ chat: Chat, chatSettings: ChatSettings) { } } } +private func filtered(_ reversedChatItems: Array) -> Array { + reversedChatItems + .enumerated() + .filter { (index, chatItem) in + if let mergeCategory = chatItem.mergeCategory, index > 0 { + mergeCategory != reversedChatItems[index - 1].mergeCategory + } else { + true + } + } + .map { $0.element } +} + +func loadItemsAround(_ cInfo: ChatInfo, _ chatItemId: Int64) async -> [ChatItem]? { + do { + let im = ItemsModel.shared + var reversedPage = Array() + var chatItemsAvailable = true + // Load additional items until the page is +50 large after merging + while chatItemsAvailable && filtered(reversedPage).count < loadItemsPerPage { + let pagination: ChatPagination = .before(chatItemId: chatItemId, count: loadItemsPerPage / 2) + var chatItems = try await apiGetChatItems( + type: cInfo.chatType, + id: cInfo.apiId, + pagination: pagination, + search: "" + ) + if let lastItem = chatItems.last { + let pagination: ChatPagination = .after(chatItemId: lastItem.id, count: loadItemsPerPage / 2) + let afterItems = try await apiGetChatItems( + type: cInfo.chatType, + id: cInfo.apiId, + pagination: pagination, + search: "" + ) + chatItems.append(contentsOf: afterItems) + } + + chatItemsAvailable = !chatItems.isEmpty + reversedPage.append(contentsOf: chatItems.reversed()) + } + + return reversedPage + } catch let error { + logger.error("apiGetChat error: \(responseError(error))") + return nil + } +} struct ChatView_Previews: PreviewProvider { static var previews: some View { diff --git a/apps/ios/Shared/Views/Chat/ReverseList.swift b/apps/ios/Shared/Views/Chat/ReverseList.swift index 471511d987..ed162986cb 100644 --- a/apps/ios/Shared/Views/Chat/ReverseList.swift +++ b/apps/ios/Shared/Views/Chat/ReverseList.swift @@ -32,7 +32,6 @@ struct ReverseList: UIViewControllerRepresentable { let content: (ChatItem) -> Content let loadPage: (ChatScrollDirection, ChatSection, ChatItem?) -> Void - let loadItemsAround: (Int64) -> Void func makeUIViewController(context: Context) -> Controller { Controller(representer: self) @@ -46,7 +45,6 @@ struct ReverseList: UIViewControllerRepresentable { case .nextPage: controller.scrollToNextPage() case let .item(id): - controller.update(items: items) controller.scrollToItem(id: id) case .bottom: controller.scroll(to: 0, position: .top, section: .bottom) @@ -194,13 +192,6 @@ struct ReverseList: UIViewControllerRepresentable { let section = dataSource.sectionIdentifier(for: indexPath.section) { self.scroll(to: indexPath.row, position: .bottom, section: section) } - } else { - Task { - if (self.representer.sectionModel.getItemSection(id) == nil) { - self.representer.sectionModel.activeSection = .destination - self.representer.loadItemsAround(id) - } - } } }