Add gift screen presentation source

This commit is contained in:
Ilya Laktyushin 2023-12-21 18:36:15 +04:00
parent 6795603c4e
commit c035b7d376
11 changed files with 62 additions and 18 deletions

View File

@ -302,6 +302,7 @@ public enum ResolvedUrl {
case story(peerId: PeerId, id: Int32)
case boost(peerId: PeerId, status: ChannelBoostStatus?, myBoostStatus: MyBoostStatus?)
case premiumGiftCode(slug: String)
case premiumMultiGift(reference: String?)
}
public enum ResolveUrlResult {
@ -941,7 +942,7 @@ public protocol SharedAccountContext: AnyObject {
func makePremiumIntroController(context: AccountContext, source: PremiumIntroSource, forceDark: Bool, dismissed: (() -> Void)?) -> ViewController
func makePremiumDemoController(context: AccountContext, subject: PremiumDemoSubject, action: @escaping () -> Void) -> ViewController
func makePremiumLimitController(context: AccountContext, subject: PremiumLimitSubject, count: Int32, forceDark: Bool, cancel: @escaping () -> Void, action: @escaping () -> Bool) -> ViewController
func makePremiumGiftController(context: AccountContext) -> ViewController
func makePremiumGiftController(context: AccountContext, source: PremiumGiftSource) -> ViewController
func makeStickerPackScreen(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, mainStickerPack: StickerPackReference, stickerPacks: [StickerPackReference], loadedStickerPacks: [LoadedStickerPack], parentNavigationController: NavigationController?, sendSticker: ((FileMediaReference, UIView, CGRect) -> Bool)?) -> ViewController
@ -1008,6 +1009,15 @@ public enum PremiumIntroSource {
case wallpapers
}
public enum PremiumGiftSource: Equatable {
case profile
case attachMenu
case settings
case chatList
case channelBoost
case deeplink(String?)
}
public enum PremiumDemoSubject {
case doubleLimits
case moreUpload

View File

@ -1612,7 +1612,7 @@ public final class ChatListNode: ListView {
guard let self else {
return
}
let controller = self.context.sharedContext.makePremiumGiftController(context: self.context)
let controller = self.context.sharedContext.makePremiumGiftController(context: self.context, source: .chatList)
self.push?(controller)
}, openActiveSessions: { [weak self] in
guard let self else {

View File

@ -236,7 +236,7 @@ public func PremiumBoostScreen(
actions: [
TextAlertAction(type: .defaultAction, title: presentationData.strings.ChannelBoost_MoreBoosts_Gift, action: {
dismissImpl?()
let controller = context.sharedContext.makePremiumGiftController(context: context)
let controller = context.sharedContext.makePremiumGiftController(context: context, source: .channelBoost)
pushController(controller)
}),
TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Close, action: {})

View File

@ -21,11 +21,7 @@ import TextFormat
import UniversalMediaPlayer
import InstantPageCache
public enum PremiumGiftSource: Equatable {
case profile
case attachMenu
case settings
extension PremiumGiftSource {
var identifier: String? {
switch self {
case .profile:
@ -34,6 +30,16 @@ public enum PremiumGiftSource: Equatable {
return "attach"
case .settings:
return "settings"
case .chatList:
return "chats"
case .channelBoost:
return "channel_boost"
case let .deeplink(reference):
if let reference = reference {
return "deeplink_\(reference)"
} else {
return "deeplink"
}
}
}
}

View File

@ -880,7 +880,7 @@ public class ReplaceBoostScreen: ViewController {
}
let navigationController = self.navigationController
self.dismiss(animated: true, completion: {
let giftController = context.sharedContext.makePremiumGiftController(context: context)
let giftController = context.sharedContext.makePremiumGiftController(context: context, source: .channelBoost)
navigationController?.pushViewController(giftController, animated: true)
})
}

View File

@ -1090,6 +1090,8 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
break
case .premiumGiftCode:
break
case .premiumMultiGift:
break
}
}
}))

View File

@ -8666,9 +8666,10 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
case .language:
push(LocalizationListController(context: self.context))
case .premium:
self.controller?.push(PremiumIntroScreen(context: self.context, modal: false, source: .settings))
let controller = self.context.sharedContext.makePremiumIntroController(context: self.context, source: .settings, forceDark: false, dismissed: nil)
self.controller?.push(controller)
case .premiumGift:
let controller = self.context.sharedContext.makePremiumGiftController(context: self.context)
let controller = self.context.sharedContext.makePremiumGiftController(context: self.context, source: .settings)
self.controller?.push(controller)
case .stickers:
if let settings = self.data?.globalSettings {

View File

@ -400,7 +400,7 @@ public final class StoryFooterPanelComponent: Component {
var displayViewLists = false
if case let .channel(channel) = component.peer, channel.flags.contains(.isCreator) || component.canViewChannelStats {
displayViewLists = reactionCount != 0 || forwardCount != 0
displayViewLists = true
} else {
displayViewLists = viewCount != 0 && !component.isChannel
}

View File

@ -581,7 +581,13 @@ func openResolvedUrlImpl(
}
case let .premiumOffer(reference):
dismissInput()
let controller = PremiumIntroScreen(context: context, source: .deeplink(reference))
let controller = context.sharedContext.makePremiumIntroController(context: context, source: .deeplink(reference), forceDark: false, dismissed: nil)
if let navigationController = navigationController {
navigationController.pushViewController(controller, animated: true)
}
case let .premiumMultiGift(reference):
dismissInput()
let controller = context.sharedContext.makePremiumGiftController(context: context, source: .deeplink(reference))
if let navigationController = navigationController {
navigationController.pushViewController(controller, animated: true)
}

View File

@ -842,6 +842,20 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur
}
}
handleResolvedUrl(.premiumOffer(reference: reference))
} else if parsedUrl.host == "premium_multigift" {
var reference: String?
if let components = URLComponents(string: "/?" + query) {
if let queryItems = components.queryItems {
for queryItem in queryItems {
if let value = queryItem.value {
if queryItem.name == "ref" {
reference = value
}
}
}
}
}
handleResolvedUrl(.premiumMultiGift(reference: reference))
} else if parsedUrl.host == "addlist" {
if let components = URLComponents(string: "/?" + query) {
var slug: String?

View File

@ -1805,10 +1805,12 @@ public final class SharedAccountContextImpl: SharedAccountContext {
}
public func makePremiumIntroController(context: AccountContext, source: PremiumIntroSource, forceDark: Bool, dismissed: (() -> Void)?) -> ViewController {
var modal = true
let mappedSource: PremiumSource
switch source {
case .settings:
mappedSource = .settings
modal = false
case .stickers:
mappedSource = .stickers
case .reactions:
@ -1872,7 +1874,7 @@ public final class SharedAccountContextImpl: SharedAccountContext {
case .wallpapers:
mappedSource = .wallpapers
}
let controller = PremiumIntroScreen(context: context, source: mappedSource, forceDark: forceDark)
let controller = PremiumIntroScreen(context: context, modal: modal, source: mappedSource, forceDark: forceDark)
controller.wasDismissed = dismissed
return controller
}
@ -1949,7 +1951,7 @@ public final class SharedAccountContextImpl: SharedAccountContext {
return PremiumLimitScreen(context: context, subject: mappedSubject, count: count, forceDark: forceDark, cancel: cancel, action: action)
}
public func makePremiumGiftController(context: AccountContext) -> ViewController {
public func makePremiumGiftController(context: AccountContext, source: PremiumGiftSource) -> ViewController {
let options = Promise<[PremiumGiftCodeOption]>()
options.set(context.engine.payments.premiumGiftCodeOptions(peerId: nil))
@ -1958,7 +1960,7 @@ public final class SharedAccountContextImpl: SharedAccountContext {
let limit: Int32 = 10
var reachedLimitImpl: ((Int32) -> Void)?
let controller = context.sharedContext.makeContactMultiselectionController(ContactMultiselectionControllerParams(context: context, mode: .premiumGifting, options: [], isPeerEnabled: { peer in
if case let .user(user) = peer, user.botInfo == nil {
if case let .user(user) = peer, user.botInfo == nil && !peer.isService && !user.flags.contains(.isSupport) {
return true
} else {
return false
@ -1990,11 +1992,14 @@ public final class SharedAccountContextImpl: SharedAccountContext {
}
})
}
guard !peerIds.isEmpty else {
return
}
let mappedOptions = options.filter { $0.users == 1 }.map { CachedPremiumGiftOption(months: $0.months, currency: $0.currency, amount: $0.amount, botUrl: "", storeProductId: $0.storeProductId) }
var pushImpl: ((ViewController) -> Void)?
var filterImpl: (() -> Void)?
let giftController = PremiumGiftScreen(context: context, peerIds: peerIds, options: mappedOptions, source: .settings, pushController: { c in
let giftController = PremiumGiftScreen(context: context, peerIds: peerIds, options: mappedOptions, source: source, pushController: { c in
pushImpl?(c)
}, completion: {
filterImpl?()