mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2024-12-17 17:20:21 +01:00
simplify jump to quote
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user