From 1321a198f304e77c041bb1313e0abb5047f8c39b Mon Sep 17 00:00:00 2001 From: Levitating Pineapple Date: Fri, 16 Aug 2024 12:32:12 +0300 Subject: [PATCH] fade in chat item --- apps/ios/Shared/Model/ChatModel.swift | 15 ++++++------ apps/ios/Shared/Views/Chat/ChatView.swift | 23 +++++++++++++++++++ apps/ios/Shared/Views/Chat/ReverseList.swift | 4 +--- .../xcshareddata/swiftpm/Package.resolved | 5 ++-- 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index 347ffa7a8f..1724ede58e 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -61,7 +61,7 @@ class ItemsModel: ObservableObject { init() { publisher - .throttle(for: 0.25, scheduler: DispatchQueue.main, latest: true) + .throttle(for: 1, scheduler: DispatchQueue.main, latest: true) .sink { self.objectWillChange.send() } .store(in: &bag) } @@ -452,14 +452,13 @@ final class ChatModel: ObservableObject { } return false } else { - withConditionalAnimation(itemAnimation()) { - var ci = cItem - if let status = chatItemStatuses.removeValue(forKey: ci.id), case .sndNew = ci.meta.itemStatus { - ci.meta.itemStatus = status - } - im.reversedChatItems.insert(ci, at: hasLiveDummy ? 1 : 0) - im.itemAdded = true + var ci = cItem + if let status = chatItemStatuses.removeValue(forKey: ci.id), case .sndNew = ci.meta.itemStatus { + ci.meta.itemStatus = status } + if itemAnimation() != nil { FadeInChatItem.items.insert(ci.id) } + im.reversedChatItems.insert(ci, at: hasLiveDummy ? 1 : 0) + im.itemAdded = true return true } diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 7bd13a3fa7..6331cb4717 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -414,6 +414,7 @@ struct ChatView: View { revealedChatItem: $revealedChatItem, selectedChatItems: $selectedChatItems ) + .modifier(FadeInChatItem(id: ci.id)) .onAppear { floatingButtonModel.appeared(viewId: ci.viewId) } @@ -1551,6 +1552,28 @@ private func buildTheme() -> AppTheme { } } +struct FadeInChatItem: ViewModifier { + static var items = Set() + private let chatItemId: ChatItem.ID + @State private var isVisible: Bool + + init(id: ChatItem.ID) { + chatItemId = id + isVisible = !Self.items.contains(chatItemId) + } + + func body(content: Content) -> some View { + content + .opacity(isVisible ? 1 : 0) + .onAppear { + if !isVisible { + Self.items.remove(chatItemId) + withAnimation { isVisible = true } + } + } + } +} + struct ToggleNtfsButton: View { @ObservedObject var chat: Chat diff --git a/apps/ios/Shared/Views/Chat/ReverseList.swift b/apps/ios/Shared/Views/Chat/ReverseList.swift index 77b82aa83e..39a968f884 100644 --- a/apps/ios/Shared/Views/Chat/ReverseList.swift +++ b/apps/ios/Shared/Views/Chat/ReverseList.swift @@ -175,9 +175,7 @@ struct ReverseList: UIV var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([.main]) snapshot.appendItems(items) - dataSource.defaultRowAnimation = items.count > itemCount - ? .top // Added items slide in from the bottom (top reversed) - : .none // Replaced or removed rows are not animated + dataSource.defaultRowAnimation = .none let countChange = abs(items.count - itemCount) dataSource.apply(snapshot, animatingDifferences: countChange > 0 && // Avoid animating initial load diff --git a/apps/ios/SimpleX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/apps/ios/SimpleX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index d3e61c88f9..c8623a95cb 100644 --- a/apps/ios/SimpleX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/apps/ios/SimpleX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -6,8 +6,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/twostraws/CodeScanner", "state" : { - "revision" : "c27a66149b7483fe42e2ec6aad61d5c3fffe522d", - "version" : "2.1.1" + "revision" : "34da57fb63b47add20de8a85da58191523ccce57", + "version" : "2.5.0" } }, { @@ -23,7 +23,6 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/kirualex/SwiftyGif", "state" : { - "branch" : "master", "revision" : "5e8619335d394901379c9add5c4c1c2f420b3800" } },