diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index d0d0521f81..48060e73c8 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -13789,8 +13789,7 @@ Sorry for the inconvenience."; "Notification.StarsGift.SentSomeone" = "Someone sent you a gift"; "Notification.StarsGift.UpgradeChannel" = "A gift was turned into a unique collectible"; -"Gift.View.TonGiftInfo" = "This gift is owned by a TON account. [View >]()"; -"Gift.View.ViewTonAddressUrl" = "https://tonviewer.com/%@"; +"Gift.View.TonGiftAddressInfo" = "This gift is in TON Blockchain. [View >]()"; "Gift.View.CopiedAddress" = "TON address copied to clipboard."; "NameColor.AddProfileIcons" = "Add Icons To Profile"; diff --git a/submodules/LegacyComponents/Sources/TGMediaPickerGalleryInterfaceView.m b/submodules/LegacyComponents/Sources/TGMediaPickerGalleryInterfaceView.m index 288e2a4077..d2a95292e1 100644 --- a/submodules/LegacyComponents/Sources/TGMediaPickerGalleryInterfaceView.m +++ b/submodules/LegacyComponents/Sources/TGMediaPickerGalleryInterfaceView.m @@ -233,17 +233,6 @@ [_wrapperView addSubview:_recipientLabel]; } - if (hasCameraButton) - { - _cameraButton = [[TGMediaPickerCameraButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 44.0f, 44.0f)]; - _cameraButton.adjustsImageWhenHighlighted = false; - [_cameraButton addTarget:self action:@selector(cameraButtonPressed) forControlEvents:UIControlEventTouchUpInside]; - - [_wrapperView addSubview:_cameraButton]; - - //if (_selectionContext != nil) - // [_cameraButton setHidden:true animated:false]; - } if (_selectionContext != nil) { @@ -429,6 +418,15 @@ [_wrapperView addSubview:_coverGalleryButton]; } + if (hasCameraButton) + { + _cameraButton = [[TGMediaPickerCameraButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 44.0f, 44.0f)]; + _cameraButton.adjustsImageWhenHighlighted = false; + [_cameraButton addTarget:self action:@selector(cameraButtonPressed) forControlEvents:UIControlEventTouchUpInside]; + + [_wrapperView addSubview:_cameraButton]; + } + TGPhotoEditorDoneButton doneButton = isScheduledMessages ? TGPhotoEditorDoneButtonSchedule : TGPhotoEditorDoneButtonSend; _portraitToolbarView = [[TGPhotoToolbarView alloc] initWithContext:_context backButton:TGPhotoEditorBackButtonBack doneButton:doneButton solidBackground:false]; diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 655906e5ac..856a5e7ad6 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -914,7 +914,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1301522832] = { return Api.SponsoredMessage.parse_sponsoredMessage($0) } dict[1124938064] = { return Api.SponsoredMessageReportOption.parse_sponsoredMessageReportOption($0) } dict[46953416] = { return Api.StarGift.parse_starGift($0) } - dict[-218202550] = { return Api.StarGift.parse_starGiftUnique($0) } + dict[1549979985] = { return Api.StarGift.parse_starGiftUnique($0) } dict[-1809377438] = { return Api.StarGiftAttribute.parse_starGiftAttributeBackdrop($0) } dict[970559507] = { return Api.StarGiftAttribute.parse_starGiftAttributeModel($0) } dict[-524291476] = { return Api.StarGiftAttribute.parse_starGiftAttributeOriginalDetails($0) } diff --git a/submodules/TelegramApi/Sources/Api24.swift b/submodules/TelegramApi/Sources/Api24.swift index a70e047e6b..d272074c77 100644 --- a/submodules/TelegramApi/Sources/Api24.swift +++ b/submodules/TelegramApi/Sources/Api24.swift @@ -575,7 +575,7 @@ public extension Api { public extension Api { enum StarGift: TypeConstructorDescription { case starGift(flags: Int32, id: Int64, sticker: Api.Document, stars: Int64, availabilityRemains: Int32?, availabilityTotal: Int32?, convertStars: Int64, firstSaleDate: Int32?, lastSaleDate: Int32?, upgradeStars: Int64?) - case starGiftUnique(flags: Int32, id: Int64, title: String, slug: String, num: Int32, ownerId: Api.Peer?, ownerName: String?, ownerAddress: String?, attributes: [Api.StarGiftAttribute], availabilityIssued: Int32, availabilityTotal: Int32) + case starGiftUnique(flags: Int32, id: Int64, title: String, slug: String, num: Int32, ownerId: Api.Peer?, ownerName: String?, ownerAddress: String?, attributes: [Api.StarGiftAttribute], availabilityIssued: Int32, availabilityTotal: Int32, giftAddress: String?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -594,9 +594,9 @@ public extension Api { if Int(flags) & Int(1 << 1) != 0 {serializeInt32(lastSaleDate!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 3) != 0 {serializeInt64(upgradeStars!, buffer: buffer, boxed: false)} break - case .starGiftUnique(let flags, let id, let title, let slug, let num, let ownerId, let ownerName, let ownerAddress, let attributes, let availabilityIssued, let availabilityTotal): + case .starGiftUnique(let flags, let id, let title, let slug, let num, let ownerId, let ownerName, let ownerAddress, let attributes, let availabilityIssued, let availabilityTotal, let giftAddress): if boxed { - buffer.appendInt32(-218202550) + buffer.appendInt32(1549979985) } serializeInt32(flags, buffer: buffer, boxed: false) serializeInt64(id, buffer: buffer, boxed: false) @@ -613,6 +613,7 @@ public extension Api { } serializeInt32(availabilityIssued, buffer: buffer, boxed: false) serializeInt32(availabilityTotal, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 3) != 0 {serializeString(giftAddress!, buffer: buffer, boxed: false)} break } } @@ -621,8 +622,8 @@ public extension Api { switch self { case .starGift(let flags, let id, let sticker, let stars, let availabilityRemains, let availabilityTotal, let convertStars, let firstSaleDate, let lastSaleDate, let upgradeStars): return ("starGift", [("flags", flags as Any), ("id", id as Any), ("sticker", sticker as Any), ("stars", stars as Any), ("availabilityRemains", availabilityRemains as Any), ("availabilityTotal", availabilityTotal as Any), ("convertStars", convertStars as Any), ("firstSaleDate", firstSaleDate as Any), ("lastSaleDate", lastSaleDate as Any), ("upgradeStars", upgradeStars as Any)]) - case .starGiftUnique(let flags, let id, let title, let slug, let num, let ownerId, let ownerName, let ownerAddress, let attributes, let availabilityIssued, let availabilityTotal): - return ("starGiftUnique", [("flags", flags as Any), ("id", id as Any), ("title", title as Any), ("slug", slug as Any), ("num", num as Any), ("ownerId", ownerId as Any), ("ownerName", ownerName as Any), ("ownerAddress", ownerAddress as Any), ("attributes", attributes as Any), ("availabilityIssued", availabilityIssued as Any), ("availabilityTotal", availabilityTotal as Any)]) + case .starGiftUnique(let flags, let id, let title, let slug, let num, let ownerId, let ownerName, let ownerAddress, let attributes, let availabilityIssued, let availabilityTotal, let giftAddress): + return ("starGiftUnique", [("flags", flags as Any), ("id", id as Any), ("title", title as Any), ("slug", slug as Any), ("num", num as Any), ("ownerId", ownerId as Any), ("ownerName", ownerName as Any), ("ownerAddress", ownerAddress as Any), ("attributes", attributes as Any), ("availabilityIssued", availabilityIssued as Any), ("availabilityTotal", availabilityTotal as Any), ("giftAddress", giftAddress as Any)]) } } @@ -693,6 +694,8 @@ public extension Api { _10 = reader.readInt32() var _11: Int32? _11 = reader.readInt32() + var _12: String? + if Int(_1!) & Int(1 << 3) != 0 {_12 = parseString(reader) } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil @@ -704,8 +707,9 @@ public extension Api { let _c9 = _9 != nil let _c10 = _10 != nil let _c11 = _11 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 { - return Api.StarGift.starGiftUnique(flags: _1!, id: _2!, title: _3!, slug: _4!, num: _5!, ownerId: _6, ownerName: _7, ownerAddress: _8, attributes: _9!, availabilityIssued: _10!, availabilityTotal: _11!) + let _c12 = (Int(_1!) & Int(1 << 3) == 0) || _12 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 { + return Api.StarGift.starGiftUnique(flags: _1!, id: _2!, title: _3!, slug: _4!, num: _5!, ownerId: _6, ownerName: _7, ownerAddress: _8, attributes: _9!, availabilityIssued: _10!, availabilityTotal: _11!, giftAddress: _12) } else { return nil diff --git a/submodules/TelegramCore/Sources/State/ManagedRecentStickers.swift b/submodules/TelegramCore/Sources/State/ManagedRecentStickers.swift index 5a06921c6b..476f7b4306 100644 --- a/submodules/TelegramCore/Sources/State/ManagedRecentStickers.swift +++ b/submodules/TelegramCore/Sources/State/ManagedRecentStickers.swift @@ -322,7 +322,8 @@ func managedUniqueStarGifts(accountPeerId: PeerId, postbox: Postbox, network: Ne .pattern(name: "", file: patternFile, rarity: 0), .backdrop(name: "", innerColor: innerColor, outerColor: outerColor, patternColor: patternColor, textColor: textColor, rarity: 0) ], - availability: StarGift.UniqueGift.Availability(issued: 0, total: 0) + availability: StarGift.UniqueGift.Availability(issued: 0, total: 0), + giftAddress: nil ) if let entry = CodableEntry(RecentStarGiftItem(gift)) { items.append(OrderedItemListEntry(id: RecentStarGiftItemId(id).rawValue, contents: entry)) diff --git a/submodules/TelegramCore/Sources/State/Serialization.swift b/submodules/TelegramCore/Sources/State/Serialization.swift index 40f0173b41..d017b0426d 100644 --- a/submodules/TelegramCore/Sources/State/Serialization.swift +++ b/submodules/TelegramCore/Sources/State/Serialization.swift @@ -210,7 +210,7 @@ public class BoxedMessage: NSObject { public class Serialization: NSObject, MTSerialization { public func currentLayer() -> UInt { - return 198 + return 199 } public func parseMessage(_ data: Data!) -> Any! { diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Payments/StarGifts.swift b/submodules/TelegramCore/Sources/TelegramEngine/Payments/StarGifts.swift index 08eccef4c6..4f4c241a45 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Payments/StarGifts.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Payments/StarGifts.swift @@ -210,6 +210,7 @@ public enum StarGift: Equatable, Codable, PostboxCoding { case ownerAddress case attributes case availability + case giftAddress } public enum Attribute: Equatable, Codable, PostboxCoding { @@ -449,8 +450,9 @@ public enum StarGift: Equatable, Codable, PostboxCoding { public let owner: Owner public let attributes: [Attribute] public let availability: Availability + public let giftAddress: String? - public init(id: Int64, title: String, number: Int32, slug: String, owner: Owner, attributes: [Attribute], availability: Availability) { + public init(id: Int64, title: String, number: Int32, slug: String, owner: Owner, attributes: [Attribute], availability: Availability, giftAddress: String?) { self.id = id self.title = title self.number = number @@ -458,6 +460,7 @@ public enum StarGift: Equatable, Codable, PostboxCoding { self.owner = owner self.attributes = attributes self.availability = availability + self.giftAddress = giftAddress } public init(from decoder: Decoder) throws { @@ -477,6 +480,7 @@ public enum StarGift: Equatable, Codable, PostboxCoding { } self.attributes = try container.decode([UniqueGift.Attribute].self, forKey: .attributes) self.availability = try container.decode(UniqueGift.Availability.self, forKey: .availability) + self.giftAddress = try container.decodeIfPresent(String.self, forKey: .giftAddress) } public init(decoder: PostboxDecoder) { @@ -495,6 +499,7 @@ public enum StarGift: Equatable, Codable, PostboxCoding { } self.attributes = (try? decoder.decodeObjectArrayWithCustomDecoderForKey(CodingKeys.attributes.rawValue, decoder: { UniqueGift.Attribute(decoder: $0) })) ?? [] self.availability = decoder.decodeObjectForKey(CodingKeys.availability.rawValue, decoder: { UniqueGift.Availability(decoder: $0) }) as! UniqueGift.Availability + self.giftAddress = decoder.decodeOptionalStringForKey(CodingKeys.giftAddress.rawValue) } public func encode(to encoder: Encoder) throws { @@ -513,6 +518,7 @@ public enum StarGift: Equatable, Codable, PostboxCoding { } try container.encode(self.attributes, forKey: .attributes) try container.encode(self.availability, forKey: .availability) + try container.encodeIfPresent(self.giftAddress, forKey: .giftAddress) } public func encode(_ encoder: PostboxEncoder) { @@ -530,6 +536,11 @@ public enum StarGift: Equatable, Codable, PostboxCoding { } encoder.encodeObjectArray(self.attributes, forKey: CodingKeys.attributes.rawValue) encoder.encodeObject(self.availability, forKey: CodingKeys.availability.rawValue) + if let giftAddress = self.giftAddress { + encoder.encodeString(giftAddress, forKey: CodingKeys.giftAddress.rawValue) + } else { + encoder.encodeNil(forKey: CodingKeys.giftAddress.rawValue) + } } } @@ -615,7 +626,7 @@ extension StarGift { return nil } self = .generic(StarGift.Gift(id: id, file: file, price: stars, convertStars: convertStars, availability: availability, soldOut: soldOut, flags: flags, upgradeStars: upgradeStars)) - case let .starGiftUnique(_, id, title, slug, num, ownerPeerId, ownerName, ownerAddress, attributes, availabilityIssued, availabilityTotal): + case let .starGiftUnique(_, id, title, slug, num, ownerPeerId, ownerName, ownerAddress, attributes, availabilityIssued, availabilityTotal, giftAddress): let owner: StarGift.UniqueGift.Owner if let ownerAddress { owner = .address(ownerAddress) @@ -626,7 +637,7 @@ extension StarGift { } else { return nil } - self = .unique(StarGift.UniqueGift(id: id, title: title, number: num, slug: slug, owner: owner, attributes: attributes.compactMap { UniqueGift.Attribute(apiAttribute: $0) }, availability: UniqueGift.Availability(issued: availabilityIssued, total: availabilityTotal))) + self = .unique(StarGift.UniqueGift(id: id, title: title, number: num, slug: slug, owner: owner, attributes: attributes.compactMap { UniqueGift.Attribute(apiAttribute: $0) }, availability: UniqueGift.Availability(issued: availabilityIssued, total: availabilityTotal), giftAddress: giftAddress)) } } } @@ -1270,6 +1281,7 @@ public final class ProfileGiftsContext { case canExportDate case upgradeStars case transferStars + case giftAddress } public let gift: TelegramCore.StarGift diff --git a/submodules/TelegramUI/Components/Chat/ChatChannelSubscriberInputPanelNode/Sources/ChatChannelSubscriberInputPanelNode.swift b/submodules/TelegramUI/Components/Chat/ChatChannelSubscriberInputPanelNode/Sources/ChatChannelSubscriberInputPanelNode.swift index 61964aa70b..e07fa93515 100644 --- a/submodules/TelegramUI/Components/Chat/ChatChannelSubscriberInputPanelNode/Sources/ChatChannelSubscriberInputPanelNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatChannelSubscriberInputPanelNode/Sources/ChatChannelSubscriberInputPanelNode.swift @@ -411,34 +411,34 @@ public final class ChatChannelSubscriberInputPanelNode: ChatInputPanelNode { let panelHeight = defaultHeight(metrics: metrics) if self.discussButton.isHidden { - if let action = self.action, action == .muteNotifications || action == .unmuteNotifications { - let buttonWidth = self.button.calculateSizeThatFits(CGSize(width: width, height: panelHeight)).width + 24.0 - self.button.frame = CGRect(origin: CGPoint(x: floor((width - buttonWidth) / 2.0), y: 0.0), size: CGSize(width: buttonWidth, height: panelHeight)) - - if let peer = interfaceState.renderedPeer?.peer as? TelegramChannel { - if case .broadcast = peer.info, interfaceState.starGiftsAvailable { - if self.giftButton.isHidden && !isFirstTime { - self.giftButton.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) - self.giftButton.layer.animateScale(from: 0.01, to: 1.0, duration: 0.2) - } - - self.giftButton.isHidden = false - self.helpButton.isHidden = true - - self.presentGiftTooltip() - } else if peer.flags.contains(.isGigagroup) { - self.giftButton.isHidden = true - self.helpButton.isHidden = false + if let peer = interfaceState.renderedPeer?.peer as? TelegramChannel { + if case .broadcast = peer.info, interfaceState.starGiftsAvailable { + if self.giftButton.isHidden && !isFirstTime { + self.giftButton.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + self.giftButton.layer.animateScale(from: 0.01, to: 1.0, duration: 0.2) } + + self.giftButton.isHidden = false + self.helpButton.isHidden = true + + self.presentGiftTooltip() + } else if peer.flags.contains(.isGigagroup), self.action == .muteNotifications || self.action == .unmuteNotifications { + self.giftButton.isHidden = true + self.helpButton.isHidden = false } else { self.giftButton.isHidden = true self.helpButton.isHidden = true } } else { - self.button.frame = CGRect(origin: CGPoint(x: leftInset, y: 0.0), size: CGSize(width: width - leftInset - rightInset, height: panelHeight)) self.giftButton.isHidden = true self.helpButton.isHidden = true } + if let action = self.action, action == .muteNotifications || action == .unmuteNotifications { + let buttonWidth = self.button.calculateSizeThatFits(CGSize(width: width, height: panelHeight)).width + 24.0 + self.button.frame = CGRect(origin: CGPoint(x: floor((width - buttonWidth) / 2.0), y: 0.0), size: CGSize(width: buttonWidth, height: panelHeight)) + } else { + self.button.frame = CGRect(origin: CGPoint(x: leftInset, y: 0.0), size: CGSize(width: width - leftInset - rightInset, height: panelHeight)) + } self.giftButton.frame = CGRect(x: width - rightInset - panelHeight - 5.0, y: 0.0, width: panelHeight, height: panelHeight) self.helpButton.frame = CGRect(x: width - rightInset - panelHeight, y: 0.0, width: panelHeight, height: panelHeight) } else { diff --git a/submodules/TelegramUI/Components/Gifts/GiftItemComponent/Sources/GiftItemComponent.swift b/submodules/TelegramUI/Components/Gifts/GiftItemComponent/Sources/GiftItemComponent.swift index 7aedefdfc2..fcb3e340ab 100644 --- a/submodules/TelegramUI/Components/Gifts/GiftItemComponent/Sources/GiftItemComponent.swift +++ b/submodules/TelegramUI/Components/Gifts/GiftItemComponent/Sources/GiftItemComponent.swift @@ -291,6 +291,8 @@ public final class GiftItemComponent: Component { var patternFile: TelegramMediaFile? var files: [Int64: TelegramMediaFile] = [:] + var placeholderColor = component.theme.list.mediaPlaceholderColor + let emoji: ChatTextInputTextCustomEmojiAttribute? var animationOffset: CGFloat = 0.0 switch component.subject { @@ -326,6 +328,9 @@ public final class GiftItemComponent: Component { backgroundColor = UIColor(rgb: UInt32(bitPattern: outerColorValue)) secondBackgroundColor = UIColor(rgb: UInt32(bitPattern: innerColorValue)) patternColor = UIColor(rgb: UInt32(bitPattern: patternColorValue)) + if let backgroundColor { + placeholderColor = backgroundColor + } default: break } @@ -352,7 +357,7 @@ public final class GiftItemComponent: Component { cache: component.context.animationCache, renderer: component.context.animationRenderer, unique: false, - placeholderColor: component.theme.list.mediaPlaceholderColor, + placeholderColor: placeholderColor, pointSize: CGSize(width: iconSize.width * 2.0, height: iconSize.height * 2.0), loopCount: 1 ) diff --git a/submodules/TelegramUI/Components/Gifts/GiftOptionsScreen/Sources/GiftOptionsScreen.swift b/submodules/TelegramUI/Components/Gifts/GiftOptionsScreen/Sources/GiftOptionsScreen.swift index 8617860046..44906797f0 100644 --- a/submodules/TelegramUI/Components/Gifts/GiftOptionsScreen/Sources/GiftOptionsScreen.swift +++ b/submodules/TelegramUI/Components/Gifts/GiftOptionsScreen/Sources/GiftOptionsScreen.swift @@ -275,7 +275,7 @@ final class GiftOptionsScreenComponent: Component { let starsTitleOffset: CGFloat let starsTitleFraction: CGFloat - if contentOffset > 350 { + if contentOffset > 350, self.starsTitle.view != nil { starsTitleOffset = contentOffset + max(0.0, min(1.0, (contentOffset - 350.0) / starsTitleOffsetDelta)) * 10.0 starsTitleFraction = max(0.0, min(1.0, (starsTitleOffset - 350.0) / starsTitleOffsetDelta)) if contentOffset > 380.0 { diff --git a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift index 746955b19a..05a4ab724b 100644 --- a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift +++ b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift @@ -1889,9 +1889,9 @@ private final class GiftViewSheetContent: CombinedComponent { } var addressToOpen: String? var descriptionText: String - if let uniqueGift, case let .address(address) = uniqueGift.owner { + if let uniqueGift, let address = uniqueGift.giftAddress { addressToOpen = address - descriptionText = strings.Gift_View_TonGiftInfo + descriptionText = strings.Gift_View_TonGiftAddressInfo } else if savedToProfile { descriptionText = isChannelGift ? strings.Gift_View_DisplayedInfoHide_Channel : strings.Gift_View_DisplayedInfoHide } else if let upgradeStars, upgradeStars > 0 && !upgraded { @@ -2562,8 +2562,10 @@ public class GiftViewScreen: ViewControllerComponentContainer { let presentationData = self.context.sharedContext.currentPresentationData.with { $0 } openAddressImpl = { [weak self] address in if let navigationController = self?.navigationController as? NavigationController { + let configuration = GiftViewConfiguration.with(appConfiguration: context.currentAppConfiguration.with { $0 }) + let url = configuration.explorerUrl + address Queue.mainQueue().after(0.3) { - context.sharedContext.openExternalUrl(context: context, urlContext: .generic, url: presentationData.strings.Gift_View_ViewTonAddressUrl(address).string, forceExternal: false, presentationData: presentationData, navigationController: navigationController, dismissInput: {}) + context.sharedContext.openExternalUrl(context: context, urlContext: .generic, url: url, forceExternal: false, presentationData: presentationData, navigationController: navigationController, dismissInput: {}) } } } @@ -3914,3 +3916,23 @@ private final class AvatarComponent: Component { return view.update(component: self, availableSize: availableSize, state: state, environment: environment, transition: transition) } } + +private struct GiftViewConfiguration { + public static var defaultValue: GiftViewConfiguration { + return GiftViewConfiguration(explorerUrl: "https://tonviewer.com") + } + + public let explorerUrl: String + + fileprivate init(explorerUrl: String) { + self.explorerUrl = explorerUrl + } + + public static func with(appConfiguration: AppConfiguration) -> GiftViewConfiguration { + if let data = appConfiguration.data, let value = data["ton_blockchain_explorer_url"] as? String { + return GiftViewConfiguration(explorerUrl: value) + } else { + return .defaultValue + } + } +} diff --git a/submodules/TelegramUI/Components/LegacyCamera/Sources/LegacyCamera.swift b/submodules/TelegramUI/Components/LegacyCamera/Sources/LegacyCamera.swift index 0cac4f3e96..7d8aa898ee 100644 --- a/submodules/TelegramUI/Components/LegacyCamera/Sources/LegacyCamera.swift +++ b/submodules/TelegramUI/Components/LegacyCamera/Sources/LegacyCamera.swift @@ -10,7 +10,7 @@ import ShareController import LegacyUI import LegacyMediaPickerUI -public func presentedLegacyCamera(context: AccountContext, peer: Peer?, chatLocation: ChatLocation, cameraView: TGAttachmentCameraView?, menuController: TGMenuSheetController?, parentController: ViewController, attachmentController: ViewController? = nil, editingMedia: Bool, saveCapturedPhotos: Bool, mediaGrouping: Bool, initialCaption: NSAttributedString, hasSchedule: Bool, enablePhoto: Bool, enableVideo: Bool, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, recognizedQRCode: @escaping (String) -> Void = { _ in }, presentSchedulePicker: @escaping (Bool, @escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, getCaptionPanelView: @escaping () -> TGCaptionPanelView?, dismissedWithResult: @escaping () -> Void = {}, finishedTransitionIn: @escaping () -> Void = {}) { +public func presentedLegacyCamera(context: AccountContext, peer: Peer?, chatLocation: ChatLocation, cameraView: TGAttachmentCameraView?, menuController: TGMenuSheetController?, parentController: ViewController, attachmentController: ViewController? = nil, editingMedia: Bool, saveCapturedPhotos: Bool, mediaGrouping: Bool, initialCaption: NSAttributedString, hasSchedule: Bool, enablePhoto: Bool, enableVideo: Bool, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32, ChatSendMessageActionSheetController.SendParameters?) -> Void, recognizedQRCode: @escaping (String) -> Void = { _ in }, presentSchedulePicker: @escaping (Bool, @escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, getCaptionPanelView: @escaping () -> TGCaptionPanelView?, dismissedWithResult: @escaping () -> Void = {}, finishedTransitionIn: @escaping () -> Void = {}) { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let legacyController = LegacyController(presentation: .custom, theme: presentationData.theme) legacyController.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .portrait, compactSize: .portrait) @@ -142,11 +142,17 @@ public func presentedLegacyCamera(context: AccountContext, peer: Peer?, chatLoca controller.finishedWithResults = { [weak menuController, weak legacyController] overlayController, selectionContext, editingContext, currentItem, silentPosting, scheduleTime in if let selectionContext = selectionContext, let editingContext = editingContext { + let textIsAboveMedia = editingContext.isCaptionAbove() + let parameters = ChatSendMessageActionSheetController.SendParameters( + effect: nil, + textIsAboveMedia: textIsAboveMedia + ) + let nativeGenerator = legacyAssetPickerItemGenerator() let signals = TGCameraController.resultSignals(for: selectionContext, editingContext: editingContext, currentItem: currentItem, storeAssets: saveCapturedPhotos && !isSecretChat, saveEditedPhotos: saveCapturedPhotos && !isSecretChat, descriptionGenerator: { _1, _2, _3 in nativeGenerator(_1, _2, _3, nil) }) - sendMessagesWithSignals(signals, silentPosting, scheduleTime) + sendMessagesWithSignals(signals, silentPosting, scheduleTime, parameters) } menuController?.dismiss(animated: false) @@ -163,7 +169,7 @@ public func presentedLegacyCamera(context: AccountContext, peer: Peer?, chatLoca description["timer"] = timer } if let item = legacyAssetPickerItemGenerator()(description, caption, nil, nil) { - sendMessagesWithSignals([SSignal.single(item)], false, 0) + sendMessagesWithSignals([SSignal.single(item)], false, 0, nil) } } @@ -189,7 +195,7 @@ public func presentedLegacyCamera(context: AccountContext, peer: Peer?, chatLoca description["timer"] = timer } if let item = legacyAssetPickerItemGenerator()(description, caption, nil, nil) { - sendMessagesWithSignals([SSignal.single(item)], false, 0) + sendMessagesWithSignals([SSignal.single(item)], false, 0, nil) } } menuController?.dismiss(animated: false) diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoHeaderNode.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoHeaderNode.swift index f5f7f42c0b..355831c2e4 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoHeaderNode.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoHeaderNode.swift @@ -1152,13 +1152,16 @@ final class PeerInfoHeaderNode: ASDisplayNode { title = EnginePeer(peer).displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder) } title = title.replacingOccurrences(of: "\u{1160}", with: "").replacingOccurrences(of: "\u{3164}", with: "") + if title.replacingOccurrences(of: "\u{fe0e}", with: "").trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + title = "" //"\u{00A0}" + } if title.isEmpty { if let peer = peer as? TelegramUser, let phone = peer.phone { title = formatPhoneNumber(context: self.context, number: phone) } else if let addressName = peer.addressName { title = "@\(addressName)" } else { - title = " " + title = "_" } } diff --git a/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/UserApperanceScreen.swift b/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/UserApperanceScreen.swift index 2c44548509..7dbe2cd3b7 100644 --- a/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/UserApperanceScreen.swift +++ b/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/UserApperanceScreen.swift @@ -458,7 +458,8 @@ final class UserAppearanceScreenComponent: Component { .pattern(name: "", file: patternFile, rarity: 0), .backdrop(name: "", innerColor: innerColor, outerColor: outerColor, patternColor: patternColor, textColor: textColor, rarity: 0) ], - availability: StarGift.UniqueGift.Availability(issued: 0, total: 0) + availability: StarGift.UniqueGift.Availability(issued: 0, total: 0), + giftAddress: nil ) signal = component.context.engine.accountData.setStarGiftStatus(starGift: gift, expirationDate: emojiStatus.expirationDate) } else { diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerViewSendMessage.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerViewSendMessage.swift index 5bacb94618..a16eec5159 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerViewSendMessage.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerViewSendMessage.swift @@ -2412,11 +2412,11 @@ final class StoryItemSetContainerSendMessage { let storeCapturedMedia = peer.id.namespace != Namespaces.Peer.SecretChat - presentedLegacyCamera(context: component.context, peer: peer._asPeer(), chatLocation: .peer(id: peer.id), cameraView: cameraView, menuController: nil, parentController: parentController, attachmentController: self.attachmentController, editingMedia: false, saveCapturedPhotos: storeCapturedMedia, mediaGrouping: true, initialCaption: inputText, hasSchedule: peer.id.namespace != Namespaces.Peer.SecretChat, enablePhoto: enablePhoto, enableVideo: enableVideo, sendMessagesWithSignals: { [weak self, weak view] signals, silentPosting, scheduleTime in + presentedLegacyCamera(context: component.context, peer: peer._asPeer(), chatLocation: .peer(id: peer.id), cameraView: cameraView, menuController: nil, parentController: parentController, attachmentController: self.attachmentController, editingMedia: false, saveCapturedPhotos: storeCapturedMedia, mediaGrouping: true, initialCaption: inputText, hasSchedule: peer.id.namespace != Namespaces.Peer.SecretChat, enablePhoto: enablePhoto, enableVideo: enableVideo, sendMessagesWithSignals: { [weak self, weak view] signals, silentPosting, scheduleTime, parameters in guard let self, let view else { return } - self.enqueueMediaMessages(view: view, peer: peer, replyToMessageId: replyToMessageId, replyToStoryId: replyToStoryId, signals: signals, silentPosting: silentPosting, scheduleTime: scheduleTime > 0 ? scheduleTime : nil) + self.enqueueMediaMessages(view: view, peer: peer, replyToMessageId: replyToMessageId, replyToStoryId: replyToStoryId, signals: signals, silentPosting: silentPosting, scheduleTime: scheduleTime > 0 ? scheduleTime : nil, parameters: parameters) if !inputText.string.isEmpty { self.clearInputText(view: view) } diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index cecfd5e3c1..c1b4051e36 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -4538,21 +4538,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let self else { return } - let controller = chatAgeRestrictionAlertController(context: self.context, updatedPresentationData: self.updatedPresentationData, completion: { [weak self] alwaysShow in - guard let self else { - return - } - if alwaysShow { - let _ = updateRemoteContentSettingsConfiguration(postbox: context.account.postbox, network: context.account.network, sensitiveContentEnabled: true).start() - - self.present(UndoOverlayController(presentationData: self.presentationData, content: .info(title: nil, text: self.presentationData.strings.SensitiveContent_SettingsInfo, timeout: nil, customUndoText: nil), elevatedLayout: false, position: .top, action: { [weak self] action in - if case .info = action, let self { - let controller = self.context.sharedContext.makeDataAndStorageController(context: self.context, sensitiveContent: true) - self.push(controller) - } - return false - }), in: .current) - } + let controller = chatAgeRestrictionAlertController(context: self.context, updatedPresentationData: self.updatedPresentationData, completion: { _ in reveal() }) self.present(controller, in: .window(.root)) diff --git a/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift b/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift index ebf8d73be5..58afd63dd1 100644 --- a/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift +++ b/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift @@ -880,7 +880,7 @@ extension ChatControllerImpl { hasSchedule = strongSelf.presentationInterfaceState.subject != .scheduledMessages && peer.id.namespace != Namespaces.Peer.SecretChat } - presentedLegacyCamera(context: strongSelf.context, peer: strongSelf.presentationInterfaceState.renderedPeer?.peer, chatLocation: strongSelf.chatLocation, cameraView: cameraView, menuController: menuController, parentController: strongSelf, editingMedia: editMediaOptions != nil, saveCapturedPhotos: storeCapturedPhotos, mediaGrouping: true, initialCaption: inputText, hasSchedule: hasSchedule, enablePhoto: enablePhoto, enableVideo: enableVideo, sendMessagesWithSignals: { [weak self] signals, silentPosting, scheduleTime in + presentedLegacyCamera(context: strongSelf.context, peer: strongSelf.presentationInterfaceState.renderedPeer?.peer, chatLocation: strongSelf.chatLocation, cameraView: cameraView, menuController: menuController, parentController: strongSelf, editingMedia: editMediaOptions != nil, saveCapturedPhotos: storeCapturedPhotos, mediaGrouping: true, initialCaption: inputText, hasSchedule: hasSchedule, enablePhoto: enablePhoto, enableVideo: enableVideo, sendMessagesWithSignals: { [weak self] signals, _, _, _ in if let strongSelf = self { strongSelf.editMessageMediaWithLegacySignals(signals!) @@ -1779,9 +1779,9 @@ extension ChatControllerImpl { } let inputText = strongSelf.presentationInterfaceState.interfaceState.effectiveInputState.inputText - presentedLegacyCamera(context: strongSelf.context, peer: strongSelf.presentationInterfaceState.renderedPeer?.peer, chatLocation: strongSelf.chatLocation, cameraView: cameraView, menuController: nil, parentController: strongSelf, attachmentController: self?.attachmentController, editingMedia: false, saveCapturedPhotos: storeCapturedMedia, mediaGrouping: true, initialCaption: inputText, hasSchedule: hasSchedule, enablePhoto: enablePhoto, enableVideo: enableVideo, sendMessagesWithSignals: { [weak self] signals, silentPosting, scheduleTime in + presentedLegacyCamera(context: strongSelf.context, peer: strongSelf.presentationInterfaceState.renderedPeer?.peer, chatLocation: strongSelf.chatLocation, cameraView: cameraView, menuController: nil, parentController: strongSelf, attachmentController: self?.attachmentController, editingMedia: false, saveCapturedPhotos: storeCapturedMedia, mediaGrouping: true, initialCaption: inputText, hasSchedule: hasSchedule, enablePhoto: enablePhoto, enableVideo: enableVideo, sendMessagesWithSignals: { [weak self] signals, silentPosting, scheduleTime, parameters in if let strongSelf = self { - strongSelf.enqueueMediaMessages(signals: signals, silentPosting: silentPosting, scheduleTime: scheduleTime > 0 ? scheduleTime : nil) + strongSelf.enqueueMediaMessages(signals: signals, silentPosting: silentPosting, scheduleTime: scheduleTime > 0 ? scheduleTime : nil, parameters: parameters) if !inputText.string.isEmpty { strongSelf.clearInputText() }