mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-07 01:10:09 +00:00
Various improvements
This commit is contained in:
parent
8cf054ef30
commit
0485aed646
@ -13474,6 +13474,7 @@ Sorry for the inconvenience.";
|
|||||||
|
|
||||||
"Conversation.ContextMenuSendGiftTo" = "Send Gift to %@";
|
"Conversation.ContextMenuSendGiftTo" = "Send Gift to %@";
|
||||||
"Conversation.ContextMenuSendAnotherGift" = "Send Another Gift";
|
"Conversation.ContextMenuSendAnotherGift" = "Send Another Gift";
|
||||||
|
"Conversation.ContextMenuBuyGift" = "Buy Yourself a Gift";
|
||||||
|
|
||||||
"Gift.View.Status" = "Status";
|
"Gift.View.Status" = "Status";
|
||||||
"Gift.View.Status.NonUnique" = "Non-Unique";
|
"Gift.View.Status.NonUnique" = "Non-Unique";
|
||||||
|
|||||||
@ -1055,7 +1055,7 @@ public protocol SharedAccountContext: AnyObject {
|
|||||||
|
|
||||||
func makeStarsGiftController(context: AccountContext, birthdays: [EnginePeer.Id: TelegramBirthday]?, completion: @escaping (([EnginePeer.Id]) -> Void)) -> ViewController
|
func makeStarsGiftController(context: AccountContext, birthdays: [EnginePeer.Id: TelegramBirthday]?, completion: @escaping (([EnginePeer.Id]) -> Void)) -> ViewController
|
||||||
func makePremiumGiftController(context: AccountContext, source: PremiumGiftSource, completion: (([EnginePeer.Id]) -> Void)?) -> ViewController
|
func makePremiumGiftController(context: AccountContext, source: PremiumGiftSource, completion: (([EnginePeer.Id]) -> Void)?) -> ViewController
|
||||||
func makeGiftOptionsController(context: AccountContext, peerId: EnginePeer.Id, premiumOptions: [CachedPremiumGiftOption], hasBirthday: Bool) -> ViewController
|
func makeGiftOptionsController(context: AccountContext, peerId: EnginePeer.Id, premiumOptions: [CachedPremiumGiftOption], hasBirthday: Bool, completion: (() -> Void)?) -> ViewController
|
||||||
func makePremiumPrivacyControllerController(context: AccountContext, subject: PremiumPrivacySubject, peerId: EnginePeer.Id) -> ViewController
|
func makePremiumPrivacyControllerController(context: AccountContext, subject: PremiumPrivacySubject, peerId: EnginePeer.Id) -> ViewController
|
||||||
func makePremiumBoostLevelsController(context: AccountContext, peerId: EnginePeer.Id, subject: BoostSubject, boostStatus: ChannelBoostStatus, myBoostStatus: MyBoostStatus, forceDark: Bool, openStats: (() -> Void)?) -> ViewController
|
func makePremiumBoostLevelsController(context: AccountContext, peerId: EnginePeer.Id, subject: BoostSubject, boostStatus: ChannelBoostStatus, myBoostStatus: MyBoostStatus, forceDark: Bool, openStats: (() -> Void)?) -> ViewController
|
||||||
|
|
||||||
@ -1101,8 +1101,8 @@ public protocol SharedAccountContext: AnyObject {
|
|||||||
func makeStarsGiftScreen(context: AccountContext, message: EngineMessage) -> ViewController
|
func makeStarsGiftScreen(context: AccountContext, message: EngineMessage) -> ViewController
|
||||||
func makeStarsGiveawayBoostScreen(context: AccountContext, peerId: EnginePeer.Id, boost: ChannelBoostersContext.State.Boost) -> ViewController
|
func makeStarsGiveawayBoostScreen(context: AccountContext, peerId: EnginePeer.Id, boost: ChannelBoostersContext.State.Boost) -> ViewController
|
||||||
func makeStarsIntroScreen(context: AccountContext) -> ViewController
|
func makeStarsIntroScreen(context: AccountContext) -> ViewController
|
||||||
func makeGiftViewScreen(context: AccountContext, message: EngineMessage, shareStory: (() -> Void)?) -> ViewController
|
func makeGiftViewScreen(context: AccountContext, message: EngineMessage, shareStory: ((StarGift.UniqueGift) -> Void)?) -> ViewController
|
||||||
func makeGiftViewScreen(context: AccountContext, gift: StarGift.UniqueGift, shareStory: (() -> Void)?, dismissed: (() -> Void)?) -> ViewController
|
func makeGiftViewScreen(context: AccountContext, gift: StarGift.UniqueGift, shareStory: ((StarGift.UniqueGift) -> Void)?, dismissed: (() -> Void)?) -> ViewController
|
||||||
func makeGiftWearPreviewScreen(context: AccountContext, gift: StarGift.UniqueGift) -> ViewController
|
func makeGiftWearPreviewScreen(context: AccountContext, gift: StarGift.UniqueGift) -> ViewController
|
||||||
|
|
||||||
func makeStorySharingScreen(context: AccountContext, subject: StorySharingSubject, parentController: ViewController) -> ViewController
|
func makeStorySharingScreen(context: AccountContext, subject: StorySharingSubject, parentController: ViewController) -> ViewController
|
||||||
|
|||||||
@ -1742,7 +1742,7 @@ public final class ChatListNode: ListView {
|
|||||||
|> filter { !$0.isEmpty }
|
|> filter { !$0.isEmpty }
|
||||||
|> deliverOnMainQueue).start(next: { giftOptions in
|
|> deliverOnMainQueue).start(next: { giftOptions in
|
||||||
let premiumOptions = giftOptions.filter { $0.users == 1 }.map { CachedPremiumGiftOption(months: $0.months, currency: $0.currency, amount: $0.amount, botUrl: "", storeProductId: $0.storeProductId) }
|
let premiumOptions = giftOptions.filter { $0.users == 1 }.map { CachedPremiumGiftOption(months: $0.months, currency: $0.currency, amount: $0.amount, botUrl: "", storeProductId: $0.storeProductId) }
|
||||||
let controller = self.context.sharedContext.makeGiftOptionsController(context: self.context, peerId: peerId, premiumOptions: premiumOptions, hasBirthday: true)
|
let controller = self.context.sharedContext.makeGiftOptionsController(context: self.context, peerId: peerId, premiumOptions: premiumOptions, hasBirthday: true, completion: nil)
|
||||||
controller.navigationPresentation = .modal
|
controller.navigationPresentation = .modal
|
||||||
self.push?(controller)
|
self.push?(controller)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -971,12 +971,12 @@ private final class ProfileGiftsContextImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func reload() {
|
func reload() {
|
||||||
gifts = []
|
self.gifts = []
|
||||||
dataState = .ready(canLoadMore: true, nextOffset: nil)
|
self.dataState = .ready(canLoadMore: true, nextOffset: nil)
|
||||||
self.loadMore()
|
self.loadMore(reload: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadMore() {
|
func loadMore(reload: Bool = false) {
|
||||||
let peerId = self.peerId
|
let peerId = self.peerId
|
||||||
let accountPeerId = self.account.peerId
|
let accountPeerId = self.account.peerId
|
||||||
let network = self.account.network
|
let network = self.account.network
|
||||||
@ -1012,7 +1012,9 @@ private final class ProfileGiftsContextImpl {
|
|||||||
} else {
|
} else {
|
||||||
self.dataState = .loading
|
self.dataState = .loading
|
||||||
}
|
}
|
||||||
self.pushState()
|
if !reload {
|
||||||
|
self.pushState()
|
||||||
|
}
|
||||||
|
|
||||||
let signal: Signal<([ProfileGiftsContext.State.StarGift], Int32, String?, Bool?), NoError> = self.account.postbox.transaction { transaction -> Api.InputPeer? in
|
let signal: Signal<([ProfileGiftsContext.State.StarGift], Int32, String?, Bool?), NoError> = self.account.postbox.transaction { transaction -> Api.InputPeer? in
|
||||||
return transaction.getPeer(peerId).flatMap(apiInputPeer)
|
return transaction.getPeer(peerId).flatMap(apiInputPeer)
|
||||||
@ -1077,7 +1079,7 @@ private final class ProfileGiftsContextImpl {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if isFiltered {
|
if isFiltered {
|
||||||
if initialNextOffset == nil {
|
if initialNextOffset == nil || reload {
|
||||||
self.filteredGifts = gifts
|
self.filteredGifts = gifts
|
||||||
} else {
|
} else {
|
||||||
for gift in gifts {
|
for gift in gifts {
|
||||||
@ -1089,7 +1091,7 @@ private final class ProfileGiftsContextImpl {
|
|||||||
self.filteredCount = updatedCount
|
self.filteredCount = updatedCount
|
||||||
self.filteredDataState = .ready(canLoadMore: count != 0 && updatedCount > self.filteredGifts.count && nextOffset != nil, nextOffset: nextOffset)
|
self.filteredDataState = .ready(canLoadMore: count != 0 && updatedCount > self.filteredGifts.count && nextOffset != nil, nextOffset: nextOffset)
|
||||||
} else {
|
} else {
|
||||||
if initialNextOffset == nil {
|
if initialNextOffset == nil || reload {
|
||||||
self.gifts = gifts
|
self.gifts = gifts
|
||||||
self.cacheDisposable.set(self.account.postbox.transaction { transaction in
|
self.cacheDisposable.set(self.account.postbox.transaction { transaction in
|
||||||
if let entry = CodableEntry(CachedProfileGifts(gifts: gifts, count: count, notificationsEnabled: notificationsEnabled)) {
|
if let entry = CodableEntry(CachedProfileGifts(gifts: gifts, count: count, notificationsEnabled: notificationsEnabled)) {
|
||||||
|
|||||||
@ -2789,7 +2789,7 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
|
|
||||||
self.longPressItem = item.1
|
self.longPressItem = item.1
|
||||||
|
|
||||||
if #available(iOS 13.0, *) {
|
if #available(iOS 13.0, *), item.0.itemFile != nil {
|
||||||
self.continuousHaptic = try? ContinuousHaptic(duration: longPressDuration)
|
self.continuousHaptic = try? ContinuousHaptic(duration: longPressDuration)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -358,6 +358,27 @@ final class GiftSetupScreenComponent: Component {
|
|||||||
}
|
}
|
||||||
let _ = (component.context.engine.payments.sendStarsPaymentForm(formId: inputData.form.id, source: source)
|
let _ = (component.context.engine.payments.sendStarsPaymentForm(formId: inputData.form.id, source: source)
|
||||||
|> deliverOnMainQueue).start(next: { [weak self] result in
|
|> deliverOnMainQueue).start(next: { [weak self] result in
|
||||||
|
if let self, peerId.namespace == Namespaces.Peer.CloudChannel, let controller = self.environment?.controller(), let navigationController = controller.navigationController as? NavigationController {
|
||||||
|
var controllers = navigationController.viewControllers
|
||||||
|
controllers = controllers.filter { !($0 is GiftSetupScreen) && !($0 is GiftOptionsScreenProtocol) }
|
||||||
|
navigationController.setViewControllers(controllers, animated: true)
|
||||||
|
|
||||||
|
let tooltipController = UndoOverlayController(
|
||||||
|
presentationData: presentationData,
|
||||||
|
content: .sticker(
|
||||||
|
context: context,
|
||||||
|
file: starGift.file,
|
||||||
|
loop: true,
|
||||||
|
title: nil,
|
||||||
|
text: presentationData.strings.Gift_Send_Success(self.peerMap[peerId]?.compactDisplayTitle ?? "", presentationData.strings.Gift_Send_Success_Stars(Int32(starGift.price))).string,
|
||||||
|
undoText: nil,
|
||||||
|
customAction: nil
|
||||||
|
),
|
||||||
|
action: { _ in return true }
|
||||||
|
)
|
||||||
|
(navigationController.viewControllers.last as? ViewController)?.present(tooltipController, in: .current)
|
||||||
|
}
|
||||||
|
|
||||||
if let completion {
|
if let completion {
|
||||||
completion()
|
completion()
|
||||||
|
|
||||||
@ -369,26 +390,7 @@ final class GiftSetupScreenComponent: Component {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if peerId.namespace == Namespaces.Peer.CloudChannel {
|
if peerId.namespace != Namespaces.Peer.CloudChannel {
|
||||||
var controllers = navigationController.viewControllers
|
|
||||||
controllers = controllers.filter { !($0 is GiftSetupScreen) && !($0 is GiftOptionsScreenProtocol) }
|
|
||||||
navigationController.setViewControllers(controllers, animated: true)
|
|
||||||
|
|
||||||
let tooltipController = UndoOverlayController(
|
|
||||||
presentationData: presentationData,
|
|
||||||
content: .sticker(
|
|
||||||
context: context,
|
|
||||||
file: starGift.file,
|
|
||||||
loop: true,
|
|
||||||
title: nil,
|
|
||||||
text: presentationData.strings.Gift_Send_Success(self.peerMap[peerId]?.compactDisplayTitle ?? "", presentationData.strings.Gift_Send_Success_Stars(Int32(starGift.price))).string,
|
|
||||||
undoText: nil,
|
|
||||||
customAction: nil
|
|
||||||
),
|
|
||||||
action: { _ in return true }
|
|
||||||
)
|
|
||||||
(navigationController.viewControllers.last as? ViewController)?.present(tooltipController, in: .current)
|
|
||||||
} else {
|
|
||||||
var controllers = navigationController.viewControllers
|
var controllers = navigationController.viewControllers
|
||||||
controllers = controllers.filter { !($0 is GiftSetupScreen) && !($0 is GiftOptionsScreenProtocol) && !($0 is PeerInfoScreen) && !($0 is ContactSelectionController) }
|
controllers = controllers.filter { !($0 is GiftSetupScreen) && !($0 is GiftOptionsScreenProtocol) && !($0 is PeerInfoScreen) && !($0 is ContactSelectionController) }
|
||||||
var foundController = false
|
var foundController = false
|
||||||
|
|||||||
@ -320,7 +320,7 @@ private final class GiftViewSheetContent: CombinedComponent {
|
|||||||
self.updated(transition: .spring(duration: 0.4))
|
self.updated(transition: .spring(duration: 0.4))
|
||||||
|
|
||||||
if let arguments = self.subject.arguments, let peerId = arguments.peerId, peerId.namespace == Namespaces.Peer.CloudChannel {
|
if let arguments = self.subject.arguments, let peerId = arguments.peerId, peerId.namespace == Namespaces.Peer.CloudChannel {
|
||||||
let _ = self.context.engine.peers.updatePeerEmojiStatus(peerId: peerId, fileId: nil, expirationDate: nil)
|
let _ = self.context.engine.peers.updatePeerEmojiStatus(peerId: peerId, fileId: nil, expirationDate: nil).startStandalone()
|
||||||
} else {
|
} else {
|
||||||
let _ = self.context.engine.accountData.setEmojiStatus(file: nil, expirationDate: nil).startStandalone()
|
let _ = self.context.engine.accountData.setEmojiStatus(file: nil, expirationDate: nil).startStandalone()
|
||||||
}
|
}
|
||||||
@ -1101,8 +1101,10 @@ private final class GiftViewSheetContent: CombinedComponent {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
tapAction: { _, _ in
|
tapAction: { attributes, _ in
|
||||||
component.openStarsIntro()
|
if let _ = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] as? String {
|
||||||
|
component.openStarsIntro()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
availableSize: CGSize(width: context.availableSize.width - sideInset * 2.0 - 50.0, height: CGFloat.greatestFiniteMagnitude),
|
availableSize: CGSize(width: context.availableSize.width - sideInset * 2.0 - 50.0, height: CGFloat.greatestFiniteMagnitude),
|
||||||
@ -1907,11 +1909,13 @@ private final class GiftViewSheetContent: CombinedComponent {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
tapAction: { _, _ in
|
tapAction: { attributes, _ in
|
||||||
component.updateSavedToProfile(!savedToProfile)
|
if let _ = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] as? String {
|
||||||
Queue.mainQueue().after(0.6, {
|
component.updateSavedToProfile(!savedToProfile)
|
||||||
component.cancel(false)
|
Queue.mainQueue().after(0.6, {
|
||||||
})
|
component.cancel(false)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
availableSize: CGSize(width: context.availableSize.width - sideInset * 2.0 - 60.0, height: CGFloat.greatestFiniteMagnitude),
|
availableSize: CGSize(width: context.availableSize.width - sideInset * 2.0 - 60.0, height: CGFloat.greatestFiniteMagnitude),
|
||||||
@ -2430,7 +2434,7 @@ public class GiftViewScreen: ViewControllerComponentContainer {
|
|||||||
convertToStars: (() -> Void)? = nil,
|
convertToStars: (() -> Void)? = nil,
|
||||||
transferGift: ((Bool, EnginePeer.Id) -> Void)? = nil,
|
transferGift: ((Bool, EnginePeer.Id) -> Void)? = nil,
|
||||||
upgradeGift: ((Int64?, Bool) -> Signal<ProfileGiftsContext.State.StarGift, UpgradeStarGiftError>)? = nil,
|
upgradeGift: ((Int64?, Bool) -> Signal<ProfileGiftsContext.State.StarGift, UpgradeStarGiftError>)? = nil,
|
||||||
shareStory: (() -> Void)? = nil
|
shareStory: ((StarGift.UniqueGift) -> Void)? = nil
|
||||||
) {
|
) {
|
||||||
self.context = context
|
self.context = context
|
||||||
self.subject = subject
|
self.subject = subject
|
||||||
@ -2687,7 +2691,7 @@ public class GiftViewScreen: ViewControllerComponentContainer {
|
|||||||
|> filter { !$0.isEmpty }
|
|> filter { !$0.isEmpty }
|
||||||
|> deliverOnMainQueue).start(next: { giftOptions in
|
|> deliverOnMainQueue).start(next: { giftOptions in
|
||||||
let premiumOptions = giftOptions.filter { $0.users == 1 }.map { CachedPremiumGiftOption(months: $0.months, currency: $0.currency, amount: $0.amount, botUrl: "", storeProductId: $0.storeProductId) }
|
let premiumOptions = giftOptions.filter { $0.users == 1 }.map { CachedPremiumGiftOption(months: $0.months, currency: $0.currency, amount: $0.amount, botUrl: "", storeProductId: $0.storeProductId) }
|
||||||
let controller = context.sharedContext.makeGiftOptionsController(context: context, peerId: peerId, premiumOptions: premiumOptions, hasBirthday: false)
|
let controller = context.sharedContext.makeGiftOptionsController(context: context, peerId: peerId, premiumOptions: premiumOptions, hasBirthday: false, completion: nil)
|
||||||
self.push(controller)
|
self.push(controller)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -2766,12 +2770,19 @@ public class GiftViewScreen: ViewControllerComponentContainer {
|
|||||||
guard let self, let arguments = self.subject.arguments, case let .unique(gift) = arguments.gift else {
|
guard let self, let arguments = self.subject.arguments, case let .unique(gift) = arguments.gift else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var shareStoryImpl: (() -> Void)?
|
||||||
|
if let shareStory {
|
||||||
|
shareStoryImpl = {
|
||||||
|
shareStory(gift)
|
||||||
|
}
|
||||||
|
}
|
||||||
let link = "https://t.me/nft/\(gift.slug)"
|
let link = "https://t.me/nft/\(gift.slug)"
|
||||||
let shareController = context.sharedContext.makeShareController(
|
let shareController = context.sharedContext.makeShareController(
|
||||||
context: context,
|
context: context,
|
||||||
subject: .url(link),
|
subject: .url(link),
|
||||||
forceExternal: false,
|
forceExternal: false,
|
||||||
shareStory: shareStory,
|
shareStory: shareStoryImpl,
|
||||||
enqueued: { peerIds, _ in
|
enqueued: { peerIds, _ in
|
||||||
let _ = (context.engine.data.get(
|
let _ = (context.engine.data.get(
|
||||||
EngineDataList(
|
EngineDataList(
|
||||||
|
|||||||
@ -114,6 +114,7 @@ public final class PeerInfoCoverComponent: Component {
|
|||||||
public let avatarScale: CGFloat
|
public let avatarScale: CGFloat
|
||||||
public let defaultHeight: CGFloat
|
public let defaultHeight: CGFloat
|
||||||
public let gradientOnTop: Bool
|
public let gradientOnTop: Bool
|
||||||
|
public let gradientCenter: CGPoint
|
||||||
public let avatarTransitionFraction: CGFloat
|
public let avatarTransitionFraction: CGFloat
|
||||||
public let patternTransitionFraction: CGFloat
|
public let patternTransitionFraction: CGFloat
|
||||||
|
|
||||||
@ -126,6 +127,7 @@ public final class PeerInfoCoverComponent: Component {
|
|||||||
avatarScale: CGFloat,
|
avatarScale: CGFloat,
|
||||||
defaultHeight: CGFloat,
|
defaultHeight: CGFloat,
|
||||||
gradientOnTop: Bool = false,
|
gradientOnTop: Bool = false,
|
||||||
|
gradientCenter: CGPoint = CGPoint(x: 0.5, y: 0.5),
|
||||||
avatarTransitionFraction: CGFloat,
|
avatarTransitionFraction: CGFloat,
|
||||||
patternTransitionFraction: CGFloat
|
patternTransitionFraction: CGFloat
|
||||||
) {
|
) {
|
||||||
@ -137,6 +139,7 @@ public final class PeerInfoCoverComponent: Component {
|
|||||||
self.avatarScale = avatarScale
|
self.avatarScale = avatarScale
|
||||||
self.defaultHeight = defaultHeight
|
self.defaultHeight = defaultHeight
|
||||||
self.gradientOnTop = gradientOnTop
|
self.gradientOnTop = gradientOnTop
|
||||||
|
self.gradientCenter = gradientCenter
|
||||||
self.avatarTransitionFraction = avatarTransitionFraction
|
self.avatarTransitionFraction = avatarTransitionFraction
|
||||||
self.patternTransitionFraction = patternTransitionFraction
|
self.patternTransitionFraction = patternTransitionFraction
|
||||||
}
|
}
|
||||||
@ -166,6 +169,9 @@ public final class PeerInfoCoverComponent: Component {
|
|||||||
if lhs.gradientOnTop != rhs.gradientOnTop {
|
if lhs.gradientOnTop != rhs.gradientOnTop {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
if lhs.gradientCenter != rhs.gradientCenter {
|
||||||
|
return false
|
||||||
|
}
|
||||||
if lhs.avatarTransitionFraction != rhs.avatarTransitionFraction {
|
if lhs.avatarTransitionFraction != rhs.avatarTransitionFraction {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -412,7 +418,7 @@ public final class PeerInfoCoverComponent: Component {
|
|||||||
} else if case .status = component.subject {
|
} else if case .status = component.subject {
|
||||||
gradientWidth = availableSize.width
|
gradientWidth = availableSize.width
|
||||||
self.backgroundView.backgroundColor = secondaryBackgroundColor
|
self.backgroundView.backgroundColor = secondaryBackgroundColor
|
||||||
self.backgroundGradientLayer.startPoint = CGPoint(x: 0.5, y: component.avatarCenter.y / gradientHeight)
|
self.backgroundGradientLayer.startPoint = component.gradientCenter
|
||||||
self.backgroundGradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)
|
self.backgroundGradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)
|
||||||
self.backgroundGradientLayer.type = .radial
|
self.backgroundGradientLayer.type = .radial
|
||||||
self.backgroundGradientLayer.colors = [backgroundColor.cgColor, secondaryBackgroundColor.cgColor]
|
self.backgroundGradientLayer.colors = [backgroundColor.cgColor, secondaryBackgroundColor.cgColor]
|
||||||
|
|||||||
@ -88,7 +88,20 @@ final class PeerInfoAvatarTransformContainerNode: ASDisplayNode {
|
|||||||
var colors = AvatarNode.Colors(theme: theme)
|
var colors = AvatarNode.Colors(theme: theme)
|
||||||
|
|
||||||
let regularNavigationContentsSecondaryColor: UIColor
|
let regularNavigationContentsSecondaryColor: UIColor
|
||||||
if let profileColor = peer?.profileColor {
|
if case let .starGift(_, _, _, _, _, innerColorValue, outerColorValue, _, _) = peer?.emojiStatus?.content {
|
||||||
|
let innerColor = UIColor(rgb: UInt32(bitPattern: innerColorValue))
|
||||||
|
let outerColor = UIColor(rgb: UInt32(bitPattern: outerColorValue))
|
||||||
|
regularNavigationContentsSecondaryColor = UIColor(white: 1.0, alpha: 0.6).blitOver(innerColor.withMultiplied(hue: 1.0, saturation: 2.2, brightness: 1.5), alpha: 1.0)
|
||||||
|
|
||||||
|
let baseBackgroundColor = UIColor(white: 1.0, alpha: 0.75)
|
||||||
|
|
||||||
|
let topColor = baseBackgroundColor.blendOver(background: innerColor.mixedWith(outerColor, alpha: 0.1)).withMultiplied(hue: 1.0, saturation: 1.2, brightness: 1.5)
|
||||||
|
let bottomColor = baseBackgroundColor.blendOver(background: outerColor).withMultiplied(hue: 1.0, saturation: 1.2, brightness: 1.5)
|
||||||
|
|
||||||
|
colors.unseenColors = [topColor, bottomColor]
|
||||||
|
colors.unseenCloseFriendsColors = colors.unseenColors
|
||||||
|
colors.seenColors = colors.unseenColors
|
||||||
|
} else if let profileColor = peer?.profileColor {
|
||||||
let backgroundColors = self.context.peerNameColors.getProfile(profileColor, dark: theme.overallDarkAppearance)
|
let backgroundColors = self.context.peerNameColors.getProfile(profileColor, dark: theme.overallDarkAppearance)
|
||||||
regularNavigationContentsSecondaryColor = UIColor(white: 1.0, alpha: 0.6).blitOver(backgroundColors.main.withMultiplied(hue: 1.0, saturation: 2.2, brightness: 1.5), alpha: 1.0)
|
regularNavigationContentsSecondaryColor = UIColor(white: 1.0, alpha: 0.6).blitOver(backgroundColors.main.withMultiplied(hue: 1.0, saturation: 2.2, brightness: 1.5), alpha: 1.0)
|
||||||
|
|
||||||
|
|||||||
@ -620,6 +620,7 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
let collapsedHeaderContentButtonForegroundColor = presentationData.theme.list.itemAccentColor
|
let collapsedHeaderContentButtonForegroundColor = presentationData.theme.list.itemAccentColor
|
||||||
let expandedAvatarContentButtonForegroundColor: UIColor = .white
|
let expandedAvatarContentButtonForegroundColor: UIColor = .white
|
||||||
|
|
||||||
|
var hasCoverColor = false
|
||||||
let regularNavigationContentsSecondaryColor: UIColor
|
let regularNavigationContentsSecondaryColor: UIColor
|
||||||
if let emojiStatus = peer?.emojiStatus, case let .starGift(_, _, _, _, _, innerColor, outerColor, _, _) = emojiStatus.content {
|
if let emojiStatus = peer?.emojiStatus, case let .starGift(_, _, _, _, _, innerColor, outerColor, _, _) = emojiStatus.content {
|
||||||
let mainColor = UIColor(rgb: UInt32(bitPattern: innerColor))
|
let mainColor = UIColor(rgb: UInt32(bitPattern: innerColor))
|
||||||
@ -632,8 +633,10 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
} else {
|
} else {
|
||||||
baseButtonBackgroundColor = UIColor(white: 1.0, alpha: 0.25)
|
baseButtonBackgroundColor = UIColor(white: 1.0, alpha: 0.25)
|
||||||
}
|
}
|
||||||
regularContentButtonBackgroundColor = baseButtonBackgroundColor.blendOver(background: mainColor)
|
regularContentButtonBackgroundColor = baseButtonBackgroundColor.blendOver(background: secondaryColor.mixedWith(mainColor, alpha: 0.1))
|
||||||
regularHeaderButtonBackgroundColor = baseButtonBackgroundColor.blendOver(background: secondaryColor.mixedWith(mainColor, alpha: 0.1))
|
regularHeaderButtonBackgroundColor = baseButtonBackgroundColor.blendOver(background: secondaryColor.mixedWith(mainColor, alpha: 0.1))
|
||||||
|
|
||||||
|
hasCoverColor = true
|
||||||
} else if let profileColor = peer?.profileColor {
|
} else if let profileColor = peer?.profileColor {
|
||||||
let backgroundColors = self.context.peerNameColors.getProfile(profileColor, dark: presentationData.theme.overallDarkAppearance)
|
let backgroundColors = self.context.peerNameColors.getProfile(profileColor, dark: presentationData.theme.overallDarkAppearance)
|
||||||
regularNavigationContentsSecondaryColor = UIColor(white: 1.0, alpha: 0.6).blitOver(backgroundColors.main.withMultiplied(hue: 1.0, saturation: 2.2, brightness: 1.5), alpha: 1.0)
|
regularNavigationContentsSecondaryColor = UIColor(white: 1.0, alpha: 0.6).blitOver(backgroundColors.main.withMultiplied(hue: 1.0, saturation: 2.2, brightness: 1.5), alpha: 1.0)
|
||||||
@ -646,12 +649,14 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
regularContentButtonBackgroundColor = baseButtonBackgroundColor.blendOver(background: backgroundColors.main)
|
regularContentButtonBackgroundColor = baseButtonBackgroundColor.blendOver(background: backgroundColors.main)
|
||||||
regularHeaderButtonBackgroundColor = baseButtonBackgroundColor.blendOver(background: (backgroundColors.secondary ?? backgroundColors.main).mixedWith(backgroundColors.main, alpha: 0.1))
|
regularHeaderButtonBackgroundColor = baseButtonBackgroundColor.blendOver(background: (backgroundColors.secondary ?? backgroundColors.main).mixedWith(backgroundColors.main, alpha: 0.1))
|
||||||
|
|
||||||
|
hasCoverColor = true
|
||||||
} else {
|
} else {
|
||||||
regularNavigationContentsSecondaryColor = presentationData.theme.list.itemSecondaryTextColor
|
regularNavigationContentsSecondaryColor = presentationData.theme.list.itemSecondaryTextColor
|
||||||
regularContentButtonBackgroundColor = presentationData.theme.list.itemBlocksBackgroundColor
|
regularContentButtonBackgroundColor = presentationData.theme.list.itemBlocksBackgroundColor
|
||||||
regularHeaderButtonBackgroundColor = .clear
|
regularHeaderButtonBackgroundColor = .clear
|
||||||
}
|
}
|
||||||
self.contentButtonBackgroundColor = regularContentButtonBackgroundColor
|
self.contentButtonBackgroundColor = regularNavigationContentsSecondaryColor.mixedWith(regularContentButtonBackgroundColor, alpha: 0.5)
|
||||||
|
|
||||||
let collapsedHeaderNavigationContentsSecondaryColor = presentationData.theme.list.itemSecondaryTextColor
|
let collapsedHeaderNavigationContentsSecondaryColor = presentationData.theme.list.itemSecondaryTextColor
|
||||||
let expandedAvatarNavigationContentsSecondaryColor: UIColor = .white
|
let expandedAvatarNavigationContentsSecondaryColor: UIColor = .white
|
||||||
@ -793,7 +798,7 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
navigationContentsPrimaryColor = regularNavigationContentsPrimaryColor.mixedWith(collapsedHeaderNavigationContentsPrimaryColor, alpha: effectiveTransitionFraction)
|
navigationContentsPrimaryColor = regularNavigationContentsPrimaryColor.mixedWith(collapsedHeaderNavigationContentsPrimaryColor, alpha: effectiveTransitionFraction)
|
||||||
navigationContentsSecondaryColor = regularNavigationContentsSecondaryColor.mixedWith(collapsedHeaderNavigationContentsSecondaryColor, alpha: effectiveTransitionFraction)
|
navigationContentsSecondaryColor = regularNavigationContentsSecondaryColor.mixedWith(collapsedHeaderNavigationContentsSecondaryColor, alpha: effectiveTransitionFraction)
|
||||||
|
|
||||||
if peer?.profileColor != nil {
|
if hasCoverColor {
|
||||||
navigationContentsCanBeExpanded = effectiveTransitionFraction == 1.0
|
navigationContentsCanBeExpanded = effectiveTransitionFraction == 1.0
|
||||||
} else {
|
} else {
|
||||||
navigationContentsCanBeExpanded = true
|
navigationContentsCanBeExpanded = true
|
||||||
@ -2263,6 +2268,7 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
|
|
||||||
let backgroundCoverSubject: PeerInfoCoverComponent.Subject?
|
let backgroundCoverSubject: PeerInfoCoverComponent.Subject?
|
||||||
var backgroundCoverAnimateIn = false
|
var backgroundCoverAnimateIn = false
|
||||||
|
var backgroundDefaultHeight: CGFloat = 254.0
|
||||||
if let status = peer?.emojiStatus, case .starGift = status.content {
|
if let status = peer?.emojiStatus, case .starGift = status.content {
|
||||||
backgroundCoverSubject = .status(status)
|
backgroundCoverSubject = .status(status)
|
||||||
if !self.didSetupBackgroundCover {
|
if !self.didSetupBackgroundCover {
|
||||||
@ -2271,6 +2277,9 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
self.didSetupBackgroundCover = true
|
self.didSetupBackgroundCover = true
|
||||||
}
|
}
|
||||||
|
if !buttonKeys.isEmpty {
|
||||||
|
backgroundDefaultHeight = 327.0
|
||||||
|
}
|
||||||
} else if let peer {
|
} else if let peer {
|
||||||
backgroundCoverSubject = .peer(EnginePeer(peer))
|
backgroundCoverSubject = .peer(EnginePeer(peer))
|
||||||
} else {
|
} else {
|
||||||
@ -2286,7 +2295,8 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
isDark: presentationData.theme.overallDarkAppearance,
|
isDark: presentationData.theme.overallDarkAppearance,
|
||||||
avatarCenter: apparentAvatarFrame.center,
|
avatarCenter: apparentAvatarFrame.center,
|
||||||
avatarScale: avatarScale,
|
avatarScale: avatarScale,
|
||||||
defaultHeight: 254.0,
|
defaultHeight: backgroundDefaultHeight,
|
||||||
|
gradientCenter: CGPoint(x: 0.5, y: buttonKeys.isEmpty ? 0.5 : 0.45),
|
||||||
avatarTransitionFraction: max(0.0, min(1.0, titleCollapseFraction + transitionFraction * 2.0)),
|
avatarTransitionFraction: max(0.0, min(1.0, titleCollapseFraction + transitionFraction * 2.0)),
|
||||||
patternTransitionFraction: buttonsTransitionFraction * backgroundTransitionFraction
|
patternTransitionFraction: buttonsTransitionFraction * backgroundTransitionFraction
|
||||||
)),
|
)),
|
||||||
|
|||||||
@ -9821,7 +9821,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
|||||||
context: self.context,
|
context: self.context,
|
||||||
peerId: self.peerId,
|
peerId: self.peerId,
|
||||||
premiumOptions: premiumOptions,
|
premiumOptions: premiumOptions,
|
||||||
hasBirthday: false
|
hasBirthday: false,
|
||||||
|
completion: { [weak self] in
|
||||||
|
guard let self, let profileGiftsContext = self.data?.profileGiftsContext else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
profileGiftsContext.reload()
|
||||||
|
}
|
||||||
)
|
)
|
||||||
self.controller?.push(controller)
|
self.controller?.push(controller)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -265,8 +265,8 @@ public final class PeerInfoGiftsPaneNode: ASDisplayNode, PeerInfoPaneNode, UIScr
|
|||||||
}
|
}
|
||||||
return self.profileGifts.upgradeStarGift(formId: formId, reference: reference, keepOriginalInfo: keepOriginalInfo)
|
return self.profileGifts.upgradeStarGift(formId: formId, reference: reference, keepOriginalInfo: keepOriginalInfo)
|
||||||
},
|
},
|
||||||
shareStory: { [weak self] in
|
shareStory: { [weak self] uniqueGift in
|
||||||
guard let self, case let .unique(uniqueGift) = product.gift, let parentController = self.parentController else {
|
guard let self, let parentController = self.parentController else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
Queue.mainQueue().after(0.15) {
|
Queue.mainQueue().after(0.15) {
|
||||||
@ -650,7 +650,7 @@ public final class PeerInfoGiftsPaneNode: ASDisplayNode, PeerInfoPaneNode, UIScr
|
|||||||
self.chatControllerInteraction.navigationController()?.pushViewController(controller)
|
self.chatControllerInteraction.navigationController()?.pushViewController(controller)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
let controller = self.context.sharedContext.makeGiftOptionsController(context: self.context, peerId: self.peerId, premiumOptions: [], hasBirthday: false)
|
let controller = self.context.sharedContext.makeGiftOptionsController(context: self.context, peerId: self.peerId, premiumOptions: [], hasBirthday: false, completion: nil)
|
||||||
self.chatControllerInteraction.navigationController()?.pushViewController(controller)
|
self.chatControllerInteraction.navigationController()?.pushViewController(controller)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1829,7 +1829,7 @@ public class StarsTransactionScreen: ViewControllerComponentContainer {
|
|||||||
|> filter { !$0.isEmpty }
|
|> filter { !$0.isEmpty }
|
||||||
|> deliverOnMainQueue).start(next: { giftOptions in
|
|> deliverOnMainQueue).start(next: { giftOptions in
|
||||||
let premiumOptions = giftOptions.filter { $0.users == 1 }.map { CachedPremiumGiftOption(months: $0.months, currency: $0.currency, amount: $0.amount, botUrl: "", storeProductId: $0.storeProductId) }
|
let premiumOptions = giftOptions.filter { $0.users == 1 }.map { CachedPremiumGiftOption(months: $0.months, currency: $0.currency, amount: $0.amount, botUrl: "", storeProductId: $0.storeProductId) }
|
||||||
let controller = context.sharedContext.makeGiftOptionsController(context: context, peerId: peerId, premiumOptions: premiumOptions, hasBirthday: false)
|
let controller = context.sharedContext.makeGiftOptionsController(context: context, peerId: peerId, premiumOptions: premiumOptions, hasBirthday: false, completion: nil)
|
||||||
self.push(controller)
|
self.push(controller)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4339,7 +4339,7 @@ extension ChatControllerImpl {
|
|||||||
let _ = ApplicationSpecificNotice.incrementDismissedPremiumGiftSuggestion(accountManager: self.context.sharedContext.accountManager, peerId: peerId, timestamp: Int32(Date().timeIntervalSince1970)).startStandalone()
|
let _ = ApplicationSpecificNotice.incrementDismissedPremiumGiftSuggestion(accountManager: self.context.sharedContext.accountManager, peerId: peerId, timestamp: Int32(Date().timeIntervalSince1970)).startStandalone()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let controller = self.context.sharedContext.makeGiftOptionsController(context: self.context, peerId: peerId, premiumOptions: [], hasBirthday: false)
|
let controller = self.context.sharedContext.makeGiftOptionsController(context: self.context, peerId: peerId, premiumOptions: [], hasBirthday: false, completion: nil)
|
||||||
self.push(controller)
|
self.push(controller)
|
||||||
}
|
}
|
||||||
}, openPremiumRequiredForMessaging: { [weak self] in
|
}, openPremiumRequiredForMessaging: { [weak self] in
|
||||||
|
|||||||
@ -1198,8 +1198,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
strongSelf.push(controller)
|
strongSelf.push(controller)
|
||||||
return true
|
return true
|
||||||
case .starGift, .starGiftUnique:
|
case .starGift, .starGiftUnique:
|
||||||
let controller = strongSelf.context.sharedContext.makeGiftViewScreen(context: strongSelf.context, message: EngineMessage(message), shareStory: { [weak self] in
|
let controller = strongSelf.context.sharedContext.makeGiftViewScreen(context: strongSelf.context, message: EngineMessage(message), shareStory: { [weak self] uniqueGift in
|
||||||
if let self, case let .starGiftUnique(gift, _, _, _, _, _, _, _, _, _) = action.action, case let .unique(uniqueGift) = gift {
|
if let self {
|
||||||
Queue.mainQueue().after(0.15) {
|
Queue.mainQueue().after(0.15) {
|
||||||
let controller = self.context.sharedContext.makeStorySharingScreen(context: self.context, subject: .gift(uniqueGift), parentController: self)
|
let controller = self.context.sharedContext.makeStorySharingScreen(context: self.context, subject: .gift(uniqueGift), parentController: self)
|
||||||
self.push(controller)
|
self.push(controller)
|
||||||
@ -4577,7 +4577,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
let premiumOptions = giftOptions.filter { $0.users == 1 }.map { CachedPremiumGiftOption(months: $0.months, currency: $0.currency, amount: $0.amount, botUrl: "", storeProductId: $0.storeProductId) }
|
let premiumOptions = giftOptions.filter { $0.users == 1 }.map { CachedPremiumGiftOption(months: $0.months, currency: $0.currency, amount: $0.amount, botUrl: "", storeProductId: $0.storeProductId) }
|
||||||
let controller = self.context.sharedContext.makeGiftOptionsController(context: context, peerId: peerId, premiumOptions: premiumOptions, hasBirthday: false)
|
let controller = self.context.sharedContext.makeGiftOptionsController(context: context, peerId: peerId, premiumOptions: premiumOptions, hasBirthday: false, completion: nil)
|
||||||
self.push(controller)
|
self.push(controller)
|
||||||
})
|
})
|
||||||
}, requestMessageUpdate: { [weak self] id, scroll in
|
}, requestMessageUpdate: { [weak self] id, scroll in
|
||||||
|
|||||||
@ -1131,7 +1131,9 @@ func contextMenuForChatPresentationInterfaceState(chatPresentationInterfaceState
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if isIncoming {
|
if message.id.peerId == context.account.peerId {
|
||||||
|
sendGiftTitle = chatPresentationInterfaceState.strings.Conversation_ContextMenuBuyGift
|
||||||
|
} else if isIncoming {
|
||||||
let peerName = message.peers[message.id.peerId].flatMap(EnginePeer.init)?.compactDisplayTitle ?? ""
|
let peerName = message.peers[message.id.peerId].flatMap(EnginePeer.init)?.compactDisplayTitle ?? ""
|
||||||
sendGiftTitle = chatPresentationInterfaceState.strings.Conversation_ContextMenuSendGiftTo(peerName).string
|
sendGiftTitle = chatPresentationInterfaceState.strings.Conversation_ContextMenuSendGiftTo(peerName).string
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -2648,11 +2648,11 @@ public final class SharedAccountContextImpl: SharedAccountContext {
|
|||||||
return controller
|
return controller
|
||||||
}
|
}
|
||||||
|
|
||||||
public func makeGiftOptionsController(context: AccountContext, peerId: EnginePeer.Id, premiumOptions: [CachedPremiumGiftOption], hasBirthday: Bool) -> ViewController {
|
public func makeGiftOptionsController(context: AccountContext, peerId: EnginePeer.Id, premiumOptions: [CachedPremiumGiftOption], hasBirthday: Bool, completion: (() -> Void)?) -> ViewController {
|
||||||
guard let starsContext = context.starsContext else {
|
guard let starsContext = context.starsContext else {
|
||||||
fatalError()
|
fatalError()
|
||||||
}
|
}
|
||||||
let controller = GiftOptionsScreen(context: context, starsContext: starsContext, peerId: peerId, premiumOptions: premiumOptions, hasBirthday: hasBirthday)
|
let controller = GiftOptionsScreen(context: context, starsContext: starsContext, peerId: peerId, premiumOptions: premiumOptions, hasBirthday: hasBirthday, completion: completion)
|
||||||
controller.navigationPresentation = .modal
|
controller.navigationPresentation = .modal
|
||||||
return controller
|
return controller
|
||||||
}
|
}
|
||||||
@ -3054,11 +3054,11 @@ public final class SharedAccountContextImpl: SharedAccountContext {
|
|||||||
return StarsIntroScreen(context: context)
|
return StarsIntroScreen(context: context)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func makeGiftViewScreen(context: AccountContext, message: EngineMessage, shareStory: (() -> Void)?) -> ViewController {
|
public func makeGiftViewScreen(context: AccountContext, message: EngineMessage, shareStory: ((StarGift.UniqueGift) -> Void)?) -> ViewController {
|
||||||
return GiftViewScreen(context: context, subject: .message(message), shareStory: shareStory)
|
return GiftViewScreen(context: context, subject: .message(message), shareStory: shareStory)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func makeGiftViewScreen(context: AccountContext, gift: StarGift.UniqueGift, shareStory: (() -> Void)?, dismissed: (() -> Void)?) -> ViewController {
|
public func makeGiftViewScreen(context: AccountContext, gift: StarGift.UniqueGift, shareStory: ((StarGift.UniqueGift) -> Void)?, dismissed: (() -> Void)?) -> ViewController {
|
||||||
let controller = GiftViewScreen(context: context, subject: .uniqueGift(gift), shareStory: shareStory)
|
let controller = GiftViewScreen(context: context, subject: .uniqueGift(gift), shareStory: shareStory)
|
||||||
controller.disposed = {
|
controller.disposed = {
|
||||||
dismissed?()
|
dismissed?()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user