From cae2388f95635ed796358b5a982bcbdb3268dc48 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 25 Jun 2025 12:00:37 +0200 Subject: [PATCH] Various improvements --- .../Sources/AccountContext.swift | 1 - .../Sources/ChatController.swift | 8 +- submodules/PremiumUI/Resources/back.png | Bin 0 -> 3925 bytes submodules/PremiumUI/Resources/bottom.png | Bin 0 -> 3013 bytes submodules/PremiumUI/Resources/business | Bin 0 -> 13266 bytes submodules/PremiumUI/Resources/business.scn | Bin 28482 -> 0 bytes submodules/PremiumUI/Resources/front.png | Bin 0 -> 4013 bytes submodules/PremiumUI/Resources/gift2 | Bin 0 -> 27317 bytes submodules/PremiumUI/Resources/gift2.scn | Bin 69788 -> 0 bytes submodules/PremiumUI/Resources/left.png | Bin 0 -> 4429 bytes submodules/PremiumUI/Resources/right.png | Bin 0 -> 3467 bytes submodules/PremiumUI/Resources/top.png | Bin 0 -> 4350 bytes .../TelegramEngine/Payments/Stars.swift | 4 +- .../ChatMessageGiftBubbleContentNode.swift | 2 +- .../ChatMessageTextBubbleContentNode.swift | 12 + .../Sources/ComposeTodoScreen.swift | 25 ++ .../ListComposePollOptionComponent.swift | 12 +- .../Sources/PeerInfoScreen.swift | 2 +- .../Premium/PremiumDiamondComponent/BUILD | 45 ++ .../MetalResources/diamond.metal | 271 ++++++++++++ .../Sources/DiamondLayer.swift | 393 ++++++++++++++++++ .../Sources/PremiumDiamondComponent.swift | 133 ++---- .../Sources/StarsTransactionsScreen.swift | 99 +++-- .../Sources/TextFieldComponent.swift | 12 +- .../Sources/ChatHistoryListNode.swift | 12 +- .../Sources/SharedAccountContext.swift | 6 +- 26 files changed, 875 insertions(+), 162 deletions(-) create mode 100644 submodules/PremiumUI/Resources/back.png create mode 100644 submodules/PremiumUI/Resources/bottom.png create mode 100644 submodules/PremiumUI/Resources/business delete mode 100644 submodules/PremiumUI/Resources/business.scn create mode 100644 submodules/PremiumUI/Resources/front.png create mode 100644 submodules/PremiumUI/Resources/gift2 delete mode 100644 submodules/PremiumUI/Resources/gift2.scn create mode 100644 submodules/PremiumUI/Resources/left.png create mode 100644 submodules/PremiumUI/Resources/right.png create mode 100644 submodules/PremiumUI/Resources/top.png create mode 100644 submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/MetalResources/diamond.metal create mode 100644 submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/Sources/DiamondLayer.swift diff --git a/submodules/AccountContext/Sources/AccountContext.swift b/submodules/AccountContext/Sources/AccountContext.swift index 619c1b6b99..639cbb16d3 100644 --- a/submodules/AccountContext/Sources/AccountContext.swift +++ b/submodules/AccountContext/Sources/AccountContext.swift @@ -1213,7 +1213,6 @@ public protocol SharedAccountContext: AnyObject { func makeStoryStatsController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)?, peerId: EnginePeer.Id, storyId: Int32, storyItem: EngineStoryItem, fromStory: Bool) -> ViewController func makeStarsTransactionsScreen(context: AccountContext, starsContext: StarsContext) -> ViewController - func makeTonTransactionsScreen(context: AccountContext, tonContext: StarsContext) -> ViewController func makeStarsPurchaseScreen(context: AccountContext, starsContext: StarsContext, options: [Any], purpose: StarsPurchasePurpose, completion: @escaping (Int64) -> Void) -> ViewController func makeStarsTransferScreen(context: AccountContext, starsContext: StarsContext, invoice: TelegramMediaInvoice, source: BotPaymentInvoiceSource, extendedMedia: [TelegramExtendedMedia], inputData: Signal<(StarsContext.State, BotPaymentForm, EnginePeer?, EnginePeer?)?, NoError>, completion: @escaping (Bool) -> Void) -> ViewController func makeStarsSubscriptionTransferScreen(context: AccountContext, starsContext: StarsContext, invoice: TelegramMediaInvoice, link: String, inputData: Signal<(StarsContext.State, BotPaymentForm, EnginePeer?, EnginePeer?)?, NoError>, navigateToPeer: @escaping (EnginePeer) -> Void) -> ViewController diff --git a/submodules/AccountContext/Sources/ChatController.swift b/submodules/AccountContext/Sources/ChatController.swift index 80789c546d..f130be618c 100644 --- a/submodules/AccountContext/Sources/ChatController.swift +++ b/submodules/AccountContext/Sources/ChatController.swift @@ -63,6 +63,7 @@ public final class ChatMessageItemAssociatedData: Equatable { public let isStandalone: Bool public let isInline: Bool public let showSensitiveContent: Bool + public let isSuspiciousPeer: Bool public init( automaticDownloadPeerType: MediaAutoDownloadPeerType, @@ -96,7 +97,8 @@ public final class ChatMessageItemAssociatedData: Equatable { deviceContactsNumbers: Set = Set(), isStandalone: Bool = false, isInline: Bool = false, - showSensitiveContent: Bool = false + showSensitiveContent: Bool = false, + isSuspiciousPeer: Bool = false ) { self.automaticDownloadPeerType = automaticDownloadPeerType self.automaticDownloadPeerId = automaticDownloadPeerId @@ -130,6 +132,7 @@ public final class ChatMessageItemAssociatedData: Equatable { self.isStandalone = isStandalone self.isInline = isInline self.showSensitiveContent = showSensitiveContent + self.isSuspiciousPeer = isSuspiciousPeer } public static func == (lhs: ChatMessageItemAssociatedData, rhs: ChatMessageItemAssociatedData) -> Bool { @@ -223,6 +226,9 @@ public final class ChatMessageItemAssociatedData: Equatable { if lhs.showSensitiveContent != rhs.showSensitiveContent { return false } + if lhs.isSuspiciousPeer != rhs.isSuspiciousPeer { + return false + } return true } } diff --git a/submodules/PremiumUI/Resources/back.png b/submodules/PremiumUI/Resources/back.png new file mode 100644 index 0000000000000000000000000000000000000000..b097d52b67f98addc42e35c7fb6c0da2329e913f GIT binary patch literal 3925 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 literal 0 HcmV?d00001 diff --git a/submodules/PremiumUI/Resources/bottom.png b/submodules/PremiumUI/Resources/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..7c971bb50332dc4b70f3461775c30e799d6961fc GIT binary patch literal 3013 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 literal 0 HcmV?d00001 diff --git a/submodules/PremiumUI/Resources/business b/submodules/PremiumUI/Resources/business new file mode 100644 index 0000000000000000000000000000000000000000..cb937febefc935eba25094a0688355b8fb62a59f GIT binary patch literal 13266 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 QRQcTh1M!=QOhRt}0GA@CEC2ui literal 0 HcmV?d00001 diff --git a/submodules/PremiumUI/Resources/business.scn b/submodules/PremiumUI/Resources/business.scn deleted file mode 100644 index a88303fa791c27631dabfd54b5156de68ec4d194..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28482 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 uQ$H<5rOu^3rGBNYO52nUEFD}*m3~+{v2>2FI{ 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

d% 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 X_kTHZ$N%5^bfx|eGj`qtoDcy3;+~dm literal 0 HcmV?d00001 diff --git a/submodules/PremiumUI/Resources/gift2.scn b/submodules/PremiumUI/Resources/gift2.scn deleted file mode 100644 index ffbaec38e38155f505bfc0aa1c7ef1a9ff8f255a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69788 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 E0pn~p82|tP diff --git a/submodules/PremiumUI/Resources/left.png b/submodules/PremiumUI/Resources/left.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef61740c8df84aa7954e07278c071340f88dcc9 GIT binary patch literal 4429 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 DjgE%9 literal 0 HcmV?d00001 diff --git a/submodules/PremiumUI/Resources/right.png b/submodules/PremiumUI/Resources/right.png new file mode 100644 index 0000000000000000000000000000000000000000..54b4f70b1ab7458f8c12398b6d47a2fbb1e8bb5a GIT binary patch literal 3467 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 Zv}!uP5kaoGWaoFu)W`}`eaiFVe*iXFH$?yd literal 0 HcmV?d00001 diff --git a/submodules/PremiumUI/Resources/top.png b/submodules/PremiumUI/Resources/top.png new file mode 100644 index 0000000000000000000000000000000000000000..d4681c1fb01e79d833149e1ddc436881d512102e GIT binary patch literal 4350 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 YASR7__HsE%Z2qCZncJGxVZD$12g8{~d;kCd literal 0 HcmV?d00001 diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Payments/Stars.swift b/submodules/TelegramCore/Sources/TelegramEngine/Payments/Stars.swift index c80f535da0..7b947a4e7d 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Payments/Stars.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Payments/Stars.swift @@ -442,10 +442,10 @@ private func _internal_requestStarsState(account: Account, peerId: EnginePeer.Id break } if let _ = subscriptionId { - flags = 1 << 3 + flags |= 1 << 3 } if ton { - flags = 1 << 4 + flags |= 1 << 4 } signal = account.network.request(Api.functions.payments.getStarsTransactions(flags: flags, subscriptionId: subscriptionId, peer: inputPeer, offset: offset, limit: limit)) } else { diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageGiftBubbleContentNode/Sources/ChatMessageGiftBubbleContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageGiftBubbleContentNode/Sources/ChatMessageGiftBubbleContentNode.swift index 52e44d335a..8fe7861387 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageGiftBubbleContentNode/Sources/ChatMessageGiftBubbleContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageGiftBubbleContentNode/Sources/ChatMessageGiftBubbleContentNode.swift @@ -430,7 +430,7 @@ public class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { let cryptoAmount = cryptoAmount ?? 0 title = "$ \(formatTonAmountText(cryptoAmount, dateTimeFormat: item.presentationData.dateTimeFormat))" - text = incoming ? "Use TON to unlock content and services on Telegram." : "With TON, \(peerName) will be able to unlock content and services on Telegram." + text = incoming ? "Use TON to submit post suggestions to channels." : "With TON, \(peerName) will be able to submit post suggestions to channels." case let .prizeStars(count, _, channelId, _, _): if count <= 1000 { months = 3 diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageTextBubbleContentNode/Sources/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageTextBubbleContentNode/Sources/ChatMessageTextBubbleContentNode.swift index 8c606a3afa..c7c84b197b 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageTextBubbleContentNode/Sources/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageTextBubbleContentNode/Sources/ChatMessageTextBubbleContentNode.swift @@ -412,6 +412,18 @@ public class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { } } + + if item.associatedData.isSuspiciousPeer, let entities = messageEntities { + messageEntities = entities.filter { entity in + switch entity.type { + case .Url, .TextUrl, .Mention, .TextMention, .Hashtag, .Email, .BankCard: + return false + default: + return true + } + } + } + var entities: [MessageTextEntity]? var updatedCachedChatMessageText: CachedChatMessageText? if let cached = currentCachedChatMessageText, cached.matches(text: rawText, inputEntities: messageEntities) { diff --git a/submodules/TelegramUI/Components/ComposeTodoScreen/Sources/ComposeTodoScreen.swift b/submodules/TelegramUI/Components/ComposeTodoScreen/Sources/ComposeTodoScreen.swift index 0a6cc6b3bc..9f467571e0 100644 --- a/submodules/TelegramUI/Components/ComposeTodoScreen/Sources/ComposeTodoScreen.swift +++ b/submodules/TelegramUI/Components/ComposeTodoScreen/Sources/ComposeTodoScreen.swift @@ -921,6 +921,31 @@ final class ComposeTodoScreenComponent: Component { self.todoItems.removeAll(where: { $0.id == optionId }) self.state?.updated(transition: .spring(duration: 0.4)) } : nil, + paste: { [weak self] data in + guard let self else { + return + } + if case let .text(text) = data { + let lines = text.string.components(separatedBy: "\n") + if !lines.isEmpty { + var i = 0 + for line in lines { + if i < self.todoItems.count { + self.todoItems[i].resetText = line + } else { + let todoItem = ComposeTodoScreenComponent.TodoItem( + id: self.nextTodoItemId + ) + todoItem.resetText = line + self.todoItems.append(todoItem) + self.nextTodoItemId += 1 + } + i += 1 + } + self.state?.updated() + } + } + }, tag: todoItem.textFieldTag )))) diff --git a/submodules/TelegramUI/Components/ListComposePollOptionComponent/Sources/ListComposePollOptionComponent.swift b/submodules/TelegramUI/Components/ListComposePollOptionComponent/Sources/ListComposePollOptionComponent.swift index cda17c5ea1..2828c2def0 100644 --- a/submodules/TelegramUI/Components/ListComposePollOptionComponent/Sources/ListComposePollOptionComponent.swift +++ b/submodules/TelegramUI/Components/ListComposePollOptionComponent/Sources/ListComposePollOptionComponent.swift @@ -87,6 +87,7 @@ public final class ListComposePollOptionComponent: Component { public let alwaysDisplayInputModeSelector: Bool public let toggleInputMode: (() -> Void)? public let deleteAction: (() -> Void)? + public let paste: ((TextFieldComponent.PasteData) -> Void)? public let tag: AnyObject? public init( @@ -109,6 +110,7 @@ public final class ListComposePollOptionComponent: Component { alwaysDisplayInputModeSelector: Bool = false, toggleInputMode: (() -> Void)?, deleteAction: (() -> Void)? = nil, + paste: ((TextFieldComponent.PasteData) -> Void)? = nil, tag: AnyObject? = nil ) { self.externalState = externalState @@ -130,6 +132,7 @@ public final class ListComposePollOptionComponent: Component { self.alwaysDisplayInputModeSelector = alwaysDisplayInputModeSelector self.toggleInputMode = toggleInputMode self.deleteAction = deleteAction + self.paste = paste self.tag = tag } @@ -589,13 +592,20 @@ public final class ListComposePollOptionComponent: Component { characterLimit: component.characterLimit, enableInlineAnimations: component.enableInlineAnimations, emptyLineHandling: component.emptyLineHandling, + externalHandlingForMultilinePaste: true, formatMenuAvailability: .none, returnKeyType: .next, lockedFormatAction: { }, present: { _ in }, - paste: { _ in + paste: { [weak self] data in + guard let self, let component = self.component else { + return + } + if let paste = component.paste, case .text = data { + paste(data) + } }, returnKeyAction: { [weak self] in guard let self, let component = self.component else { diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift index 0f88b26a3e..cce46fcecd 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift @@ -10670,7 +10670,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } case .ton: if let tonContext = self.controller?.tonContext { - push(self.context.sharedContext.makeTonTransactionsScreen(context: self.context, tonContext: tonContext)) + push(self.context.sharedContext.makeStarsTransactionsScreen(context: self.context, starsContext: tonContext)) } } } diff --git a/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/BUILD b/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/BUILD index bb9178dd5f..567ee0e5c9 100644 --- a/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/BUILD +++ b/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/BUILD @@ -1,4 +1,44 @@ load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") +load( + "@build_bazel_rules_apple//apple:resources.bzl", + "apple_resource_bundle", + "apple_resource_group", +) +load("//build-system/bazel-utils:plist_fragment.bzl", + "plist_fragment", +) + +filegroup( + name = "PremiumDiamondComponentMetalResources", + srcs = glob([ + "MetalResources/**/*.*", + ]), + visibility = ["//visibility:public"], +) + +plist_fragment( + name = "PremiumDiamondComponentBundleInfoPlist", + extension = "plist", + template = + """ + CFBundleIdentifier + org.telegram.PremiumDiamondComponent + CFBundleDevelopmentRegion + en + CFBundleName + StoryPeerList + """ +) + +apple_resource_bundle( + name = "PremiumDiamondComponentBundle", + infoplists = [ + ":PremiumDiamondComponentBundleInfoPlist", + ], + resources = [ + ":PremiumDiamondComponentMetalResources", + ], +) swift_library( name = "PremiumDiamondComponent", @@ -9,10 +49,14 @@ swift_library( copts = [ "-warnings-as-errors", ], + data = [ + ":PremiumDiamondComponentBundle", + ], deps = [ "//submodules/AsyncDisplayKit", "//submodules/Display", "//submodules/SSignalKit/SwiftSignalKit", + "//submodules/MetalEngine", "//submodules/ComponentFlow", "//submodules/AccountContext", "//submodules/AppBundle", @@ -20,6 +64,7 @@ swift_library( "//submodules/LegacyComponents", "//submodules/Components/MultilineTextComponent:MultilineTextComponent", "//submodules/TelegramUI/Components/Premium/PremiumStarComponent", + "//submodules/TelegramUI/Components/Utils/AnimatableProperty", ], visibility = [ "//visibility:public", diff --git a/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/MetalResources/diamond.metal b/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/MetalResources/diamond.metal new file mode 100644 index 0000000000..47e8547dae --- /dev/null +++ b/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/MetalResources/diamond.metal @@ -0,0 +1,271 @@ +#include +using namespace metal; + +#define EPS 1e-4 +#define EPS2 1e-4 +#define NEAR 1.0 +#define FAR 10.0 +#define NEAR2 0.02 +#define ITER 96 +#define ITER2 48 +#define RI1 2.40 +#define RI2 2.44 +#define PI 3.14159265359 + +float3 hsv(float h, float s, float v) { + float3 k = float3(1.0, 2.0 / 3.0, 1.0 / 3.0); + float3 p = abs(fract(h + k.xyz) * 6.0 - 3.0); + return v * mix(float3(1.0), clamp(p - 1.0, 0.0, 1.0), s); +} + +float2x2 rot(float a) { + float s = sin(a), c = cos(a); + return float2x2(c, s, -s, c); +} + +float sdTable(float3 p) { + float2 d = abs(float2(length(p.xz), (p.y + 0.159) * 1.650)) - float2(1.0); + return min(max(d.x, d.y), 0.0) + length(max(d, 0.0)); +} + +float sdCut(float3 p, float a, float h) { + p.y *= a; + p.y -= (abs(p.x) + abs(p.z)) * h; + p = abs(p); + return (p.x + p.y + p.z - 1.0) * 0.5; +} + +constant float2x2 ROT4 = float2x2(0.70710678, 0.70710678, -0.70710678, 0.70710678); +constant float2x2 ROT3 = float2x2(0.92387953, 0.38268343, -0.38268343, 0.92387953); +constant float2x2 ROT2 = float2x2(0.38268343, 0.92387953, -0.92387953, 0.38268343); +constant float2x2 ROT1 = float2x2(0.19509032, 0.98078528, -0.98078528, 0.19509032); + +float map(float3 p, float time, float3 cameraRotation) { + p.y *= 0.72; + + p.yz = p.yz; + p.xz = rot(time * 0.45) * p.xz; + + float d = sdTable(p); + + float3 q = p * 0.3000; + q.y += 0.0808; + q.xz = ROT2 * q.xz; + q.xz = abs(q.xz); + q.xz = ROT4 * q.xz; + q.xz = abs(q.xz); + q.xz = ROT2 * q.xz; + d = max(d, sdCut(q, 3.700, 0.0000)); + + q = p * 0.691; + q.xz = abs(q.xz); + q.xz = ROT4 * q.xz; + q.xz = abs(q.xz); + q.xz = ROT2 * q.xz; + d = max(d, sdCut(q, 1.868, 0.1744)); + + q *= 1.022; + q.y -= 0.034; + q.xz = ROT1 * q.xz; + d = max(d, sdCut(q, 1.650, 0.1000)); + q.xz = ROT3 * q.xz; + d = max(d, sdCut(q, 1.650, 0.1000)); + + return d; +} + +float3 normal(float3 p, float time, float3 cameraRotation) { + float2 e = float2(EPS, 0); + return normalize(float3( + map(p + e.xyy, time, cameraRotation) - map(p - e.xyy, time, cameraRotation), + map(p + e.yxy, time, cameraRotation) - map(p - e.yxy, time, cameraRotation), + map(p + e.yyx, time, cameraRotation) - map(p - e.yyx, time, cameraRotation) + )); +} + +float trace(float3 ro, float3 rd, thread float3 &p, thread float3 &n, float time, float3 cameraRotation) { + float t = NEAR, d; + for (int i = 0; i < ITER; i++) { + p = ro + rd * t; + d = map(p, time, cameraRotation); + if (abs(d) < EPS || t > FAR) break; + t += step(d, 1.0) * d * 0.5 + d * 0.5; + } + n = normal(p, time, cameraRotation); + return min(t, FAR); +} + +float trace2(float3 ro, float3 rd, thread float3 &p, thread float3 &n, float time, float3 cameraRotation) { + float t = NEAR2, d; + for (int i = 0; i < ITER2; i++) { + p = ro + rd * t; + d = -map(p, time, cameraRotation); + if (abs(d) < EPS2 || d < EPS2) break; + t += d; + } + n = -normal(p, time, cameraRotation); + return t; +} + +float schlickFresnel(float ri, float co) { + float r = (1.0 - ri) / (1.0 + ri); + r = r * r; + return r + (1.0 - r) * pow(1.0 - co, 5.0); +} + +float3 lightPath(float3 p, float3 rd, float ri, float time, float3 cameraRotation) { + float3 n; + float3 r0 = -rd; + trace2(p, rd, p, n, time, cameraRotation); + rd = reflect(rd, n); + float3 r1 = refract(rd, n, ri); + r1 = length(r1) < EPS ? r0 : r1; + trace2(p, rd, p, n, time, cameraRotation); + rd = reflect(rd, n); + float3 r2 = refract(rd, n, ri); + r2 = length(r2) < EPS ? r1 : r2; + trace2(p, rd, p, n, time, cameraRotation); + float3 r3 = refract(rd, n, ri); + return length(r3) < EPS ? r2 : r3; +} + +float3 material(float3 p, float3 rd, float3 n, texturecube cubemap, float time, float3 cameraRotation) { + float3 l0 = reflect(rd, n); + float co = max(0.0, dot(-rd, n)); + float f1 = schlickFresnel(RI1, co); + float3 l1 = lightPath(p, refract(rd, n, 1.0 / RI1), RI1, time, cameraRotation); + float f2 = schlickFresnel(RI2, co); + float3 l2 = lightPath(p, refract(rd, n, 1.0 / RI2), RI2, time, cameraRotation); + + float a = 0.0; + float3 dc = float3(0.0); + float3 r = cubemap.sample(sampler(mag_filter::linear, min_filter::linear), l0).rgb; + + for (int i = 0; i < 10; i++) { + float3 l = normalize(mix(l1, l2, a)); + float f = mix(f1, f2, a); + dc += cubemap.sample(sampler(mag_filter::linear, min_filter::linear), l).rgb * hsv(a + 0.9, 1.0, 1.0) * (1.0 - f) + r * f; + a += 0.1; + } + dc *= 0.19; + + return dc; +} + +kernel void compute_main(texture2d outputTexture [[texture(0)]], + texturecube cubemap [[texture(1)]], + constant float &iTime [[buffer(0)]], + constant float2 &iResolution [[buffer(1)]], + constant float3 &cameraRotation [[buffer(2)]], + uint2 gid [[thread_position_in_grid]]) { + if (gid.x >= uint(iResolution.x) || gid.y >= uint(iResolution.y)) { + return; + } + + float2 fragCoord = float2(gid.x, gid.y); + float2 uv = (fragCoord - 0.5 * iResolution) / iResolution.y; + + float3 ro = float3(0.0, 0.0, -4.0); + float3 rd = normalize(float3(uv, 1.1)); + + float2x2 ry = rot(cameraRotation.y); // Yaw + ro.yz = ry * ro.yz; + rd.yz = ry * rd.yz; + + float2x2 rx = rot(cameraRotation.x); // Pitch + ro.xz = rx * ro.xz; + rd.xz = rx * rd.xz; + + float2x2 rz = rot(0.0); // cameraRotation.z); // Roll + ro.xy = rz * ro.xy; + rd.xy = rz * rd.xy; + + float3 p, n; + float t = trace(ro, rd, p, n, iTime, cameraRotation); + + float3 c = float3(0.0); + float w = 0.0; + if (t > 9.0) { + c = float3(1.0, 0.0, 0.0); + //c = cubemap.sample(sampler(mag_filter::linear, min_filter::linear), rd).rgb; + } else { + c = material(p, rd, n, cubemap, iTime, cameraRotation); + w = smoothstep(1.60, 1.61, length(c)); + } + + outputTexture.write(float4(c, w), gid); +} + +#define POST_ITER 36.0 +#define RADIUS 0.05 + +struct QuadVertexOut { + float4 position [[position]]; + float2 uv; +}; + +constant static float2 quadVertices[6] = { + float2(0.0, 0.0), + float2(1.0, 0.0), + float2(0.0, 1.0), + float2(1.0, 0.0), + float2(0.0, 1.0), + float2(1.0, 1.0) +}; + +vertex QuadVertexOut post_vertex_main( + constant float4 &rect [[ buffer(0) ]], + uint vid [[ vertex_id ]] +) { + float2 quadVertex = quadVertices[vid]; + + QuadVertexOut out; + out.position = float4(rect.x + quadVertex.x * rect.z, rect.y + quadVertex.y * rect.w, 0.0, 1.0); + out.position.x = -1.0 + out.position.x * 2.0; + out.position.y = -1.0 + out.position.y * 2.0; + + out.uv = quadVertex; + + return out; +} + +fragment float4 post_fragment_main(QuadVertexOut in [[stage_in]], + constant float &iTime [[buffer(0)]], + constant float2 &iResolution [[buffer(1)]], + texture2d inputTexture [[texture(0)]]) { + + constexpr sampler textureSampler(mag_filter::linear, min_filter::linear, address::clamp_to_edge); + + float2 uv = in.uv; + float2 m = float2(1.0, iResolution.x / iResolution.y); + + float4 co = inputTexture.sample(textureSampler, uv); + float4 c = co; + + float a = sin(iTime * 0.1) * 6.283; + float v = 0.0; + float b = 1.0 / POST_ITER; + + for (int j = 0; j < 6; j++) { + float r = RADIUS / POST_ITER; + float2 d = float2(cos(a), sin(a)) * m; + + for (int i = 0; i < int(POST_ITER); i++) { + float4 sample = inputTexture.sample(textureSampler, uv + d * r * RADIUS); + v += sample.w * (1.0 - r); + r += b; + } + a += 1.047; + } + + v *= 0.01; + c += float4(v, v, v, 0.0); + c.w = 1.0; + if (co.r == 1.0 && co.g == 0.0 && co.b == 0.0) { + c.w = 0.0; + } else { + c.w = 1.0; + } + + return c; +} diff --git a/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/Sources/DiamondLayer.swift b/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/Sources/DiamondLayer.swift new file mode 100644 index 0000000000..d2f9ef255b --- /dev/null +++ b/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/Sources/DiamondLayer.swift @@ -0,0 +1,393 @@ +import Foundation +import Display +import Metal +import MetalKit +import MetalEngine +import ComponentFlow +import TelegramPresentationData +import AnimatableProperty +import SwiftSignalKit + +private var metalLibraryValue: MTLLibrary? +func metalLibrary(device: MTLDevice) -> MTLLibrary? { + if let metalLibraryValue { + return metalLibraryValue + } + + let mainBundle = Bundle(for: DiamondLayer.self) + guard let path = mainBundle.path(forResource: "PremiumDiamondComponentBundle", ofType: "bundle") else { + return nil + } + guard let bundle = Bundle(path: path) else { + return nil + } + guard let library = try? device.makeDefaultLibrary(bundle: bundle) else { + return nil + } + + metalLibraryValue = library + return library +} + +final class DiamondLayer: MetalEngineSubjectLayer, MetalEngineSubject { + var internalData: MetalEngineSubjectInternalData? + + private final class RenderState: RenderToLayerState { + let pipelineState: MTLRenderPipelineState + + required init?(device: MTLDevice) { + guard let library = metalLibrary(device: device) else { + return nil + } + guard let vertexFunction = library.makeFunction(name: "post_vertex_main"), + let fragmentFunction = library.makeFunction(name: "post_fragment_main") else { + return nil + } + + let pipelineDescriptor = MTLRenderPipelineDescriptor() + pipelineDescriptor.vertexFunction = vertexFunction + pipelineDescriptor.fragmentFunction = fragmentFunction + pipelineDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm + pipelineDescriptor.colorAttachments[0].isBlendingEnabled = true + pipelineDescriptor.colorAttachments[0].rgbBlendOperation = .add + pipelineDescriptor.colorAttachments[0].alphaBlendOperation = .add + pipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha + pipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha + pipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha + pipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha + + guard let pipelineState = try? device.makeRenderPipelineState(descriptor: pipelineDescriptor) else { + return nil + } + self.pipelineState = pipelineState + } + } + + final class DiamondState: ComputeState { + let computePipelineState: MTLComputePipelineState + let cubemapTexture: MTLTexture? + + required init?(device: MTLDevice) { + guard let library = metalLibrary(device: device) else { + return nil + } + + guard let functionComputeMain = library.makeFunction(name: "compute_main") else { + return nil + } + guard let computePipelineState = try? device.makeComputePipelineState(function: functionComputeMain) else { + return nil + } + self.computePipelineState = computePipelineState + + self.cubemapTexture = loadCubemap(device: device) + } + } + + private var offscreenTexture: PooledTexture? + + private var rotationX = AnimatableProperty(value: -15.0 * .pi / 180.0) + private var rotationY = AnimatableProperty(value: 0.0) + private var rotationZ = AnimatableProperty(value: 0.0 * .pi / 180.0) + private var time = AnimatableProperty(value: 0.0) + + private var startTime = CFAbsoluteTimeGetCurrent() + private var interactionStartTme: Double? + + private var displayLinkSubscription: SharedDisplayLinkDriver.Link? + private var hasActiveAnimations: Bool = false + + private var isExploding = false + + private var currentRenderSize: CGSize = .zero + + override init() { + super.init() + + self.isOpaque = false + + self.didEnterHierarchy = { [weak self] in + guard let self else { + return + } + self.displayLinkSubscription = SharedDisplayLinkDriver.shared.add { [weak self] _ in + guard let self else { + return + } + self.updateAnimations() + self.setNeedsUpdate() + } + } + + self.didExitHierarchy = { [weak self] in + guard let self else { + return + } + self.displayLinkSubscription = nil + } + } + + override init(layer: Any) { + super.init(layer: layer) + + if let layer = layer as? DiamondLayer { + self.rotationX = layer.rotationX + self.rotationY = layer.rotationY + self.rotationZ = layer.rotationZ + self.time = layer.time + self.startTime = layer.startTime + self.currentRenderSize = layer.currentRenderSize + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc func handlePan(_ gesture: UIPanGestureRecognizer) { + switch gesture.state { + case .began: + self.interactionStartTme = CFAbsoluteTimeGetCurrent() + case .changed: + let translation = gesture.translation(in: gesture.view) + let yawPan = -Float(translation.x) * Float.pi / 180.0 + + func rubberBandingOffset(offset: CGFloat, bandingStart: CGFloat) -> CGFloat { + let bandedOffset = offset - bandingStart + let range: CGFloat = 75.0 + let coefficient: CGFloat = 0.4 + return bandingStart + (1.0 - (1.0 / ((bandedOffset * coefficient / range) + 1.0))) * range + } + + var pitchTranslation = rubberBandingOffset(offset: abs(translation.y), bandingStart: 0.0) + if translation.y < 0.0 { + pitchTranslation *= -1.0 + } + let pitchPan = Float(pitchTranslation) * Float.pi / 180.0 + + self.rotationX.update(value: CGFloat(yawPan), transition: .immediate) + self.rotationY.update(value: CGFloat(pitchPan), transition: .immediate) + + case .ended: + let velocity = gesture.velocity(in: gesture.view) + + if let interactionStartTme = self.interactionStartTme { + let delta = CFAbsoluteTimeGetCurrent() - interactionStartTme + self.startTime += delta + + self.interactionStartTme = nil + } +// +// var smallAngle = false +// let previousYaw = Float(self.rotationX.presentationValue) +// if (previousYaw < .pi / 2 && previousYaw > -.pi / 2) && abs(velocity.x) < 200 { +// smallAngle = true +// } + + playAppearanceAnimation(velocity: velocity.x, smallAngle: true, explode: false) //, smallAngle: smallAngle, explode: !smallAngle && abs(velocity.x) > 600) + default: + break + } + + self.setNeedsUpdate() + } + + func playAppearanceAnimation(velocity: CGFloat?, smallAngle: Bool, explode: Bool) { + if explode { + self.isExploding = true + self.time.update(value: 8.0, transition: .spring(duration: 2.0)) + + Queue.mainQueue().after(1.2) { + if self.isExploding { + self.isExploding = false + self.startTime = CFAbsoluteTimeGetCurrent() - 8.0 + } + } + } else if smallAngle { + let transition = ComponentTransition.easeInOut(duration: 0.3) + self.rotationX.update(value: 0.0, transition: transition) + self.rotationY.update(value: 0.0, transition: transition) + } + + } + + private func updateAnimations() { + let properties = [ + self.rotationX, + self.rotationY, + self.rotationZ + ] + + let timestamp = CACurrentMediaTime() + var hasAnimations = false + for property in properties { + if property.tick(timestamp: timestamp) { + hasAnimations = true + } + } + + let currentTime = CFAbsoluteTimeGetCurrent() + if self.time.tick(timestamp: timestamp) { + hasAnimations = true + } + self.hasActiveAnimations = hasAnimations + + if !self.isExploding && self.interactionStartTme == nil { + let elapsedTime = currentTime - self.startTime + self.time.update(value: CGFloat(elapsedTime), transition: .immediate) + } + } + + func update(context: MetalEngineSubjectContext) { + if self.bounds.isEmpty { + return + } + + let drawableSize = CGSize(width: self.bounds.width * UIScreen.main.scale, height: self.bounds.height * UIScreen.main.scale) + + let offscreenTextureSpec = TextureSpec(width: Int(drawableSize.width), height: Int(drawableSize.height), pixelFormat: .rgba8UnsignedNormalized) + if self.offscreenTexture == nil || self.offscreenTexture?.spec != offscreenTextureSpec { + self.offscreenTexture = MetalEngine.shared.pooledTexture(spec: offscreenTextureSpec) + } + + guard let offscreenTexture = self.offscreenTexture?.get(context: context) else { + return + } + + let diamondTexture = context.compute(state: DiamondState.self, inputs: offscreenTexture.placeholer, commands: { commandBuffer, computeState, offscreenTexture -> MTLTexture? in + guard let offscreenTexture, let cubemapTexture = computeState.cubemapTexture else { + return nil + } + do { + guard let computeEncoder = commandBuffer.makeComputeCommandEncoder() else { + return nil + } + + let threadgroupSize = MTLSize(width: 16, height: 16, depth: 1) + let threadgroupCount = MTLSize(width: (offscreenTextureSpec.width + threadgroupSize.width - 1) / threadgroupSize.width, height: (offscreenTextureSpec.height + threadgroupSize.height - 1) / threadgroupSize.height, depth: 1) + + var iTime = Float(self.time.presentationValue) + + var iResolution = simd_float2( + Float(drawableSize.width), + Float(drawableSize.height) + ) + + var cameraRotation = SIMD3( + Float(180.0 * .pi / 180.0 + self.rotationX.presentationValue), + Float(18.0 * .pi / 180.0 + self.rotationY.presentationValue), + Float(0.0) + ) + + computeEncoder.setComputePipelineState(computeState.computePipelineState) + computeEncoder.setBytes(&iTime, length: MemoryLayout.size, index: 0) + computeEncoder.setBytes(&iResolution, length: MemoryLayout.size, index: 1) + computeEncoder.setBytes(&cameraRotation, length: MemoryLayout.size, index: 2) + computeEncoder.setTexture(offscreenTexture, index: 0) + computeEncoder.setTexture(cubemapTexture, index: 1) + computeEncoder.dispatchThreadgroups(threadgroupCount, threadsPerThreadgroup: threadgroupSize) + + computeEncoder.endEncoding() + } + + return offscreenTexture + }) + + + context.renderToLayer(spec: RenderLayerSpec(size: RenderSize(width: Int(drawableSize.width), height: Int(drawableSize.height))), state: RenderState.self, layer: self, inputs: diamondTexture, commands: { encoder, placement, diamondTexture in + guard let diamondTexture else { + return + } + + let effectiveRect = placement.effectiveRect + + var iTime = Float(self.time.presentationValue) + + var rect = SIMD4(Float(effectiveRect.minX), Float(effectiveRect.minY), Float(effectiveRect.width), Float(effectiveRect.height)) + encoder.setVertexBytes(&rect, length: 4 * 4, index: 0) + + var iResolution = simd_float2( + Float(drawableSize.width), + Float(drawableSize.height) + ) + encoder.setFragmentBytes(&iTime, length: MemoryLayout.size, index: 0) + encoder.setFragmentBytes(&iResolution, length: MemoryLayout.size, index: 1) + encoder.setFragmentTexture(diamondTexture, index: 0) + encoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 6) + }) + } +} + +private func loadCubemap(device: MTLDevice) -> MTLTexture? { + let faceNames = ["right", "left", "top", "bottom", "front", "back"].map { "\($0).png" } + + guard let firstImage = UIImage(named: faceNames[0]) else { + return nil + } + + let width = Int(firstImage.size.width) + let height = Int(firstImage.size.height) + + let textureDescriptor = MTLTextureDescriptor.textureCubeDescriptor( + pixelFormat: .rgba8Unorm, + size: width, + mipmapped: true + ) + textureDescriptor.usage = [.shaderRead] + + guard let cubemapTexture = device.makeTexture(descriptor: textureDescriptor) else { + return nil + } + + for (index, faceName) in faceNames.enumerated() { + guard let image = UIImage(named: faceName), + let cgImage = image.cgImage else { + return nil + } + + let colorSpace = CGColorSpaceCreateDeviceRGB() + let bytesPerPixel = 4 + let bytesPerRow = width * bytesPerPixel + let bitsPerComponent = 8 + + var pixelData = [UInt8](repeating: 0, count: width * height * bytesPerPixel) + + guard let context = CGContext( + data: &pixelData, + width: width, + height: height, + bitsPerComponent: bitsPerComponent, + bytesPerRow: bytesPerRow, + space: colorSpace, + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) else { + return nil + } + + context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height)) + + let region = MTLRegion(origin: MTLOrigin(x: 0, y: 0, z: 0), size: MTLSize(width: width, height: height, depth: 1)) + + cubemapTexture.replace( + region: region, + mipmapLevel: 0, + slice: index, + withBytes: pixelData, + bytesPerRow: bytesPerRow, + bytesPerImage: 0 + ) + } + + if textureDescriptor.mipmapLevelCount > 1 { + let commandQueue = device.makeCommandQueue() + let commandBuffer = commandQueue?.makeCommandBuffer() + let blitEncoder = commandBuffer?.makeBlitCommandEncoder() + + blitEncoder?.generateMipmaps(for: cubemapTexture) + blitEncoder?.endEncoding() + commandBuffer?.commit() + commandBuffer?.waitUntilCompleted() + } + + return cubemapTexture +} diff --git a/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/Sources/PremiumDiamondComponent.swift b/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/Sources/PremiumDiamondComponent.swift index 0aeb9e849f..3a62fc5987 100644 --- a/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/Sources/PremiumDiamondComponent.swift +++ b/submodules/TelegramUI/Components/Premium/PremiumDiamondComponent/Sources/PremiumDiamondComponent.swift @@ -45,12 +45,11 @@ public final class PremiumDiamondComponent: Component { public var ready: Signal { return self._ready.get() } - - weak var animateFrom: UIView? - weak var containerView: UIView? - - private let sceneView: SCNView + private let sceneView: SCNView + + private let diamondLayer: DiamondLayer + private var timer: SwiftSignalKit.Timer? private var component: PremiumDiamondComponent? @@ -63,13 +62,17 @@ public final class PremiumDiamondComponent: Component { self.sceneView.preferredFramesPerSecond = 60 self.sceneView.isJitteringEnabled = true + self.diamondLayer = DiamondLayer() + super.init(frame: frame) self.addSubview(self.sceneView) + self.layer.addSublayer(self.diamondLayer) + self.setup() - let panGestureRecoginzer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(_:))) + let panGestureRecoginzer = UIPanGestureRecognizer(target: self.diamondLayer, action: #selector(self.diamondLayer.handlePan(_:))) self.addGestureRecognizer(panGestureRecoginzer) self.disablesInteractiveModalDismiss = true @@ -84,61 +87,6 @@ public final class PremiumDiamondComponent: Component { self.timer?.invalidate() } - private var previousYaw: Float = 0.0 - @objc private func handlePan(_ gesture: UIPanGestureRecognizer) { - guard let scene = self.sceneView.scene, let node = scene.rootNode.childNode(withName: "star", recursively: false) else { - return - } - - let keys = [ - "rotate", - "tapRotate", - "continuousRotation" - ] - - for key in keys { - node.removeAnimation(forKey: key) - } - - switch gesture.state { - case .began: - self.previousYaw = 0.0 - case .changed: - let translation = gesture.translation(in: gesture.view) - let yawPan = deg2rad(Float(translation.x)) - - func rubberBandingOffset(offset: CGFloat, bandingStart: CGFloat) -> CGFloat { - let bandedOffset = offset - bandingStart - let range: CGFloat = 60.0 - let coefficient: CGFloat = 0.4 - return bandingStart + (1.0 - (1.0 / ((bandedOffset * coefficient / range) + 1.0))) * range - } - - var pitchTranslation = rubberBandingOffset(offset: abs(translation.y), bandingStart: 0.0) - if translation.y < 0.0 { - pitchTranslation *= -1.0 - } - let pitchPan = deg2rad(Float(pitchTranslation)) - - self.previousYaw = yawPan - // Maintain the initial tilt while adding pan gestures - let initialTiltX: Float = deg2rad(-15.0) - let initialTiltZ: Float = deg2rad(5.0) - node.eulerAngles = SCNVector3(initialTiltX + pitchPan, yawPan, initialTiltZ) - case .ended: - let velocity = gesture.velocity(in: gesture.view) - - var smallAngle = false - if (self.previousYaw < .pi / 2 && self.previousYaw > -.pi / 2) && abs(velocity.x) < 200 { - smallAngle = true - } - - self.playAppearanceAnimation(velocity: velocity.x, smallAngle: smallAngle, explode: !smallAngle && abs(velocity.x) > 600) - default: - break - } - } - private func setup() { guard let scene = loadCompressedScene(name: "diamond", version: sceneVersion) else { return @@ -163,9 +111,23 @@ public final class PremiumDiamondComponent: Component { } private func onReady() { + self.setupScaleAnimation() + self.playAppearanceAnimation(mirror: true, explode: true) } + private func setupScaleAnimation() { + let animation = CABasicAnimation(keyPath: "transform.scale") + animation.duration = 2.0 + animation.fromValue = 0.9 + animation.toValue = 1.0 + animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut) + animation.autoreverses = true + animation.repeatCount = .infinity + + self.diamondLayer.add(animation, forKey: "scale") + } + private func playAppearanceAnimation(velocity: CGFloat? = nil, smallAngle: Bool = false, mirror: Bool = false, explode: Bool = false) { guard let scene = self.sceneView.scene else { return @@ -244,56 +206,19 @@ public final class PremiumDiamondComponent: Component { rightParticleSystem.pop_add(rightAnimation, forKey: "speedFactor") } } + + self.diamondLayer.playAppearanceAnimation(velocity:nil, smallAngle: false, explode: true) } - -// var from = node.presentation.eulerAngles -// if abs(from.y - .pi * 2.0) < 0.001 { -// from.y = 0.0 -// } -// node.removeAnimation(forKey: "tapRotate") -// -// var toValue: Float = smallAngle ? 0.0 : .pi * 2.0 -// if let velocity = velocity, !smallAngle && abs(velocity) > 200 && velocity < 0.0 { -// toValue *= -1 -// } -// if mirror { -// toValue *= -1 -// } -// -// -// let to = SCNVector3(x: from.x, y: toValue, z: from.z) -// let distance = rad2deg(to.y - from.y) -// -// guard !distance.isZero else { -// Queue.mainQueue().after(0.1) { [weak self] in -// self?.setupContinuousRotation() -// } -// return -// } -// -// let springAnimation = CASpringAnimation(keyPath: "eulerAngles") -// springAnimation.fromValue = NSValue(scnVector3: from) -// springAnimation.toValue = NSValue(scnVector3: to) -// springAnimation.mass = 1.0 -// springAnimation.stiffness = 21.0 -// springAnimation.damping = 5.8 -// springAnimation.duration = springAnimation.settlingDuration * 0.75 -// springAnimation.initialVelocity = velocity.flatMap { abs($0 / CGFloat(distance)) } ?? 1.7 -// springAnimation.completion = { [weak self] finished in -// if finished { -// self?.setupContinuousRotation() -// } -// } -// node.addAnimation(springAnimation, forKey: "rotate") } func update(component: PremiumDiamondComponent, availableSize: CGSize, transition: ComponentTransition) -> CGSize { self.component = component self.sceneView.bounds = CGRect(origin: .zero, size: CGSize(width: availableSize.width * 2.0, height: availableSize.height * 2.0)) - if self.sceneView.superview == self { - self.sceneView.center = CGPoint(x: availableSize.width / 2.0, y: availableSize.height / 2.0) - } + self.sceneView.center = CGPoint(x: availableSize.width / 2.0, y: availableSize.height / 2.0) + + self.diamondLayer.bounds = CGRect(origin: .zero, size: CGSize(width: availableSize.height, height: availableSize.height)) + self.diamondLayer.position = CGPoint(x: availableSize.width / 2.0, y: availableSize.height / 2.0 - 8.0) return availableSize } diff --git a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsScreen.swift b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsScreen.swift index a693c1cc02..6f2f6d2faf 100644 --- a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsScreen.swift +++ b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsScreen.swift @@ -24,6 +24,7 @@ import TelegramStringFormatting import ListItemComponentAdaptor import ItemListUI import StarsWithdrawalScreen +import PremiumDiamondComponent private let initialSubscriptionsDisplayedLimit: Int32 = 3 @@ -33,7 +34,7 @@ final class StarsTransactionsScreenComponent: Component { let context: AccountContext let starsContext: StarsContext let starsRevenueStatsContext: StarsRevenueStatsContext - let subscriptionsContext: StarsSubscriptionsContext + let subscriptionsContext: StarsSubscriptionsContext? let openTransaction: (StarsContext.State.Transaction) -> Void let openSubscription: (StarsContext.State.Subscription) -> Void let buy: () -> Void @@ -45,7 +46,7 @@ final class StarsTransactionsScreenComponent: Component { context: AccountContext, starsContext: StarsContext, starsRevenueStatsContext: StarsRevenueStatsContext, - subscriptionsContext: StarsSubscriptionsContext, + subscriptionsContext: StarsSubscriptionsContext?, openTransaction: @escaping (StarsContext.State.Transaction) -> Void, openSubscription: @escaping (StarsContext.State.Subscription) -> Void, buy: @escaping () -> Void, @@ -399,22 +400,24 @@ final class StarsTransactionsScreenComponent: Component { } }) - self.subscriptionsStateDisposable = (component.subscriptionsContext.state - |> deliverOnMainQueue).start(next: { [weak self] state in - guard let self else { - return - } - let isFirstTime = self.subscriptionsState == nil - if !state.subscriptions.isEmpty { - self.subscriptionsState = state - } else { - self.subscriptionsState = nil - } - - if !self.isUpdating { - self.state?.updated(transition: isFirstTime ? .immediate : .spring(duration: 0.4)) - } - }) + if let subscriptionsContext = component.subscriptionsContext { + self.subscriptionsStateDisposable = (subscriptionsContext.state + |> deliverOnMainQueue).start(next: { [weak self] state in + guard let self else { + return + } + let isFirstTime = self.subscriptionsState == nil + if !state.subscriptions.isEmpty { + self.subscriptionsState = state + } else { + self.subscriptionsState = nil + } + + if !self.isUpdating { + self.state?.updated(transition: isFirstTime ? .immediate : .spring(duration: 0.4)) + } + }) + } } var wasLockedAtPanels = false @@ -495,10 +498,12 @@ final class StarsTransactionsScreenComponent: Component { } starTransition.setFrame(view: fadeView, frame: fadeFrame) } - - let starSize = self.starView.update( - transition: .immediate, - component: AnyComponent(PremiumStarComponent( + + let headerComponent: AnyComponent + if component.starsContext.ton { + headerComponent = AnyComponent(PremiumDiamondComponent()) + } else { + headerComponent = AnyComponent(PremiumStarComponent( theme: environment.theme, isIntro: true, isVisible: true, @@ -511,7 +516,12 @@ final class StarsTransactionsScreenComponent: Component { ], particleColor: UIColor(rgb: 0xf9b004), backgroundColor: environment.theme.list.blocksBackgroundColor - )), + )) + } + + let starSize = self.starView.update( + transition: .immediate, + component: headerComponent, environment: {}, containerSize: CGSize(width: min(414.0, availableSize.width), height: 220.0) ) @@ -528,7 +538,7 @@ final class StarsTransactionsScreenComponent: Component { if component.starsContext.ton { //TODO:localize titleString = "TON" - descriptionString = "Use TON to unlock content and services on Telegram" + descriptionString = "Use TON to submit post suggestions to channels on Telegram." } else { titleString = environment.strings.Stars_Intro_Title descriptionString = environment.strings.Stars_Intro_Description @@ -657,8 +667,9 @@ final class StarsTransactionsScreenComponent: Component { contentHeight += descriptionSize.height contentHeight += 29.0 - let withdrawAvailable = (self.revenueState?.balances.overallRevenue.value ?? 0) > 0 + let withdrawAvailable = component.starsContext.ton ? (self.starsState?.balance.value ?? 0) > 0 : (self.revenueState?.balances.overallRevenue.value ?? 0) > 0 + //TODO:localize let premiumConfiguration = PremiumConfiguration.with(appConfiguration: component.context.currentAppConfiguration.with { $0 }) let balanceSize = self.balanceView.update( transition: .immediate, @@ -674,25 +685,29 @@ final class StarsTransactionsScreenComponent: Component { count: self.starsState?.balance ?? StarsAmount.zero, currency: component.starsContext.ton ? .ton : .stars, rate: nil, - actionTitle: withdrawAvailable ? environment.strings.Stars_Intro_BuyShort : environment.strings.Stars_Intro_Buy, - actionAvailable: !premiumConfiguration.areStarsDisabled && !premiumConfiguration.isPremiumDisabled, + actionTitle: component.starsContext.ton ? "Withdraw via Fragment" : (withdrawAvailable ? environment.strings.Stars_Intro_BuyShort : environment.strings.Stars_Intro_Buy), + actionAvailable: (component.starsContext.ton && withdrawAvailable) || (!premiumConfiguration.areStarsDisabled && !premiumConfiguration.isPremiumDisabled), actionIsEnabled: true, - actionIcon: PresentationResourcesItemList.itemListRoundTopupIcon(environment.theme), + actionIcon: component.starsContext.ton ? nil : PresentationResourcesItemList.itemListRoundTopupIcon(environment.theme), action: { [weak self] in guard let self, let component = self.component else { return } - component.buy() + if component.starsContext.ton { + component.withdraw() + } else { + component.buy() + } }, - secondaryActionTitle: withdrawAvailable ? environment.strings.Stars_Intro_Stats : nil, - secondaryActionIcon: withdrawAvailable ? PresentationResourcesItemList.itemListStatsIcon(environment.theme) : nil, - secondaryAction: withdrawAvailable ? { [weak self] in + secondaryActionTitle: withdrawAvailable && !component.starsContext.ton ? environment.strings.Stars_Intro_Stats : nil, + secondaryActionIcon: withdrawAvailable && !component.starsContext.ton ? PresentationResourcesItemList.itemListStatsIcon(environment.theme) : nil, + secondaryAction: withdrawAvailable && !component.starsContext.ton ? { [weak self] in guard let self, let component = self.component else { return } component.withdraw() } : nil, - additionalAction: (premiumConfiguration.starsGiftsPurchaseAvailable && !premiumConfiguration.isPremiumDisabled) ? AnyComponent( + additionalAction: (premiumConfiguration.starsGiftsPurchaseAvailable && !premiumConfiguration.isPremiumDisabled && !component.starsContext.ton) ? AnyComponent( Button( content: AnyComponent( HStack([ @@ -918,7 +933,7 @@ final class StarsTransactionsScreenComponent: Component { self.subscriptionsExpanded = true } self.state?.updated(transition: .spring(duration: 0.4)) - component.subscriptionsContext.loadMore() + component.subscriptionsContext?.loadMore() }, highlighting: .default, updateIsHighlighted: { view, _ in @@ -1111,7 +1126,7 @@ public final class StarsTransactionsScreen: ViewControllerComponentContainer { private let context: AccountContext private let starsContext: StarsContext private let starsRevenueStatsContext: StarsRevenueStatsContext - private let subscriptionsContext: StarsSubscriptionsContext + private let subscriptionsContext: StarsSubscriptionsContext? private let options = Promise<[StarsTopUpOption]>() @@ -1125,7 +1140,11 @@ public final class StarsTransactionsScreen: ViewControllerComponentContainer { self.starsContext = starsContext self.starsRevenueStatsContext = context.engine.payments.peerStarsRevenueContext(peerId: context.account.peerId) - self.subscriptionsContext = context.engine.payments.peerStarsSubscriptionsContext(starsContext: starsContext) + if !starsContext.ton { + self.subscriptionsContext = context.engine.payments.peerStarsSubscriptionsContext(starsContext: starsContext) + } else { + self.subscriptionsContext = nil + } var buyImpl: (() -> Void)? var withdrawImpl: (() -> Void)? @@ -1196,9 +1215,9 @@ public final class StarsTransactionsScreen: ViewControllerComponentContainer { } if !updated { if subscription.flags.contains(.isCancelled) { - self.subscriptionsContext.updateSubscription(id: subscription.id, cancel: false) + self.subscriptionsContext?.updateSubscription(id: subscription.id, cancel: false) } else { - self.subscriptionsContext.updateSubscription(id: subscription.id, cancel: true) + self.subscriptionsContext?.updateSubscription(id: subscription.id, cancel: true) } } } else { @@ -1423,7 +1442,7 @@ public final class StarsTransactionsScreen: ViewControllerComponentContainer { } self.starsContext.load(force: false) - self.subscriptionsContext.loadMore() + self.subscriptionsContext?.loadMore() self.scrollToTop = { [weak self] in guard let self else { @@ -1444,6 +1463,6 @@ public final class StarsTransactionsScreen: ViewControllerComponentContainer { } public func update() { - self.subscriptionsContext.loadMore() + self.subscriptionsContext?.loadMore() } } diff --git a/submodules/TelegramUI/Components/TextFieldComponent/Sources/TextFieldComponent.swift b/submodules/TelegramUI/Components/TextFieldComponent/Sources/TextFieldComponent.swift index 8fa75ffef1..b07f313b0c 100644 --- a/submodules/TelegramUI/Components/TextFieldComponent/Sources/TextFieldComponent.swift +++ b/submodules/TelegramUI/Components/TextFieldComponent/Sources/TextFieldComponent.swift @@ -87,7 +87,7 @@ public final class TextFieldComponent: Component { case images([UIImage]) case video(Data) case gif(Data) - case text + case text(NSAttributedString) } @@ -158,6 +158,7 @@ public final class TextFieldComponent: Component { public let characterLimit: Int? public let enableInlineAnimations: Bool public let emptyLineHandling: EmptyLineHandling + public let externalHandlingForMultilinePaste: Bool public let formatMenuAvailability: FormatMenuAvailability public let returnKeyType: UIReturnKeyType public let lockedFormatAction: () -> Void @@ -184,6 +185,7 @@ public final class TextFieldComponent: Component { characterLimit: Int? = nil, enableInlineAnimations: Bool = true, emptyLineHandling: EmptyLineHandling = .allowed, + externalHandlingForMultilinePaste: Bool = false, formatMenuAvailability: FormatMenuAvailability, returnKeyType: UIReturnKeyType = .default, lockedFormatAction: @escaping () -> Void, @@ -471,6 +473,10 @@ public final class TextFieldComponent: Component { if let attributedString = attributedString { let current = self.inputState let range = NSMakeRange(current.selectionRange.lowerBound, current.selectionRange.count) + if component.externalHandlingForMultilinePaste, component.emptyLineHandling == .notAllowed, attributedString.string.contains("\n") { + component.paste(.text(attributedString)) + return false + } if !self.chatInputTextNode(shouldChangeTextIn: range, replacementText: attributedString.string) { return false } @@ -487,7 +493,7 @@ public final class TextFieldComponent: Component { if !self.isUpdating { self.state?.updated(transition: ComponentTransition(animation: .curve(duration: 0.4, curve: .spring)).withUserData(AnimationHint(view: self, kind: .textChanged))) } - component.paste(.text) + component.paste(.text(attributedString)) return false } @@ -537,7 +543,7 @@ public final class TextFieldComponent: Component { } } - component.paste(.text) + component.paste(.text(NSAttributedString())) return true } diff --git a/submodules/TelegramUI/Sources/ChatHistoryListNode.swift b/submodules/TelegramUI/Sources/ChatHistoryListNode.swift index ddd6aaddea..e9316c1180 100644 --- a/submodules/TelegramUI/Sources/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/Sources/ChatHistoryListNode.swift @@ -367,7 +367,8 @@ private func extractAssociatedData( chatThemes: [TelegramTheme], deviceContactsNumbers: Set, isInline: Bool, - showSensitiveContent: Bool + showSensitiveContent: Bool, + isSuspiciousPeer: Bool ) -> ChatMessageItemAssociatedData { var automaticDownloadPeerId: EnginePeer.Id? var automaticMediaDownloadPeerType: MediaAutoDownloadPeerType = .channel @@ -422,7 +423,7 @@ private func extractAssociatedData( automaticDownloadPeerId = message.peerId } - return ChatMessageItemAssociatedData(automaticDownloadPeerType: automaticMediaDownloadPeerType, automaticDownloadPeerId: automaticDownloadPeerId, automaticDownloadNetworkType: automaticDownloadNetworkType, preferredStoryHighQuality: preferredStoryHighQuality, isRecentActions: false, subject: subject, contactsPeerIds: contactsPeerIds, channelDiscussionGroup: channelDiscussionGroup, animatedEmojiStickers: animatedEmojiStickers, additionalAnimatedEmojiStickers: additionalAnimatedEmojiStickers, currentlyPlayingMessageId: currentlyPlayingMessageId, isCopyProtectionEnabled: isCopyProtectionEnabled, availableReactions: availableReactions, availableMessageEffects: availableMessageEffects, savedMessageTags: savedMessageTags, defaultReaction: defaultReaction, isPremium: isPremium, accountPeer: accountPeer, alwaysDisplayTranscribeButton: alwaysDisplayTranscribeButton, topicAuthorId: topicAuthorId, hasBots: hasBots, translateToLanguage: translateToLanguage, maxReadStoryId: maxReadStoryId, recommendedChannels: recommendedChannels, audioTranscriptionTrial: audioTranscriptionTrial, chatThemes: chatThemes, deviceContactsNumbers: deviceContactsNumbers, isInline: isInline, showSensitiveContent: showSensitiveContent) + return ChatMessageItemAssociatedData(automaticDownloadPeerType: automaticMediaDownloadPeerType, automaticDownloadPeerId: automaticDownloadPeerId, automaticDownloadNetworkType: automaticDownloadNetworkType, preferredStoryHighQuality: preferredStoryHighQuality, isRecentActions: false, subject: subject, contactsPeerIds: contactsPeerIds, channelDiscussionGroup: channelDiscussionGroup, animatedEmojiStickers: animatedEmojiStickers, additionalAnimatedEmojiStickers: additionalAnimatedEmojiStickers, currentlyPlayingMessageId: currentlyPlayingMessageId, isCopyProtectionEnabled: isCopyProtectionEnabled, availableReactions: availableReactions, availableMessageEffects: availableMessageEffects, savedMessageTags: savedMessageTags, defaultReaction: defaultReaction, isPremium: isPremium, accountPeer: accountPeer, alwaysDisplayTranscribeButton: alwaysDisplayTranscribeButton, topicAuthorId: topicAuthorId, hasBots: hasBots, translateToLanguage: translateToLanguage, maxReadStoryId: maxReadStoryId, recommendedChannels: recommendedChannels, audioTranscriptionTrial: audioTranscriptionTrial, chatThemes: chatThemes, deviceContactsNumbers: deviceContactsNumbers, isInline: isInline, showSensitiveContent: showSensitiveContent, isSuspiciousPeer: isSuspiciousPeer) } private extension ChatHistoryLocationInput { @@ -1986,7 +1987,12 @@ public final class ChatHistoryListNodeImpl: ListView, ChatHistoryNode, ChatHisto translateToLanguage = (normalizeTranslationLanguage(translationState.fromLang), normalizeTranslationLanguage(languageCode)) } - let associatedData = extractAssociatedData(chatLocation: chatLocation, view: view, automaticDownloadNetworkType: networkType, preferredStoryHighQuality: preferredStoryHighQuality, animatedEmojiStickers: animatedEmojiStickers, additionalAnimatedEmojiStickers: additionalAnimatedEmojiStickers, subject: subject, currentlyPlayingMessageId: currentlyPlayingMessageIdAndType?.0, isCopyProtectionEnabled: isCopyProtectionEnabled, availableReactions: availableReactions, availableMessageEffects: availableMessageEffects, savedMessageTags: savedMessageTags, defaultReaction: defaultReaction, isPremium: isPremium, alwaysDisplayTranscribeButton: alwaysDisplayTranscribeButton, accountPeer: accountPeer, topicAuthorId: topicAuthorId, hasBots: chatHasBots, translateToLanguage: translateToLanguage?.toLang, maxReadStoryId: maxReadStoryId, recommendedChannels: recommendedChannels, audioTranscriptionTrial: audioTranscriptionTrial, chatThemes: chatThemes, deviceContactsNumbers: deviceContactsNumbers, isInline: !rotated, showSensitiveContent: contentSettings.ignoreContentRestrictionReasons.contains("sensitive")) + var isSuspiciousPeer = false + if let cachedUserData = data.cachedData as? CachedUserData, let peerStatusSettings = cachedUserData.peerStatusSettings, peerStatusSettings.flags.contains(.canBlock) { + isSuspiciousPeer = true + } + + let associatedData = extractAssociatedData(chatLocation: chatLocation, view: view, automaticDownloadNetworkType: networkType, preferredStoryHighQuality: preferredStoryHighQuality, animatedEmojiStickers: animatedEmojiStickers, additionalAnimatedEmojiStickers: additionalAnimatedEmojiStickers, subject: subject, currentlyPlayingMessageId: currentlyPlayingMessageIdAndType?.0, isCopyProtectionEnabled: isCopyProtectionEnabled, availableReactions: availableReactions, availableMessageEffects: availableMessageEffects, savedMessageTags: savedMessageTags, defaultReaction: defaultReaction, isPremium: isPremium, alwaysDisplayTranscribeButton: alwaysDisplayTranscribeButton, accountPeer: accountPeer, topicAuthorId: topicAuthorId, hasBots: chatHasBots, translateToLanguage: translateToLanguage?.toLang, maxReadStoryId: maxReadStoryId, recommendedChannels: recommendedChannels, audioTranscriptionTrial: audioTranscriptionTrial, chatThemes: chatThemes, deviceContactsNumbers: deviceContactsNumbers, isInline: !rotated, showSensitiveContent: contentSettings.ignoreContentRestrictionReasons.contains("sensitive"), isSuspiciousPeer: isSuspiciousPeer) var includeEmbeddedSavedChatInfo = false if case let .replyThread(message) = chatLocation, message.peerId == context.account.peerId, !rotated { diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index ee7e2a1b93..c39b3ac5d2 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -3686,11 +3686,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { public func makeStarsTransactionsScreen(context: AccountContext, starsContext: StarsContext) -> ViewController { return StarsTransactionsScreen(context: context, starsContext: starsContext) } - - public func makeTonTransactionsScreen(context: AccountContext, tonContext: StarsContext) -> ViewController { - return TonTransactionsScreen(context: context, tonContext: tonContext) - } - + public func makeStarsPurchaseScreen(context: AccountContext, starsContext: StarsContext, options: [Any], purpose: StarsPurchasePurpose, completion: @escaping (Int64) -> Void) -> ViewController { return StarsPurchaseScreen(context: context, starsContext: starsContext, options: options, purpose: purpose, completion: completion) }