mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2025-06-28 20:29:53 +00:00
experiment
This commit is contained in:
parent
085ada470e
commit
c952c9e623
1 changed files with 102 additions and 87 deletions
|
@ -78,7 +78,7 @@ struct ChatView: View {
|
|||
}
|
||||
VStack(spacing: 0) {
|
||||
ZStack(alignment: .bottomTrailing) {
|
||||
chatItemsList()
|
||||
ChatItemsList(chat: $chat, mergedItems: $mergedItems, revealedItems: $revealedItems, scrollModel: $scrollModel, loadingMoreItems: $loadingMoreItems, allowLoadMoreItems: $allowLoadMoreItems, ignoreLoadingRequests: $ignoreLoadingRequests, searchText: $searchText, theme: $theme)
|
||||
FloatingButtons(theme: theme, scrollModel: scrollModel, chat: chat, loadingMoreItems: $loadingMoreItems)
|
||||
}
|
||||
connectingText()
|
||||
|
@ -441,105 +441,120 @@ struct ChatView: View {
|
|||
}
|
||||
}
|
||||
|
||||
struct ChatItemsList: View {
|
||||
@Binding var chat: Chat
|
||||
@Binding var mergedItems: MergedItems
|
||||
@Binding var revealedItems: [Int64]
|
||||
@Binding var scrollModel: ReverseListScrollModel
|
||||
@Binding var loadingMoreItems: Bool
|
||||
@Binding var allowLoadMoreItems: Bool
|
||||
@Binding var ignoreLoadingRequests: Int64?
|
||||
@Binding var searchText: String
|
||||
@Binding var theme: AppTheme
|
||||
|
||||
private func chatItemsList() -> some View {
|
||||
let cInfo = chat.chatInfo
|
||||
return GeometryReader { g in
|
||||
let _ = logger.debug("LALAL RELOAD \(im.reversedChatItems.count)")
|
||||
// LALAL CAN I CHANGE BINDING LIKE THIS IN ignoreLoadingRequests?
|
||||
ReverseList(mergedItems: $mergedItems, revealedItems: $revealedItems, unreadCount: Binding.constant(chat.chatStats.unreadCount), scrollState: $scrollModel.state, loadingMoreItems: $loadingMoreItems, allowLoadMoreItems: $allowLoadMoreItems, ignoreLoadingRequests: searchValueIsEmpty ? $ignoreLoadingRequests : Binding.constant(nil)) { index, mergedItem in
|
||||
let ci = switch mergedItem {
|
||||
case let .single(item, _, _): item.item
|
||||
case let .grouped(items, _, _, _, _, _, _, _): items.boxedValue.last!.item
|
||||
}
|
||||
let voiceNoFrame = voiceWithoutFrame(ci)
|
||||
let maxWidth = cInfo.chatType == .group
|
||||
? voiceNoFrame
|
||||
? (g.size.width - 28) - 42
|
||||
: (g.size.width - 28) * 0.84 - 42
|
||||
: voiceNoFrame
|
||||
? (g.size.width - 32)
|
||||
: (g.size.width - 32) * 0.84
|
||||
return ChatItemWithMenu(
|
||||
chat: $chat,
|
||||
index: index,
|
||||
isLastItem: index == mergedItems.items.count - 1,
|
||||
chatItem: ci,
|
||||
merged: mergedItem,
|
||||
maxWidth: maxWidth,
|
||||
composeState: $composeState,
|
||||
selectedMember: $selectedMember,
|
||||
showChatInfoSheet: $showChatInfoSheet,
|
||||
revealedItems: $revealedItems,
|
||||
selectedChatItems: $selectedChatItems,
|
||||
forwardedChatItems: $forwardedChatItems,
|
||||
reveal: { reveal in
|
||||
mergedItem.reveal(reveal, $revealedItems)
|
||||
updateMergedItemsTask?.cancel()
|
||||
mergedItems = MergedItems.create(ItemsModel.shared.reversedChatItems, chat.chatStats.unreadCount, revealedItems, ItemsModel.shared.chatState)
|
||||
var searchValueIsEmpty: Bool { get { searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty } }
|
||||
|
||||
var body: some View {
|
||||
let im = ItemsModel.shared
|
||||
let cInfo = chat.chatInfo
|
||||
return GeometryReader { g in
|
||||
let _ = logger.debug("LALAL RELOAD \(im.reversedChatItems.count)")
|
||||
// LALAL CAN I CHANGE BINDING LIKE THIS IN ignoreLoadingRequests?
|
||||
ReverseList(mergedItems: $mergedItems, revealedItems: $revealedItems, unreadCount: Binding.constant(chat.chatStats.unreadCount), scrollState: $scrollModel.state, loadingMoreItems: $loadingMoreItems, allowLoadMoreItems: $allowLoadMoreItems, ignoreLoadingRequests: searchValueIsEmpty ? $ignoreLoadingRequests : Binding.constant(nil)) { index, mergedItem in
|
||||
let ci = switch mergedItem {
|
||||
case let .single(item, _, _): item.item
|
||||
case let .grouped(items, _, _, _, _, _, _, _): items.boxedValue.last!.item
|
||||
}
|
||||
let voiceNoFrame = voiceWithoutFrame(ci)
|
||||
let maxWidth = cInfo.chatType == .group
|
||||
? voiceNoFrame
|
||||
? (g.size.width - 28) - 42
|
||||
: (g.size.width - 28) * 0.84 - 42
|
||||
: voiceNoFrame
|
||||
? (g.size.width - 32)
|
||||
: (g.size.width - 32) * 0.84
|
||||
return ChatItemWithMenu(
|
||||
chat: $chat,
|
||||
index: index,
|
||||
isLastItem: index == mergedItems.items.count - 1,
|
||||
chatItem: ci,
|
||||
merged: mergedItem,
|
||||
maxWidth: maxWidth,
|
||||
composeState: $composeState,
|
||||
selectedMember: $selectedMember,
|
||||
showChatInfoSheet: $showChatInfoSheet,
|
||||
revealedItems: $revealedItems,
|
||||
selectedChatItems: $selectedChatItems,
|
||||
forwardedChatItems: $forwardedChatItems,
|
||||
reveal: { reveal in
|
||||
mergedItem.reveal(reveal, $revealedItems)
|
||||
updateMergedItemsTask?.cancel()
|
||||
mergedItems = MergedItems.create(ItemsModel.shared.reversedChatItems, chat.chatStats.unreadCount, revealedItems, ItemsModel.shared.chatState)
|
||||
}
|
||||
)
|
||||
.environmentObject(theme) // crashes without this line when scrolling to the first unread in ReverseList
|
||||
.id(ci.id) // Required to trigger `onAppear` on iOS15
|
||||
} loadItems: { unchecked, pagination, visibleItemIndexesNonReversed in
|
||||
if unchecked {
|
||||
await loadChatItemsUnchecked(cInfo, pagination, visibleItemIndexesNonReversed)
|
||||
} else {
|
||||
await loadChatItems(cInfo, pagination, visibleItemIndexesNonReversed)
|
||||
}
|
||||
)
|
||||
.environmentObject(theme) // crashes without this line when scrolling to the first unread in ReverseList
|
||||
.id(ci.id) // Required to trigger `onAppear` on iOS15
|
||||
} loadItems: { unchecked, pagination, visibleItemIndexesNonReversed in
|
||||
if unchecked {
|
||||
await loadChatItemsUnchecked(cInfo, pagination, visibleItemIndexesNonReversed)
|
||||
} else {
|
||||
await loadChatItems(cInfo, pagination, visibleItemIndexesNonReversed)
|
||||
}
|
||||
}
|
||||
.onAppear {
|
||||
mergedItems = MergedItems.create(im.reversedChatItems, chat.chatStats.unreadCount, revealedItems, ItemsModel.shared.chatState)
|
||||
loadLastItems($loadingMoreItems, chat.chatInfo)
|
||||
allowLoadMoreItems = false
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
||||
allowLoadMoreItems = true
|
||||
.onAppear {
|
||||
mergedItems = MergedItems.create(im.reversedChatItems, chat.chatStats.unreadCount, revealedItems, ItemsModel.shared.chatState)
|
||||
loadLastItems($loadingMoreItems, chat.chatInfo)
|
||||
allowLoadMoreItems = false
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
||||
allowLoadMoreItems = true
|
||||
}
|
||||
}
|
||||
}
|
||||
.onChange(of: im.reversedChatItems) { items in
|
||||
updateMergedItemsTask?.cancel()
|
||||
updateMergedItemsTask = Task {
|
||||
.onChange(of: im.reversedChatItems) { items in
|
||||
updateMergedItemsTask?.cancel()
|
||||
//updateMergedItemsTask = Task {
|
||||
let items = MergedItems.create(items, chat.chatStats.unreadCount, revealedItems, ItemsModel.shared.chatState)
|
||||
if Task.isCancelled {
|
||||
return
|
||||
}
|
||||
await MainActor.run {
|
||||
mergedItems = items
|
||||
//if Task.isCancelled {
|
||||
// return
|
||||
//}
|
||||
//await MainActor.run {
|
||||
mergedItems = items
|
||||
//}
|
||||
//}
|
||||
}
|
||||
.onChange(of: revealedItems) { revealed in
|
||||
updateMergedItemsTask?.cancel()
|
||||
mergedItems = MergedItems.create(im.reversedChatItems, chat.chatStats.unreadCount, revealed, ItemsModel.shared.chatState)
|
||||
}
|
||||
.onChange(of: chat.chatStats.unreadCount) { unreadCount in
|
||||
updateMergedItemsTask?.cancel()
|
||||
mergedItems = MergedItems.create(im.reversedChatItems, unreadCount, revealedItems, ItemsModel.shared.chatState)
|
||||
}
|
||||
.onChange(of: chat.id) { _ in
|
||||
loadLastItems($loadingMoreItems, chat.chatInfo)
|
||||
allowLoadMoreItems = false
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
||||
allowLoadMoreItems = true
|
||||
}
|
||||
}
|
||||
}
|
||||
.onChange(of: revealedItems) { revealed in
|
||||
updateMergedItemsTask?.cancel()
|
||||
mergedItems = MergedItems.create(im.reversedChatItems, chat.chatStats.unreadCount, revealed, ItemsModel.shared.chatState)
|
||||
}
|
||||
.onChange(of: chat.chatStats.unreadCount) { unreadCount in
|
||||
updateMergedItemsTask?.cancel()
|
||||
mergedItems = MergedItems.create(im.reversedChatItems, unreadCount, revealedItems, ItemsModel.shared.chatState)
|
||||
}
|
||||
.onChange(of: chat.id) { _ in
|
||||
loadLastItems($loadingMoreItems, chat.chatInfo)
|
||||
allowLoadMoreItems = false
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
||||
allowLoadMoreItems = true
|
||||
.opacity(ItemsModel.shared.isLoading ? 0 : 1)
|
||||
.padding(.vertical, -InvertedTableView.inset)
|
||||
.onTapGesture { hideKeyboard() }
|
||||
.onChange(of: searchText) { _ in
|
||||
Task { await loadChat(type: chat.chatInfo.chatType, id: chat.chatInfo.apiId, search: searchText) }
|
||||
}
|
||||
}
|
||||
.opacity(ItemsModel.shared.isLoading ? 0 : 1)
|
||||
.padding(.vertical, -InvertedTableView.inset)
|
||||
.onTapGesture { hideKeyboard() }
|
||||
.onChange(of: searchText) { _ in
|
||||
Task { await loadChat(type: chat.chatInfo.chatType, id: chat.chatInfo.apiId, search: searchText) }
|
||||
}
|
||||
.onChange(of: im.itemAdded) { added in
|
||||
if added {
|
||||
im.itemAdded = false
|
||||
if FloatingButtonModel.shared.isReallyNearBottom {
|
||||
scrollModel.scrollToBottom()
|
||||
.onChange(of: im.itemAdded) { added in
|
||||
if added {
|
||||
im.itemAdded = false
|
||||
if FloatingButtonModel.shared.isReallyNearBottom {
|
||||
scrollModel.scrollToBottom()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ViewBuilder private func connectingText() -> some View {
|
||||
if case let .direct(contact) = chat.chatInfo,
|
||||
!contact.sndReady,
|
||||
|
@ -1112,7 +1127,7 @@ struct ChatView: View {
|
|||
.onAppear {
|
||||
// LALAL
|
||||
//return ()
|
||||
|
||||
|
||||
if markedRead {
|
||||
return
|
||||
} else {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue