Various fixes

This commit is contained in:
Ilya Laktyushin 2025-12-11 21:36:25 +04:00
parent 68a75ff7fc
commit aeb2e35d42
15 changed files with 202 additions and 72 deletions

View file

@ -468,7 +468,7 @@ public final class SheetComponent<ChildEnvironmentType: Sendable & Equatable>: C
switch component.style {
case .glass:
let clipFrame = CGRect(origin: CGPoint(x: glassInset, y: -glassInset), size: CGSize(width: contentSize.width, height: contentSize.height))
self.clipView.update(size: clipFrame.size, color: .clear, topCornerRadius: topCornerRadius, bottomCornerRadius: bottomCornerRadius, transition: transition)
self.clipView.update(size: clipFrame.size, color: .clear, topCornerRadius: topCornerRadius - 1.5, bottomCornerRadius: bottomCornerRadius, transition: transition)
transition.setFrame(view: self.clipView, frame: clipFrame)
transition.setFrame(view: contentView, frame: CGRect(origin: .zero, size: CGSize(width: contentSize.width, height: contentSize.height)), completion: nil)
transition.setFrame(view: self.backgroundView, frame: CGRect(origin: CGPoint(x: glassInset, y: -glassInset), size: CGSize(width: contentSize.width, height: contentSize.height)), completion: nil)
@ -482,7 +482,7 @@ public final class SheetComponent<ChildEnvironmentType: Sendable & Equatable>: C
transition.setFrame(view: effectView, frame: CGRect(origin: .zero, size: CGSize(width: contentSize.width, height: contentSize.height + 1000.0)), completion: nil)
}
}
self.backgroundView.update(size: contentSize, color: backgroundColor, topCornerRadius: topCornerRadius, bottomCornerRadius: bottomCornerRadius, transition: transition)
self.backgroundView.update(size: contentSize, color: backgroundColor, topCornerRadius: topCornerRadius + 1.5, bottomCornerRadius: bottomCornerRadius, transition: transition)
}
}
transition.setFrame(view: self.scrollView, frame: CGRect(origin: CGPoint(), size: availableSize), completion: nil)

View file

@ -716,6 +716,22 @@ NSString *suffix = @"";
[platform isEqualToString:@"iPad14,11"])
return @"iPad Air (7th gen)";
if ([platform isEqualToString:@"iPad15,3"] ||
[platform isEqualToString:@"iPad15,4"])
return @"iPad Air 11 inch (7th gen)";
if ([platform isEqualToString:@"iPad15,5"] ||
[platform isEqualToString:@"iPad15,6"])
return @"iPad Air 13 inch (7th gen)";
if ([platform isEqualToString:@"iPad15,7"] ||
[platform isEqualToString:@"iPad15,8"])
return @"iPad (11th gen)";
if ([platform isEqualToString:@"iPad16,1"] ||
[platform isEqualToString:@"iPad16,2"])
return @"iPad mini (7th gen)";
if ([platform isEqualToString:@"iPad16,3"] ||
[platform isEqualToString:@"iPad16,4"])
return @"iPad Pro 11 inch (5th gen)";

View file

@ -1664,6 +1664,12 @@ public func selectivePrivacySettingsController(
} else {
updatedDisallowedGifts.remove(.premium)
}
case .channel:
if value {
updatedDisallowedGifts.insert(.channel)
} else {
updatedDisallowedGifts.remove(.channel)
}
default:
break
}

View file

@ -580,7 +580,7 @@ public class GiftAuctionsManager {
}
public extension GiftAuctionContext.State {
func getPlace(myBid: Int64?, myBidDate: Int32?) -> Int32? {
func getPlace(myBid: Int64?, myBidDate: Int32?) -> (place: Int32, isApproximate: Bool)? {
guard case let .ongoing(_, _, _, _, bidLevels, _, _, _, _, _, _, _) = self.auctionState else {
return nil
}
@ -592,7 +592,7 @@ public extension GiftAuctionContext.State {
let levels = bidLevels
guard !levels.isEmpty else {
return 1
return (1, false)
}
func isWorse(than level: GiftAuctionContext.State.BidLevel) -> Bool {
@ -614,7 +614,7 @@ public extension GiftAuctionContext.State {
}
}
if lowerIndex == -1 {
return 1
return (1, false)
}
let lowerPosition = levels[lowerIndex].position
@ -626,14 +626,14 @@ public extension GiftAuctionContext.State {
nextPosition = lowerPosition
}
if nextPosition == lowerPosition + 1 {
return lowerPosition + 1
return (lowerPosition + 1, false)
} else {
return nextPosition
return (lowerPosition, true)
}
}
var place: Int32? {
return self.getPlace(myBid: nil, myBidDate: nil)
return self.getPlace(myBid: nil, myBidDate: nil)?.place
}
var startDate: Int32 {

View file

@ -1663,7 +1663,7 @@ public func universalServiceMessageString(presentationData: (PresentationTheme,
case .stars:
priceString = strings.Notification_StarsGiftOffer_OfferYou_Stars(Int32(clamping: amount.amount.value))
case .ton:
priceString = "\(amount.amount) TON"
priceString = formatTonAmountText(amount.amount.value, dateTimeFormat: dateTimeFormat) + " TON"
}
attributedString = addAttributesToStringWithRanges(strings.Notification_StarsGiftOffer_OfferYou(peerName, priceString, giftTitle)._tuple, body: bodyAttributes, argumentAttributes: attributes)
@ -1673,7 +1673,7 @@ public func universalServiceMessageString(presentationData: (PresentationTheme,
case .stars:
priceString = strings.Notification_StarsGiftOffer_Offer_Stars(Int32(clamping: amount.amount.value))
case .ton:
priceString = "\(amount.amount) TON"
priceString = formatTonAmountText(amount.amount.value, dateTimeFormat: dateTimeFormat) + " TON"
}
attributedString = addAttributesToStringWithRanges(strings.Notification_StarsGiftOffer_Offer(peerName, priceString, giftTitle)._tuple, body: bodyAttributes, argumentAttributes: attributes)
@ -1696,7 +1696,7 @@ public func universalServiceMessageString(presentationData: (PresentationTheme,
case .stars:
priceString = strings.Notification_StarsGiftOffer_ExpiredYou_Stars(Int32(clamping: amount.amount.value))
case .ton:
priceString = "\(amount.amount) TON"
priceString = formatTonAmountText(amount.amount.value, dateTimeFormat: dateTimeFormat) + " TON"
}
var attributes = peerMentionsAttributes(primaryTextColor: primaryTextColor, peerIds: peerIds)
@ -1709,7 +1709,7 @@ public func universalServiceMessageString(presentationData: (PresentationTheme,
case .stars:
priceString = strings.Notification_StarsGiftOffer_Expired_Stars(Int32(clamping: amount.amount.value))
case .ton:
priceString = "\(amount.amount) TON"
priceString = formatTonAmountText(amount.amount.value, dateTimeFormat: dateTimeFormat) + " TON"
}
let timeString = "[TODO]"
@ -1730,7 +1730,7 @@ public func universalServiceMessageString(presentationData: (PresentationTheme,
case .stars:
priceString = strings.Notification_StarsGiftOffer_Rejected_Stars(Int32(clamping: amount.amount.value))
case .ton:
priceString = "\(amount.amount) TON"
priceString = formatTonAmountText(amount.amount.value, dateTimeFormat: dateTimeFormat) + " TON"
}
var attributes = peerMentionsAttributes(primaryTextColor: primaryTextColor, peerIds: peerIds)

View file

@ -131,7 +131,7 @@ public class ChatMessageGiftOfferBubbleContentNode: ChatMessageBubbleContentNode
case .stars:
priceString = item.presentationData.strings.Notification_StarGiftOffer_Offer_Stars(Int32(clamping: amount.amount.value))
case .ton:
priceString = "\(amount.amount) TON"
priceString = formatTonAmountText(amount.amount.value, dateTimeFormat: item.presentationData.dateTimeFormat) + " TON"
}
let peerName = item.message.peers[item.message.id.peerId].flatMap { EnginePeer($0) }?.compactDisplayTitle ?? ""

View file

@ -1084,6 +1084,9 @@ final class GiftOptionsScreenComponent: Component {
guard let self, let component = self.component, let controller = controller(), let navigationController = controller.navigationController as? NavigationController else {
return
}
guard component.peerId != component.context.account.peerId else {
return
}
let _ = (component.context.engine.data.get(
TelegramEngine.EngineData.Item.Peer.Peer(id: component.peerId)
)

View file

@ -369,17 +369,20 @@ private final class PeerPlaceComponent: Component {
let theme: PresentationTheme
let color: UIColor
let place: Int32?
let placeIsApproximate: Bool
let groupingSeparator: String
init(
theme: PresentationTheme,
color: UIColor,
place: Int32?,
placeIsApproximate: Bool,
groupingSeparator: String
) {
self.theme = theme
self.color = color
self.place = place
self.placeIsApproximate = placeIsApproximate
self.groupingSeparator = groupingSeparator
}
@ -393,6 +396,9 @@ private final class PeerPlaceComponent: Component {
if lhs.place != rhs.place {
return false
}
if lhs.placeIsApproximate != rhs.placeIsApproximate {
return false
}
if lhs.groupingSeparator != rhs.groupingSeparator {
return false
}
@ -455,7 +461,7 @@ private final class PeerPlaceComponent: Component {
var placeString: String
if let place = component.place {
placeString = presentationStringsFormattedNumber(place, component.groupingSeparator)
if place >= 100 {
if component.placeIsApproximate {
placeString = "\(compactNumericCountString(Int(place), decimalSeparator: ".", showDecimalPart: false))+"
}
} else {
@ -501,6 +507,7 @@ private final class PeerComponent: Component {
let groupingSeparator: String
let peer: EnginePeer
let place: Int32
let placeIsApproximate: Bool
let amount: Int64
let status: Status?
let isLast: Bool
@ -512,6 +519,7 @@ private final class PeerComponent: Component {
groupingSeparator: String,
peer: EnginePeer,
place: Int32,
placeIsApproximate: Bool,
amount: Int64,
status: Status? = nil,
isLast: Bool,
@ -522,6 +530,7 @@ private final class PeerComponent: Component {
self.groupingSeparator = groupingSeparator
self.peer = peer
self.place = place
self.placeIsApproximate = placeIsApproximate
self.amount = amount
self.status = status
self.isLast = isLast
@ -541,6 +550,9 @@ private final class PeerComponent: Component {
if lhs.place != rhs.place {
return false
}
if lhs.placeIsApproximate != rhs.placeIsApproximate {
return false
}
if lhs.amount != rhs.amount {
return false
}
@ -623,8 +635,17 @@ private final class PeerComponent: Component {
let presentationData = component.context.sharedContext.currentPresentationData.with { $0 }
let placeSize = self.place.update(
transition: .immediate,
component: AnyComponent(PeerPlaceComponent(theme: component.theme, color: color, place: component.status == .returned ? nil : component.place, groupingSeparator: presentationData.dateTimeFormat.groupingSeparator)),
environment: {},
component: AnyComponent(
PeerPlaceComponent(
theme: component.theme,
color: color,
place: component.status == .returned ? nil : component.place,
placeIsApproximate: component.placeIsApproximate,
groupingSeparator: presentationData.dateTimeFormat.groupingSeparator
)
),
environment: {
},
containerSize: CGSize(width: 40.0, height: 40.0)
)
let placeFrame = CGRect(origin: CGPoint(x: 0.0, y: floorToScreenPixels((size.height - placeSize.height) / 2.0)), size: placeSize)
@ -2213,8 +2234,9 @@ private final class GiftAuctionBidScreenComponent: Component {
isBiddingUp = false
}
place = giftAuctionState.getPlace(myBid: myBidAmount, myBidDate: myBidDate) ?? 1
let placeAndIsApproximate = giftAuctionState.getPlace(myBid: myBidAmount, myBidDate: myBidDate) ?? (1, false)
place = placeAndIsApproximate.place
var bidTitle: String
var bidTitleColor: UIColor
var bidStatus: PeerComponent.Status?
@ -2247,7 +2269,18 @@ private final class GiftAuctionBidScreenComponent: Component {
if let peer = self.peersMap[component.context.account.peerId] {
myBidTitleComponent = AnyComponent(PeerHeaderComponent(color: bidTitleColor, dateTimeFormat: environment.dateTimeFormat, title: bidTitle, giftTitle: giftTitle, giftNumber: giftNumber))
myBidComponent = AnyComponent(PeerComponent(context: component.context, theme: environment.theme, groupingSeparator: environment.dateTimeFormat.groupingSeparator, peer: peer, place: place, amount: myBidAmount, status: bidStatus, isLast: true, action: nil))
myBidComponent = AnyComponent(PeerComponent(
context: component.context,
theme: environment.theme,
groupingSeparator: environment.dateTimeFormat.groupingSeparator,
peer: peer,
place: place,
placeIsApproximate: placeAndIsApproximate.isApproximate,
amount: myBidAmount,
status: bidStatus,
isLast: true,
action: nil
))
}
var i: Int32 = 1
@ -2259,7 +2292,17 @@ private final class GiftAuctionBidScreenComponent: Component {
break
}
}
topBidsComponents.append((peer.id, AnyComponent(PeerComponent(context: component.context, theme: environment.theme, groupingSeparator: environment.dateTimeFormat.groupingSeparator, peer: peer, place: i, amount: bid, isLast: i == topBidders.count, action: nil))))
topBidsComponents.append((peer.id, AnyComponent(PeerComponent(
context: component.context,
theme: environment.theme,
groupingSeparator: environment.dateTimeFormat.groupingSeparator,
peer: peer,
place: i,
placeIsApproximate: false,
amount: bid,
isLast: i == topBidders.count,
action: nil
))))
i += 1
}

View file

@ -199,7 +199,7 @@ private final class GiftAuctionWearPreviewSheetContent: CombinedComponent {
return { context in
let environment = context.environment[ViewControllerComponentContainer.Environment.self].value
let component = context.component
let theme = environment.theme
let theme = environment.theme.withModalBlocksBackground()
let strings = environment.strings
let nameDisplayOrder = component.context.sharedContext.currentPresentationData.with { $0 }.nameDisplayOrder
let controller = environment.controller

View file

@ -485,7 +485,7 @@ public func giftOfferAlertController(
case .stars:
priceString = strings.Chat_GiftPurchaseOffer_AcceptConfirmation_Text_Stars(Int32(clamping: amount.amount.value))
case .ton:
priceString = "\(amount.amount) TON"
priceString = formatTonAmountText(amount.amount.value, dateTimeFormat: presentationData.dateTimeFormat) + " TON"
}
let resaleConfiguration = StarsSubscriptionConfiguration.with(appConfiguration: context.currentAppConfiguration.with { $0 })

View file

@ -40,6 +40,7 @@ import ChatThemeScreen
import ProfileLevelRatingBarComponent
import AnimatedTextComponent
import InfoParagraphComponent
import ChatMessagePaymentAlertController
private final class GiftViewSheetContent: CombinedComponent {
typealias EnvironmentType = ViewControllerComponentContainer.Environment
@ -2337,6 +2338,7 @@ private final class GiftViewSheetContent: CombinedComponent {
guard let gift = self.subject.arguments?.gift, case let .unique(uniqueGift) = gift, case let .peerId(ownerPeerId) = uniqueGift.owner, let controller = self.getController() else {
return
}
let presentationData = self.context.sharedContext.currentPresentationData.with { $0 }
let _ = (self.context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: ownerPeerId))
|> deliverOnMainQueue).start(next: { [weak self] peer in
guard let self, let peer else {
@ -2346,13 +2348,41 @@ private final class GiftViewSheetContent: CombinedComponent {
guard let self else {
return
}
self.commitGiftBuyOffer(peer: peer, price: amount, duration: duration)
let _ = (self.context.engine.data.get(TelegramEngine.EngineData.Item.Peer.SendPaidMessageStars(id: peer.id))
|> deliverOnMainQueue).start(next: { [weak self, weak controller] sendPaidMessageStars in
guard let self else {
return
}
let action: (Int64?) -> Void = { allowPaidStars in
self.commitGiftBuyOffer(peer: peer, price: amount, duration: duration, allowPaidStars: allowPaidStars)
}
if let sendPaidMessageStars, sendPaidMessageStars.value > 0 {
let alertController = chatMessagePaymentAlertController(
context: nil,
presentationData: presentationData,
updatedPresentationData: nil,
peers: [EngineRenderedPeer(peer: peer)],
count: 1,
amount: sendPaidMessageStars,
totalAmount: nil,
hasCheck: false,
navigationController: controller?.navigationController as? NavigationController,
completion: { _ in
action(sendPaidMessageStars.value)
}
)
controller?.present(alertController, in: .window(.root))
} else {
action(nil)
}
})
}))
controller.push(buyController)
})
}
func commitGiftBuyOffer(peer: EnginePeer, price: CurrencyAmount, duration: Int32) {
func commitGiftBuyOffer(peer: EnginePeer, price: CurrencyAmount, duration: Int32, allowPaidStars: Int64?) {
guard let gift = self.subject.arguments?.gift, case let .unique(uniqueGift) = gift, let starsContext = self.context.starsContext, let starsState = starsContext.currentState else {
return
}
@ -2362,7 +2392,7 @@ private final class GiftViewSheetContent: CombinedComponent {
guard let self else {
return
}
self.upgradeDisposable = (context.engine.payments.sendStarGiftOffer(peerId: peer.id, slug: uniqueGift.slug, amount: price, duration: duration, allowPaidStars: nil)
self.upgradeDisposable = (context.engine.payments.sendStarGiftOffer(peerId: peer.id, slug: uniqueGift.slug, amount: price, duration: duration, allowPaidStars: allowPaidStars)
|> deliverOnMainQueue).start(error: { _ in
}, completed: { [weak self, weak starsContext] in
guard let self else {
@ -2383,11 +2413,15 @@ private final class GiftViewSheetContent: CombinedComponent {
guard let self, let controller = self.getController() else {
return
}
var finalStars = price.amount.value
if let allowPaidStars {
finalStars += allowPaidStars
}
let purchaseController = context.sharedContext.makeStarsPurchaseScreen(
context: context,
starsContext: starsContext,
options: options ?? [],
purpose: .starGiftOffer(requiredStars: price.amount.value),
purpose: .starGiftOffer(requiredStars: finalStars),
targetPeerId: nil,
customTheme: nil,
completion: { [weak self, weak starsContext] stars in
@ -2411,7 +2445,7 @@ private final class GiftViewSheetContent: CombinedComponent {
self.inProgress = false
self.updated()
self.commitGiftBuyOffer(peer: peer, price: price, duration: duration)
self.commitGiftBuyOffer(peer: peer, price: price, duration: duration, allowPaidStars: allowPaidStars)
} else {
proceed()
}
@ -5164,42 +5198,50 @@ final class GiftViewSheetComponent: CombinedComponent {
var headerContent: AnyComponent<Empty>?
if let arguments = context.component.subject.arguments, case .unique = arguments.gift, let fromPeerId = arguments.fromPeerId, var fromPeerName = arguments.fromPeerName, arguments.fromPeerId != context.component.context.account.peerId && !(arguments.fromPeerId?.isTelegramNotifications ?? false) {
let dateString = stringForMediumDate(timestamp: arguments.date, strings: environment.strings, dateTimeFormat: environment.dateTimeFormat, withTime: false)
if fromPeerName.count > 25 {
fromPeerName = "\(fromPeerName.prefix(25))"
var showSenderInfo = false
if arguments.incoming {
showSenderInfo = true
} else if arguments.peerId == context.component.context.account.peerId {
showSenderInfo = true
}
if showSenderInfo {
let dateString = stringForMediumDate(timestamp: arguments.date, strings: environment.strings, dateTimeFormat: environment.dateTimeFormat, withTime: false)
if fromPeerName.count > 25 {
fromPeerName = "\(fromPeerName.prefix(25))"
}
let rawString = environment.strings.Gift_View_SenderInfo(fromPeerName, dateString).string
let attributedString = parseMarkdownIntoAttributedString(rawString, attributes: MarkdownAttributes(body: MarkdownAttributeSet(font: Font.regular(13.0), textColor: .white), bold: MarkdownAttributeSet(font: Font.semibold(13.0), textColor: .white), link: MarkdownAttributeSet(font: Font.regular(13.0), textColor: .white), linkAttribute: { _ in return nil }))
let context = context.component.context
headerContent = AnyComponent(
PlainButtonComponent(content: AnyComponent(HeaderContentComponent(attributedText: attributedString)), action: {
if let controller = controller(), let navigationController = controller.navigationController as? NavigationController {
let _ = (context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: fromPeerId))
|> deliverOnMainQueue).start(next: { [weak navigationController] peer in
guard let peer, let navigationController else {
return
}
context.sharedContext.navigateToChatController(NavigateToChatControllerParams(
navigationController: navigationController,
chatController: nil,
context: context,
chatLocation: .peer(peer),
subject: nil,
botStart: nil,
updateTextInputState: nil,
keepStack: .always,
useExisting: true,
purposefulAction: nil,
scrollToEndIfExists: false,
activateMessageSearch: nil,
animated: true
))
})
}
})
)
}
let rawString = environment.strings.Gift_View_SenderInfo(fromPeerName, dateString).string
let attributedString = parseMarkdownIntoAttributedString(rawString, attributes: MarkdownAttributes(body: MarkdownAttributeSet(font: Font.regular(13.0), textColor: .white), bold: MarkdownAttributeSet(font: Font.semibold(13.0), textColor: .white), link: MarkdownAttributeSet(font: Font.regular(13.0), textColor: .white), linkAttribute: { _ in return nil }))
let context = context.component.context
headerContent = AnyComponent(
PlainButtonComponent(content: AnyComponent(HeaderContentComponent(attributedText: attributedString)), action: {
if let controller = controller(), let navigationController = controller.navigationController as? NavigationController {
let _ = (context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: fromPeerId))
|> deliverOnMainQueue).start(next: { [weak navigationController] peer in
guard let peer, let navigationController else {
return
}
context.sharedContext.navigateToChatController(NavigateToChatControllerParams(
navigationController: navigationController,
chatController: nil,
context: context,
chatLocation: .peer(peer),
subject: nil,
botStart: nil,
updateTextInputState: nil,
keepStack: .always,
useExisting: true,
purposefulAction: nil,
scrollToEndIfExists: false,
activateMessageSearch: nil,
animated: true
))
})
}
})
)
}
let sheet = sheet.update(

View file

@ -142,6 +142,7 @@ final class TableComponent: CombinedComponent {
var innerTotalOffset: CGFloat = 0.0
var hasRowBackground = false
var rowBackgroundIsLast = false
var hasStraightSide = false
for item in context.component.items {
let insets: UIEdgeInsets
@ -194,6 +195,12 @@ final class TableComponent: CombinedComponent {
}
hasRowBackground = true
}
if item.title == nil {
if i != 0 {
rowBackgroundIsLast = true
}
hasStraightSide = true
}
i += 1
}
@ -247,8 +254,8 @@ final class TableComponent: CombinedComponent {
context.clear(bounds)
var offset: CGFloat = 0.0
if hasRowBackground {
offset = rowBackgroundIsLast ? borderRadius : -borderRadius
if hasStraightSide {
offset = rowBackgroundIsLast ? 0.0 : -borderRadius
bounds.origin.y += offset
bounds.size.height += borderRadius

View file

@ -74,13 +74,15 @@ private final class PeerInfoScreenCallListItemNode: PeerInfoScreenItemNode {
let params = ListViewItemLayoutParams(width: width, leftInset: safeInsets.left, rightInset: safeInsets.right, availableHeight: 1000.0)
let verticalInset: CGFloat = 8.0
let itemNode: ItemListCallListItemNode
if let current = self.itemNode {
itemNode = current
addressItem.updateNode(async: { $0() }, node: {
return itemNode
}, params: params, previousItem: nil, nextItem: nil, animation: .None, completion: { (layout, apply) in
let nodeFrame = CGRect(origin: CGPoint(), size: CGSize(width: width, height: layout.size.height))
let nodeFrame = CGRect(origin: CGPoint(x: 0.0, y: verticalInset), size: CGSize(width: width, height: layout.size.height))
itemNode.contentSize = layout.contentSize
itemNode.insets = layout.insets
@ -100,9 +102,8 @@ private final class PeerInfoScreenCallListItemNode: PeerInfoScreenItemNode {
self.addSubnode(itemNode)
}
let verticalInset: CGFloat = 8.0
let height = itemNode.contentSize.height + verticalInset * 2.0
let height = itemNode.contentSize.height + verticalInset * 2.0
transition.updateFrame(node: itemNode, frame: CGRect(origin: CGPoint(x: 0.0, y: verticalInset), size: itemNode.bounds.size))
let highlightNodeOffset: CGFloat = topItem == nil ? 0.0 : UIScreenPixel

View file

@ -1769,8 +1769,15 @@ public final class AmountFieldComponent: Component {
guard let component = self.component, let value = component.value else {
return
}
self.textField.text = "\(value)"
self.placeholderView.view?.isHidden = self.textField.text?.isEmpty ?? false
var text = ""
switch component.currency {
case .stars:
text = "\(value)"
case .ton:
text = "\(formatTonAmountText(value, dateTimeFormat: PresentationDateTimeFormat(timeFormat: component.dateTimeFormat.timeFormat, dateFormat: component.dateTimeFormat.dateFormat, dateSeparator: "", dateSuffix: "", requiresFullYear: false, decimalSeparator: ".", groupingSeparator: ""), maxDecimalPositions: nil))"
}
self.textField.text = text
self.placeholderView.view?.isHidden = !(self.textField.text ?? "").isEmpty
}
func update(component: AmountFieldComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment<EnvironmentType>, transition: ComponentTransition) -> CGSize {
@ -1790,7 +1797,7 @@ public final class AmountFieldComponent: Component {
text = "\(formatTonAmountText(value, dateTimeFormat: PresentationDateTimeFormat(timeFormat: component.dateTimeFormat.timeFormat, dateFormat: component.dateTimeFormat.dateFormat, dateSeparator: "", dateSuffix: "", requiresFullYear: false, decimalSeparator: ".", groupingSeparator: ""), maxDecimalPositions: nil))"
}
self.textField.text = text
self.placeholderView.view?.isHidden = text.isEmpty
self.placeholderView.view?.isHidden = !text.isEmpty
} else {
self.textField.text = ""
}

View file

@ -52,7 +52,12 @@ public enum DeviceModel: CaseIterable, Equatable {
.iPhone16,
.iPhone16Plus,
.iPhone16Pro,
.iPhone16ProMax
.iPhone16ProMax,
.iPhone16e,
.iPhone17,
.iPhone17Pro,
.iPhone17ProMax,
.iPhoneAir
]
}