mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Stars giveaways
This commit is contained in:
parent
9ec342bc71
commit
7aaebe5d48
@ -12855,3 +12855,24 @@ Sorry for the inconvenience.";
|
|||||||
"Stats.RevenueInTon" = "Revenue in TON";
|
"Stats.RevenueInTon" = "Revenue in TON";
|
||||||
"Stats.RevenueInStars" = "Revenue in Stars";
|
"Stats.RevenueInStars" = "Revenue in Stars";
|
||||||
"Stats.RevenueInUsd" = "Revenue in USD";
|
"Stats.RevenueInUsd" = "Revenue in USD";
|
||||||
|
|
||||||
|
"BoostGift.NewDescriptionGroup" = "Get more boosts and members for\nyour group by giving away prizes.";
|
||||||
|
"BoostGift.NewDescription" = "Get more boosts and subscribers for\nyour channel by giving away prizes.";
|
||||||
|
"BoostGift.Prize" = "PRIZE";
|
||||||
|
"BoostGift.Prize.Premium" = "Telegram Premium";
|
||||||
|
"BoostGift.Prize.Stars" = "Telegram Stars";
|
||||||
|
"BoostGift.Stars.Title" = "STARS TO DISTRIBUTE";
|
||||||
|
"BoostGift.Stars.Boosts_1" = "%@ BOOST";
|
||||||
|
"BoostGift.Stars.Boosts_any" = "%@ BOOSTS";
|
||||||
|
"BoostGift.Stars.Stars_1" = "%@ Star";
|
||||||
|
"BoostGift.Stars.Stars_any" = "%@ Stars";
|
||||||
|
"BoostGift.Stars.PerUser" = "%@ per user";
|
||||||
|
"BoostGift.Stars.ShowMoreOptions" = "Show More Options";
|
||||||
|
"BoostGift.Stars.Info" = "Choose how many stars to give away and how many boosts to receive for 1 year.";
|
||||||
|
"BoostGift.AdditionalPrizesInfoStarsOff" = "Turn this on if you want to give the winners your own prizes in addition to Stars.";
|
||||||
|
|
||||||
|
"BoostGift.Stars.Winners" = "NUMBER OF WINNERS";
|
||||||
|
"BoostGift.Stars.WinnersInfo" = "Choose how many winners you want to distribute stars among.";
|
||||||
|
|
||||||
|
"BoostGift.Group.StarsDateInfo" = "Choose when %@ of your group will be randomly selected to receive Stars.";
|
||||||
|
"BoostGift.StarsDateInfo" = "Choose when %@ of your channel will be randomly selected to receive Stars.";
|
||||||
|
@ -88,7 +88,7 @@ private enum CreateGiveawayEntry: ItemListNodeEntry {
|
|||||||
case prepaid(PresentationTheme, String, String, PrepaidGiveaway)
|
case prepaid(PresentationTheme, String, String, PrepaidGiveaway)
|
||||||
|
|
||||||
case starsHeader(PresentationTheme, String, String)
|
case starsHeader(PresentationTheme, String, String)
|
||||||
case stars(Int32, PresentationTheme, Int32, String, String, String, Bool)
|
case stars(Int32, PresentationTheme, Int32, String, String, String, Bool, Int32)
|
||||||
case starsMore(PresentationTheme, String)
|
case starsMore(PresentationTheme, String)
|
||||||
case starsInfo(PresentationTheme, String)
|
case starsInfo(PresentationTheme, String)
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ private enum CreateGiveawayEntry: ItemListNodeEntry {
|
|||||||
return 3
|
return 3
|
||||||
case .starsHeader:
|
case .starsHeader:
|
||||||
return 4
|
return 4
|
||||||
case let .stars(_, _, stars, _, _, _, _):
|
case let .stars(_, _, stars, _, _, _, _, _):
|
||||||
return 5 + stars
|
return 5 + stars
|
||||||
case .starsMore:
|
case .starsMore:
|
||||||
return 100000
|
return 100000
|
||||||
@ -262,8 +262,8 @@ private enum CreateGiveawayEntry: ItemListNodeEntry {
|
|||||||
} else {
|
} else {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
case let .stars(lhsIndex, lhsTheme, lhsStars, lhsTitle, lhsSubtitle, lhsLabel, lhsIsSelected):
|
case let .stars(lhsIndex, lhsTheme, lhsStars, lhsTitle, lhsSubtitle, lhsLabel, lhsIsSelected, lhsMaxWinners):
|
||||||
if case let .stars(rhsIndex, rhsTheme, rhsStars, rhsTitle, rhsSubtitle, rhsLabel, rhsIsSelected) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsStars == rhsStars, lhsTitle == rhsTitle, lhsSubtitle == rhsSubtitle, lhsLabel == rhsLabel, lhsIsSelected == rhsIsSelected {
|
if case let .stars(rhsIndex, rhsTheme, rhsStars, rhsTitle, rhsSubtitle, rhsLabel, rhsIsSelected, rhsMaxWinners) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsStars == rhsStars, lhsTitle == rhsTitle, lhsSubtitle == rhsSubtitle, lhsLabel == rhsLabel, lhsIsSelected == rhsIsSelected, lhsMaxWinners == rhsMaxWinners {
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
return false
|
return false
|
||||||
@ -472,11 +472,12 @@ private enum CreateGiveawayEntry: ItemListNodeEntry {
|
|||||||
return GiftOptionItem(presentationData: presentationData, context: arguments.context, icon: .image(color: color, name: "Premium/Giveaway"), title: title, titleFont: .bold, titleBadge: "\(prepaidGiveaway.quantity * 4)", subtitle: subtitle, sectionId: self.section, action: nil)
|
return GiftOptionItem(presentationData: presentationData, context: arguments.context, icon: .image(color: color, name: "Premium/Giveaway"), title: title, titleFont: .bold, titleBadge: "\(prepaidGiveaway.quantity * 4)", subtitle: subtitle, sectionId: self.section, action: nil)
|
||||||
case let .starsHeader(_, text, additionalText):
|
case let .starsHeader(_, text, additionalText):
|
||||||
return ItemListSectionHeaderItem(presentationData: presentationData, text: text, accessoryText: ItemListSectionHeaderAccessoryText(value: additionalText, color: .generic), sectionId: self.section)
|
return ItemListSectionHeaderItem(presentationData: presentationData, text: text, accessoryText: ItemListSectionHeaderAccessoryText(value: additionalText, color: .generic), sectionId: self.section)
|
||||||
case let .stars(_, _, stars, title, subtitle, label, isSelected):
|
case let .stars(_, _, stars, title, subtitle, label, isSelected, maxWinners):
|
||||||
return GiftOptionItem(presentationData: presentationData, context: arguments.context, title: title, subtitle: subtitle, subtitleFont: .small, label: .generic(label), badge: nil, isSelected: isSelected, stars: Int64(stars), sectionId: self.section, action: {
|
return GiftOptionItem(presentationData: presentationData, context: arguments.context, title: title, subtitle: subtitle, subtitleFont: .small, label: .generic(label), badge: nil, isSelected: isSelected, stars: Int64(stars), sectionId: self.section, action: {
|
||||||
arguments.updateState { state in
|
arguments.updateState { state in
|
||||||
var updatedState = state
|
var updatedState = state
|
||||||
updatedState.stars = Int64(stars)
|
updatedState.stars = Int64(stars)
|
||||||
|
updatedState.winners = min(updatedState.winners, maxWinners)
|
||||||
return updatedState
|
return updatedState
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -753,11 +754,10 @@ private func createGiveawayControllerEntries(
|
|||||||
recipientsText = presentationData.strings.BoostGift_CreateGiveawayInfo //presentationData.strings.BoostGift_SelectRecipients
|
recipientsText = presentationData.strings.BoostGift_CreateGiveawayInfo //presentationData.strings.BoostGift_SelectRecipients
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO:localize
|
entries.append(.modeHeader(presentationData.theme, presentationData.strings.BoostGift_Prize.uppercased()))
|
||||||
entries.append(.modeHeader(presentationData.theme, "PRIZE"))
|
entries.append(.giftPremium(presentationData.theme, presentationData.strings.BoostGift_Prize_Premium, recipientsText, state.mode == .giveaway || state.mode == .gift))
|
||||||
entries.append(.giftPremium(presentationData.theme, "Telegram Premium", recipientsText, state.mode == .giveaway || state.mode == .gift))
|
|
||||||
|
|
||||||
entries.append(.giftStars(presentationData.theme, "Telegram Stars", presentationData.strings.BoostGift_CreateGiveawayInfo, state.mode == .starsGiveaway))
|
entries.append(.giftStars(presentationData.theme, presentationData.strings.BoostGift_Prize_Stars, presentationData.strings.BoostGift_CreateGiveawayInfo, state.mode == .starsGiveaway))
|
||||||
case let .prepaid(prepaidGiveaway):
|
case let .prepaid(prepaidGiveaway):
|
||||||
entries.append(.prepaidHeader(presentationData.theme, presentationData.strings.BoostGift_PrepaidGiveawayTitle))
|
entries.append(.prepaidHeader(presentationData.theme, presentationData.strings.BoostGift_PrepaidGiveawayTitle))
|
||||||
entries.append(.prepaid(presentationData.theme, presentationData.strings.BoostGift_PrepaidGiveawayCount(prepaidGiveaway.quantity), presentationData.strings.BoostGift_PrepaidGiveawayMonths("\(prepaidGiveaway.months)").string, prepaidGiveaway))
|
entries.append(.prepaid(presentationData.theme, presentationData.strings.BoostGift_PrepaidGiveawayCount(prepaidGiveaway.quantity), presentationData.strings.BoostGift_PrepaidGiveawayMonths("\(prepaidGiveaway.months)").string, prepaidGiveaway))
|
||||||
@ -765,30 +765,32 @@ private func createGiveawayControllerEntries(
|
|||||||
|
|
||||||
if case .starsGiveaway = state.mode, !starsGiveawayOptions.isEmpty {
|
if case .starsGiveaway = state.mode, !starsGiveawayOptions.isEmpty {
|
||||||
let selectedOption = starsGiveawayOptions.first(where: { $0.giveawayOption.count == state.stars })!
|
let selectedOption = starsGiveawayOptions.first(where: { $0.giveawayOption.count == state.stars })!
|
||||||
entries.append(.starsHeader(presentationData.theme, "STARS TO DISTRIBUTE".uppercased(), "\(selectedOption.giveawayOption.yearlyBoosts) BOOSTS"))
|
entries.append(.starsHeader(presentationData.theme, presentationData.strings.BoostGift_Stars_Title.uppercased(), presentationData.strings.BoostGift_Stars_Boosts(selectedOption.giveawayOption.yearlyBoosts).uppercased()))
|
||||||
|
|
||||||
var i: Int32 = 0
|
var i: Int32 = 0
|
||||||
for product in starsGiveawayOptions {
|
for product in starsGiveawayOptions {
|
||||||
if !state.starsExpanded && product.giveawayOption.isExtended {
|
if !state.starsExpanded && product.giveawayOption.isExtended {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
let giftTitle: String = "\(product.giveawayOption.count) Stars"
|
let giftTitle: String = presentationData.strings.BoostGift_Stars_Stars(Int32(product.giveawayOption.count))
|
||||||
let winners = product.giveawayOption.winners.first(where: { $0.users == state.winners }) ?? product.giveawayOption.winners.first!
|
let winners = product.giveawayOption.winners.first(where: { $0.users == state.winners }) ?? product.giveawayOption.winners.first!
|
||||||
|
|
||||||
let subtitle = "\(winners.starsPerUser) per user"
|
let maxWinners = product.giveawayOption.winners.sorted(by: { $0.users < $1.users }).last?.users ?? 1
|
||||||
|
|
||||||
|
let subtitle = presentationData.strings.BoostGift_Stars_PerUser("\(winners.starsPerUser)").string
|
||||||
let label = product.storeProduct.price
|
let label = product.storeProduct.price
|
||||||
|
|
||||||
let isSelected = product.giveawayOption.count == state.stars
|
let isSelected = product.giveawayOption.count == state.stars
|
||||||
entries.append(.stars(i, presentationData.theme, Int32(product.giveawayOption.count), giftTitle, subtitle, label, isSelected))
|
entries.append(.stars(i, presentationData.theme, Int32(product.giveawayOption.count), giftTitle, subtitle, label, isSelected, maxWinners))
|
||||||
|
|
||||||
i += 1
|
i += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if !state.starsExpanded {
|
if !state.starsExpanded {
|
||||||
entries.append(.starsMore(presentationData.theme, "Show More Options"))
|
entries.append(.starsMore(presentationData.theme, presentationData.strings.BoostGift_Stars_ShowMoreOptions))
|
||||||
}
|
}
|
||||||
|
|
||||||
entries.append(.starsInfo(presentationData.theme, "Choose how many stars to give away and how many boosts to receive for 1 year."))
|
entries.append(.starsInfo(presentationData.theme, presentationData.strings.BoostGift_Stars_Info))
|
||||||
}
|
}
|
||||||
|
|
||||||
let appendDurationEntries = {
|
let appendDurationEntries = {
|
||||||
@ -847,9 +849,11 @@ private func createGiveawayControllerEntries(
|
|||||||
if let selectedOption = starsGiveawayOptions.first(where: { $0.giveawayOption.count == state.stars }) {
|
if let selectedOption = starsGiveawayOptions.first(where: { $0.giveawayOption.count == state.stars }) {
|
||||||
values = selectedOption.giveawayOption.winners.map { $0.users }
|
values = selectedOption.giveawayOption.winners.map { $0.users }
|
||||||
}
|
}
|
||||||
entries.append(.subscriptionsHeader(presentationData.theme, "NUMBER OF WINNERS", ""))
|
if values.count > 1 {
|
||||||
|
entries.append(.subscriptionsHeader(presentationData.theme, presentationData.strings.BoostGift_Stars_Winners, ""))
|
||||||
entries.append(.subscriptions(presentationData.theme, state.winners, values))
|
entries.append(.subscriptions(presentationData.theme, state.winners, values))
|
||||||
entries.append(.subscriptionsInfo(presentationData.theme, "Choose how many winners you want to distribute stars among."))
|
entries.append(.subscriptionsInfo(presentationData.theme, presentationData.strings.BoostGift_Stars_WinnersInfo))
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if case .generic = subject {
|
if case .generic = subject {
|
||||||
entries.append(.subscriptionsHeader(presentationData.theme, presentationData.strings.BoostGift_QuantityTitle.uppercased(), presentationData.strings.BoostGift_QuantityBoosts(state.subscriptions * 4)))
|
entries.append(.subscriptionsHeader(presentationData.theme, presentationData.strings.BoostGift_QuantityTitle.uppercased(), presentationData.strings.BoostGift_QuantityBoosts(state.subscriptions * 4)))
|
||||||
@ -904,7 +908,7 @@ private func createGiveawayControllerEntries(
|
|||||||
}
|
}
|
||||||
|
|
||||||
entries.append(.prizeDescription(presentationData.theme, presentationData.strings.BoostGift_AdditionalPrizes, state.showPrizeDescription))
|
entries.append(.prizeDescription(presentationData.theme, presentationData.strings.BoostGift_AdditionalPrizes, state.showPrizeDescription))
|
||||||
var prizeDescriptionInfoText = state.mode == .starsGiveaway ? "Turn this on if you want to give the winners your own prizes in addition to Stars." : presentationData.strings.BoostGift_AdditionalPrizesInfoOff
|
var prizeDescriptionInfoText = state.mode == .starsGiveaway ? presentationData.strings.BoostGift_AdditionalPrizesInfoStarsOff : presentationData.strings.BoostGift_AdditionalPrizesInfoOff
|
||||||
if state.showPrizeDescription {
|
if state.showPrizeDescription {
|
||||||
entries.append(.prizeDescriptionText(presentationData.theme, presentationData.strings.BoostGift_AdditionalPrizesPlaceholder, state.prizeDescription, state.subscriptions))
|
entries.append(.prizeDescriptionText(presentationData.theme, presentationData.strings.BoostGift_AdditionalPrizesPlaceholder, state.prizeDescription, state.subscriptions))
|
||||||
|
|
||||||
@ -926,13 +930,13 @@ private func createGiveawayControllerEntries(
|
|||||||
let timeInfoText: String
|
let timeInfoText: String
|
||||||
if isGroup {
|
if isGroup {
|
||||||
if case .starsGiveaway = state.mode {
|
if case .starsGiveaway = state.mode {
|
||||||
timeInfoText = "Choose when \(presentationData.strings.BoostGift_Group_DateInfoMembers(Int32(state.winners))) of your group will be randomly selected to receive Stars."
|
timeInfoText = presentationData.strings.BoostGift_Group_StarsDateInfo(presentationData.strings.BoostGift_Group_DateInfoMembers(Int32(state.winners))).string
|
||||||
} else {
|
} else {
|
||||||
timeInfoText = presentationData.strings.BoostGift_Group_DateInfo(presentationData.strings.BoostGift_Group_DateInfoMembers(Int32(state.subscriptions))).string
|
timeInfoText = presentationData.strings.BoostGift_Group_DateInfo(presentationData.strings.BoostGift_Group_DateInfoMembers(Int32(state.subscriptions))).string
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if case .starsGiveaway = state.mode {
|
if case .starsGiveaway = state.mode {
|
||||||
timeInfoText = "Choose when \(presentationData.strings.BoostGift_DateInfoSubscribers(Int32(state.winners))) of your channel will be randomly selected to receive Stars."
|
timeInfoText = presentationData.strings.BoostGift_StarsDateInfo(presentationData.strings.BoostGift_DateInfoSubscribers(Int32(state.winners))).string
|
||||||
} else {
|
} else {
|
||||||
timeInfoText = presentationData.strings.BoostGift_DateInfo(presentationData.strings.BoostGift_DateInfoSubscribers(Int32(state.subscriptions))).string
|
timeInfoText = presentationData.strings.BoostGift_DateInfo(presentationData.strings.BoostGift_DateInfoSubscribers(Int32(state.subscriptions))).string
|
||||||
}
|
}
|
||||||
@ -1142,9 +1146,8 @@ public func createGiveawayController(context: AccountContext, updatedPresentatio
|
|||||||
}
|
}
|
||||||
let _ = isGroupValue.swap(isGroup)
|
let _ = isGroupValue.swap(isGroup)
|
||||||
|
|
||||||
//TODO:localize
|
let headerText = isGroup ? presentationData.strings.BoostGift_NewDescriptionGroup : presentationData.strings.BoostGift_NewDescription
|
||||||
let headerText = isGroup ? "Get more boosts and members for\nyour group by giving away prizes." : "Get more boosts and subscribers for\nyour channel by giving away prizes."
|
let headerItem = CreateGiveawayHeaderItem(theme: presentationData.theme, strings: presentationData.strings, title: presentationData.strings.BoostGift_Title, text: headerText, isStars: state.mode == .starsGiveaway, cancel: {
|
||||||
let headerItem = CreateGiveawayHeaderItem(theme: presentationData.theme, strings: presentationData.strings, title: presentationData.strings.BoostGift_Title, text: headerText, cancel: {
|
|
||||||
dismissImpl?()
|
dismissImpl?()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -15,13 +15,15 @@ final class CreateGiveawayHeaderItem: ItemListControllerHeaderItem {
|
|||||||
let strings: PresentationStrings
|
let strings: PresentationStrings
|
||||||
let title: String
|
let title: String
|
||||||
let text: String
|
let text: String
|
||||||
|
let isStars: Bool
|
||||||
let cancel: () -> Void
|
let cancel: () -> Void
|
||||||
|
|
||||||
init(theme: PresentationTheme, strings: PresentationStrings, title: String, text: String, cancel: @escaping () -> Void) {
|
init(theme: PresentationTheme, strings: PresentationStrings, title: String, text: String, isStars: Bool, cancel: @escaping () -> Void) {
|
||||||
self.theme = theme
|
self.theme = theme
|
||||||
self.strings = strings
|
self.strings = strings
|
||||||
self.title = title
|
self.title = title
|
||||||
self.text = text
|
self.text = text
|
||||||
|
self.isStars = isStars
|
||||||
self.cancel = cancel
|
self.cancel = cancel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,10 +272,21 @@ public func presentGiveawayInfoController(
|
|||||||
title = presentationData.strings.Chat_Giveaway_Info_EndedTitle
|
title = presentationData.strings.Chat_Giveaway_Info_EndedTitle
|
||||||
|
|
||||||
let intro: String
|
let intro: String
|
||||||
|
if stars > 0 {
|
||||||
|
let starsString = presentationData.strings.Chat_Giveaway_Info_Stars_Stars(Int32(stars))
|
||||||
if isGroup {
|
if isGroup {
|
||||||
intro = presentationData.strings.Chat_Giveaway_Info_Group_EndedIntro(peerName, presentationData.strings.Chat_Giveaway_Info_Subscriptions(quantity), presentationData.strings.Chat_Giveaway_Info_Months(months)).string
|
intro = presentationData.strings.Chat_Giveaway_Info_Stars_Group_EndedIntro(peerName, starsString).string
|
||||||
} else {
|
} else {
|
||||||
intro = presentationData.strings.Chat_Giveaway_Info_EndedIntro(peerName, presentationData.strings.Chat_Giveaway_Info_Subscriptions(quantity), presentationData.strings.Chat_Giveaway_Info_Months(months)).string
|
intro = presentationData.strings.Chat_Giveaway_Info_Stars_EndedIntro(peerName, starsString).string
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let subscriptionsString = presentationData.strings.Chat_Giveaway_Info_Subscriptions(quantity)
|
||||||
|
let monthsString = presentationData.strings.Chat_Giveaway_Info_Months(months)
|
||||||
|
if isGroup {
|
||||||
|
intro = presentationData.strings.Chat_Giveaway_Info_Group_EndedIntro(peerName, subscriptionsString, monthsString).string
|
||||||
|
} else {
|
||||||
|
intro = presentationData.strings.Chat_Giveaway_Info_EndedIntro(peerName, subscriptionsString, monthsString).string
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var ending: String
|
var ending: String
|
||||||
|
@ -255,7 +255,7 @@ private final class SubscriptionsCountItemNode: ListViewItemNode {
|
|||||||
textNode.isHidden = false
|
textNode.isHidden = false
|
||||||
var position = params.leftInset + 18.0 + delta * CGFloat(i)
|
var position = params.leftInset + 18.0 + delta * CGFloat(i)
|
||||||
if i == textNodes.count - 1 {
|
if i == textNodes.count - 1 {
|
||||||
position -= textSize.width
|
position -= textSize.width / 2.0 + 2.0
|
||||||
} else if i > 0 {
|
} else if i > 0 {
|
||||||
position -= textSize.width / 2.0
|
position -= textSize.width / 2.0
|
||||||
}
|
}
|
||||||
@ -290,30 +290,12 @@ private final class SubscriptionsCountItemNode: ListViewItemNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc func sliderValueChanged() {
|
@objc func sliderValueChanged() {
|
||||||
guard let sliderView = self.sliderView else {
|
guard let sliderView = self.sliderView, let item = self.item else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
let value = Int(sliderView.value)
|
||||||
var mappedValue: Int32 = 1
|
if value >= 0 && value < item.values.count {
|
||||||
switch Int(sliderView.value) {
|
self.item?.updated(item.values[value])
|
||||||
case 0:
|
|
||||||
mappedValue = 1
|
|
||||||
case 1:
|
|
||||||
mappedValue = 3
|
|
||||||
case 2:
|
|
||||||
mappedValue = 5
|
|
||||||
case 3:
|
|
||||||
mappedValue = 7
|
|
||||||
case 4:
|
|
||||||
mappedValue = 10
|
|
||||||
case 5:
|
|
||||||
mappedValue = 25
|
|
||||||
case 6:
|
|
||||||
mappedValue = 50
|
|
||||||
default:
|
|
||||||
mappedValue = 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.item?.updated(Int32(mappedValue))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,8 @@ swift_library(
|
|||||||
"//submodules/TelegramUI/Components/Chat/ChatMessageItemCommon",
|
"//submodules/TelegramUI/Components/Chat/ChatMessageItemCommon",
|
||||||
"//submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentButtonNode",
|
"//submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentButtonNode",
|
||||||
"//submodules/TelegramUI/Components/ChatControllerInteraction",
|
"//submodules/TelegramUI/Components/ChatControllerInteraction",
|
||||||
|
"//submodules/TelegramUI/Components/TextNodeWithEntities",
|
||||||
|
"//submodules/TextFormat",
|
||||||
],
|
],
|
||||||
visibility = [
|
visibility = [
|
||||||
"//visibility:public",
|
"//visibility:public",
|
||||||
|
@ -19,6 +19,8 @@ import ChatMessageBubbleContentNode
|
|||||||
import ChatMessageItemCommon
|
import ChatMessageItemCommon
|
||||||
import ChatMessageAttachedContentButtonNode
|
import ChatMessageAttachedContentButtonNode
|
||||||
import ChatControllerInteraction
|
import ChatControllerInteraction
|
||||||
|
import TextNodeWithEntities
|
||||||
|
import TextFormat
|
||||||
|
|
||||||
private let titleFont = Font.medium(15.0)
|
private let titleFont = Font.medium(15.0)
|
||||||
private let textFont = Font.regular(13.0)
|
private let textFont = Font.regular(13.0)
|
||||||
@ -48,7 +50,7 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode,
|
|||||||
private let dateTextNode: TextNode
|
private let dateTextNode: TextNode
|
||||||
|
|
||||||
private let badgeBackgroundNode: ASImageNode
|
private let badgeBackgroundNode: ASImageNode
|
||||||
private let badgeTextNode: TextNode
|
private let badgeTextNode: TextNodeWithEntities
|
||||||
|
|
||||||
private var giveaway: TelegramMediaGiveaway?
|
private var giveaway: TelegramMediaGiveaway?
|
||||||
|
|
||||||
@ -104,7 +106,7 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode,
|
|||||||
self.badgeBackgroundNode = ASImageNode()
|
self.badgeBackgroundNode = ASImageNode()
|
||||||
self.badgeBackgroundNode.displaysAsynchronously = false
|
self.badgeBackgroundNode.displaysAsynchronously = false
|
||||||
|
|
||||||
self.badgeTextNode = TextNode()
|
self.badgeTextNode = TextNodeWithEntities()
|
||||||
|
|
||||||
self.buttonNode = ChatMessageAttachedContentButtonNode()
|
self.buttonNode = ChatMessageAttachedContentButtonNode()
|
||||||
self.channelButtons = PeerButtonsStackNode()
|
self.channelButtons = PeerButtonsStackNode()
|
||||||
@ -126,7 +128,7 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode,
|
|||||||
self.addSubnode(self.channelButtons)
|
self.addSubnode(self.channelButtons)
|
||||||
self.addSubnode(self.animationNode)
|
self.addSubnode(self.animationNode)
|
||||||
self.addSubnode(self.badgeBackgroundNode)
|
self.addSubnode(self.badgeBackgroundNode)
|
||||||
self.addSubnode(self.badgeTextNode)
|
self.addSubnode(self.badgeTextNode.textNode)
|
||||||
|
|
||||||
self.buttonNode.addTarget(self, action: #selector(self.buttonPressed), forControlEvents: .touchUpInside)
|
self.buttonNode.addTarget(self, action: #selector(self.buttonPressed), forControlEvents: .touchUpInside)
|
||||||
|
|
||||||
@ -221,7 +223,7 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode,
|
|||||||
let makeDateTitleLayout = TextNode.asyncLayout(self.dateTitleNode)
|
let makeDateTitleLayout = TextNode.asyncLayout(self.dateTitleNode)
|
||||||
let makeDateTextLayout = TextNode.asyncLayout(self.dateTextNode)
|
let makeDateTextLayout = TextNode.asyncLayout(self.dateTextNode)
|
||||||
|
|
||||||
let makeBadgeTextLayout = TextNode.asyncLayout(self.badgeTextNode)
|
let makeBadgeTextLayout = TextNodeWithEntities.asyncLayout(self.badgeTextNode)
|
||||||
|
|
||||||
let makeButtonLayout = ChatMessageAttachedContentButtonNode.asyncLayout(self.buttonNode)
|
let makeButtonLayout = ChatMessageAttachedContentButtonNode.asyncLayout(self.buttonNode)
|
||||||
|
|
||||||
@ -267,7 +269,7 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode,
|
|||||||
case .premium:
|
case .premium:
|
||||||
badgeText = "X\(giveaway.quantity)"
|
badgeText = "X\(giveaway.quantity)"
|
||||||
case let .stars(amount):
|
case let .stars(amount):
|
||||||
badgeText = "\(amount)"
|
badgeText = "⭐️\(presentationStringsFormattedNumber(Int32(amount), item.presentationData.dateTimeFormat.groupingSeparator)) "
|
||||||
isStars = true
|
isStars = true
|
||||||
}
|
}
|
||||||
} else if let giveawayResults {
|
} else if let giveawayResults {
|
||||||
@ -275,13 +277,17 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode,
|
|||||||
case .premium:
|
case .premium:
|
||||||
badgeText = "X\(giveawayResults.winnersCount)"
|
badgeText = "X\(giveawayResults.winnersCount)"
|
||||||
case let .stars(amount):
|
case let .stars(amount):
|
||||||
badgeText = "\(amount)"
|
badgeText = "⭐️\(presentationStringsFormattedNumber(Int32(amount), item.presentationData.dateTimeFormat.groupingSeparator)) "
|
||||||
isStars = true
|
isStars = true
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
badgeText = ""
|
badgeText = ""
|
||||||
}
|
}
|
||||||
let badgeString = NSAttributedString(string: badgeText, font: Font.with(size: 10.0, design: .round , weight: .bold, traits: .monospacedNumbers), textColor: badgeTextColor)
|
let badgeString = NSMutableAttributedString(string: badgeText, font: Font.with(size: 10.0, design: .round , weight: .bold, traits: .monospacedNumbers), textColor: badgeTextColor)
|
||||||
|
if let range = badgeString.string.range(of: "⭐️") {
|
||||||
|
badgeString.addAttribute(ChatTextInputAttributes.customEmoji, value: ChatTextInputTextCustomEmojiAttribute(interactivelySelectedFromPackId: nil, fileId: 0, file: nil, custom: .stars(tinted: true)), range: NSRange(range, in: badgeString.string))
|
||||||
|
badgeString.addAttribute(.baselineOffset, value: 1.5, range: NSRange(range, in: badgeString.string))
|
||||||
|
}
|
||||||
|
|
||||||
var updatedBadgeImage: UIImage?
|
var updatedBadgeImage: UIImage?
|
||||||
if themeUpdated {
|
if themeUpdated {
|
||||||
@ -690,7 +696,7 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode,
|
|||||||
strongSelf.giveaway = giveaway
|
strongSelf.giveaway = giveaway
|
||||||
|
|
||||||
let displaysAsynchronously = !item.presentationData.isPreview
|
let displaysAsynchronously = !item.presentationData.isPreview
|
||||||
strongSelf.badgeTextNode.displaysAsynchronously = displaysAsynchronously
|
strongSelf.badgeTextNode.textNode.displaysAsynchronously = displaysAsynchronously
|
||||||
strongSelf.prizeTitleNode.displaysAsynchronously = displaysAsynchronously
|
strongSelf.prizeTitleNode.displaysAsynchronously = displaysAsynchronously
|
||||||
strongSelf.prizeTextNode.displaysAsynchronously = displaysAsynchronously
|
strongSelf.prizeTextNode.displaysAsynchronously = displaysAsynchronously
|
||||||
strongSelf.additionalPrizeTextNode.displaysAsynchronously = displaysAsynchronously
|
strongSelf.additionalPrizeTextNode.displaysAsynchronously = displaysAsynchronously
|
||||||
@ -705,7 +711,7 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode,
|
|||||||
|
|
||||||
strongSelf.updateVisibility()
|
strongSelf.updateVisibility()
|
||||||
|
|
||||||
let _ = badgeTextApply()
|
let _ = badgeTextApply(TextNodeWithEntities.Arguments(context: item.context, cache: item.context.animationCache, renderer: item.context.animationRenderer, placeholderColor: .clear, attemptSynchronous: true))
|
||||||
let _ = prizeTitleApply()
|
let _ = prizeTitleApply()
|
||||||
let _ = prizeTextApply()
|
let _ = prizeTextApply()
|
||||||
let _ = additionalPrizeSeparatorApply()
|
let _ = additionalPrizeSeparatorApply()
|
||||||
@ -728,7 +734,7 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode,
|
|||||||
strongSelf.animationNode.updateLayout(size: iconSize)
|
strongSelf.animationNode.updateLayout(size: iconSize)
|
||||||
|
|
||||||
let badgeTextFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((layoutSize.width - badgeTextLayout.size.width) / 2.0) + 1.0, y: originY + 88.0), size: badgeTextLayout.size)
|
let badgeTextFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((layoutSize.width - badgeTextLayout.size.width) / 2.0) + 1.0, y: originY + 88.0), size: badgeTextLayout.size)
|
||||||
strongSelf.badgeTextNode.frame = badgeTextFrame
|
strongSelf.badgeTextNode.textNode.frame = badgeTextFrame
|
||||||
strongSelf.badgeBackgroundNode.frame = badgeTextFrame.insetBy(dx: -6.0, dy: -5.0).offsetBy(dx: -1.0, dy: 0.0)
|
strongSelf.badgeBackgroundNode.frame = badgeTextFrame.insetBy(dx: -6.0, dy: -5.0).offsetBy(dx: -1.0, dy: 0.0)
|
||||||
if let updatedBadgeImage {
|
if let updatedBadgeImage {
|
||||||
strongSelf.badgeBackgroundNode.image = updatedBadgeImage
|
strongSelf.badgeBackgroundNode.image = updatedBadgeImage
|
||||||
|
@ -1217,7 +1217,7 @@ public class StarsTransactionScreen: ViewControllerComponentContainer {
|
|||||||
theme: forceDark ? .dark : .default
|
theme: forceDark ? .dark : .default
|
||||||
)
|
)
|
||||||
|
|
||||||
self.navigationPresentation = .standaloneFlatModal
|
self.navigationPresentation = .flatModal
|
||||||
self.automaticallyControlPresentationContextLayout = false
|
self.automaticallyControlPresentationContextLayout = false
|
||||||
|
|
||||||
openPeerImpl = { [weak self] peer in
|
openPeerImpl = { [weak self] peer in
|
||||||
|
Loading…
x
Reference in New Issue
Block a user