mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Fix embedded sticker pack preview
This commit is contained in:
parent
9bb7ff60de
commit
4cb77a910d
@ -24,6 +24,8 @@ static_library(
|
||||
"//submodules/CheckNode:CheckNode",
|
||||
"//submodules/AppBundle:AppBundle",
|
||||
"//submodules/StickerPackPreviewUI:StickerPackPreviewUI",
|
||||
"//submodules/OverlayStatusController:OverlayStatusController",
|
||||
"//submodules/PresentationDataUtils:PresentationDataUtils",
|
||||
],
|
||||
frameworks = [
|
||||
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
|
||||
|
@ -12,6 +12,8 @@ import RadialStatusNode
|
||||
import PhotoResources
|
||||
import AppBundle
|
||||
import StickerPackPreviewUI
|
||||
import OverlayStatusController
|
||||
import PresentationDataUtils
|
||||
|
||||
enum ChatMediaGalleryThumbnail: Equatable {
|
||||
case image(ImageMediaReference)
|
||||
@ -245,7 +247,30 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
guard let (context, media) = self.contextAndMedia else {
|
||||
return
|
||||
}
|
||||
let _ = (stickerPacksAttachedToMedia(postbox: context.account.postbox, network: context.account.network, media: media)
|
||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
let progressSignal = Signal<Never, NoError> { [weak self] subscriber in
|
||||
guard let strongSelf = self else {
|
||||
return EmptyDisposable
|
||||
}
|
||||
let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil))
|
||||
(strongSelf.baseNavigationController()?.topViewController as? ViewController)?.present(controller, in: .window(.root), with: nil)
|
||||
return ActionDisposable { [weak controller] in
|
||||
Queue.mainQueue().async() {
|
||||
controller?.dismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
|> runOn(Queue.mainQueue())
|
||||
|> delay(0.15, queue: Queue.mainQueue())
|
||||
let progressDisposable = progressSignal.start()
|
||||
|
||||
let signal = stickerPacksAttachedToMedia(account: context.account, media: media)
|
||||
|> afterDisposed {
|
||||
Queue.mainQueue().async {
|
||||
progressDisposable.dispose()
|
||||
}
|
||||
}
|
||||
let _ = (signal
|
||||
|> deliverOnMainQueue).start(next: { [weak self] packs in
|
||||
guard let strongSelf = self, !packs.isEmpty else {
|
||||
return
|
||||
|
@ -550,7 +550,9 @@ private final class StickerPackScreenNode: ViewControllerTracingNode {
|
||||
return
|
||||
}
|
||||
if index == strongSelf.selectedStickerPackIndex {
|
||||
strongSelf.containerLayoutUpdated(layout, transition: transition)
|
||||
let modalProgress = strongSelf.containers[strongSelf.selectedStickerPackIndex].modalProgress
|
||||
strongSelf.modalProgressUpdated(modalProgress, transition)
|
||||
strongSelf.containerLayoutUpdated(layout, transition: .immediate)
|
||||
}
|
||||
}, presentInGlobalOverlay: presentInGlobalOverlay,
|
||||
sendSticker: sendSticker)
|
||||
@ -610,15 +612,12 @@ private final class StickerPackScreenNode: ViewControllerTracingNode {
|
||||
var scaledOffset: CGFloat = 0.0
|
||||
scaledOffset = -CGFloat(indexOffset) * (1.0 - expandProgress) * (scaledInset * 2.0) + CGFloat(indexOffset) * scaledDistance
|
||||
|
||||
transition.updateFrame(node: container, frame: CGRect(origin: CGPoint(x: CGFloat(indexOffset) * layout.size.width + self.relativeToSelectedStickerPackTransition + scaledOffset, y: containerVerticalOffset), size: layout.size))
|
||||
transition.updateSublayerTransformScale(node: container, scale: containerScale)
|
||||
transition.updateFrame(node: container, frame: CGRect(origin: CGPoint(x: CGFloat(indexOffset) * layout.size.width + self.relativeToSelectedStickerPackTransition + scaledOffset, y: containerVerticalOffset), size: layout.size), beginWithCurrentState: true)
|
||||
transition.updateSublayerTransformScaleAndOffset(node: container, scale: containerScale, offset: CGPoint(), beginWithCurrentState: true)
|
||||
if container.validLayout?.0 != layout {
|
||||
container.updateLayout(layout: layout, transition: transition)
|
||||
}
|
||||
}
|
||||
|
||||
let modalProgress = self.containers[self.selectedStickerPackIndex].modalProgress
|
||||
self.modalProgressUpdated(modalProgress, transition)
|
||||
}
|
||||
|
||||
@objc private func panGesture(_ recognizer: UIPanGestureRecognizer) {
|
||||
|
@ -3,6 +3,7 @@ import Postbox
|
||||
import TelegramApi
|
||||
import SwiftSignalKit
|
||||
import SyncCore
|
||||
import MtProtoKit
|
||||
|
||||
func telegramStickerPachThumbnailRepresentationFromApiSize(datacenterId: Int32, size: Api.PhotoSize) -> TelegramMediaImageRepresentation? {
|
||||
switch size {
|
||||
@ -50,16 +51,43 @@ extension StickerPackCollectionInfo {
|
||||
}
|
||||
}
|
||||
|
||||
public func stickerPacksAttachedToMedia(postbox: Postbox, network: Network, media: AnyMediaReference) -> Signal<[StickerPackReference], NoError> {
|
||||
public func stickerPacksAttachedToMedia(account: Account, media: AnyMediaReference) -> Signal<[StickerPackReference], NoError> {
|
||||
let inputMedia: Api.InputStickeredMedia
|
||||
if let imageReference = media.concrete(TelegramMediaImage.self), let reference = imageReference.media.reference, case let .cloud(imageId, accessHash, fileReference) = reference {
|
||||
let resourceReference: MediaResourceReference
|
||||
if let imageReference = media.concrete(TelegramMediaImage.self), let reference = imageReference.media.reference, case let .cloud(imageId, accessHash, fileReference) = reference, let representation = largestImageRepresentation(imageReference.media.representations) {
|
||||
inputMedia = .inputStickeredMediaPhoto(id: Api.InputPhoto.inputPhoto(id: imageId, accessHash: accessHash, fileReference: Buffer(data: fileReference ?? Data())))
|
||||
resourceReference = imageReference.resourceReference(representation.resource)
|
||||
} else if let fileReference = media.concrete(TelegramMediaFile.self), let resource = fileReference.media.resource as? CloudDocumentMediaResource {
|
||||
inputMedia = .inputStickeredMediaDocument(id: Api.InputDocument.inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference ?? Data())))
|
||||
resourceReference = fileReference.resourceReference(fileReference.media.resource)
|
||||
} else {
|
||||
return .single([])
|
||||
}
|
||||
return network.request(Api.functions.messages.getAttachedStickers(media: inputMedia))
|
||||
return account.network.request(Api.functions.messages.getAttachedStickers(media: inputMedia))
|
||||
|> `catch` { _ -> Signal<[Api.StickerSetCovered], MTRpcError> in
|
||||
return revalidateMediaResourceReference(postbox: account.postbox, network: account.network, revalidationContext: account.mediaReferenceRevalidationContext, info: TelegramCloudMediaResourceFetchInfo(reference: resourceReference, preferBackgroundReferenceRevalidation: false, continueInBackground: false), resource: resourceReference.resource)
|
||||
|> mapError { _ -> MTRpcError in
|
||||
return MTRpcError(errorCode: 500, errorDescription: "Internal")
|
||||
}
|
||||
|> mapToSignal { reference -> Signal<[Api.StickerSetCovered], MTRpcError> in
|
||||
let inputMedia: Api.InputStickeredMedia
|
||||
if let resource = reference.updatedResource as? TelegramCloudMediaResourceWithFileReference, let updatedReference = resource.fileReference {
|
||||
if let imageReference = media.concrete(TelegramMediaImage.self), let reference = imageReference.media.reference, case let .cloud(imageId, accessHash, fileReference) = reference, let representation = largestImageRepresentation(imageReference.media.representations) {
|
||||
inputMedia = .inputStickeredMediaPhoto(id: Api.InputPhoto.inputPhoto(id: imageId, accessHash: accessHash, fileReference: Buffer(data: updatedReference ?? Data())))
|
||||
} else if let fileReference = media.concrete(TelegramMediaFile.self), let resource = fileReference.media.resource as? CloudDocumentMediaResource {
|
||||
inputMedia = .inputStickeredMediaDocument(id: Api.InputDocument.inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: updatedReference ?? Data())))
|
||||
} else {
|
||||
return .single([])
|
||||
}
|
||||
return account.network.request(Api.functions.messages.getAttachedStickers(media: inputMedia))
|
||||
} else {
|
||||
return .single([])
|
||||
}
|
||||
}
|
||||
|> `catch` { _ -> Signal<[Api.StickerSetCovered], MTRpcError> in
|
||||
return .single([])
|
||||
}
|
||||
}
|
||||
|> map { result -> [StickerPackReference] in
|
||||
return result.map { pack in
|
||||
switch pack {
|
||||
|
Loading…
x
Reference in New Issue
Block a user