mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Stars ref
This commit is contained in:
parent
c49b242cd5
commit
c229c3c94f
@ -1575,7 +1575,8 @@ private func monetizationEntries(
|
||||
premiumConfiguration: PremiumConfiguration,
|
||||
monetizationConfiguration: MonetizationConfiguration,
|
||||
canViewRevenue: Bool,
|
||||
canViewStarsRevenue: Bool
|
||||
canViewStarsRevenue: Bool,
|
||||
canJoinRefPrograms: Bool
|
||||
) -> [StatsEntry] {
|
||||
var entries: [StatsEntry] = []
|
||||
|
||||
@ -1700,8 +1701,10 @@ private func monetizationEntries(
|
||||
|
||||
if displayStarsTransactions {
|
||||
if !addedTransactionsTabs {
|
||||
//TODO:localize
|
||||
entries.append(.earnStarsInfo)
|
||||
if canJoinRefPrograms {
|
||||
//TODO:localize
|
||||
entries.append(.earnStarsInfo)
|
||||
}
|
||||
|
||||
entries.append(.adsTransactionsTitle(presentationData.theme, presentationData.strings.Monetization_StarsTransactions.uppercased()))
|
||||
}
|
||||
@ -1767,7 +1770,8 @@ private func channelStatsControllerEntries(
|
||||
premiumConfiguration: PremiumConfiguration,
|
||||
monetizationConfiguration: MonetizationConfiguration,
|
||||
canViewRevenue: Bool,
|
||||
canViewStarsRevenue: Bool
|
||||
canViewStarsRevenue: Bool,
|
||||
canJoinRefPrograms: Bool
|
||||
) -> [StatsEntry] {
|
||||
switch state.section {
|
||||
case .stats:
|
||||
@ -1809,7 +1813,8 @@ private func channelStatsControllerEntries(
|
||||
premiumConfiguration: premiumConfiguration,
|
||||
monetizationConfiguration: monetizationConfiguration,
|
||||
canViewRevenue: canViewRevenue,
|
||||
canViewStarsRevenue: canViewStarsRevenue
|
||||
canViewStarsRevenue: canViewStarsRevenue,
|
||||
canJoinRefPrograms: canJoinRefPrograms
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -2157,6 +2162,15 @@ public func channelStatsController(
|
||||
let (canViewStats, adsRestricted, _, canViewStarsRevenue) = peerData
|
||||
var canViewRevenue = peerData.2
|
||||
|
||||
var canJoinRefPrograms = false
|
||||
if let data = context.currentAppConfiguration.with({ $0 }).data, let value = data["starref_connect_allowed"] {
|
||||
if let value = value as? Double {
|
||||
canJoinRefPrograms = value != 0.0
|
||||
} else if let value = value as? Bool {
|
||||
canJoinRefPrograms = value
|
||||
}
|
||||
}
|
||||
|
||||
let _ = canViewStatsValue.swap(canViewStats)
|
||||
|
||||
var isGroup = false
|
||||
@ -2262,7 +2276,7 @@ public func channelStatsController(
|
||||
}
|
||||
|
||||
let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: title, leftNavigationButton: leftNavigationButton, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true)
|
||||
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: channelStatsControllerEntries(presentationData: presentationData, state: state, peer: peer, data: data, messages: messages, stories: stories, interactions: interactions, boostData: boostData, boostersState: boostersState, giftsState: giftsState, giveawayAvailable: premiumConfiguration.giveawayGiftsPurchaseAvailable, isGroup: isGroup, boostsOnly: boostsOnly, revenueState: revenueState?.stats, revenueTransactions: revenueTransactions, starsState: starsState?.stats, starsTransactions: starsTransactions, adsRestricted: adsRestricted, premiumConfiguration: premiumConfiguration, monetizationConfiguration: monetizationConfiguration, canViewRevenue: canViewRevenue, canViewStarsRevenue: canViewStarsRevenue), style: .blocks, emptyStateItem: emptyStateItem, headerItem: headerItem, crossfadeState: previous == nil, animateChanges: false)
|
||||
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: channelStatsControllerEntries(presentationData: presentationData, state: state, peer: peer, data: data, messages: messages, stories: stories, interactions: interactions, boostData: boostData, boostersState: boostersState, giftsState: giftsState, giveawayAvailable: premiumConfiguration.giveawayGiftsPurchaseAvailable, isGroup: isGroup, boostsOnly: boostsOnly, revenueState: revenueState?.stats, revenueTransactions: revenueTransactions, starsState: starsState?.stats, starsTransactions: starsTransactions, adsRestricted: adsRestricted, premiumConfiguration: premiumConfiguration, monetizationConfiguration: monetizationConfiguration, canViewRevenue: canViewRevenue, canViewStarsRevenue: canViewStarsRevenue, canJoinRefPrograms: canJoinRefPrograms), style: .blocks, emptyStateItem: emptyStateItem, headerItem: headerItem, crossfadeState: previous == nil, animateChanges: false)
|
||||
|
||||
return (controllerState, (listState, arguments))
|
||||
}
|
||||
|
@ -180,7 +180,7 @@ private final class ChatMessageActionButtonNode: ASDisplayNode {
|
||||
iconImage = incoming ? graphics.chatBubbleActionButtonIncomingMessageIconImage : graphics.chatBubbleActionButtonOutgoingMessageIconImage
|
||||
case let .url(value):
|
||||
var isApp = false
|
||||
if isTelegramMeLink(value), let internalUrl = parseFullInternalUrl(sharedContext: context.sharedContext, url: value) {
|
||||
if isTelegramMeLink(value), let internalUrl = parseFullInternalUrl(sharedContext: context.sharedContext, context: context, url: value) {
|
||||
if case .peer(_, .appStart) = internalUrl {
|
||||
isApp = true
|
||||
} else if case .peer(_, .attachBotStart) = internalUrl {
|
||||
|
@ -65,6 +65,12 @@ final class AffiliateProgramSetupScreenComponent: Component {
|
||||
return true
|
||||
}
|
||||
|
||||
private class ScrollView: UIScrollView {
|
||||
override func touchesShouldCancel(in view: UIView) -> Bool {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
final class View: UIView, UIScrollViewDelegate {
|
||||
private let scrollView: UIScrollView
|
||||
|
||||
@ -119,7 +125,7 @@ final class AffiliateProgramSetupScreenComponent: Component {
|
||||
private var isSuggestedSortModeUpdating: Bool = false
|
||||
|
||||
override init(frame: CGRect) {
|
||||
self.scrollView = UIScrollView()
|
||||
self.scrollView = ScrollView()
|
||||
self.scrollView.showsVerticalScrollIndicator = true
|
||||
self.scrollView.showsHorizontalScrollIndicator = false
|
||||
self.scrollView.scrollsToTop = false
|
||||
@ -456,6 +462,20 @@ If you end your affiliate program:
|
||||
controller.presentInGlobalOverlay(contextController)
|
||||
}
|
||||
|
||||
private func openExistingAffiliatePrograms() {
|
||||
guard let component = self.component else {
|
||||
return
|
||||
}
|
||||
let _ = (component.context.sharedContext.makeAffiliateProgramSetupScreenInitialData(context: component.context, peerId: component.initialContent.peerId, mode: .connectedPrograms)
|
||||
|> deliverOnMainQueue).startStandalone(next: { [weak self] initialData in
|
||||
guard let self, let component = self.component else {
|
||||
return
|
||||
}
|
||||
let setupScreen = component.context.sharedContext.makeAffiliateProgramSetupScreen(context: component.context, initialData: initialData)
|
||||
self.environment?.controller()?.push(setupScreen)
|
||||
})
|
||||
}
|
||||
|
||||
func update(component: AffiliateProgramSetupScreenComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment<EnvironmentType>, transition: ComponentTransition) -> CGSize {
|
||||
self.isUpdating = true
|
||||
defer {
|
||||
@ -991,8 +1011,7 @@ If you end your affiliate program:
|
||||
guard let self else {
|
||||
return
|
||||
}
|
||||
|
||||
let _ = self
|
||||
self.openExistingAffiliatePrograms()
|
||||
}
|
||||
)))
|
||||
],
|
||||
|
@ -92,7 +92,7 @@ private final class JoinAffiliateProgramScreenComponent: Component {
|
||||
|
||||
private let linkIconBackground = ComponentView<Empty>()
|
||||
private let linkIcon = ComponentView<Empty>()
|
||||
private let linkIconBadge = ComponentView<Empty>()
|
||||
private var linkIconBadge: ComponentView<Empty>?
|
||||
|
||||
private let title = ComponentView<Empty>()
|
||||
private let subtitle = ComponentView<Empty>()
|
||||
@ -668,7 +668,17 @@ private final class JoinAffiliateProgramScreenComponent: Component {
|
||||
}
|
||||
|
||||
if active.bot.participants != 0 {
|
||||
let linkIconBadgeSize = self.linkIconBadge.update(
|
||||
let linkIconBadge: ComponentView<Empty>
|
||||
var linkIconBadgeTransition = transition
|
||||
if let current = self.linkIconBadge {
|
||||
linkIconBadge = current
|
||||
} else {
|
||||
linkIconBadgeTransition = linkIconBadgeTransition.withAnimation(.none)
|
||||
linkIconBadge = ComponentView()
|
||||
self.linkIconBadge = linkIconBadge
|
||||
}
|
||||
|
||||
let linkIconBadgeSize = linkIconBadge.update(
|
||||
transition: .immediate,
|
||||
component: AnyComponent(BorderedBadgeComponent(
|
||||
backgroundColor: UIColor(rgb: 0x34C759),
|
||||
@ -690,12 +700,15 @@ private final class JoinAffiliateProgramScreenComponent: Component {
|
||||
containerSize: CGSize(width: 100.0, height: 100.0)
|
||||
)
|
||||
let linkIconBadgeFrame = CGRect(origin: CGPoint(x: linkIconBackgroundFrame.minX + floor((linkIconBackgroundFrame.width - linkIconBadgeSize.width) * 0.5), y: linkIconBackgroundFrame.maxY - floor(linkIconBadgeSize.height * 0.5)), size: linkIconBadgeSize)
|
||||
if let linkIconBadgeView = self.linkIconBadge.view {
|
||||
if let linkIconBadgeView = linkIconBadge.view {
|
||||
if linkIconBadgeView.superview == nil {
|
||||
self.scrollContentView.addSubview(linkIconBadgeView)
|
||||
}
|
||||
transition.setFrame(view: linkIconBadgeView, frame: linkIconBadgeFrame)
|
||||
linkIconBadgeTransition.setFrame(view: linkIconBadgeView, frame: linkIconBadgeFrame)
|
||||
}
|
||||
} else if let linkIconBadge = self.linkIconBadge {
|
||||
self.linkIconBadge = nil
|
||||
linkIconBadge.view?.removeFromSuperview()
|
||||
}
|
||||
|
||||
contentHeight += linkIconBackgroundSize.height + 21.0
|
||||
@ -895,6 +908,7 @@ private final class JoinAffiliateProgramScreenComponent: Component {
|
||||
self.scrollContentView.addSubview(linkTextView)
|
||||
}
|
||||
transition.setFrame(view: linkTextView, frame: linkTextFrame)
|
||||
transition.setAlpha(view: linkTextView, alpha: self.isChangingTargetPeer ? 0.6 : 1.0)
|
||||
}
|
||||
contentHeight += linkTextSize.height
|
||||
contentHeight += 24.0
|
||||
|
@ -1430,17 +1430,28 @@ private func infoItems(data: PeerInfoScreenData?, context: AccountContext, prese
|
||||
if let botInfo = user.botInfo, botInfo.flags.contains(.canEdit) {
|
||||
} else {
|
||||
if let starRefProgram = cachedData.starRefProgram, starRefProgram.endDate == nil {
|
||||
if items[.botAffiliateProgram] == nil {
|
||||
items[.botAffiliateProgram] = []
|
||||
var canJoinRefProgram = false
|
||||
if let data = context.currentAppConfiguration.with({ $0 }).data, let value = data["starref_connect_allowed"] {
|
||||
if let value = value as? Double {
|
||||
canJoinRefProgram = value != 0.0
|
||||
} else if let value = value as? Bool {
|
||||
canJoinRefProgram = value
|
||||
}
|
||||
}
|
||||
|
||||
if canJoinRefProgram {
|
||||
if items[.botAffiliateProgram] == nil {
|
||||
items[.botAffiliateProgram] = []
|
||||
}
|
||||
//TODO:localize
|
||||
let programTitleValue: String
|
||||
programTitleValue = "\(starRefProgram.commissionPermille / 10)%"
|
||||
//TODO:localize
|
||||
items[.botAffiliateProgram]!.append(PeerInfoScreenDisclosureItem(id: 0, label: .labelBadge(programTitleValue), additionalBadgeLabel: nil, text: "Affiliate Program", icon: PresentationResourcesSettings.affiliateProgram, action: {
|
||||
interaction.editingOpenAffiliateProgram()
|
||||
}))
|
||||
items[.botAffiliateProgram]!.append(PeerInfoScreenCommentItem(id: 1, text: "Share a link to \(EnginePeer.user(user).compactDisplayTitle) with your friends and and earn \(starRefProgram.commissionPermille / 10)% of their spending there."))
|
||||
}
|
||||
//TODO:localize
|
||||
let programTitleValue: String
|
||||
programTitleValue = "\(starRefProgram.commissionPermille / 10)%"
|
||||
//TODO:localize
|
||||
items[.botAffiliateProgram]!.append(PeerInfoScreenDisclosureItem(id: 0, label: .labelBadge(programTitleValue), additionalBadgeLabel: nil, text: "Affiliate Program", icon: PresentationResourcesSettings.affiliateProgram, action: {
|
||||
interaction.editingOpenAffiliateProgram()
|
||||
}))
|
||||
items[.botAffiliateProgram]!.append(PeerInfoScreenCommentItem(id: 1, text: "Share a link to \(EnginePeer.user(user).compactDisplayTitle) with your friends and and earn \(starRefProgram.commissionPermille / 10)% of their spending there."))
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1938,16 +1949,28 @@ private func editingItems(data: PeerInfoScreenData?, state: PeerInfoState, chatL
|
||||
items[.peerDataSettings]!.append(PeerInfoScreenDisclosureItem(id: ItemUsername, label: .text("@\(user.addressName ?? "")"), text: presentationData.strings.PeerInfo_Bot_Username, icon: PresentationResourcesSettings.bot, action: {
|
||||
interaction.editingOpenPublicLinkSetup()
|
||||
}))
|
||||
//TODO:localize
|
||||
let programTitleValue: PeerInfoScreenDisclosureItem.Label
|
||||
if let cachedData = data.cachedData as? CachedUserData, let starRefProgram = cachedData.starRefProgram, starRefProgram.endDate == nil {
|
||||
programTitleValue = .labelBadge("\(starRefProgram.commissionPermille / 10)%")
|
||||
} else {
|
||||
programTitleValue = .text("Off")
|
||||
|
||||
var canSetupRefProgram = false
|
||||
if let data = context.currentAppConfiguration.with({ $0 }).data, let value = data["starref_program_allowed"] {
|
||||
if let value = value as? Double {
|
||||
canSetupRefProgram = value != 0.0
|
||||
} else if let value = value as? Bool {
|
||||
canSetupRefProgram = value
|
||||
}
|
||||
}
|
||||
|
||||
if canSetupRefProgram {
|
||||
//TODO:localize
|
||||
let programTitleValue: PeerInfoScreenDisclosureItem.Label
|
||||
if let cachedData = data.cachedData as? CachedUserData, let starRefProgram = cachedData.starRefProgram, starRefProgram.endDate == nil {
|
||||
programTitleValue = .labelBadge("\(starRefProgram.commissionPermille / 10)%")
|
||||
} else {
|
||||
programTitleValue = .text("Off")
|
||||
}
|
||||
items[.peerDataSettings]!.append(PeerInfoScreenDisclosureItem(id: ItemAffiliateProgram, label: programTitleValue, additionalBadgeLabel: presentationData.strings.Settings_New, text: "Affiliate Program", icon: PresentationResourcesSettings.affiliateProgram, action: {
|
||||
interaction.editingOpenAffiliateProgram()
|
||||
}))
|
||||
}
|
||||
items[.peerDataSettings]!.append(PeerInfoScreenDisclosureItem(id: ItemAffiliateProgram, label: programTitleValue, additionalBadgeLabel: presentationData.strings.Settings_New, text: "Affiliate Program", icon: PresentationResourcesSettings.affiliateProgram, action: {
|
||||
interaction.editingOpenAffiliateProgram()
|
||||
}))
|
||||
|
||||
items[.peerSettings]!.append(PeerInfoScreenActionItem(id: ItemIntro, text: presentationData.strings.PeerInfo_Bot_EditIntro, icon: UIImage(bundleImageName: "Peer Info/BotIntro"), action: {
|
||||
interaction.openPeerMention("botfather", .withBotStartPayload(ChatControllerInitialBotStart(payload: "\(user.addressName ?? "")-intro", behavior: .interactive)))
|
||||
@ -2199,9 +2222,20 @@ private func editingItems(data: PeerInfoScreenData?, state: PeerInfoState, chatL
|
||||
}
|
||||
|
||||
if channel.hasPermission(.changeInfo) {
|
||||
items[.peerAdditionalSettings]!.append(PeerInfoScreenDisclosureItem(id: ItemAffiliatePrograms, label: .text(""), additionalBadgeLabel: presentationData.strings.Settings_New, text: "Affiliate Programs", icon: PresentationResourcesSettings.affiliateProgram, action: {
|
||||
interaction.editingOpenAffiliateProgram()
|
||||
}))
|
||||
var canJoinRefProgram = false
|
||||
if let data = context.currentAppConfiguration.with({ $0 }).data, let value = data["starref_connect_allowed"] {
|
||||
if let value = value as? Double {
|
||||
canJoinRefProgram = value != 0.0
|
||||
} else if let value = value as? Bool {
|
||||
canJoinRefProgram = value
|
||||
}
|
||||
}
|
||||
|
||||
if canJoinRefProgram {
|
||||
items[.peerAdditionalSettings]!.append(PeerInfoScreenDisclosureItem(id: ItemAffiliatePrograms, label: .text(""), additionalBadgeLabel: presentationData.strings.Settings_New, text: "Affiliate Programs", icon: PresentationResourcesSettings.affiliateProgram, action: {
|
||||
interaction.editingOpenAffiliateProgram()
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
if isCreator { //if let cachedData = data.cachedData as? CachedChannelData, cachedData.flags.contains(.canDeleteHistory) {
|
||||
@ -8596,7 +8630,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
if let peer = self.data?.peer as? TelegramUser, let botInfo = peer.botInfo {
|
||||
if botInfo.flags.contains(.canEdit) {
|
||||
let _ = (self.context.sharedContext.makeAffiliateProgramSetupScreenInitialData(context: self.context, peerId: peer.id, mode: .editProgram)
|
||||
|> deliverOnMainQueue).startStandalone(next: { [weak self] initialData in
|
||||
|> deliverOnMainQueue).startStandalone(next: { [weak self] initialData in
|
||||
guard let self else {
|
||||
return
|
||||
}
|
||||
|
@ -662,46 +662,57 @@ final class StarsTransactionsScreenComponent: Component {
|
||||
contentHeight += balanceSize.height
|
||||
contentHeight += 34.0
|
||||
|
||||
let earnStarsSectionSize = self.earnStarsSection.update(
|
||||
transition: .immediate,
|
||||
component: AnyComponent(ListSectionComponent(
|
||||
theme: environment.theme,
|
||||
header: nil,
|
||||
footer: nil,
|
||||
items: [
|
||||
//TODO:localize
|
||||
AnyComponentWithIdentity(id: 0, component: AnyComponent(ListItemComponentAdaptor(
|
||||
itemGenerator: ItemListDisclosureItem(presentationData: ItemListPresentationData(presentationData), icon: PresentationResourcesSettings.earnStars, title: "Earn Stars", titleBadge: presentationData.strings.Settings_New, label: "Distribute links to mini apps and earn a share of their revenue in Stars.", labelStyle: .multilineDetailText, sectionId: 0, style: .blocks, action: {
|
||||
}),
|
||||
params: ListViewItemLayoutParams(width: availableSize.width, leftInset: 0.0, rightInset: 0.0, availableHeight: 10000.0, isStandalone: true),
|
||||
action: { [weak self] in
|
||||
guard let self, let component = self.component else {
|
||||
return
|
||||
}
|
||||
let _ = (component.context.sharedContext.makeAffiliateProgramSetupScreenInitialData(context: component.context, peerId: component.context.account.peerId, mode: .connectedPrograms)
|
||||
|> deliverOnMainQueue).startStandalone(next: { [weak self] initialData in
|
||||
var canJoinRefProgram = false
|
||||
if let data = component.context.currentAppConfiguration.with({ $0 }).data, let value = data["starref_connect_allowed"] {
|
||||
if let value = value as? Double {
|
||||
canJoinRefProgram = value != 0.0
|
||||
} else if let value = value as? Bool {
|
||||
canJoinRefProgram = value
|
||||
}
|
||||
}
|
||||
|
||||
if canJoinRefProgram {
|
||||
let earnStarsSectionSize = self.earnStarsSection.update(
|
||||
transition: .immediate,
|
||||
component: AnyComponent(ListSectionComponent(
|
||||
theme: environment.theme,
|
||||
header: nil,
|
||||
footer: nil,
|
||||
items: [
|
||||
//TODO:localize
|
||||
AnyComponentWithIdentity(id: 0, component: AnyComponent(ListItemComponentAdaptor(
|
||||
itemGenerator: ItemListDisclosureItem(presentationData: ItemListPresentationData(presentationData), icon: PresentationResourcesSettings.earnStars, title: "Earn Stars", titleBadge: presentationData.strings.Settings_New, label: "Distribute links to mini apps and earn a share of their revenue in Stars.", labelStyle: .multilineDetailText, sectionId: 0, style: .blocks, action: {
|
||||
}),
|
||||
params: ListViewItemLayoutParams(width: availableSize.width, leftInset: 0.0, rightInset: 0.0, availableHeight: 10000.0, isStandalone: true),
|
||||
action: { [weak self] in
|
||||
guard let self, let component = self.component else {
|
||||
return
|
||||
}
|
||||
let setupScreen = component.context.sharedContext.makeAffiliateProgramSetupScreen(context: component.context, initialData: initialData)
|
||||
self.controller?()?.push(setupScreen)
|
||||
})
|
||||
}
|
||||
)))
|
||||
]
|
||||
)),
|
||||
environment: {},
|
||||
containerSize: CGSize(width: availableSize.width - sideInsets, height: availableSize.height)
|
||||
)
|
||||
let earnStarsSectionFrame = CGRect(origin: CGPoint(x: sideInsets * 0.5, y: contentHeight), size: earnStarsSectionSize)
|
||||
if let earnStarsSectionView = self.earnStarsSection.view {
|
||||
if earnStarsSectionView.superview == nil {
|
||||
self.scrollView.addSubview(earnStarsSectionView)
|
||||
let _ = (component.context.sharedContext.makeAffiliateProgramSetupScreenInitialData(context: component.context, peerId: component.context.account.peerId, mode: .connectedPrograms)
|
||||
|> deliverOnMainQueue).startStandalone(next: { [weak self] initialData in
|
||||
guard let self, let component = self.component else {
|
||||
return
|
||||
}
|
||||
let setupScreen = component.context.sharedContext.makeAffiliateProgramSetupScreen(context: component.context, initialData: initialData)
|
||||
self.controller?()?.push(setupScreen)
|
||||
})
|
||||
}
|
||||
)))
|
||||
]
|
||||
)),
|
||||
environment: {},
|
||||
containerSize: CGSize(width: availableSize.width - sideInsets, height: availableSize.height)
|
||||
)
|
||||
let earnStarsSectionFrame = CGRect(origin: CGPoint(x: sideInsets * 0.5, y: contentHeight), size: earnStarsSectionSize)
|
||||
if let earnStarsSectionView = self.earnStarsSection.view {
|
||||
if earnStarsSectionView.superview == nil {
|
||||
self.scrollView.addSubview(earnStarsSectionView)
|
||||
}
|
||||
starTransition.setFrame(view: earnStarsSectionView, frame: earnStarsSectionFrame)
|
||||
}
|
||||
starTransition.setFrame(view: earnStarsSectionView, frame: earnStarsSectionFrame)
|
||||
contentHeight += earnStarsSectionSize.height
|
||||
contentHeight += 44.0
|
||||
}
|
||||
contentHeight += earnStarsSectionSize.height
|
||||
contentHeight += 44.0
|
||||
|
||||
let fontBaseDisplaySize = 17.0
|
||||
var subscriptionsItems: [AnyComponentWithIdentity<Empty>] = []
|
||||
|
@ -118,7 +118,7 @@ func openWebAppImpl(
|
||||
|
||||
var fullSize = false
|
||||
var isFullscreen = false
|
||||
if isTelegramMeLink(url), let internalUrl = parseFullInternalUrl(sharedContext: context.sharedContext, url: url), case .peer(_, .appStart) = internalUrl {
|
||||
if isTelegramMeLink(url), let internalUrl = parseFullInternalUrl(sharedContext: context.sharedContext, context: context, url: url), case .peer(_, .appStart) = internalUrl {
|
||||
if url.contains("mode=fullscreen") {
|
||||
isFullscreen = true
|
||||
fullSize = true
|
||||
|
@ -1147,7 +1147,7 @@ public final class ChatHistoryListNodeImpl: ListView, ChatHistoryNode, ChatHisto
|
||||
self.allAdMessages = (messages.first, [], 0)
|
||||
} else {
|
||||
var adPeerName: String?
|
||||
if let adAttribute = messages.first?.adAttribute, let parsedUrl = parseAdUrl(sharedContext: self.context.sharedContext, url: adAttribute.url), case let .peer(reference, _) = parsedUrl, case let .name(peerName) = reference {
|
||||
if let adAttribute = messages.first?.adAttribute, let parsedUrl = parseAdUrl(sharedContext: self.context.sharedContext, context: self.context, url: adAttribute.url), case let .peer(reference, _) = parsedUrl, case let .name(peerName) = reference {
|
||||
adPeerName = peerName
|
||||
}
|
||||
|
||||
|
@ -114,7 +114,7 @@ public func parseConfirmationCodeUrl(sharedContext: SharedAccountContext, url: U
|
||||
}
|
||||
}
|
||||
if url.scheme == "tg" {
|
||||
if let host = url.host, let query = url.query, let parsedUrl = parseInternalUrl(sharedContext: sharedContext, query: host + "?" + query) {
|
||||
if let host = url.host, let query = url.query, let parsedUrl = parseInternalUrl(sharedContext: sharedContext, context: nil, query: host + "?" + query) {
|
||||
switch parsedUrl {
|
||||
case let .confirmationCode(code):
|
||||
return code
|
||||
|
@ -113,7 +113,7 @@ private enum ParsedUrl {
|
||||
case internalUrl(ParsedInternalUrl)
|
||||
}
|
||||
|
||||
public func parseInternalUrl(sharedContext: SharedAccountContext, query: String) -> ParsedInternalUrl? {
|
||||
public func parseInternalUrl(sharedContext: SharedAccountContext, context: AccountContext?, query: String) -> ParsedInternalUrl? {
|
||||
var query = query
|
||||
if query.hasPrefix("s/") {
|
||||
query = String(query[query.index(query.startIndex, offsetBy: 2)...])
|
||||
@ -270,7 +270,12 @@ public func parseInternalUrl(sharedContext: SharedAccountContext, query: String)
|
||||
}
|
||||
return .peer(.name(peerName), .attachBotStart(value, startAttach))
|
||||
} else if queryItem.name == "start" {
|
||||
let linkRefPrefix = "_tgref_"
|
||||
var linkRefPrefix = "_tgr_"
|
||||
if let context {
|
||||
if let data = context.currentAppConfiguration.with({ $0 }).data, let value = data["starref_start_param_prefixes"] as? String {
|
||||
linkRefPrefix = value
|
||||
}
|
||||
}
|
||||
if value.hasPrefix(linkRefPrefix) {
|
||||
let referrer = String(value[value.index(value.startIndex, offsetBy: linkRefPrefix.count)...])
|
||||
return .peer(.name(peerName), .referrer(referrer))
|
||||
@ -1139,14 +1144,14 @@ public func parseProxyUrl(sharedContext: SharedAccountContext, url: String) -> (
|
||||
for scheme in schemes {
|
||||
let basePrefix = scheme + basePath + "/"
|
||||
if url.lowercased().hasPrefix(basePrefix) {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, query: String(url[basePrefix.endIndex...])), case let .proxy(host, port, username, password, secret) = internalUrl {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, context: nil, query: String(url[basePrefix.endIndex...])), case let .proxy(host, port, username, password, secret) = internalUrl {
|
||||
return (host, port, username, password, secret)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if let parsedUrl = URL(string: url), parsedUrl.scheme == "tg", let host = parsedUrl.host, let query = parsedUrl.query {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, query: host + "?" + query), case let .proxy(host, port, username, password, secret) = internalUrl {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, context: nil, query: host + "?" + query), case let .proxy(host, port, username, password, secret) = internalUrl {
|
||||
return (host, port, username, password, secret)
|
||||
}
|
||||
}
|
||||
@ -1160,14 +1165,14 @@ public func parseStickerPackUrl(sharedContext: SharedAccountContext, url: String
|
||||
for scheme in schemes {
|
||||
let basePrefix = scheme + basePath + "/"
|
||||
if url.lowercased().hasPrefix(basePrefix) {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, query: String(url[basePrefix.endIndex...])), case let .stickerPack(name, _) = internalUrl {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, context: nil, query: String(url[basePrefix.endIndex...])), case let .stickerPack(name, _) = internalUrl {
|
||||
return name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if let parsedUrl = URL(string: url), parsedUrl.scheme == "tg", let host = parsedUrl.host, let query = parsedUrl.query {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, query: host + "?" + query), case let .stickerPack(name, _) = internalUrl {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, context: nil, query: host + "?" + query), case let .stickerPack(name, _) = internalUrl {
|
||||
return name
|
||||
}
|
||||
}
|
||||
@ -1181,14 +1186,14 @@ public func parseWallpaperUrl(sharedContext: SharedAccountContext, url: String)
|
||||
for scheme in schemes {
|
||||
let basePrefix = scheme + basePath + "/"
|
||||
if url.lowercased().hasPrefix(basePrefix) {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, query: String(url[basePrefix.endIndex...])), case let .wallpaper(wallpaper) = internalUrl {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, context: nil, query: String(url[basePrefix.endIndex...])), case let .wallpaper(wallpaper) = internalUrl {
|
||||
return wallpaper
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if let parsedUrl = URL(string: url), parsedUrl.scheme == "tg", let host = parsedUrl.host, let query = parsedUrl.query {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, query: host + "?" + query), case let .wallpaper(wallpaper) = internalUrl {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, context: nil, query: host + "?" + query), case let .wallpaper(wallpaper) = internalUrl {
|
||||
return wallpaper
|
||||
}
|
||||
}
|
||||
@ -1196,20 +1201,20 @@ public func parseWallpaperUrl(sharedContext: SharedAccountContext, url: String)
|
||||
return nil
|
||||
}
|
||||
|
||||
public func parseAdUrl(sharedContext: SharedAccountContext, url: String) -> ParsedInternalUrl? {
|
||||
public func parseAdUrl(sharedContext: SharedAccountContext, context: AccountContext, url: String) -> ParsedInternalUrl? {
|
||||
let schemes = ["http://", "https://", ""]
|
||||
for basePath in baseTelegramMePaths {
|
||||
for scheme in schemes {
|
||||
let basePrefix = scheme + basePath + "/"
|
||||
if url.lowercased().hasPrefix(basePrefix) {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, query: String(url[basePrefix.endIndex...])), case .peer = internalUrl {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, context: context, query: String(url[basePrefix.endIndex...])), case .peer = internalUrl {
|
||||
return internalUrl
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if let parsedUrl = URL(string: url), parsedUrl.scheme == "tg", let host = parsedUrl.host, let query = parsedUrl.query {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, query: host + "?" + query), case .peer = internalUrl {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, context: context, query: host + "?" + query), case .peer = internalUrl {
|
||||
return internalUrl
|
||||
}
|
||||
}
|
||||
@ -1217,13 +1222,13 @@ public func parseAdUrl(sharedContext: SharedAccountContext, url: String) -> Pars
|
||||
return nil
|
||||
}
|
||||
|
||||
public func parseFullInternalUrl(sharedContext: SharedAccountContext, url: String) -> ParsedInternalUrl? {
|
||||
public func parseFullInternalUrl(sharedContext: SharedAccountContext, context: AccountContext, url: String) -> ParsedInternalUrl? {
|
||||
let schemes = ["http://", "https://", ""]
|
||||
for basePath in baseTelegramMePaths {
|
||||
for scheme in schemes {
|
||||
let basePrefix = scheme + basePath + "/"
|
||||
if url.lowercased().hasPrefix(basePrefix) {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, query: String(url[basePrefix.endIndex...])) {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, context: context, query: String(url[basePrefix.endIndex...])) {
|
||||
return internalUrl
|
||||
}
|
||||
}
|
||||
@ -1309,7 +1314,7 @@ public func resolveUrlImpl(context: AccountContext, peerId: PeerId?, url: String
|
||||
}
|
||||
}
|
||||
if url.lowercased().hasPrefix(basePrefix) {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: context.sharedContext, query: String(url[basePrefix.endIndex...])) {
|
||||
if let internalUrl = parseInternalUrl(sharedContext: context.sharedContext, context: context, query: String(url[basePrefix.endIndex...])) {
|
||||
return resolveInternalUrl(context: context, url: internalUrl)
|
||||
|> map { result -> ResolveUrlResult in
|
||||
switch result {
|
||||
|
@ -456,7 +456,7 @@ public final class WebAppController: ViewController, AttachmentContainable {
|
||||
}
|
||||
})
|
||||
} else {
|
||||
if let url = controller.url, isTelegramMeLink(url), let internalUrl = parseFullInternalUrl(sharedContext: self.context.sharedContext, url: url), case .peer(_, .appStart) = internalUrl {
|
||||
if let url = controller.url, isTelegramMeLink(url), let internalUrl = parseFullInternalUrl(sharedContext: self.context.sharedContext, context: self.context, url: url), case .peer(_, .appStart) = internalUrl {
|
||||
let _ = (self.context.sharedContext.resolveUrl(context: self.context, peerId: controller.peerId, url: url, skipUrlAuth: false)
|
||||
|> deliverOnMainQueue).startStandalone(next: { [weak self] result in
|
||||
guard let self, let controller = self.controller else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user