diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index ead14912e0..5da343cadc 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -15423,3 +15423,6 @@ Error: %8$@"; "ChatList.AlertResumeLiveStreamTitle" = "Resume Live Stream"; "ChatList.AlertResumeLiveStreamText" = "Do you want to resume an existing Live Stream?"; "ChatList.AlertResumeLiveStreamAction" = "Resume"; + +"Gift.Options.Gift.JoinAuction" = "Join"; +"Gift.Options.Gift.ViewAuction" = "View"; diff --git a/submodules/Components/SheetComponent/Sources/SheetComponent.swift b/submodules/Components/SheetComponent/Sources/SheetComponent.swift index 0e868d3dbe..94b2a3a2ba 100644 --- a/submodules/Components/SheetComponent/Sources/SheetComponent.swift +++ b/submodules/Components/SheetComponent/Sources/SheetComponent.swift @@ -400,6 +400,10 @@ public final class SheetComponent: C self.component = component self.currentHasInputHeight = sheetEnvironment.hasInputHeight + if self.isAnimatingOut { + return availableSize + } + var glassInset: CGFloat = 0.0 var topCornerRadius: CGFloat var bottomCornerRadius: CGFloat diff --git a/submodules/TelegramBaseController/Sources/GiftAuctionAccessoryPanel.swift b/submodules/TelegramBaseController/Sources/GiftAuctionAccessoryPanel.swift index 8a05eff35f..94a6c208e1 100644 --- a/submodules/TelegramBaseController/Sources/GiftAuctionAccessoryPanel.swift +++ b/submodules/TelegramBaseController/Sources/GiftAuctionAccessoryPanel.swift @@ -106,22 +106,6 @@ final class GiftAuctionAccessoryPanel: ASDisplayNode { let titleText: String = self.strings.ChatList_Auctions_ActiveAuction(Int32(self.states.count)) titleItems.append(AnyComponentWithIdentity(id: "label", component: AnyComponent(MultilineTextComponent(text: .plain(NSAttributedString(string: titleText, font: titleFont, textColor: self.theme.rootController.navigationBar.primaryTextColor)))))) - let titleSize = self.title.update( - transition: .immediate, - component: AnyComponent( - HStack(titleItems, spacing: 3.0, alignment: .left) - ), - environment: {}, - containerSize: size - ) - let titleFrame = CGRect(origin: CGPoint(x: 16.0, y: 9.0), size: titleSize) - if let titleView = self.title.view { - if titleView.superview == nil { - self.contentNode.view.addSubview(titleView) - } - titleView.frame = titleFrame - } - let subtitleText: String var subtitleTextColor = self.theme.rootController.navigationBar.secondaryTextColor var isOutbid = false @@ -195,20 +179,6 @@ final class GiftAuctionAccessoryPanel: ASDisplayNode { buttonAnimatedTitleItems.append(AnimatedTextComponent.Item(id: "view", content: .text(self.strings.ChatList_Auctions_View))) } - let subtitleSize = self.subtitle.update( - transition: .immediate, - component: AnyComponent(MultilineTextComponent(text: .plain(NSAttributedString(string: subtitleText, font: subtitleFont, textColor: subtitleTextColor)))), - environment: {}, - containerSize: size - ) - let subtitleFrame = CGRect(origin: CGPoint(x: 16.0, y: 29.0), size: subtitleSize) - if let subtitleView = self.subtitle.view { - if subtitleView.superview == nil { - self.contentNode.view.addSubview(subtitleView) - } - subtitleView.frame = subtitleFrame - } - let buttonSize = self.button.update( transition: .spring(duration: 0.2), component: AnyComponent( @@ -254,6 +224,36 @@ final class GiftAuctionAccessoryPanel: ASDisplayNode { buttonView.frame = buttonFrame } + let titleSize = self.title.update( + transition: .immediate, + component: AnyComponent( + HStack(titleItems, spacing: 3.0, alignment: .left) + ), + environment: {}, + containerSize: CGSize(width: size.width - buttonSize.width - 48.0, height: size.height) + ) + let titleFrame = CGRect(origin: CGPoint(x: 16.0, y: 9.0), size: titleSize) + if let titleView = self.title.view { + if titleView.superview == nil { + self.contentNode.view.addSubview(titleView) + } + titleView.frame = titleFrame + } + + let subtitleSize = self.subtitle.update( + transition: .immediate, + component: AnyComponent(MultilineTextComponent(text: .plain(NSAttributedString(string: subtitleText, font: subtitleFont, textColor: subtitleTextColor)))), + environment: {}, + containerSize: CGSize(width: size.width - buttonSize.width - 40.0, height: size.height) + ) + let subtitleFrame = CGRect(origin: CGPoint(x: 16.0, y: 29.0), size: subtitleSize) + if let subtitleView = self.subtitle.view { + if subtitleView.superview == nil { + self.contentNode.view.addSubview(subtitleView) + } + subtitleView.frame = subtitleFrame + } + transition.updateFrame(node: self.separatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: size.width, height: UIScreenPixel))) } diff --git a/submodules/TelegramUI/Components/Gifts/GiftOptionsScreen/Sources/GiftOptionsScreen.swift b/submodules/TelegramUI/Components/Gifts/GiftOptionsScreen/Sources/GiftOptionsScreen.swift index 19c2b79c20..4d212f315d 100644 --- a/submodules/TelegramUI/Components/Gifts/GiftOptionsScreen/Sources/GiftOptionsScreen.swift +++ b/submodules/TelegramUI/Components/Gifts/GiftOptionsScreen/Sources/GiftOptionsScreen.swift @@ -658,7 +658,11 @@ final class GiftOptionsScreenComponent: Component { switch gift { case let .generic(gift): if gift.flags.contains(.isAuction) { - subject = .starGift(gift: gift, price: "Join") + var action = environment.strings.Gift_Options_Gift_JoinAuction + if gift.availability?.remains == 0 { + action = environment.strings.Gift_Options_Gift_ViewAuction + } + subject = .starGift(gift: gift, price: action) } else if let availability = gift.availability, availability.remains == 0, let minResaleStars = availability.minResaleStars { let priceString = presentationStringsFormattedNumber(Int32(minResaleStars), environment.dateTimeFormat.groupingSeparator) if let resaleConfiguration = self.resaleConfiguration, minResaleStars == resaleConfiguration.starGiftResaleMaxStarsAmount || availability.resale == 1 { @@ -1823,6 +1827,14 @@ final class GiftOptionsScreenComponent: Component { } var filteredStarGifts = starGifts + if peerId.namespace == Namespaces.Peer.CloudChannel { + filteredStarGifts = filteredStarGifts?.filter { gift in + if case let .generic(gift) = gift, gift.availability != nil { + return false + } + return true + } + } if let disallowedGifts = self.disallowedGifts, !disallowedGifts.isEmpty { filteredStarGifts = filteredStarGifts?.filter { gift in if case let .generic(gift) = gift { diff --git a/submodules/TelegramUI/Components/Gifts/GiftSetupScreen/Sources/GiftSetupScreen.swift b/submodules/TelegramUI/Components/Gifts/GiftSetupScreen/Sources/GiftSetupScreen.swift index 61f83c6485..6999ba732e 100644 --- a/submodules/TelegramUI/Components/Gifts/GiftSetupScreen/Sources/GiftSetupScreen.swift +++ b/submodules/TelegramUI/Components/Gifts/GiftSetupScreen/Sources/GiftSetupScreen.swift @@ -889,9 +889,10 @@ private final class GiftSetupScreenComponent: Component { if case .regular = environment.metrics.widthClass { fillingSize = min(availableSize.width, 414.0) - environment.safeInsets.left * 2.0 } else { - fillingSize = min(availableSize.width, 428.0) - environment.safeInsets.left * 2.0 + fillingSize = min(availableSize.width, environment.deviceMetrics.screenSize.width) - environment.safeInsets.left * 2.0 } - let sideInset: CGFloat = floor((availableSize.width - fillingSize) * 0.5) + 24.0 + let rawSideInset: CGFloat = floor((availableSize.width - fillingSize) * 0.5) + let sideInset: CGFloat = rawSideInset + 24.0 let peerName = self.peerMap[component.peerId]?.compactDisplayTitle ?? "" let isSelfGift = component.peerId == component.context.account.peerId @@ -1130,7 +1131,7 @@ private final class GiftSetupScreenComponent: Component { environment: {}, containerSize: CGSize(width: 40.0, height: 40.0) ) - let closeButtonFrame = CGRect(origin: CGPoint(x: 16.0, y: 16.0), size: closeButtonSize) + let closeButtonFrame = CGRect(origin: CGPoint(x: rawSideInset + 16.0, y: 16.0), size: closeButtonSize) if let closeButtonView = self.closeButton.view { if closeButtonView.superview == nil { self.navigationBarContainer.addSubview(closeButtonView) @@ -1143,64 +1144,6 @@ private final class GiftSetupScreenComponent: Component { var initialContentHeight = contentHeight let clippingY: CGFloat - if case let .starGift(starGift, forceUnique) = component.subject, let availability = starGift.availability, availability.resale > 0 { - if let forceUnique, !forceUnique { - } else { - let resaleSectionSize = self.resaleSection.update( - transition: transition, - component: AnyComponent(ListSectionComponent( - theme: environment.theme, - style: .glass, - header: nil, - footer: nil, - items: [ - AnyComponentWithIdentity(id: 0, component: AnyComponent(ListActionItemComponent( - theme: environment.theme, - style: .glass, - title: AnyComponent(VStack([ - AnyComponentWithIdentity(id: AnyHashable(0), component: AnyComponent( - MultilineTextComponent( - text: .plain(NSAttributedString(string: environment.strings.Gift_Send_AvailableForResale, font: Font.regular(presentationData.listsFontSize.baseDisplaySize), textColor: environment.theme.list.itemPrimaryTextColor)) - ) - )), - ], alignment: .left, spacing: 2.0)), - accessory: .custom(ListActionItemComponent.CustomAccessory(component: AnyComponentWithIdentity(id: 0, component: AnyComponent(MultilineTextComponent( - text: .plain(NSAttributedString( - string: presentationStringsFormattedNumber(Int32(availability.resale), environment.dateTimeFormat.groupingSeparator), - font: Font.regular(presentationData.listsFontSize.baseDisplaySize), - textColor: environment.theme.list.itemSecondaryTextColor - )), - maximumNumberOfLines: 0 - ))), insets: UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 16.0))), - action: { [weak self] _ in - guard let self, let component = self.component, let controller = environment.controller() else { - return - } - let storeController = component.context.sharedContext.makeGiftStoreController( - context: component.context, - peerId: component.peerId, - gift: starGift - ) - controller.push(storeController) - } - ))) - ] - )), - environment: {}, - containerSize: CGSize(width: availableSize.width - sideInset * 2.0, height: 10000.0) - ) - let resaleSectionFrame = CGRect(origin: CGPoint(x: sideInset, y: contentHeight), size: resaleSectionSize) - if let resaleSectionView = self.resaleSection.view { - if resaleSectionView.superview == nil { - self.scrollContentView.addSubview(resaleSectionView) - } - transition.setFrame(view: resaleSectionView, frame: resaleSectionFrame) - } - contentHeight += resaleSectionSize.height - contentHeight += sectionSpacing - } - } - let giftConfiguration = GiftConfiguration.with(appConfiguration: component.context.currentAppConfiguration.with { $0 }) let footerAttributes = MarkdownAttributes( @@ -1211,45 +1154,7 @@ private final class GiftSetupScreenComponent: Component { return (TelegramTextAttributes.URL, contents) } ) - -// let introFooter: AnyComponent? -// switch component.subject { -// case .premium: -// introFooter = AnyComponent(MultilineTextComponent( -// text: .plain(NSAttributedString( -// string: environment.strings.Gift_Send_Customize_Info(peerName).string, -// font: Font.regular(presentationData.listsFontSize.itemListBaseHeaderFontSize), -// textColor: environment.theme.list.freeTextColor -// )), -// maximumNumberOfLines: 0 -// )) -// case .starGift: -// introFooter = nil -// } -// -// let introSectionSize = self.introSection.update( -// transition: transition, -// component: AnyComponent(ListSectionComponent( -// theme: environment.theme, -// style: .glass, -// header: nil, -// footer: introFooter, -// items: introSectionItems -// )), -// environment: {}, -// containerSize: CGSize(width: availableSize.width - sideInset * 2.0, height: 10000.0) -// ) -// let introSectionFrame = CGRect(origin: CGPoint(x: sideInset, y: contentHeight), size: introSectionSize) -// if let introSectionView = self.introSection.view { -// if introSectionView.superview == nil { -// self.scrollContentView.addSubview(introSectionView) -// self.introSection.parentState = state -// } -// transition.setFrame(view: introSectionView, frame: introSectionFrame) -// } -// contentHeight += introSectionSize.height -// contentHeight += sectionSpacing - + var inputHeight: CGFloat = 0.0 inputHeight += self.updateInputMediaNode( component: component, @@ -1270,7 +1175,7 @@ private final class GiftSetupScreenComponent: Component { } self.previousInputHeight = inputHeight - let listItemParams = ListViewItemLayoutParams(width: availableSize.width, leftInset: 0.0, rightInset: 0.0, availableHeight: 10000.0, isStandalone: true) + let listItemParams = ListViewItemLayoutParams(width: fillingSize, leftInset: 0.0, rightInset: 0.0, availableHeight: 10000.0, isStandalone: true) var introContentSize = CGSize() if let accountPeer = self.peerMap[component.context.account.peerId] { var inputPanelSize = CGSize() @@ -1377,7 +1282,7 @@ private final class GiftSetupScreenComponent: Component { chatLocation: nil )), environment: {}, - containerSize: CGSize(width: availableSize.width - inputPanelInset * 2.0, height: 160.0) + containerSize: CGSize(width: fillingSize - inputPanelInset * 2.0, height: 160.0) ) } @@ -1410,6 +1315,10 @@ private final class GiftSetupScreenComponent: Component { if let inputPanelView = self.inputPanel.view as? MessageInputPanelComponent.View, case let .text(text) = inputPanelView.getSendMessageInput(applyAutocorrection: false) { textInputText = text } + var inputBottomInset: CGFloat = inputPanelSize.height - 26.0 + if component.peerId == component.context.account.peerId { + inputBottomInset += 8.0 + } introContentSize = self.introContent.update( transition: transition, component: AnyComponent( @@ -1432,13 +1341,13 @@ private final class GiftSetupScreenComponent: Component { entities: generateChatInputTextEntities(textInputText), upgradeStars: self.includeUpgrade ? upgradeStars : nil, chargeStars: nil, - bottomInset: max(0.0, inputPanelSize.height - 26.0) + bottomInset: max(0.0, inputBottomInset) ), params: listItemParams ) ), environment: {}, - containerSize: CGSize(width: availableSize.width, height: 10000.0) + containerSize: CGSize(width: fillingSize, height: 10000.0) ) if let introContentView = self.introContent.view { if introContentView.superview == nil { @@ -1449,10 +1358,10 @@ private final class GiftSetupScreenComponent: Component { self.scrollContentView.addSubview(introContentView) introContentView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.previewTap))) } - transition.setFrame(view: introContentView, frame: CGRect(origin: CGPoint(), size: introContentSize)) + transition.setFrame(view: introContentView, frame: CGRect(origin: CGPoint(x: rawSideInset, y: 0.0), size: introContentSize)) } - let inputPanelFrame = CGRect(origin: CGPoint(x: inputPanelInset, y: contentHeight + introContentSize.height - inputPanelInset - inputPanelSize.height + 6.0), size: inputPanelSize) + let inputPanelFrame = CGRect(origin: CGPoint(x: rawSideInset + inputPanelInset, y: contentHeight + introContentSize.height - inputPanelInset - inputPanelSize.height + 6.0), size: inputPanelSize) if let inputPanelView = self.inputPanel.view { if inputPanelView.superview == nil { self.scrollContentView.addSubview(inputPanelView) @@ -1463,6 +1372,64 @@ private final class GiftSetupScreenComponent: Component { contentHeight += introContentSize.height contentHeight += sectionSpacing + if case let .starGift(starGift, forceUnique) = component.subject, let availability = starGift.availability, availability.resale > 0 { + if let forceUnique, !forceUnique { + } else { + let resaleSectionSize = self.resaleSection.update( + transition: transition, + component: AnyComponent(ListSectionComponent( + theme: environment.theme, + style: .glass, + header: nil, + footer: nil, + items: [ + AnyComponentWithIdentity(id: 0, component: AnyComponent(ListActionItemComponent( + theme: environment.theme, + style: .glass, + title: AnyComponent(VStack([ + AnyComponentWithIdentity(id: AnyHashable(0), component: AnyComponent( + MultilineTextComponent( + text: .plain(NSAttributedString(string: environment.strings.Gift_Send_AvailableForResale, font: Font.regular(presentationData.listsFontSize.baseDisplaySize), textColor: environment.theme.list.itemPrimaryTextColor)) + ) + )), + ], alignment: .left, spacing: 2.0)), + accessory: .custom(ListActionItemComponent.CustomAccessory(component: AnyComponentWithIdentity(id: 0, component: AnyComponent(MultilineTextComponent( + text: .plain(NSAttributedString( + string: presentationStringsFormattedNumber(Int32(availability.resale), environment.dateTimeFormat.groupingSeparator), + font: Font.regular(presentationData.listsFontSize.baseDisplaySize), + textColor: environment.theme.list.itemSecondaryTextColor + )), + maximumNumberOfLines: 0 + ))), insets: UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 16.0))), + action: { [weak self] _ in + guard let self, let component = self.component, let controller = environment.controller() else { + return + } + let storeController = component.context.sharedContext.makeGiftStoreController( + context: component.context, + peerId: component.peerId, + gift: starGift + ) + controller.push(storeController) + } + ))) + ] + )), + environment: {}, + containerSize: CGSize(width: availableSize.width - sideInset * 2.0, height: 10000.0) + ) + let resaleSectionFrame = CGRect(origin: CGPoint(x: sideInset, y: contentHeight), size: resaleSectionSize) + if let resaleSectionView = self.resaleSection.view { + if resaleSectionView.superview == nil { + self.scrollContentView.addSubview(resaleSectionView) + } + transition.setFrame(view: resaleSectionView, frame: resaleSectionFrame) + } + contentHeight += resaleSectionSize.height + contentHeight += sectionSpacing + } + } + switch component.subject { case let .premium(product): let balance = component.context.starsContext?.currentState?.balance.value ?? 0 @@ -1945,19 +1912,19 @@ private final class GiftSetupScreenComponent: Component { } )), environment: {}, - containerSize: CGSize(width: availableSize.width - buttonInsets.left - buttonInsets.right, height: buttonHeight) + containerSize: CGSize(width: fillingSize - buttonInsets.left - buttonInsets.right, height: buttonHeight) ) var bottomPanelHeight = 13.0 + buttonInsets.bottom + actionButtonSize.height let bottomEdgeEffectHeight: CGFloat = bottomPanelHeight - let bottomEdgeEffectFrame = CGRect(origin: CGPoint(x: 0.0, y: availableSize.height - bottomEdgeEffectHeight), size: CGSize(width: availableSize.width, height: bottomEdgeEffectHeight)) + let bottomEdgeEffectFrame = CGRect(origin: CGPoint(x: rawSideInset, y: availableSize.height - bottomEdgeEffectHeight), size: CGSize(width: fillingSize, height: bottomEdgeEffectHeight)) transition.setFrame(view: self.bottomEdgeEffectView, frame: bottomEdgeEffectFrame) self.bottomEdgeEffectView.update(content: environment.theme.actionSheet.opaqueItemBackgroundColor, blur: true, alpha: 1.0, rect: bottomEdgeEffectFrame, edge: .bottom, edgeSize: bottomEdgeEffectFrame.height, transition: transition) if self.bottomEdgeEffectView.superview == nil { self.containerView.addSubview(self.bottomEdgeEffectView) } - let actionButtonFrame = CGRect(origin: CGPoint(x: buttonInsets.left, y: availableSize.height - buttonInsets.bottom - actionButtonSize.height), size: actionButtonSize) + let actionButtonFrame = CGRect(origin: CGPoint(x: rawSideInset + buttonInsets.left, y: availableSize.height - buttonInsets.bottom - actionButtonSize.height), size: actionButtonSize) if let buttonView = self.actionButton.view { if buttonView.superview == nil { self.containerView.addSubview(buttonView) @@ -2086,7 +2053,11 @@ public class GiftSetupScreen: ViewControllerComponentContainer { self.didPlayAppearAnimation = true if let componentView = self.node.hostView.componentView as? GiftSetupScreenComponent.View { - componentView.animateIn() + componentView.alpha = 0.0 + Queue.mainQueue().after(0.01, { + componentView.alpha = 1.0 + componentView.animateIn() + }) } } } diff --git a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionAcquiredScreen.swift b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionAcquiredScreen.swift index 705c24f352..49e8bd7b16 100644 --- a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionAcquiredScreen.swift +++ b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionAcquiredScreen.swift @@ -291,7 +291,7 @@ private final class GiftAuctionAcquiredScreenComponent: Component { if case .regular = environment.metrics.widthClass { fillingSize = min(availableSize.width, 414.0) - environment.safeInsets.left * 2.0 } else { - fillingSize = min(availableSize.width, 428.0) - environment.safeInsets.left * 2.0 + fillingSize = min(availableSize.width, environment.deviceMetrics.screenSize.width) - environment.safeInsets.left * 2.0 } let rawSideInset = floor((availableSize.width - fillingSize) * 0.5) let sideInset: CGFloat = floor((availableSize.width - fillingSize) * 0.5) + 24.0 diff --git a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionActiveBidsScreen.swift b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionActiveBidsScreen.swift index b2a2a88d8d..98dd212461 100644 --- a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionActiveBidsScreen.swift +++ b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionActiveBidsScreen.swift @@ -250,9 +250,10 @@ private final class GiftAuctionActiveBidsScreenComponent: Component { if case .regular = environment.metrics.widthClass { fillingSize = min(availableSize.width, 414.0) - environment.safeInsets.left * 2.0 } else { - fillingSize = min(availableSize.width, 428.0) - environment.safeInsets.left * 2.0 + fillingSize = min(availableSize.width, environment.deviceMetrics.screenSize.width) - environment.safeInsets.left * 2.0 } - let sideInset: CGFloat = floor((availableSize.width - fillingSize) * 0.5) + 16.0 + let rawSideInset: CGFloat = floor((availableSize.width - fillingSize) * 0.5) + let sideInset: CGFloat = rawSideInset + 16.0 if self.component == nil, let giftAuctionsManager = component.context.giftAuctionsManager { self.auctionStatesDisposable = (giftAuctionsManager.state @@ -403,7 +404,7 @@ private final class GiftAuctionActiveBidsScreenComponent: Component { environment: {}, containerSize: CGSize(width: 40.0, height: 40.0) ) - let closeButtonFrame = CGRect(origin: CGPoint(x: 16.0, y: 16.0), size: closeButtonSize) + let closeButtonFrame = CGRect(origin: CGPoint(x: rawSideInset + 16.0, y: 16.0), size: closeButtonSize) if let closeButtonView = self.closeButton.view { if closeButtonView.superview == nil { self.navigationBarContainer.addSubview(closeButtonView) @@ -438,7 +439,7 @@ private final class GiftAuctionActiveBidsScreenComponent: Component { initialContentHeight = contentHeight let edgeEffectHeight: CGFloat = 80.0 - let edgeEffectFrame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: availableSize.width, height: edgeEffectHeight)) + let edgeEffectFrame = CGRect(origin: CGPoint(x: rawSideInset, y: 0.0), size: CGSize(width: fillingSize, height: edgeEffectHeight)) transition.setFrame(view: self.topEdgeEffectView, frame: edgeEffectFrame) self.topEdgeEffectView.update(content: environment.theme.actionSheet.opaqueItemBackgroundColor, blur: true, alpha: 1.0, rect: edgeEffectFrame, edge: .top, edgeSize: edgeEffectFrame.height, transition: transition) if self.topEdgeEffectView.superview == nil { diff --git a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionBidScreen.swift b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionBidScreen.swift index 2b632cd242..e308bc412f 100644 --- a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionBidScreen.swift +++ b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionBidScreen.swift @@ -912,7 +912,7 @@ private final class SliderBackgroundComponent: Component { topBackgroundTextView.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: animateTopTextAdditionalX, y: 0.0)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: 0.3, damping: 100.0, additive: true) } - topForegroundTextView.isHidden = component.topCutoff == nil || topLineFrame.maxX + topTextSize.width + 20.0 > availableSize.width + topForegroundTextView.isHidden = component.topCutoff == nil || topTextFrame.maxX > availableSize.width - 28.0 topBackgroundTextView.isHidden = topForegroundTextView.isHidden self.topBackgroundLine.isHidden = topX < 10.0 self.topForegroundLine.isHidden = self.topBackgroundLine.isHidden @@ -1438,7 +1438,7 @@ private final class GiftAuctionBidScreenComponent: Component { private var isLoading = false private func commitBid(value: Int64) { - guard let component = self.component, case let .generic(gift) = component.gift, let controller = self.environment?.controller() else { + guard let component = self.component, let environment = self.environment, let controller = self.environment?.controller(), let balance = self.balance, case let .generic(gift) = component.gift else { return } @@ -1447,7 +1447,9 @@ private final class GiftAuctionBidScreenComponent: Component { if let peerId = self.giftAuctionState?.myState.bidPeerId { myBidPeerId = peerId } + var requiredStars = value if let myBidAmount = self.giftAuctionState?.myState.bidAmount { + requiredStars = requiredStars - myBidAmount isUpdate = true if value == myBidAmount { controller.dismiss() @@ -1455,6 +1457,29 @@ private final class GiftAuctionBidScreenComponent: Component { } } + if balance < StarsAmount(value: requiredStars, nanos: 0) { + let _ = (component.context.engine.payments.starsTopUpOptions() + |> take(1) + |> deliverOnMainQueue).startStandalone(next: { [weak self] options in + guard let self, let component = self.component else { + return + } + guard let starsContext = component.context.starsContext else { + return + } + + let purchasePurpose: StarsPurchasePurpose = .generic + let purchaseScreen = component.context.sharedContext.makeStarsPurchaseScreen(context: component.context, starsContext: starsContext, options: options, purpose: purchasePurpose, targetPeerId: nil, customTheme: environment.theme, completion: { result in + let _ = result + //TODO:release + }) + self.environment?.controller()?.push(purchaseScreen) + self.environment?.controller()?.dismiss() + }) + + return + } + let giftsPerRounds = gift.auctionGiftsPerRound ?? 50 let presentationData = component.context.sharedContext.currentPresentationData.with { $0 } @@ -1795,7 +1820,7 @@ private final class GiftAuctionBidScreenComponent: Component { if case .regular = environment.metrics.widthClass { fillingSize = min(availableSize.width, 414.0) - environment.safeInsets.left * 2.0 } else { - fillingSize = min(availableSize.width, 428.0) - environment.safeInsets.left * 2.0 + fillingSize = min(availableSize.width, environment.deviceMetrics.screenSize.width) - environment.safeInsets.left * 2.0 } let rawSideInset = floor((availableSize.width - fillingSize) * 0.5) let sideInset: CGFloat = floor((availableSize.width - fillingSize) * 0.5) + 24.0 @@ -2019,7 +2044,7 @@ private final class GiftAuctionBidScreenComponent: Component { var sliderColor: UIColor = UIColor(rgb: 0xFFB10D) let liveStreamParams = LiveChatMessageParams(appConfig: component.context.currentAppConfiguration.with({ $0 })) - let color = GroupCallMessagesContext.getStarAmountParamMapping(params: liveStreamParams, value: Int64(self.amount.realValue)).color ?? GroupCallMessagesContext.Message.Color(rawValue: 0x985FDC) + let color = GroupCallMessagesContext.getStarAmountParamMapping(params: liveStreamParams, value: Int64(self.amount.realValue / 5)).color ?? GroupCallMessagesContext.Message.Color(rawValue: 0x985FDC) sliderColor = StoryLiveChatMessageComponent.getMessageColor(color: color) var giftsPerRound: Int32 = 50 @@ -2546,6 +2571,7 @@ private final class GiftAuctionBidScreenComponent: Component { if let topPeerItemView = topPeerItem.view { if topPeerItemView.superview == nil { self.scrollContentView.addSubview(topPeerItemView) + transition.animateAlpha(view: topPeerItemView, from: 0.0, to: 1.0) } topPeerItemView.frame = topPeerItemFrame } @@ -2635,33 +2661,7 @@ private final class GiftAuctionBidScreenComponent: Component { isEnabled: true, displaysProgress: self.isLoading, action: { [weak self] in - guard let self, let component = self.component else { - return - } - guard let balance = self.balance else { - return - } - - if balance < StarsAmount(value: Int64(self.amount.realValue), nanos: 0) { - let _ = (component.context.engine.payments.starsTopUpOptions() - |> take(1) - |> deliverOnMainQueue).startStandalone(next: { [weak self] options in - guard let self, let component = self.component else { - return - } - guard let starsContext = component.context.starsContext else { - return - } - - let purchasePurpose: StarsPurchasePurpose = .generic - let purchaseScreen = component.context.sharedContext.makeStarsPurchaseScreen(context: component.context, starsContext: starsContext, options: options, purpose: purchasePurpose, targetPeerId: nil, customTheme: environment.theme, completion: { result in - let _ = result - //TODO:release - }) - self.environment?.controller()?.push(purchaseScreen) - self.environment?.controller()?.dismiss() - }) - + guard let self else { return } self.commitBid(value: Int64(self.amount.realValue)) diff --git a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionCustomBidController.swift b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionCustomBidController.swift index c48e514a9d..924a2d214f 100644 --- a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionCustomBidController.swift +++ b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftAuctionCustomBidController.swift @@ -208,15 +208,17 @@ private final class GiftAuctionCustomBidAlertContentNode: AlertContentNode { environment: {}, containerSize: CGSize(width: fieldWidth, height: 44.0) ) - let amountFieldFrame = CGRect(origin: CGPoint(x: floor((resultWidth - fieldWidth) / 2.0), y: origin.y - 2.0), size: amountFieldSize) + var amountFieldFrame = CGRect(origin: CGPoint(x: floor((resultWidth - fieldWidth) / 2.0), y: origin.y - 2.0), size: amountFieldSize) if let amountFieldView = self.amountField.view { if amountFieldView.superview == nil { + amountFieldView.clipsToBounds = true self.backgroundView.image = generateStretchableFilledCircleImage(diameter: 12.0, color: self.theme.actionSheet.inputHollowBackgroundColor, strokeColor: self.theme.actionSheet.inputBorderColor, strokeWidth: 1.0) self.view.addSubview(self.backgroundView) self.view.addSubview(amountFieldView) } self.backgroundView.frame = amountFieldFrame.insetBy(dx: 7.0, dy: 9.0) + amountFieldFrame.size.width -= 14.0 amountFieldView.frame = amountFieldFrame } diff --git a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift index 296b4545bc..420eacaf68 100644 --- a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift +++ b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift @@ -5640,10 +5640,13 @@ final class PeerCellComponent: Component { let avatarSize = CGSize(width: 22.0, height: 22.0) let spacing: CGFloat = 6.0 - let peerName: String + var peerName: String let avatarOverride: AvatarNodeImageOverride? if let peerValue = component.peer { peerName = peerValue.compactDisplayTitle + if peerName.count > 40 { + peerName = "\(peerName.prefix(40))…" + } avatarOverride = nil } else { peerName = component.strings.Gift_View_HiddenName