diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index fc7028e2bc..1d11364e8d 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -2493,6 +2493,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController destinationView: transitionView, destinationRect: transitionView.bounds, destinationCornerRadius: transitionView.bounds.height * 0.5, + destinationIsAvatar: true, completed: {} ) } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift index 39c4af3eae..0cf6227796 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift @@ -329,7 +329,7 @@ func _internal_getStoryById(accountPeerId: PeerId, postbox: Postbox, network: Ne return .single(nil) } |> mapToSignal { result -> Signal in - guard let result else { + guard let result = result else { return .single(nil) } return postbox.transaction { transaction -> StoryListContext.Item? in @@ -382,7 +382,7 @@ func _internal_getStoryViewList(account: Account, id: Int32, offsetTimestamp: In return .single(nil) } |> mapToSignal { result -> Signal in - guard let result else { + guard let result = result else { return .single(nil) } return account.postbox.transaction { transaction -> StoryViewList? in @@ -425,7 +425,7 @@ func _internal_getStoryViews(account: Account, ids: [Int32]) -> Signal<[Int32: S return .single(nil) } |> mapToSignal { result -> Signal<[Int32: StoryListContext.Views], NoError> in - guard let result else { + guard let result = result else { return .single([:]) } return account.postbox.transaction { transaction -> [Int32: StoryListContext.Views] in diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift index ab48dd6f33..21907c8a06 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift @@ -177,7 +177,7 @@ public final class StoryListContext { return transaction.getPeer(account.peerId) } |> deliverOnMainQueue).start(next: { [weak self] peer in - guard let self, let peer else { + guard let `self` = self, let peer = peer else { return } self.stateValue = State(itemSets: [ @@ -213,7 +213,7 @@ public final class StoryListContext { } return peers }).start(next: { peers in - guard let self else { + guard let `self` = self else { return } if self.isLoadingMore { @@ -257,7 +257,7 @@ public final class StoryListContext { if lhsItem.timestamp != rhsItem.timestamp { switch scope { case .all: - return lhsItem.timestamp > rhsItem.timestamp + return lhsItem.timestamp < rhsItem.timestamp case .peer: return lhsItem.timestamp < rhsItem.timestamp } @@ -309,7 +309,7 @@ public final class StoryListContext { } itemSets.sort(by: { lhs, rhs in - guard let lhsItem = lhs.items.first, let rhsItem = rhs.items.first else { + guard let lhsItem = lhs.items.last, let rhsItem = rhs.items.last else { if lhs.items.first != nil { return false } else { @@ -417,6 +417,8 @@ public final class StoryListContext { var itemSets = self.stateValue.itemSets if let index = itemSets.firstIndex(where: { $0.peerId == id }) { itemSets[index] = itemSet + } else { + itemSets.append(itemSet) } self.stateValue.itemSets = itemSets })) @@ -468,7 +470,7 @@ public final class StoryListContext { return .single(nil) } |> mapToSignal { result -> Signal<([PeerItemSet], LoadMoreToken?), NoError> in - guard let result else { + guard let result = result else { return .single(([], nil)) } return account.postbox.transaction { transaction -> ([PeerItemSet], LoadMoreToken?) in @@ -553,7 +555,7 @@ public final class StoryListContext { if lhsItem.timestamp != rhsItem.timestamp { switch scope { case .all: - return lhsItem.timestamp > rhsItem.timestamp + return lhsItem.timestamp < rhsItem.timestamp case .peer: return lhsItem.timestamp < rhsItem.timestamp } @@ -573,7 +575,7 @@ public final class StoryListContext { if lhsItem.timestamp != rhsItem.timestamp { switch scope { case .all: - return lhsItem.timestamp > rhsItem.timestamp + return lhsItem.timestamp < rhsItem.timestamp case .peer: return lhsItem.timestamp < rhsItem.timestamp } @@ -585,8 +587,8 @@ public final class StoryListContext { } itemSets.sort(by: { lhs, rhs in - guard let lhsItem = lhs.items.first, let rhsItem = rhs.items.first else { - if lhs.items.first != nil { + guard let lhsItem = lhs.items.last, let rhsItem = rhs.items.last else { + if lhs.items.last != nil { return false } else { return true @@ -724,4 +726,10 @@ public final class StoryListContext { impl.upload(media: media, text: text, entities: entities, privacy: privacy) } } + + public func loadPeer(id: EnginePeer.Id) { + self.impl.with { impl in + impl.loadPeer(id: id) + } + } } diff --git a/submodules/TelegramUI/Components/MessageInputPanelComponent/Sources/MessageInputPanelComponent.swift b/submodules/TelegramUI/Components/MessageInputPanelComponent/Sources/MessageInputPanelComponent.swift index b9fbc4a1b6..5ff550726c 100644 --- a/submodules/TelegramUI/Components/MessageInputPanelComponent/Sources/MessageInputPanelComponent.swift +++ b/submodules/TelegramUI/Components/MessageInputPanelComponent/Sources/MessageInputPanelComponent.swift @@ -775,8 +775,7 @@ public final class MessageInputPanelComponent: Component { self.mediaRecordingVibrancyContainer.addSubview(mediaRecordingPanelView.vibrancyContainer) } mediaRecordingPanelTransition.setFrame(view: mediaRecordingPanelView, frame: CGRect(origin: CGPoint(), size: size)) - - transition.setFrame(view: self.mediaRecordingVibrancyContainer, frame: CGRect(origin: CGPoint(x: -fieldBackgroundFrame.minX, y: -fieldBackgroundFrame.minY), size: size)) + mediaRecordingPanelTransition.setFrame(view: self.mediaRecordingVibrancyContainer, frame: CGRect(origin: CGPoint(x: -fieldBackgroundFrame.minX, y: -fieldBackgroundFrame.minY), size: size)) if animateIn && !transition.animation.isImmediate { mediaRecordingPanelView.animateIn() @@ -855,8 +854,7 @@ public final class MessageInputPanelComponent: Component { self.mediaRecordingVibrancyContainer.addSubview(mediaPreviewPanelView.vibrancyContainer) } mediaPreviewPanelTransition.setFrame(view: mediaPreviewPanelView, frame: CGRect(origin: CGPoint(), size: size)) - - transition.setFrame(view: self.mediaRecordingVibrancyContainer, frame: CGRect(origin: CGPoint(x: -fieldBackgroundFrame.minX, y: -fieldBackgroundFrame.minY), size: size)) + mediaPreviewPanelTransition.setFrame(view: self.mediaRecordingVibrancyContainer, frame: CGRect(origin: CGPoint(x: -fieldBackgroundFrame.minX, y: -fieldBackgroundFrame.minY), size: size)) if animateIn && !transition.animation.isImmediate { mediaPreviewPanelView.animateIn() diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift index 7a42de06ef..818d89db16 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift @@ -947,6 +947,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, UIScr destinationView: self.view, destinationRect: self.itemGrid.view.convert(itemRect, to: self.view), destinationCornerRadius: 0.0, + destinationIsAvatar: false, completed: {} ) } diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryContainerScreen.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryContainerScreen.swift index 04ccb133d8..a332c19a96 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryContainerScreen.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryContainerScreen.swift @@ -756,17 +756,20 @@ public class StoryContainerScreen: ViewControllerComponentContainer { public weak var destinationView: UIView? public let destinationRect: CGRect public let destinationCornerRadius: CGFloat + public let destinationIsAvatar: Bool public let completed: () -> Void public init( destinationView: UIView, destinationRect: CGRect, destinationCornerRadius: CGFloat, + destinationIsAvatar: Bool, completed: @escaping () -> Void ) { self.destinationView = destinationView self.destinationRect = destinationRect self.destinationCornerRadius = destinationCornerRadius + self.destinationIsAvatar = destinationIsAvatar self.completed = completed } } diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift index 63c0df6b5a..05fadcedb5 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift @@ -568,10 +568,12 @@ public final class StoryItemSetContainerComponent: Component { let innerSourceLocalFrame = CGRect(origin: CGPoint(x: sourceLocalFrame.minX - self.contentContainerView.frame.minX, y: sourceLocalFrame.minY - self.contentContainerView.frame.minY), size: sourceLocalFrame.size) if let rightInfoView = self.rightInfoItem?.view.view { - let positionKeyframes: [CGPoint] = generateParabollicMotionKeyframes(from: CGPoint(x: innerSourceLocalFrame.center.x - rightInfoView.layer.position.x, y: innerSourceLocalFrame.center.y - rightInfoView.layer.position.y), to: CGPoint(), elevation: 0.0, duration: 0.3, curve: .spring, reverse: false) - rightInfoView.layer.animateKeyframes(values: positionKeyframes.map { NSValue(cgPoint: $0) }, duration: 0.3, keyPath: "position", additive: true) - - rightInfoView.layer.animateScale(from: innerSourceLocalFrame.width / rightInfoView.bounds.width, to: 1.0, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) + if transitionIn.sourceCornerRadius != 0.0 { + let positionKeyframes: [CGPoint] = generateParabollicMotionKeyframes(from: CGPoint(x: innerSourceLocalFrame.center.x - rightInfoView.layer.position.x, y: innerSourceLocalFrame.center.y - rightInfoView.layer.position.y), to: CGPoint(), elevation: 0.0, duration: 0.3, curve: .spring, reverse: false) + rightInfoView.layer.animateKeyframes(values: positionKeyframes.map { NSValue(cgPoint: $0) }, duration: 0.3, keyPath: "position", additive: true) + + rightInfoView.layer.animateScale(from: innerSourceLocalFrame.width / rightInfoView.bounds.width, to: 1.0, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) + } } self.contentContainerView.layer.animatePosition(from: sourceLocalFrame.center, to: self.contentContainerView.center, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) @@ -635,11 +637,13 @@ public final class StoryItemSetContainerComponent: Component { let innerSourceLocalFrame = CGRect(origin: CGPoint(x: sourceLocalFrame.minX - self.contentContainerView.frame.minX, y: sourceLocalFrame.minY - self.contentContainerView.frame.minY), size: sourceLocalFrame.size) if let rightInfoView = self.rightInfoItem?.view.view { - let positionKeyframes: [CGPoint] = generateParabollicMotionKeyframes(from: innerSourceLocalFrame.center, to: rightInfoView.layer.position, elevation: 0.0, duration: 0.3, curve: .spring, reverse: true) - rightInfoView.layer.position = positionKeyframes[positionKeyframes.count - 1] - rightInfoView.layer.animateKeyframes(values: positionKeyframes.map { NSValue(cgPoint: $0) }, duration: 0.3, keyPath: "position", removeOnCompletion: false, additive: false) - - rightInfoView.layer.animateScale(from: 1.0, to: innerSourceLocalFrame.width / rightInfoView.bounds.width, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false) + if transitionOut.destinationIsAvatar { + let positionKeyframes: [CGPoint] = generateParabollicMotionKeyframes(from: innerSourceLocalFrame.center, to: rightInfoView.layer.position, elevation: 0.0, duration: 0.3, curve: .spring, reverse: true) + rightInfoView.layer.position = positionKeyframes[positionKeyframes.count - 1] + rightInfoView.layer.animateKeyframes(values: positionKeyframes.map { NSValue(cgPoint: $0) }, duration: 0.3, keyPath: "position", removeOnCompletion: false, additive: false) + + rightInfoView.layer.animateScale(from: 1.0, to: innerSourceLocalFrame.width / rightInfoView.bounds.width, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false) + } } self.contentContainerView.layer.animatePosition(from: self.contentContainerView.center, to: sourceLocalFrame.center, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false) diff --git a/submodules/TelegramUI/Sources/TelegramRootController.swift b/submodules/TelegramUI/Sources/TelegramRootController.swift index c4fecb20d6..4d2909c79f 100644 --- a/submodules/TelegramUI/Sources/TelegramRootController.swift +++ b/submodules/TelegramUI/Sources/TelegramRootController.swift @@ -368,8 +368,8 @@ public final class TelegramRootController: NavigationController, TelegramRootCon if let chatListController = self.chatListController as? ChatListControllerImpl, let storyListContext = chatListController.storyListContext { switch mediaResult { case let .image(image, dimensions, caption): - if let scaledImageData = compressImageToJPEG(image, quality: 0.6) { - storyListContext.upload(media: .image(dimensions: dimensions, data: scaledImageData), text: caption?.string ?? "", entities: [], privacy: privacy) + if let imageData = compressImageToJPEG(image, quality: 0.6) { + storyListContext.upload(media: .image(dimensions: dimensions, data: imageData), text: caption?.string ?? "", entities: [], privacy: privacy) Queue.mainQueue().after(0.2, { [weak chatListController] in chatListController?.animateStoryUploadRipple() })