Various fixes

This commit is contained in:
Ilya Laktyushin 2025-11-14 02:08:00 +04:00
parent 1d351a0547
commit cbf23d0df5
8 changed files with 66 additions and 18 deletions

View File

@ -4,6 +4,7 @@ import UIKit
public final class Button: Component {
public let content: AnyComponent<Empty>
public let minSize: CGSize?
public let hitTestEdgeInsets: UIEdgeInsets?
public let tag: AnyObject?
public let automaticHighlight: Bool
public let isEnabled: Bool
@ -22,6 +23,7 @@ public final class Button: Component {
self.init(
content: content,
minSize: nil,
hitTestEdgeInsets: nil,
tag: nil,
automaticHighlight: automaticHighlight,
isEnabled: isEnabled,
@ -34,6 +36,7 @@ public final class Button: Component {
private init(
content: AnyComponent<Empty>,
minSize: CGSize? = nil,
hitTestEdgeInsets: UIEdgeInsets? = nil,
tag: AnyObject? = nil,
automaticHighlight: Bool = true,
isEnabled: Bool = true,
@ -44,6 +47,7 @@ public final class Button: Component {
) {
self.content = content
self.minSize = minSize
self.hitTestEdgeInsets = hitTestEdgeInsets
self.tag = tag
self.automaticHighlight = automaticHighlight
self.isEnabled = isEnabled
@ -57,6 +61,22 @@ public final class Button: Component {
return Button(
content: self.content,
minSize: minSize,
hitTestEdgeInsets: self.hitTestEdgeInsets,
tag: self.tag,
automaticHighlight: self.automaticHighlight,
isEnabled: self.isEnabled,
isExclusive: self.isExclusive,
action: self.action,
holdAction: self.holdAction,
highlightedAction: self.highlightedAction
)
}
public func withHitTestEdgeInsets(_ hitTestEdgeInsets: UIEdgeInsets?) -> Button {
return Button(
content: self.content,
minSize: self.minSize,
hitTestEdgeInsets: hitTestEdgeInsets,
tag: self.tag,
automaticHighlight: self.automaticHighlight,
isEnabled: self.isEnabled,
@ -71,6 +91,7 @@ public final class Button: Component {
return Button(
content: self.content,
minSize: self.minSize,
hitTestEdgeInsets: self.hitTestEdgeInsets,
tag: self.tag,
automaticHighlight: self.automaticHighlight,
isEnabled: self.isEnabled,
@ -86,6 +107,7 @@ public final class Button: Component {
return Button(
content: self.content,
minSize: self.minSize,
hitTestEdgeInsets: self.hitTestEdgeInsets,
tag: self.tag,
automaticHighlight: self.automaticHighlight,
isEnabled: self.isEnabled,
@ -100,6 +122,7 @@ public final class Button: Component {
return Button(
content: self.content,
minSize: self.minSize,
hitTestEdgeInsets: self.hitTestEdgeInsets,
tag: tag,
automaticHighlight: self.automaticHighlight,
isEnabled: self.isEnabled,
@ -117,6 +140,9 @@ public final class Button: Component {
if lhs.minSize != rhs.minSize {
return false
}
if lhs.hitTestEdgeInsets != rhs.hitTestEdgeInsets {
return false
}
if lhs.tag !== rhs.tag {
return false
}
@ -174,6 +200,14 @@ public final class Button: Component {
private var holdActionTriggerred: Bool = false
private var holdActionTimer: Timer?
public override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
var bounds = self.bounds
if let hitTestEdgeInsets = self.component?.hitTestEdgeInsets {
bounds = bounds.insetBy(dx: hitTestEdgeInsets.left, dy: hitTestEdgeInsets.top)
}
return bounds.contains(point)
}
override init(frame: CGRect) {
self.contentView = ComponentHostView<Empty>()
self.contentView.isUserInteractionEnabled = false

View File

@ -347,7 +347,7 @@ final class StarsTransactionItemNode: ListViewItemNode, ItemListItemNode {
theme: item.presentationData.theme,
title: AnyComponent(VStack(titleComponents, alignment: .left, spacing: 2.0)),
contentInsets: UIEdgeInsets(top: 9.0, left: 0.0, bottom: 8.0, right: 0.0),
leftIcon: .custom(AnyComponentWithIdentity(id: "avatar", component: AnyComponent(StarsAvatarComponent(context: item.context, theme: item.presentationData.theme, peer: .transactionPeer(item.transaction.peer), photo: nil, media: [], uniqueGift: nil, backgroundColor: item.presentationData.theme.list.itemBlocksBackgroundColor))), false),
leftIcon: .custom(AnyComponentWithIdentity(id: "avatar", component: AnyComponent(StarsAvatarComponent(context: item.context, theme: item.presentationData.theme, peer: .transactionPeer(item.transaction.peer), photo: nil, media: [], gift: nil, backgroundColor: item.presentationData.theme.list.itemBlocksBackgroundColor))), false),
icon: nil,
accessory: .custom(ListActionItemComponent.CustomAccessory(component: AnyComponentWithIdentity(id: "label", component: AnyComponent(StarsLabelComponent(text: itemLabel, iconName: itemIconName, iconColor: itemIconColor))), insets: UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 16.0))),
action: { [weak self] _ in

View File

@ -1411,6 +1411,7 @@ final class CaptureControlsComponent: Component {
transition.setAlpha(view: bottomSettingsButtonView, alpha: !isLiveStream || isLiveActive || isRecording || isTransitioning || hideControls ? 0.0 : 1.0)
}
var hitTestEdgeInsets: UIEdgeInsets?
var blobState: ShutterBlobView.BlobState
switch component.shutterState {
case .generic, .disabled:
@ -1423,6 +1424,7 @@ final class CaptureControlsComponent: Component {
blobState = self.panBlobState ?? .video
case .live:
blobState = .live
hitTestEdgeInsets = UIEdgeInsets(top: 0.0, left: -130.0, bottom: 0.0, right: -130.0)
}
let shutterButtonSize = self.shutterButtonView.update(
@ -1451,7 +1453,7 @@ final class CaptureControlsComponent: Component {
component.shutterTapped()
},
highlightedAction: self.shutterHightlightedAction
).minSize(maximumShutterSize)
).minSize(maximumShutterSize).withHitTestEdgeInsets(hitTestEdgeInsets)
),
environment: {},
containerSize: availableSize

View File

@ -177,7 +177,7 @@ private final class GiftWithdrawAlertContentNode: AlertContentNode {
peer: .transactionPeer(.fragment),
photo: nil,
media: [],
uniqueGift: nil,
gift: nil,
backgroundColor: .clear,
size: avatarSize
)

View File

@ -24,7 +24,7 @@ public final class StarsAvatarComponent: Component {
let peer: StarsAvatarComponent.Peer?
let photo: TelegramMediaWebFile?
let media: [Media]
let uniqueGift: StarGift.UniqueGift?
let gift: StarGift?
let backgroundColor: UIColor
let size: CGSize?
@ -34,7 +34,7 @@ public final class StarsAvatarComponent: Component {
peer: StarsAvatarComponent.Peer?,
photo: TelegramMediaWebFile?,
media: [Media],
uniqueGift: StarGift.UniqueGift?,
gift: StarGift?,
backgroundColor: UIColor,
size: CGSize? = nil
) {
@ -43,7 +43,7 @@ public final class StarsAvatarComponent: Component {
self.peer = peer
self.photo = photo
self.media = media
self.uniqueGift = uniqueGift
self.gift = gift
self.backgroundColor = backgroundColor
self.size = size
}
@ -64,7 +64,7 @@ public final class StarsAvatarComponent: Component {
if !areMediaArraysEqual(lhs.media, rhs.media) {
return false
}
if lhs.uniqueGift != rhs.uniqueGift {
if lhs.gift != rhs.gift {
return false
}
if lhs.backgroundColor != rhs.backgroundColor {
@ -121,8 +121,17 @@ public final class StarsAvatarComponent: Component {
var dimensions = size
var didSetup = false
if let gift = component.uniqueGift {
if let gift = component.gift {
let giftFrame = CGRect(origin: .zero, size: size)
var subject: GiftItemComponent.Subject
switch gift {
case let .generic(gift):
subject = .starGift(gift: gift, price: "")
case let .unique(gift):
subject = .uniqueGift(gift: gift, price: nil)
}
let _ = self.giftView.update(
transition: .immediate,
component: AnyComponent(
@ -131,7 +140,7 @@ public final class StarsAvatarComponent: Component {
theme: component.theme,
strings: component.context.sharedContext.currentPresentationData.with { $0 }.strings,
peer: nil,
subject: .uniqueGift(gift: gift, price: nil),
subject: subject,
mode: .thumbnail
)
),

View File

@ -214,6 +214,7 @@ private final class StarsTransactionSheetContent: CombinedComponent {
var photo: TelegramMediaWebFile?
var transactionStatus: (String, UIColor)? = nil
var isGift = false
var isGiftAuctionBid = false
var isSubscription = false
var isSubscriber = false
var isSubscriptionFee = false
@ -356,6 +357,7 @@ private final class StarsTransactionSheetContent: CombinedComponent {
case .generic:
if transaction.flags.contains(.isStarGiftAuctionBid) {
titleText = strings.Stars_Transaction_GiftAuctionBid
isGiftAuctionBid = true
} else {
titleText = strings.Stars_Transaction_Gift_Title
}
@ -927,7 +929,7 @@ private final class StarsTransactionSheetContent: CombinedComponent {
))
}
if isGift, toPeer == nil {
if isGift && !isGiftAuctionBid, toPeer == nil {
tableItems.append(.init(
id: "from",
title: strings.Stars_Transaction_From,
@ -950,7 +952,7 @@ private final class StarsTransactionSheetContent: CombinedComponent {
)
)
))
} else if let toPeer, !isRefProgram {
} else if let toPeer, !isRefProgram && !isGiftAuctionBid {
let title: String
if isGiftUpgrade {
title = strings.Stars_Transaction_GiftFrom
@ -2438,7 +2440,7 @@ private final class PeerCellComponent: Component {
let avatarNaturalSize = self.avatar.update(
transition: .immediate,
component: AnyComponent(
StarsAvatarComponent(context: component.context, theme: component.theme, peer: .transactionPeer(peer), photo: nil, media: [], uniqueGift: nil, backgroundColor: .clear)
StarsAvatarComponent(context: component.context, theme: component.theme, peer: .transactionPeer(peer), photo: nil, media: [], gift: nil, backgroundColor: .clear)
),
environment: {},
containerSize: CGSize(width: 40.0, height: 40.0)

View File

@ -301,7 +301,7 @@ final class StarsTransactionsListPanelComponent: Component {
var itemDate: String
var itemPeer: StarsAvatarComponent.Peer = .transactionPeer(item.peer)
var itemFile: TelegramMediaFile?
var uniqueGift: StarGift.UniqueGift?
var itemGift: StarGift?
switch item.peer {
case let .peer(peer):
if let months = item.premiumGiftMonths {
@ -325,17 +325,18 @@ final class StarsTransactionsListPanelComponent: Component {
if item.flags.contains(.isStarGiftAuctionBid), case let .generic(gift) = starGift {
itemTitle = gift.title ?? "Gift"
itemSubtitle = environment.strings.Stars_Intro_Transaction_GiftAuctionBid
itemGift = starGift
} else if item.flags.contains(.isStarGiftPrepaidUpgrade) {
itemTitle = peer.displayTitle(strings: environment.strings, displayOrder: .firstLast)
itemSubtitle = environment.strings.Stars_Intro_Transaction_PrepaidGiftUpgrade
} else if item.flags.contains(.isStarGiftDropOriginalDetails), case let .unique(gift) = starGift {
itemTitle = "\(gift.title) #\(presentationStringsFormattedNumber(gift.number, environment.dateTimeFormat.groupingSeparator))"
itemSubtitle = environment.strings.Stars_Intro_Transaction_GiftDropOriginalDetails
uniqueGift = gift
itemGift = starGift
} else if item.flags.contains(.isStarGiftUpgrade), case let .unique(gift) = starGift {
itemTitle = "\(gift.title) #\(presentationStringsFormattedNumber(gift.number, environment.dateTimeFormat.groupingSeparator))"
itemSubtitle = environment.strings.Stars_Intro_Transaction_GiftUpgrade
uniqueGift = gift
itemGift = starGift
} else {
itemTitle = peer.displayTitle(strings: environment.strings, displayOrder: .firstLast)
switch starGift {
@ -526,7 +527,7 @@ final class StarsTransactionsListPanelComponent: Component {
theme: environment.theme,
title: AnyComponent(VStack(titleComponents, alignment: .left, spacing: 2.0)),
contentInsets: UIEdgeInsets(top: 9.0, left: environment.containerInsets.left, bottom: 8.0, right: environment.containerInsets.right),
leftIcon: .custom(AnyComponentWithIdentity(id: "avatar", component: AnyComponent(StarsAvatarComponent(context: component.context, theme: environment.theme, peer: itemPeer, photo: item.photo, media: item.media, uniqueGift: uniqueGift, backgroundColor: environment.theme.list.plainBackgroundColor))), false),
leftIcon: .custom(AnyComponentWithIdentity(id: "avatar", component: AnyComponent(StarsAvatarComponent(context: component.context, theme: environment.theme, peer: itemPeer, photo: item.photo, media: item.media, gift: itemGift, backgroundColor: environment.theme.list.plainBackgroundColor))), false),
icon: nil,
accessory: .custom(ListActionItemComponent.CustomAccessory(component: AnyComponentWithIdentity(id: "label", component: AnyComponent(StarsLabelComponent(text: itemLabel, iconName: itemIconName, iconColor: itemIconColor))), insets: UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 16.0))),
action: { [weak self] _ in

View File

@ -929,7 +929,7 @@ final class StarsTransactionsScreenComponent: Component {
if let photo = subscription.photo {
nameGroupComponent = AnyComponent(
HStack([
AnyComponentWithIdentity(id: AnyHashable(0), component: AnyComponent(StarsAvatarComponent(context: component.context, theme: environment.theme, peer: nil, photo: photo, media: [], uniqueGift: nil, backgroundColor: .clear, size: CGSize(width: 19.0, height: 19.0)))),
AnyComponentWithIdentity(id: AnyHashable(0), component: AnyComponent(StarsAvatarComponent(context: component.context, theme: environment.theme, peer: nil, photo: photo, media: [], gift: nil, backgroundColor: .clear, size: CGSize(width: 19.0, height: 19.0)))),
AnyComponentWithIdentity(id: AnyHashable(1), component: nameComponent)
], spacing: 6.0)
)
@ -972,7 +972,7 @@ final class StarsTransactionsScreenComponent: Component {
style: .glass,
title: AnyComponent(VStack(titleComponents, alignment: .left, spacing: 2.0)),
contentInsets: UIEdgeInsets(top: 9.0, left: 0.0, bottom: 8.0, right: 0.0),
leftIcon: .custom(AnyComponentWithIdentity(id: "avatar", component: AnyComponent(StarsAvatarComponent(context: component.context, theme: environment.theme, peer: .transactionPeer(.peer(subscription.peer)), photo: nil, media: [], uniqueGift: nil, backgroundColor: environment.theme.list.plainBackgroundColor))), false),
leftIcon: .custom(AnyComponentWithIdentity(id: "avatar", component: AnyComponent(StarsAvatarComponent(context: component.context, theme: environment.theme, peer: .transactionPeer(.peer(subscription.peer)), photo: nil, media: [], gift: nil, backgroundColor: environment.theme.list.plainBackgroundColor))), false),
icon: nil,
accessory: .custom(ListActionItemComponent.CustomAccessory(component: labelComponent, insets: UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 16.0))),
action: { [weak self] _ in