diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Payments/StarGifts.swift b/submodules/TelegramCore/Sources/TelegramEngine/Payments/StarGifts.swift index a4e7b20c1e..569002f704 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Payments/StarGifts.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Payments/StarGifts.swift @@ -834,6 +834,34 @@ public enum TransferStarGiftError { case disallowedStarGift } +public enum BuyStarGiftError { + case generic +} + +public enum UpgradeStarGiftError { + case generic +} + +func _internal_buyStarGift(account: Account, slug: String, peerId: EnginePeer.Id) -> Signal { + let source: BotPaymentInvoiceSource = .starGiftResale(slug: slug, toPeerId: peerId) + return _internal_fetchBotPaymentForm(accountPeerId: account.peerId, postbox: account.postbox, network: account.network, source: source, themeParams: nil) + |> map(Optional.init) + |> `catch` { error -> Signal in + return .fail(.generic) + } + |> mapToSignal { paymentForm in + if let paymentForm { + return _internal_sendStarsPaymentForm(account: account, formId: paymentForm.id, source: source) + |> mapError { _ -> BuyStarGiftError in + return .generic + } + |> ignoreValues + } else { + return .fail(.generic) + } + } +} + func _internal_transferStarGift(account: Account, prepaid: Bool, reference: StarGiftReference, peerId: EnginePeer.Id) -> Signal { return account.postbox.transaction { transaction -> (Api.InputPeer, Api.InputSavedStarGift)? in guard let inputPeer = transaction.getPeer(peerId).flatMap(apiInputPeer), let starGift = reference.apiStarGiftReference(transaction: transaction) else { @@ -886,10 +914,6 @@ func _internal_transferStarGift(account: Account, prepaid: Bool, reference: Star } } -public enum UpgradeStarGiftError { - case generic -} - func _internal_upgradeStarGift(account: Account, formId: Int64?, reference: StarGiftReference, keepOriginalInfo: Bool) -> Signal { if let formId { let source: BotPaymentInvoiceSource = .starGiftUpgrade(keepOriginalInfo: keepOriginalInfo, reference: reference) @@ -1424,6 +1448,25 @@ private final class ProfileGiftsContextImpl { return _internal_transferStarGift(account: self.account, prepaid: prepaid, reference: reference, peerId: peerId) } + func buyStarGift(reference: StarGiftReference, peerId: EnginePeer.Id) -> Signal { + var gift = self.gifts.first(where: { $0.reference == reference }) + if gift == nil { + gift = self.filteredGifts.first(where: { $0.reference == reference }) + } + guard case let .unique(uniqueGift) = gift?.gift else { + return .complete() + } + + if let count = self.count { + self.count = max(0, count - 1) + } + self.gifts.removeAll(where: { $0.reference == reference }) + self.filteredGifts.removeAll(where: { $0.reference == reference }) + self.pushState() + + return _internal_buyStarGift(account: self.account, slug: uniqueGift.slug, peerId: peerId) + } + func upgradeStarGift(formId: Int64?, reference: StarGiftReference, keepOriginalInfo: Bool) -> Signal { return Signal { [weak self] subscriber in guard let self else { @@ -1839,6 +1882,20 @@ public final class ProfileGiftsContext { } } + public func buyStarGift(reference: StarGiftReference, peerId: EnginePeer.Id) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + self.impl.with { impl in + disposable.set(impl.buyStarGift(reference: reference, peerId: peerId).start(error: { error in + subscriber.putError(error) + }, completed: { + subscriber.putCompletion() + })) + } + return disposable + } + } + public func transferStarGift(prepaid: Bool, reference: StarGiftReference, peerId: EnginePeer.Id) -> Signal { return Signal { subscriber in let disposable = MetaDisposable() diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Payments/TelegramEnginePayments.swift b/submodules/TelegramCore/Sources/TelegramEngine/Payments/TelegramEnginePayments.swift index e92368e3dc..4207c622b2 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Payments/TelegramEnginePayments.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Payments/TelegramEnginePayments.swift @@ -125,6 +125,10 @@ public extension TelegramEngine { return _internal_transferStarGift(account: self.account, prepaid: prepaid, reference: reference, peerId: peerId) } + public func buyStarGift(prepaid: Bool, slug: String, peerId: EnginePeer.Id) -> Signal { + return _internal_buyStarGift(account: self.account, slug: slug, peerId: peerId) + } + public func upgradeStarGift(formId: Int64?, reference: StarGiftReference, keepOriginalInfo: Bool) -> Signal { return _internal_upgradeStarGift(account: self.account, formId: formId, reference: reference, keepOriginalInfo: keepOriginalInfo) }