simplify jump to quote

This commit is contained in:
Diogo
2024-10-16 16:20:01 +01:00
parent 1e419b8790
commit 4fe2b80705
3 changed files with 65 additions and 73 deletions
@@ -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)
}
}
}
}
}
}
+49 -62
View File
@@ -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<ChatItem>) -> Array<ChatItem> {
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<ChatItem>()
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<ChatItem>) -> Array<ChatItem> {
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<ChatItem>()
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 {
@@ -32,7 +32,6 @@ struct ReverseList<Content: View>: 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<Content: View>: 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<Content: View>: 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)
}
}
}
}