no message

This commit is contained in:
Ilya Laktyushin 2018-09-14 15:25:48 +01:00
parent 7ec24554d4
commit b090612e53
31 changed files with 268 additions and 129 deletions

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ModernConversationTitlePanelClose@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ModernConversationTitlePanelClose@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 732 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

View File

@ -6,8 +6,8 @@ import TelegramCore
import SwiftSignalKit import SwiftSignalKit
import Photos import Photos
private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionThrash"), color: .white) private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: .white)
private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionAction"), color: .white) private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: .white)
final class AvatarGalleryItemFooterContentNode: GalleryFooterContentNode { final class AvatarGalleryItemFooterContentNode: GalleryFooterContentNode {
private let account: Account private let account: Account

View File

@ -6,8 +6,8 @@ import TelegramCore
import SwiftSignalKit import SwiftSignalKit
import Photos import Photos
private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionThrash"), color: .white) private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: .white)
private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionAction"), color: .white) private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: .white)
private let backwardImage = UIImage(bundleImageName: "Media Gallery/BackwardButton") private let backwardImage = UIImage(bundleImageName: "Media Gallery/BackwardButton")
private let forwardImage = UIImage(bundleImageName: "Media Gallery/ForwardButton") private let forwardImage = UIImage(bundleImageName: "Media Gallery/ForwardButton")

View File

@ -56,12 +56,12 @@ final class ChatMessageSelectionInputPanelNode: ChatInputPanelNode {
self.shareButton = UIButton() self.shareButton = UIButton()
self.shareButton.isEnabled = false self.shareButton.isEnabled = false
self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal])
self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
self.reportButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionReport"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) self.reportButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionReport"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal])
self.reportButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionReport"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) self.reportButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionReport"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
self.forwardButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionForward"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) self.forwardButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionForward"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal])
self.forwardButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionForward"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) self.forwardButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionForward"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
self.shareButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat List/NavigationShare"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) self.shareButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat List/NavigationShare"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal])
self.shareButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat List/NavigationShare"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) self.shareButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat List/NavigationShare"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
@ -88,12 +88,12 @@ final class ChatMessageSelectionInputPanelNode: ChatInputPanelNode {
if self.theme !== theme { if self.theme !== theme {
self.theme = theme self.theme = theme
self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal])
self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
self.reportButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionReport"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) self.reportButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionReport"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal])
self.reportButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionReport"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) self.reportButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionReport"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
self.forwardButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionForward"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal]) self.forwardButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionForward"), color: theme.chat.inputPanel.panelControlAccentColor), for: [.normal])
self.forwardButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionForward"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled]) self.forwardButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionForward"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
} }
} }

View File

@ -35,7 +35,7 @@ final class ChatRecordingPreviewInputPanelNode: ChatInputPanelNode {
init(theme: PresentationTheme) { init(theme: PresentationTheme) {
self.deleteButton = HighlightableButtonNode() self.deleteButton = HighlightableButtonNode()
self.deleteButton.displaysAsynchronously = false self.deleteButton.displaysAsynchronously = false
self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlAccentColor), for: []) self.deleteButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlAccentColor), for: [])
self.sendButton = HighlightableButtonNode() self.sendButton = HighlightableButtonNode()
self.sendButton.displaysAsynchronously = false self.sendButton.displaysAsynchronously = false

View File

@ -55,7 +55,7 @@ final class ChatReportPeerTitlePanelNode: ChatTitleAccessoryPanelNode {
if interfaceState.theme !== self.theme { if interfaceState.theme !== self.theme {
self.theme = interfaceState.theme self.theme = interfaceState.theme
self.closeButton.setImage(PresentationResourcesChat.chatInputPanelCloseIconImage(interfaceState.theme), for: []) self.closeButton.setImage(PresentationResourcesChat.chatInputPanelEncircledCloseIconImage(interfaceState.theme), for: [])
self.backgroundColor = interfaceState.theme.rootController.navigationBar.backgroundColor self.backgroundColor = interfaceState.theme.rootController.navigationBar.backgroundColor
self.separatorNode.backgroundColor = interfaceState.theme.rootController.navigationBar.separatorColor self.separatorNode.backgroundColor = interfaceState.theme.rootController.navigationBar.separatorColor
} }

View File

@ -7,7 +7,7 @@ private let errorFont = Font.regular(13.0)
enum FormControllerTextInputItemType: Equatable { enum FormControllerTextInputItemType: Equatable {
case regular(capitalization: UITextAutocapitalizationType, autocorrection: Bool) case regular(capitalization: UITextAutocapitalizationType, autocorrection: Bool)
case latin case latin(capitalization: UITextAutocapitalizationType)
case email case email
case number case number
} }
@ -99,8 +99,8 @@ final class FormControllerTextInputItemNode: FormBlockItemNode<FormControllerTex
capitalizationType = capitalization capitalizationType = capitalization
autocorrectionType = autocorrection ? .default : .no autocorrectionType = autocorrection ? .default : .no
keyboardType = .default keyboardType = .default
case .latin: case let .latin(capitalization):
capitalizationType = .words capitalizationType = capitalization
autocorrectionType = .no autocorrectionType = .no
keyboardType = .asciiCapable keyboardType = .asciiCapable
case .email: case .email:

View File

@ -6,7 +6,7 @@ import TelegramCore
import SwiftSignalKit import SwiftSignalKit
import Photos import Photos
private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionAction"), color: .white) private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionAction"), color: .white)
private let textFont = Font.regular(16.0) private let textFont = Font.regular(16.0)

View File

@ -97,7 +97,7 @@ func legacyInstantVideoController(theme: PresentationTheme, panelFrame: CGRect,
if peerId.namespace != Namespaces.Peer.SecretChat { if peerId.namespace != Namespaces.Peer.SecretChat {
uploadInterface = LegacyLiveUploadInterface(account: account) uploadInterface = LegacyLiveUploadInterface(account: account)
} }
let controller = TGVideoMessageCaptureController(context: legacyController.context, assets: TGVideoMessageCaptureControllerAssets(send: PresentationResourcesChat.chatInputPanelSendButtonImage(theme)!, slideToCancel: PresentationResourcesChat.chatInputPanelMediaRecordingCancelArrowImage(theme)!, actionDelete: generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlAccentColor))!, transitionInView: { let controller = TGVideoMessageCaptureController(context: legacyController.context, assets: TGVideoMessageCaptureControllerAssets(send: PresentationResourcesChat.chatInputPanelSendButtonImage(theme)!, slideToCancel: PresentationResourcesChat.chatInputPanelMediaRecordingCancelArrowImage(theme)!, actionDelete: generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlAccentColor))!, transitionInView: {
return nil return nil
}, parentController: baseController, controlsFrame: panelFrame, isAlreadyLocked: { }, parentController: baseController, controlsFrame: panelFrame, isAlreadyLocked: {
return false return false

View File

@ -8,6 +8,7 @@ import TelegramCore
enum SecureIdAttachmentMenuType { enum SecureIdAttachmentMenuType {
case generic case generic
case idCard
case multiple case multiple
case selfie case selfie
} }
@ -33,6 +34,7 @@ struct SecureIdRecognizedDocumentData {
let documentType: String? let documentType: String?
let documentSubtype: String? let documentSubtype: String?
let issuingCountry: String? let issuingCountry: String?
let nationality: String?
let lastName: String? let lastName: String?
let firstName: String? let firstName: String?
let documentNumber: String? let documentNumber: String?
@ -57,6 +59,8 @@ func presentLegacySecureIdAttachmentMenu(account: Account, present: @escaping (V
switch type { switch type {
case .generic: case .generic:
mappedIntent = TGPassportAttachIntentDefault mappedIntent = TGPassportAttachIntentDefault
case .idCard:
mappedIntent = TGPassportAttachIntentIdentityCard
case .multiple: case .multiple:
mappedIntent = TGPassportAttachIntentMultiple mappedIntent = TGPassportAttachIntentMultiple
case .selfie: case .selfie:
@ -161,7 +165,11 @@ private func recognizedResources(postbox: Postbox, resources: [TelegramMediaReso
if let issuingCountryValue = value.issuingCountry { if let issuingCountryValue = value.issuingCountry {
issuingCountry = countryCodeAlpha3ToAlpha2(issuingCountryValue) issuingCountry = countryCodeAlpha3ToAlpha2(issuingCountryValue)
} }
subscriber.putNext(SecureIdRecognizedDocumentData(documentType: value.documentType, documentSubtype: value.documentSubtype, issuingCountry: issuingCountry, lastName: value.lastName, firstName: value.firstName, documentNumber: value.documentNumber, birthDate: value.birthDate, gender: value.gender, expiryDate: value.expiryDate)) var nationality: String? = nil
if let nationalityValue = value.nationality {
nationality = countryCodeAlpha3ToAlpha2(nationalityValue)
}
subscriber.putNext(SecureIdRecognizedDocumentData(documentType: value.documentType, documentSubtype: value.documentSubtype, issuingCountry: issuingCountry, nationality: nationality, lastName: value.lastName.capitalized, firstName: value.firstName.capitalized, documentNumber: value.documentNumber, birthDate: value.birthDate, gender: value.gender, expiryDate: value.expiryDate))
subscriber.putCompletion() subscriber.putCompletion()
} else { } else {
subscriber.putNext(nil) subscriber.putNext(nil)

View File

@ -119,6 +119,7 @@ enum PresentationResourceKey: Int32 {
case chatEmptyItemIconImage case chatEmptyItemIconImage
case chatInputPanelCloseIconImage case chatInputPanelCloseIconImage
case chatInputPanelEncircledCloseIconImage
case chatInputPanelVerticalSeparatorLineImage case chatInputPanelVerticalSeparatorLineImage
case chatMediaInputPanelHighlightedIconImage case chatMediaInputPanelHighlightedIconImage

View File

@ -316,6 +316,12 @@ struct PresentationResourcesChat {
}) })
} }
static func chatInputPanelEncircledCloseIconImage(_ theme: PresentationTheme) -> UIImage? {
return theme.image(PresentationResourceKey.chatInputPanelEncircledCloseIconImage.rawValue, { theme in
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/EncircledCloseButton"), color: theme.chat.serviceMessage.serviceMessagePrimaryTextColor)
})
}
static func chatInputPanelVerticalSeparatorLineImage(_ theme: PresentationTheme) -> UIImage? { static func chatInputPanelVerticalSeparatorLineImage(_ theme: PresentationTheme) -> UIImage? {
return theme.image(PresentationResourceKey.chatInputPanelVerticalSeparatorLineImage.rawValue, { theme in return theme.image(PresentationResourceKey.chatInputPanelVerticalSeparatorLineImage.rawValue, { theme in
return generateVerticallyStretchableFilledCircleImage(radius: 1.0, color: theme.chat.inputPanel.panelControlAccentColor) return generateVerticallyStretchableFilledCircleImage(radius: 1.0, color: theme.chat.inputPanel.panelControlAccentColor)

View File

@ -57,6 +57,7 @@ struct SecureIdAuthControllerFormState: Equatable {
} }
struct SecureIdAuthControllerListState: Equatable { struct SecureIdAuthControllerListState: Equatable {
let accountPeer: Peer
var verificationState: SecureIdAuthControllerVerificationState? var verificationState: SecureIdAuthControllerVerificationState?
var encryptedValues: EncryptedAllSecureIdValues? var encryptedValues: EncryptedAllSecureIdValues?
var primaryLanguageByCountry: [String: String]? var primaryLanguageByCountry: [String: String]?

View File

@ -39,8 +39,8 @@ private enum SecureIdDocumentFormSelectionField {
private enum AddFileTarget { private enum AddFileTarget {
case scan case scan
case selfie case selfie
case frontSide case frontSide(SecureIdRequestedIdentityDocument?)
case backSide case backSide(SecureIdRequestedIdentityDocument?)
case translation case translation
} }
@ -459,6 +459,8 @@ struct SecureIdDocumentFormState: FormControllerInnerState {
} }
if self.selfieRequired || self.frontSideRequired || self.backSideRequired { if self.selfieRequired || self.frontSideRequired || self.backSideRequired {
let type = identity.document?.type
if let last = result.last, case .spacer = last { if let last = result.last, case .spacer = last {
} else { } else {
result.append(.spacer) result.append(.spacer)
@ -486,9 +488,9 @@ struct SecureIdDocumentFormState: FormControllerInnerState {
break break
} }
} }
result.append(.entry(SecureIdDocumentFormEntry.frontSide(1, document, error))) result.append(.entry(SecureIdDocumentFormEntry.frontSide(1, type, document, error)))
} else { } else {
result.append(.entry(SecureIdDocumentFormEntry.frontSide(1, nil, nil))) result.append(.entry(SecureIdDocumentFormEntry.frontSide(1, type, nil, nil)))
} }
} }
if self.backSideRequired { if self.backSideRequired {
@ -513,9 +515,9 @@ struct SecureIdDocumentFormState: FormControllerInnerState {
break break
} }
} }
result.append(.entry(SecureIdDocumentFormEntry.backSide(2, document, error))) result.append(.entry(SecureIdDocumentFormEntry.backSide(2, type, document, error)))
} else { } else {
result.append(.entry(SecureIdDocumentFormEntry.backSide(2, nil, nil))) result.append(.entry(SecureIdDocumentFormEntry.backSide(2, type, nil, nil)))
} }
} }
@ -546,6 +548,8 @@ struct SecureIdDocumentFormState: FormControllerInnerState {
result.append(.entry(SecureIdDocumentFormEntry.selfie(0, nil, nil))) result.append(.entry(SecureIdDocumentFormEntry.selfie(0, nil, nil)))
} }
} }
result.append(.entry(SecureIdDocumentFormEntry.scansInfo(.identity)))
} }
if let document = identity.document, self.translationsRequired { if let document = identity.document, self.translationsRequired {
@ -1231,9 +1235,9 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
case deleteDocument case deleteDocument
case requestedDocumentsHeader case requestedDocumentsHeader
case selfie(Int, SecureIdVerificationDocument?, String?) case selfie(Int, SecureIdVerificationDocument?, String?)
case frontSide(Int, SecureIdVerificationDocument?, String?) case frontSide(Int, SecureIdRequestedIdentityDocument?, SecureIdVerificationDocument?, String?)
case backSide(Int, SecureIdVerificationDocument?, String?) case backSide(Int, SecureIdRequestedIdentityDocument?, SecureIdVerificationDocument?, String?)
case documentsInfo case documentsInfo(SecureIdDocumentFormEntryCategory)
case translationsHeader case translationsHeader
case translation(Int, SecureIdVerificationDocument, String?) case translation(Int, SecureIdVerificationDocument, String?)
case addTranslation(Bool) case addTranslation(Bool)
@ -1485,20 +1489,20 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
} else { } else {
return false return false
} }
case let .frontSide(index, document, error): case let .frontSide(index, type, document, error):
if case .frontSide(index, document, error) = to { if case .frontSide(index, type, document, error) = to {
return true return true
} else { } else {
return false return false
} }
case let .backSide(index, document, error): case let .backSide(index, type, document, error):
if case .backSide(index, document, error) = to { if case .backSide(index, type, document, error) = to {
return true return true
} else { } else {
return false return false
} }
case .documentsInfo: case let .documentsInfo(category):
if case .documentsInfo = to { if case .documentsInfo(category) = to {
return true return true
} else { } else {
return false return false
@ -1571,15 +1575,15 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
params.updateText(.identifier, text) params.updateText(.identifier, text)
}) })
case let .firstName(value, error): case let .firstName(value, error):
return FormControllerTextInputItem(title: strings.Passport_Identity_Name, text: value, placeholder: strings.Passport_Identity_NamePlaceholder, type: .latin, error: error, textUpdated: { text in return FormControllerTextInputItem(title: strings.Passport_Identity_Name, text: value, placeholder: strings.Passport_Identity_NamePlaceholder, type: .latin(capitalization: .words), error: error, textUpdated: { text in
params.updateText(.firstName, text) params.updateText(.firstName, text)
}) })
case let .middleName(value, error): case let .middleName(value, error):
return FormControllerTextInputItem(title: strings.Passport_Identity_MiddleName, text: value, placeholder: strings.Passport_Identity_MiddleNamePlaceholder, type: .latin, error: error, textUpdated: { text in return FormControllerTextInputItem(title: strings.Passport_Identity_MiddleName, text: value, placeholder: strings.Passport_Identity_MiddleNamePlaceholder, type: .latin(capitalization: .words), error: error, textUpdated: { text in
params.updateText(.middleName, text) params.updateText(.middleName, text)
}) })
case let .lastName(value, error): case let .lastName(value, error):
return FormControllerTextInputItem(title: strings.Passport_Identity_Surname, text: value, placeholder: strings.Passport_Identity_SurnamePlaceholder, type: .latin, error: error, textUpdated: { text in return FormControllerTextInputItem(title: strings.Passport_Identity_Surname, text: value, placeholder: strings.Passport_Identity_SurnamePlaceholder, type: .latin(capitalization: .words), error: error, textUpdated: { text in
params.updateText(.lastName, text) params.updateText(.lastName, text)
}) })
case let .nativeInfoHeader(language): case let .nativeInfoHeader(language):
@ -1671,7 +1675,7 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
params.updateText(.state, text) params.updateText(.state, text)
}) })
case let .postcode(value, error): case let .postcode(value, error):
return FormControllerTextInputItem(title: strings.Passport_Address_Postcode, text: value, placeholder: strings.Passport_Address_PostcodePlaceholder, type: .regular(capitalization: .allCharacters, autocorrection: false), error: error, textUpdated: { text in return FormControllerTextInputItem(title: strings.Passport_Address_Postcode, text: value, placeholder: strings.Passport_Address_PostcodePlaceholder, type: .latin(capitalization: .allCharacters), error: error, textUpdated: { text in
params.updateText(.postcode, text) params.updateText(.postcode, text)
}) })
case .requestedDocumentsHeader: case .requestedDocumentsHeader:
@ -1692,23 +1696,41 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
params.addFile(.selfie) params.addFile(.selfie)
} }
}) })
case let .frontSide(_, document, error): case let .frontSide(_, type, document, error):
let label: SecureIdValueFormFileItemLabel let label: SecureIdValueFormFileItemLabel
if let error = error { if let error = error {
label = .error(error) label = .error(error)
} else if document != nil { } else if document != nil {
label = .timestamp label = .timestamp
} else { } else {
label = .text(strings.Passport_Identity_FrontSideHelp) switch type {
case .passport?, .internalPassport?:
label = .text(strings.Passport_Identity_MainPageHelp)
default:
label = .text(strings.Passport_Identity_FrontSideHelp)
}
} }
return SecureIdValueFormFileItem(account: params.account, context: params.context, document: document, placeholder: UIImage(bundleImageName: "Secure ID/PassportInputFrontSide"), title: strings.Passport_Identity_FrontSide, label: label, activated: { let title: String
let placeholder: UIImage?
switch type {
case .passport?, .internalPassport?:
title = strings.Passport_Identity_MainPage
placeholder = UIImage(bundleImageName: "Secure ID/PassportInputFrontSide")
case .driversLicense?:
title = strings.Passport_Identity_FrontSide
placeholder = UIImage(bundleImageName: "Secure ID/DriversLicenseInputFrontSide")
default:
title = strings.Passport_Identity_FrontSide
placeholder = UIImage(bundleImageName: "Secure ID/IdCardInputFrontSide")
}
return SecureIdValueFormFileItem(account: params.account, context: params.context, document: document, placeholder: placeholder, title: title, label: label, activated: {
if let document = document { if let document = document {
params.openDocument(document) params.openDocument(document)
} else { } else {
params.addFile(.frontSide) params.addFile(.frontSide(type))
} }
}) })
case let .backSide(_, document, error): case let .backSide(_, type, document, error):
let label: SecureIdValueFormFileItemLabel let label: SecureIdValueFormFileItemLabel
if let error = error { if let error = error {
label = .error(error) label = .error(error)
@ -1721,11 +1743,18 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
if let document = document { if let document = document {
params.openDocument(document) params.openDocument(document)
} else { } else {
params.addFile(.backSide) params.addFile(.backSide(type))
} }
}) })
case .documentsInfo: case let .documentsInfo(category):
return FormControllerTextItem(text: "") let text: String
switch category {
case .identity:
text = strings.Passport_Identity_ScansHelp
case .address:
text = strings.Passport_Address_ScansHelp
}
return FormControllerTextItem(text: text)
case .translationsHeader: case .translationsHeader:
return FormControllerHeaderItem(text: strings.Passport_Identity_Translations) return FormControllerHeaderItem(text: strings.Passport_Identity_Translations)
case let .translation(index, document, error): case let .translation(index, document, error):
@ -1737,7 +1766,7 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
params.addFile(.translation) params.addFile(.translation)
}) })
case .translationsInfo: case .translationsInfo:
return FormControllerTextItem(text: strings.Passport_Identity_TranslationHelp) return FormControllerTextItem(text: strings.Passport_Identity_TranslationsHelp)
case let .error(_, text, _): case let .error(_, text, _):
return FormControllerTextItem(text: text, color: .error) return FormControllerTextItem(text: text, color: .error)
} }
@ -1912,6 +1941,10 @@ final class SecureIdDocumentFormControllerNode: FormControllerNode<SecureIdDocum
let now = Date() let now = Date()
if case .expiry = field { if case .expiry = field {
emptyTitle = strings.Passport_Identity_DoesNotExpire emptyTitle = strings.Passport_Identity_DoesNotExpire
var deltaComponents = DateComponents()
deltaComponents.month = 6
minimumDate = calendar.date(byAdding: deltaComponents, to: now)
} else if case .birthdate = field {
var components = calendar.dateComponents([.year, .month, .day], from: now) var components = calendar.dateComponents([.year, .month, .day], from: now)
if let year = components.year { if let year = components.year {
components.year = year - 18 components.year = year - 18
@ -1919,10 +1952,6 @@ final class SecureIdDocumentFormControllerNode: FormControllerNode<SecureIdDocum
components.minute = 0 components.minute = 0
maximumDate = calendar.date(from: components) maximumDate = calendar.date(from: components)
} }
} else if case .birthdate = field {
var deltaComponents = DateComponents()
deltaComponents.month = 6
minimumDate = calendar.date(byAdding: deltaComponents, to: now)
} }
let controller = DateSelectionActionSheetController(theme: theme, strings: strings, currentValue: current ?? Int32(Date().timeIntervalSince1970), minimumDate: minimumDate, maximumDate: maximumDate, emptyTitle: emptyTitle, applyValue: { value in let controller = DateSelectionActionSheetController(theme: theme, strings: strings, currentValue: current ?? Int32(Date().timeIntervalSince1970), minimumDate: minimumDate, maximumDate: maximumDate, emptyTitle: emptyTitle, applyValue: { value in
@ -2087,8 +2116,13 @@ final class SecureIdDocumentFormControllerNode: FormControllerNode<SecureIdDocum
switch type { switch type {
case .scan: case .scan:
attachmentType = .multiple attachmentType = .multiple
case .backSide, .frontSide: case let .frontSide(type), let .backSide(type):
attachmentType = .generic switch type {
case .idCard?, .driversLicense?:
attachmentType = .idCard
default:
attachmentType = .generic
}
case .selfie: case .selfie:
attachmentType = .selfie attachmentType = .selfie
case .translation: case .translation:

View File

@ -6,7 +6,7 @@ import TelegramCore
import SwiftSignalKit import SwiftSignalKit
import Photos import Photos
private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionThrash"), color: .white) private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionThrash"), color: .white)
private let textFont = Font.regular(16.0) private let textFont = Font.regular(16.0)
private let titleFont = Font.medium(15.0) private let titleFont = Font.medium(15.0)

View File

@ -22,11 +22,13 @@ final class SecureIdPlaintextFormParams {
fileprivate let openCountrySelection: () -> Void fileprivate let openCountrySelection: () -> Void
fileprivate let updateTextField: (SecureIdPlaintextFormTextField, String) -> Void fileprivate let updateTextField: (SecureIdPlaintextFormTextField, String) -> Void
fileprivate let usePhone: (String) -> Void fileprivate let usePhone: (String) -> Void
fileprivate let useEmailAddress: (String) -> Void
fileprivate init(openCountrySelection: @escaping () -> Void, updateTextField: @escaping (SecureIdPlaintextFormTextField, String) -> Void, usePhone: @escaping (String) -> Void) { fileprivate init(openCountrySelection: @escaping () -> Void, updateTextField: @escaping (SecureIdPlaintextFormTextField, String) -> Void, usePhone: @escaping (String) -> Void, useEmailAddress: @escaping (String) -> Void) {
self.openCountrySelection = openCountrySelection self.openCountrySelection = openCountrySelection
self.updateTextField = updateTextField self.updateTextField = updateTextField
self.usePhone = usePhone self.usePhone = usePhone
self.useEmailAddress = useEmailAddress
} }
} }
@ -278,6 +280,7 @@ struct SecureIdPlaintextFormInnerState: FormControllerInnerState {
result.append(.entry(SecureIdPlaintextFormEntry.immediatelyAvailablePhone(phone.phone))) result.append(.entry(SecureIdPlaintextFormEntry.immediatelyAvailablePhone(phone.phone)))
result.append(.entry(SecureIdPlaintextFormEntry.immediatelyAvailablePhoneInfo)) result.append(.entry(SecureIdPlaintextFormEntry.immediatelyAvailablePhoneInfo))
result.append(.spacer) result.append(.spacer)
result.append(.entry(SecureIdPlaintextFormEntry.numberInputHeader))
} }
result.append(.entry(SecureIdPlaintextFormEntry.numberInput(countryCode: input.countryCode, number: input.number))) result.append(.entry(SecureIdPlaintextFormEntry.numberInput(countryCode: input.countryCode, number: input.number)))
@ -293,12 +296,20 @@ struct SecureIdPlaintextFormInnerState: FormControllerInnerState {
switch email { switch email {
case let .input(input): case let .input(input):
result.append(.spacer) result.append(.spacer)
if let value = self.previousValue, case let .email(email) = value {
result.append(.entry(SecureIdPlaintextFormEntry.immediatelyAvailableEmail(email.email)))
result.append(.entry(SecureIdPlaintextFormEntry.immediatelyAvailableEmailInfo))
result.append(.spacer)
result.append(.entry(SecureIdPlaintextFormEntry.emailInputHeader))
}
result.append(.entry(SecureIdPlaintextFormEntry.emailAddress(input.email))) result.append(.entry(SecureIdPlaintextFormEntry.emailAddress(input.email)))
result.append(.entry(SecureIdPlaintextFormEntry.numberInputInfo)) result.append(.entry(SecureIdPlaintextFormEntry.emailInputInfo))
case let .verify(verify): case let .verify(verify):
result.append(.spacer) result.append(.spacer)
result.append(.entry(SecureIdPlaintextFormEntry.numberCode(verify.code))) result.append(.entry(SecureIdPlaintextFormEntry.numberCode(verify.code)))
result.append(.entry(SecureIdPlaintextFormEntry.emailVerifyInfo)) result.append(.entry(SecureIdPlaintextFormEntry.emailVerifyInfo(verify.email)))
} }
return result return result
} }
@ -383,26 +394,35 @@ extension SecureIdPlaintextFormInnerState {
enum SecureIdPlaintextFormEntryId: Hashable { enum SecureIdPlaintextFormEntryId: Hashable {
case immediatelyAvailablePhone case immediatelyAvailablePhone
case immediatelyAvailablePhoneInfo case immediatelyAvailablePhoneInfo
case numberInputHeader
case numberInput case numberInput
case numberInputInfo case numberInputInfo
case numberCode case numberCode
case numberVerifyInfo case numberVerifyInfo
case emailVerifyInfo case immediatelyAvailableEmail
case immediatelyAvailableEmailInfo
case emailInputHeader
case emailAddress case emailAddress
case emailInputInfo
case emailCode case emailCode
case emailVerifyInfo
} }
enum SecureIdPlaintextFormEntry: FormControllerEntry { enum SecureIdPlaintextFormEntry: FormControllerEntry {
case immediatelyAvailablePhone(String) case immediatelyAvailablePhone(String)
case immediatelyAvailablePhoneInfo case immediatelyAvailablePhoneInfo
case numberInputHeader
case numberInput(countryCode: String, number: String) case numberInput(countryCode: String, number: String)
case numberInputInfo case numberInputInfo
case numberCode(String) case numberCode(String)
case numberVerifyInfo case numberVerifyInfo
case immediatelyAvailableEmail(String)
case immediatelyAvailableEmailInfo
case emailInputHeader
case emailAddress(String) case emailAddress(String)
case emailInputInfo
case emailCode(String) case emailCode(String)
case emailVerifyInfo case emailVerifyInfo(String)
var stableId: SecureIdPlaintextFormEntryId { var stableId: SecureIdPlaintextFormEntryId {
switch self { switch self {
@ -410,6 +430,8 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
return .immediatelyAvailablePhone return .immediatelyAvailablePhone
case .immediatelyAvailablePhoneInfo: case .immediatelyAvailablePhoneInfo:
return .immediatelyAvailablePhoneInfo return .immediatelyAvailablePhoneInfo
case .numberInputHeader:
return .numberInputHeader
case .numberInput: case .numberInput:
return .numberInput return .numberInput
case .numberInputInfo: case .numberInputInfo:
@ -418,8 +440,16 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
return .numberCode return .numberCode
case .numberVerifyInfo: case .numberVerifyInfo:
return .numberVerifyInfo return .numberVerifyInfo
case .immediatelyAvailableEmail:
return .immediatelyAvailableEmail
case .immediatelyAvailableEmailInfo:
return .immediatelyAvailableEmailInfo
case .emailInputHeader:
return .emailInputHeader
case .emailAddress: case .emailAddress:
return .emailAddress return .emailAddress
case .emailInputInfo:
return .emailInputInfo
case .emailCode: case .emailCode:
return .emailCode return .emailCode
case .emailVerifyInfo: case .emailVerifyInfo:
@ -441,6 +471,12 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
} else { } else {
return false return false
} }
case .numberInputHeader:
if case .numberInputHeader = to {
return true
} else {
return false
}
case let .numberInput(countryCode, number): case let .numberInput(countryCode, number):
if case .numberInput(countryCode, number) = to { if case .numberInput(countryCode, number) = to {
return true return true
@ -465,8 +501,20 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
} else { } else {
return false return false
} }
case .emailVerifyInfo: case let .immediatelyAvailableEmail(value):
if case .emailVerifyInfo = to { if case .immediatelyAvailableEmail(value) = to {
return true
} else {
return false
}
case .immediatelyAvailableEmailInfo:
if case .immediatelyAvailableEmailInfo = to {
return true
} else {
return false
}
case .emailInputHeader:
if case .emailInputHeader = to {
return true return true
} else { } else {
return false return false
@ -477,12 +525,24 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
} else { } else {
return false return false
} }
case .emailInputInfo:
if case .emailInputInfo = to {
return true
} else {
return false
}
case let .emailCode(code): case let .emailCode(code):
if case .emailCode(code) = to { if case .emailCode(code) = to {
return true return true
} else { } else {
return false return false
} }
case let .emailVerifyInfo(address):
if case .emailVerifyInfo(address) = to {
return true
} else {
return false
}
} }
} }
@ -494,6 +554,8 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
}) })
case .immediatelyAvailablePhoneInfo: case .immediatelyAvailablePhoneInfo:
return FormControllerTextItem(text: strings.Passport_Phone_UseTelegramNumberHelp) return FormControllerTextItem(text: strings.Passport_Phone_UseTelegramNumberHelp)
case .numberInputHeader:
return FormControllerHeaderItem(text: strings.Passport_Phone_EnterOtherNumber)
case let .numberInput(countryCode, number): case let .numberInput(countryCode, number):
var countryName = "" var countryName = ""
if let codeNumber = Int(countryCode), let codeId = AuthorizationSequenceCountrySelectionController.lookupCountryIdByCode(codeNumber) { if let codeNumber = Int(countryCode), let codeId = AuthorizationSequenceCountrySelectionController.lookupCountryIdByCode(codeNumber) {
@ -514,16 +576,26 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
}) })
case .numberVerifyInfo: case .numberVerifyInfo:
return FormControllerTextItem(text: strings.ChangePhoneNumberCode_Help) return FormControllerTextItem(text: strings.ChangePhoneNumberCode_Help)
case let .immediatelyAvailableEmail(value):
return FormControllerActionItem(type: .accent, title: strings.Passport_Email_UseTelegramEmail(value).0, activated: {
params.useEmailAddress(value)
})
case .immediatelyAvailableEmailInfo:
return FormControllerTextItem(text: strings.Passport_Email_UseTelegramEmailHelp)
case .emailInputHeader:
return FormControllerHeaderItem(text: strings.Passport_Email_EnterOtherEmail)
case let .emailAddress(address): case let .emailAddress(address):
return FormControllerTextInputItem(title: strings.TwoStepAuth_Email, text: address, placeholder: strings.TwoStepAuth_Email, type: .email, textUpdated: { value in return FormControllerTextInputItem(title: strings.TwoStepAuth_Email, text: address, placeholder: strings.Passport_Email_EmailPlaceholder, type: .email, textUpdated: { value in
params.updateTextField(.email, value) params.updateTextField(.email, value)
}) })
case .emailInputInfo:
return FormControllerTextItem(text: strings.Passport_Email_Help)
case let .emailCode(code): case let .emailCode(code):
return FormControllerTextInputItem(title: strings.TwoStepAuth_RecoveryCode, text: code, placeholder: strings.TwoStepAuth_RecoveryCode, type: .number, textUpdated: { value in return FormControllerTextInputItem(title: strings.TwoStepAuth_RecoveryCode, text: code, placeholder: strings.TwoStepAuth_RecoveryCode, type: .number, textUpdated: { value in
params.updateTextField(.code, value) params.updateTextField(.code, value)
}) })
case .emailVerifyInfo: case let .emailVerifyInfo(address):
return FormControllerTextItem(text: strings.TwoStepAuth_EmailSent) return FormControllerTextItem(text: strings.Passport_Email_CodeHelp(address).0)
} }
} }
} }
@ -583,6 +655,8 @@ final class SecureIdPlaintextFormControllerNode: FormControllerNode<SecureIdPlai
strongSelf.updateInnerState(transition: .immediate, with: innerState) strongSelf.updateInnerState(transition: .immediate, with: innerState)
}, usePhone: { [weak self] value in }, usePhone: { [weak self] value in
self?.savePhone(value) self?.savePhone(value)
}, useEmailAddress: { [weak self] value in
self?.saveEmailAddress(value)
}) })
} }
@ -624,7 +698,7 @@ final class SecureIdPlaintextFormControllerNode: FormControllerNode<SecureIdPlai
self.actionDisposable.set((secureIdCommitPhoneVerification(postbox: self.account.postbox, network: self.account.network, context: self.context, payload: verify.payload, code: verify.code) self.actionDisposable.set((secureIdCommitPhoneVerification(postbox: self.account.postbox, network: self.account.network, context: self.context, payload: verify.payload, code: verify.code)
|> deliverOnMainQueue).start(next: { [weak self] result in |> deliverOnMainQueue).start(next: { [weak self] result in
if let strongSelf = self { if let strongSelf = self {
guard var innerState = strongSelf.innerState else { guard let innerState = strongSelf.innerState else {
return return
} }
guard case .saving = innerState.actionState else { guard case .saving = innerState.actionState else {
@ -661,45 +735,7 @@ final class SecureIdPlaintextFormControllerNode: FormControllerNode<SecureIdPlai
case let .email(email): case let .email(email):
switch email { switch email {
case let .input(input): case let .input(input):
guard case .nextAvailable = innerState.actionInputState() else { self.saveEmailAddress(input.email)
return
}
innerState.actionState = .saving
self.updateInnerState(transition: .immediate, with: innerState)
self.actionDisposable.set((secureIdPrepareEmailVerification(network: self.account.network, value: SecureIdEmailValue(email: input.email))
|> deliverOnMainQueue).start(next: { [weak self] result in
if let strongSelf = self {
guard var innerState = strongSelf.innerState else {
return
}
guard case .saving = innerState.actionState else {
return
}
innerState.actionState = .none
innerState.data = .email(.verify(EmailVerifyState(email: input.email, payload: result, code: "")))
strongSelf.updateInnerState(transition: .immediate, with: innerState)
}
}, error: { [weak self] error in
if let strongSelf = self {
guard var innerState = strongSelf.innerState else {
return
}
guard case .saving = innerState.actionState else {
return
}
innerState.actionState = .none
strongSelf.updateInnerState(transition: .immediate, with: innerState)
let errorText: String
switch error {
case .generic:
errorText = strongSelf.strings.Login_UnknownError
case .flood:
errorText = strongSelf.strings.Login_CodeFloodError
}
strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: errorText, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), nil)
}
}))
return return
case let .verify(verify): case let .verify(verify):
guard case .saveAvailable = innerState.actionInputState() else { guard case .saveAvailable = innerState.actionInputState() else {
@ -711,7 +747,7 @@ final class SecureIdPlaintextFormControllerNode: FormControllerNode<SecureIdPlai
self.actionDisposable.set((secureIdCommitEmailVerification(postbox: self.account.postbox, network: self.account.network, context: self.context, payload: verify.payload, code: verify.code) self.actionDisposable.set((secureIdCommitEmailVerification(postbox: self.account.postbox, network: self.account.network, context: self.context, payload: verify.payload, code: verify.code)
|> deliverOnMainQueue).start(next: { [weak self] result in |> deliverOnMainQueue).start(next: { [weak self] result in
if let strongSelf = self { if let strongSelf = self {
guard var innerState = strongSelf.innerState else { guard let innerState = strongSelf.innerState else {
return return
} }
guard case .saving = innerState.actionState else { guard case .saving = innerState.actionState else {
@ -794,6 +830,51 @@ final class SecureIdPlaintextFormControllerNode: FormControllerNode<SecureIdPlai
})) }))
} }
private func saveEmailAddress(_ value: String) {
guard var innerState = self.innerState else {
return
}
guard case .none = innerState.actionState else {
return
}
innerState.actionState = .saving
self.updateInnerState(transition: .immediate, with: innerState)
self.actionDisposable.set((secureIdPrepareEmailVerification(network: self.account.network, value: SecureIdEmailValue(email: value))
|> deliverOnMainQueue).start(next: { [weak self] result in
if let strongSelf = self {
guard var innerState = strongSelf.innerState else {
return
}
guard case .saving = innerState.actionState else {
return
}
innerState.actionState = .none
innerState.data = .email(.verify(EmailVerifyState(email: value, payload: result, code: "")))
strongSelf.updateInnerState(transition: .immediate, with: innerState)
}
}, error: { [weak self] error in
if let strongSelf = self {
guard var innerState = strongSelf.innerState else {
return
}
guard case .saving = innerState.actionState else {
return
}
innerState.actionState = .none
strongSelf.updateInnerState(transition: .immediate, with: innerState)
let errorText: String
switch error {
case .generic:
errorText = strongSelf.strings.Login_UnknownError
case .flood:
errorText = strongSelf.strings.Login_CodeFloodError
}
strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: errorText, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), nil)
}
}))
}
func deleteValue() { func deleteValue() {
guard var innerState = self.innerState, let previousValue = innerState.previousValue else { guard var innerState = self.innerState, let previousValue = innerState.previousValue else {
return return

View File

@ -93,28 +93,14 @@ private final class WebEmbedVideoContentNode: ASDisplayNode, UniversalVideoConte
super.init() super.init()
self.addSubnode(self.playerNode) //self.addSubnode(self.playerNode)
self.addSubnode(self.imageNode) self.addSubnode(self.imageNode)
// let nativeLoadProgress = nil //self.playerView.loadProgress()
// let loadProgress: Signal<Float, NoError> = Signal { subscriber in
// let disposable = nativeLoadProgress?.start(next: { value in
// subscriber.putNext((value as! NSNumber).floatValue)
// })
// return ActionDisposable {
// disposable?.dispose()
// }
// }
self._preloadCompleted.set(true) self._preloadCompleted.set(true)
// self.loadProgressDisposable = (loadProgress |> deliverOnMainQueue).start(next: { [weak self] value in
// if let strongSelf = self {
// strongSelf._preloadCompleted.set(value.isEqual(to: 1.0))
// }
// })
if let image = webpageContent.image { if let image = webpageContent.image {
self.imageNode.setSignal(chatMessagePhoto(postbox: postbox, photoReference: .webPage(webPage: WebpageReference(webPage), media: image)))
self.thumbnailDisposable = (rawMessagePhoto(postbox: postbox, photoReference: .webPage(webPage: WebpageReference(webPage), media: image)) self.thumbnailDisposable = (rawMessagePhoto(postbox: postbox, photoReference: .webPage(webPage: WebpageReference(webPage), media: image))
|> deliverOnMainQueue).start(next: { [weak self] image in |> deliverOnMainQueue).start(next: { [weak self] image in
if let strongSelf = self { if let strongSelf = self {