no message
|
Before Width: | Height: | Size: 170 B After Width: | Height: | Size: 170 B |
22
Images.xcassets/Chat/Input/Accessory Panels/EncircledCloseButton.imageset/Contents.json
vendored
Normal 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"
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 732 B |
|
After Width: | Height: | Size: 982 B |
|
Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 210 B |
|
Before Width: | Height: | Size: 628 B After Width: | Height: | Size: 628 B |
|
Before Width: | Height: | Size: 749 B After Width: | Height: | Size: 749 B |
|
Before Width: | Height: | Size: 747 B After Width: | Height: | Size: 747 B |
@ -6,8 +6,8 @@ import TelegramCore
|
||||
import SwiftSignalKit
|
||||
import Photos
|
||||
|
||||
private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionThrash"), color: .white)
|
||||
private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionAction"), 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/Accessory Panels/MessageSelectionAction"), color: .white)
|
||||
|
||||
final class AvatarGalleryItemFooterContentNode: GalleryFooterContentNode {
|
||||
private let account: Account
|
||||
|
||||
@ -6,8 +6,8 @@ import TelegramCore
|
||||
import SwiftSignalKit
|
||||
import Photos
|
||||
|
||||
private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionThrash"), color: .white)
|
||||
private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Acessory Panels/MessageSelectionAction"), 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/Accessory Panels/MessageSelectionAction"), color: .white)
|
||||
|
||||
private let backwardImage = UIImage(bundleImageName: "Media Gallery/BackwardButton")
|
||||
private let forwardImage = UIImage(bundleImageName: "Media Gallery/ForwardButton")
|
||||
|
||||
@ -56,12 +56,12 @@ final class ChatMessageSelectionInputPanelNode: ChatInputPanelNode {
|
||||
self.shareButton = UIButton()
|
||||
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/Acessory 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/Acessory 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/Acessory Panels/MessageSelectionForward"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
|
||||
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/Accessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
|
||||
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/Accessory Panels/MessageSelectionReport"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
|
||||
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/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.panelControlDisabledColor), for: [.disabled])
|
||||
|
||||
@ -88,12 +88,12 @@ final class ChatMessageSelectionInputPanelNode: ChatInputPanelNode {
|
||||
if 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/Acessory 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/Acessory 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/Acessory Panels/MessageSelectionForward"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
|
||||
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/Accessory Panels/MessageSelectionThrash"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
|
||||
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/Accessory Panels/MessageSelectionReport"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
|
||||
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/Accessory Panels/MessageSelectionForward"), color: theme.chat.inputPanel.panelControlDisabledColor), for: [.disabled])
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -35,7 +35,7 @@ final class ChatRecordingPreviewInputPanelNode: ChatInputPanelNode {
|
||||
init(theme: PresentationTheme) {
|
||||
self.deleteButton = HighlightableButtonNode()
|
||||
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.displaysAsynchronously = false
|
||||
|
||||
@ -55,7 +55,7 @@ final class ChatReportPeerTitlePanelNode: ChatTitleAccessoryPanelNode {
|
||||
if interfaceState.theme !== self.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.separatorNode.backgroundColor = interfaceState.theme.rootController.navigationBar.separatorColor
|
||||
}
|
||||
|
||||
@ -7,7 +7,7 @@ private let errorFont = Font.regular(13.0)
|
||||
|
||||
enum FormControllerTextInputItemType: Equatable {
|
||||
case regular(capitalization: UITextAutocapitalizationType, autocorrection: Bool)
|
||||
case latin
|
||||
case latin(capitalization: UITextAutocapitalizationType)
|
||||
case email
|
||||
case number
|
||||
}
|
||||
@ -99,8 +99,8 @@ final class FormControllerTextInputItemNode: FormBlockItemNode<FormControllerTex
|
||||
capitalizationType = capitalization
|
||||
autocorrectionType = autocorrection ? .default : .no
|
||||
keyboardType = .default
|
||||
case .latin:
|
||||
capitalizationType = .words
|
||||
case let .latin(capitalization):
|
||||
capitalizationType = capitalization
|
||||
autocorrectionType = .no
|
||||
keyboardType = .asciiCapable
|
||||
case .email:
|
||||
|
||||
@ -6,7 +6,7 @@ import TelegramCore
|
||||
import SwiftSignalKit
|
||||
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)
|
||||
|
||||
|
||||
@ -97,7 +97,7 @@ func legacyInstantVideoController(theme: PresentationTheme, panelFrame: CGRect,
|
||||
if peerId.namespace != Namespaces.Peer.SecretChat {
|
||||
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
|
||||
}, parentController: baseController, controlsFrame: panelFrame, isAlreadyLocked: {
|
||||
return false
|
||||
|
||||
@ -8,6 +8,7 @@ import TelegramCore
|
||||
|
||||
enum SecureIdAttachmentMenuType {
|
||||
case generic
|
||||
case idCard
|
||||
case multiple
|
||||
case selfie
|
||||
}
|
||||
@ -33,6 +34,7 @@ struct SecureIdRecognizedDocumentData {
|
||||
let documentType: String?
|
||||
let documentSubtype: String?
|
||||
let issuingCountry: String?
|
||||
let nationality: String?
|
||||
let lastName: String?
|
||||
let firstName: String?
|
||||
let documentNumber: String?
|
||||
@ -57,6 +59,8 @@ func presentLegacySecureIdAttachmentMenu(account: Account, present: @escaping (V
|
||||
switch type {
|
||||
case .generic:
|
||||
mappedIntent = TGPassportAttachIntentDefault
|
||||
case .idCard:
|
||||
mappedIntent = TGPassportAttachIntentIdentityCard
|
||||
case .multiple:
|
||||
mappedIntent = TGPassportAttachIntentMultiple
|
||||
case .selfie:
|
||||
@ -161,7 +165,11 @@ private func recognizedResources(postbox: Postbox, resources: [TelegramMediaReso
|
||||
if let issuingCountryValue = value.issuingCountry {
|
||||
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()
|
||||
} else {
|
||||
subscriber.putNext(nil)
|
||||
|
||||
@ -119,6 +119,7 @@ enum PresentationResourceKey: Int32 {
|
||||
case chatEmptyItemIconImage
|
||||
|
||||
case chatInputPanelCloseIconImage
|
||||
case chatInputPanelEncircledCloseIconImage
|
||||
case chatInputPanelVerticalSeparatorLineImage
|
||||
|
||||
case chatMediaInputPanelHighlightedIconImage
|
||||
|
||||
@ -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? {
|
||||
return theme.image(PresentationResourceKey.chatInputPanelVerticalSeparatorLineImage.rawValue, { theme in
|
||||
return generateVerticallyStretchableFilledCircleImage(radius: 1.0, color: theme.chat.inputPanel.panelControlAccentColor)
|
||||
|
||||
@ -57,6 +57,7 @@ struct SecureIdAuthControllerFormState: Equatable {
|
||||
}
|
||||
|
||||
struct SecureIdAuthControllerListState: Equatable {
|
||||
let accountPeer: Peer
|
||||
var verificationState: SecureIdAuthControllerVerificationState?
|
||||
var encryptedValues: EncryptedAllSecureIdValues?
|
||||
var primaryLanguageByCountry: [String: String]?
|
||||
|
||||
@ -39,8 +39,8 @@ private enum SecureIdDocumentFormSelectionField {
|
||||
private enum AddFileTarget {
|
||||
case scan
|
||||
case selfie
|
||||
case frontSide
|
||||
case backSide
|
||||
case frontSide(SecureIdRequestedIdentityDocument?)
|
||||
case backSide(SecureIdRequestedIdentityDocument?)
|
||||
case translation
|
||||
}
|
||||
|
||||
@ -459,6 +459,8 @@ struct SecureIdDocumentFormState: FormControllerInnerState {
|
||||
}
|
||||
|
||||
if self.selfieRequired || self.frontSideRequired || self.backSideRequired {
|
||||
let type = identity.document?.type
|
||||
|
||||
if let last = result.last, case .spacer = last {
|
||||
} else {
|
||||
result.append(.spacer)
|
||||
@ -486,9 +488,9 @@ struct SecureIdDocumentFormState: FormControllerInnerState {
|
||||
break
|
||||
}
|
||||
}
|
||||
result.append(.entry(SecureIdDocumentFormEntry.frontSide(1, document, error)))
|
||||
result.append(.entry(SecureIdDocumentFormEntry.frontSide(1, type, document, error)))
|
||||
} else {
|
||||
result.append(.entry(SecureIdDocumentFormEntry.frontSide(1, nil, nil)))
|
||||
result.append(.entry(SecureIdDocumentFormEntry.frontSide(1, type, nil, nil)))
|
||||
}
|
||||
}
|
||||
if self.backSideRequired {
|
||||
@ -513,9 +515,9 @@ struct SecureIdDocumentFormState: FormControllerInnerState {
|
||||
break
|
||||
}
|
||||
}
|
||||
result.append(.entry(SecureIdDocumentFormEntry.backSide(2, document, error)))
|
||||
result.append(.entry(SecureIdDocumentFormEntry.backSide(2, type, document, error)))
|
||||
} 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.scansInfo(.identity)))
|
||||
}
|
||||
|
||||
if let document = identity.document, self.translationsRequired {
|
||||
@ -1231,9 +1235,9 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
|
||||
case deleteDocument
|
||||
case requestedDocumentsHeader
|
||||
case selfie(Int, SecureIdVerificationDocument?, String?)
|
||||
case frontSide(Int, SecureIdVerificationDocument?, String?)
|
||||
case backSide(Int, SecureIdVerificationDocument?, String?)
|
||||
case documentsInfo
|
||||
case frontSide(Int, SecureIdRequestedIdentityDocument?, SecureIdVerificationDocument?, String?)
|
||||
case backSide(Int, SecureIdRequestedIdentityDocument?, SecureIdVerificationDocument?, String?)
|
||||
case documentsInfo(SecureIdDocumentFormEntryCategory)
|
||||
case translationsHeader
|
||||
case translation(Int, SecureIdVerificationDocument, String?)
|
||||
case addTranslation(Bool)
|
||||
@ -1485,20 +1489,20 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .frontSide(index, document, error):
|
||||
if case .frontSide(index, document, error) = to {
|
||||
case let .frontSide(index, type, document, error):
|
||||
if case .frontSide(index, type, document, error) = to {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .backSide(index, document, error):
|
||||
if case .backSide(index, document, error) = to {
|
||||
case let .backSide(index, type, document, error):
|
||||
if case .backSide(index, type, document, error) = to {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case .documentsInfo:
|
||||
if case .documentsInfo = to {
|
||||
case let .documentsInfo(category):
|
||||
if case .documentsInfo(category) = to {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
@ -1571,15 +1575,15 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
|
||||
params.updateText(.identifier, text)
|
||||
})
|
||||
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)
|
||||
})
|
||||
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)
|
||||
})
|
||||
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)
|
||||
})
|
||||
case let .nativeInfoHeader(language):
|
||||
@ -1671,7 +1675,7 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
|
||||
params.updateText(.state, text)
|
||||
})
|
||||
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)
|
||||
})
|
||||
case .requestedDocumentsHeader:
|
||||
@ -1692,23 +1696,41 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
|
||||
params.addFile(.selfie)
|
||||
}
|
||||
})
|
||||
case let .frontSide(_, document, error):
|
||||
case let .frontSide(_, type, document, error):
|
||||
let label: SecureIdValueFormFileItemLabel
|
||||
if let error = error {
|
||||
label = .error(error)
|
||||
} else if document != nil {
|
||||
label = .timestamp
|
||||
} else {
|
||||
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 {
|
||||
params.openDocument(document)
|
||||
} else {
|
||||
params.addFile(.frontSide)
|
||||
params.addFile(.frontSide(type))
|
||||
}
|
||||
})
|
||||
case let .backSide(_, document, error):
|
||||
case let .backSide(_, type, document, error):
|
||||
let label: SecureIdValueFormFileItemLabel
|
||||
if let error = error {
|
||||
label = .error(error)
|
||||
@ -1721,11 +1743,18 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
|
||||
if let document = document {
|
||||
params.openDocument(document)
|
||||
} else {
|
||||
params.addFile(.backSide)
|
||||
params.addFile(.backSide(type))
|
||||
}
|
||||
})
|
||||
case .documentsInfo:
|
||||
return FormControllerTextItem(text: "")
|
||||
case let .documentsInfo(category):
|
||||
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:
|
||||
return FormControllerHeaderItem(text: strings.Passport_Identity_Translations)
|
||||
case let .translation(index, document, error):
|
||||
@ -1737,7 +1766,7 @@ enum SecureIdDocumentFormEntry: FormControllerEntry {
|
||||
params.addFile(.translation)
|
||||
})
|
||||
case .translationsInfo:
|
||||
return FormControllerTextItem(text: strings.Passport_Identity_TranslationHelp)
|
||||
return FormControllerTextItem(text: strings.Passport_Identity_TranslationsHelp)
|
||||
case let .error(_, text, _):
|
||||
return FormControllerTextItem(text: text, color: .error)
|
||||
}
|
||||
@ -1912,6 +1941,10 @@ final class SecureIdDocumentFormControllerNode: FormControllerNode<SecureIdDocum
|
||||
let now = Date()
|
||||
if case .expiry = field {
|
||||
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)
|
||||
if let year = components.year {
|
||||
components.year = year - 18
|
||||
@ -1919,10 +1952,6 @@ final class SecureIdDocumentFormControllerNode: FormControllerNode<SecureIdDocum
|
||||
components.minute = 0
|
||||
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
|
||||
@ -2087,8 +2116,13 @@ final class SecureIdDocumentFormControllerNode: FormControllerNode<SecureIdDocum
|
||||
switch type {
|
||||
case .scan:
|
||||
attachmentType = .multiple
|
||||
case .backSide, .frontSide:
|
||||
case let .frontSide(type), let .backSide(type):
|
||||
switch type {
|
||||
case .idCard?, .driversLicense?:
|
||||
attachmentType = .idCard
|
||||
default:
|
||||
attachmentType = .generic
|
||||
}
|
||||
case .selfie:
|
||||
attachmentType = .selfie
|
||||
case .translation:
|
||||
|
||||
@ -6,7 +6,7 @@ import TelegramCore
|
||||
import SwiftSignalKit
|
||||
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 titleFont = Font.medium(15.0)
|
||||
|
||||
@ -22,11 +22,13 @@ final class SecureIdPlaintextFormParams {
|
||||
fileprivate let openCountrySelection: () -> Void
|
||||
fileprivate let updateTextField: (SecureIdPlaintextFormTextField, 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.updateTextField = updateTextField
|
||||
self.usePhone = usePhone
|
||||
self.useEmailAddress = useEmailAddress
|
||||
}
|
||||
}
|
||||
|
||||
@ -278,6 +280,7 @@ struct SecureIdPlaintextFormInnerState: FormControllerInnerState {
|
||||
result.append(.entry(SecureIdPlaintextFormEntry.immediatelyAvailablePhone(phone.phone)))
|
||||
result.append(.entry(SecureIdPlaintextFormEntry.immediatelyAvailablePhoneInfo))
|
||||
result.append(.spacer)
|
||||
result.append(.entry(SecureIdPlaintextFormEntry.numberInputHeader))
|
||||
}
|
||||
|
||||
result.append(.entry(SecureIdPlaintextFormEntry.numberInput(countryCode: input.countryCode, number: input.number)))
|
||||
@ -293,12 +296,20 @@ struct SecureIdPlaintextFormInnerState: FormControllerInnerState {
|
||||
switch email {
|
||||
case let .input(input):
|
||||
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.numberInputInfo))
|
||||
result.append(.entry(SecureIdPlaintextFormEntry.emailInputInfo))
|
||||
case let .verify(verify):
|
||||
result.append(.spacer)
|
||||
result.append(.entry(SecureIdPlaintextFormEntry.numberCode(verify.code)))
|
||||
result.append(.entry(SecureIdPlaintextFormEntry.emailVerifyInfo))
|
||||
result.append(.entry(SecureIdPlaintextFormEntry.emailVerifyInfo(verify.email)))
|
||||
}
|
||||
return result
|
||||
}
|
||||
@ -383,26 +394,35 @@ extension SecureIdPlaintextFormInnerState {
|
||||
enum SecureIdPlaintextFormEntryId: Hashable {
|
||||
case immediatelyAvailablePhone
|
||||
case immediatelyAvailablePhoneInfo
|
||||
case numberInputHeader
|
||||
case numberInput
|
||||
case numberInputInfo
|
||||
case numberCode
|
||||
case numberVerifyInfo
|
||||
case emailVerifyInfo
|
||||
case immediatelyAvailableEmail
|
||||
case immediatelyAvailableEmailInfo
|
||||
case emailInputHeader
|
||||
case emailAddress
|
||||
case emailInputInfo
|
||||
case emailCode
|
||||
case emailVerifyInfo
|
||||
}
|
||||
|
||||
enum SecureIdPlaintextFormEntry: FormControllerEntry {
|
||||
case immediatelyAvailablePhone(String)
|
||||
case immediatelyAvailablePhoneInfo
|
||||
|
||||
case numberInputHeader
|
||||
case numberInput(countryCode: String, number: String)
|
||||
case numberInputInfo
|
||||
case numberCode(String)
|
||||
case numberVerifyInfo
|
||||
case immediatelyAvailableEmail(String)
|
||||
case immediatelyAvailableEmailInfo
|
||||
case emailInputHeader
|
||||
case emailAddress(String)
|
||||
case emailInputInfo
|
||||
case emailCode(String)
|
||||
case emailVerifyInfo
|
||||
case emailVerifyInfo(String)
|
||||
|
||||
var stableId: SecureIdPlaintextFormEntryId {
|
||||
switch self {
|
||||
@ -410,6 +430,8 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
|
||||
return .immediatelyAvailablePhone
|
||||
case .immediatelyAvailablePhoneInfo:
|
||||
return .immediatelyAvailablePhoneInfo
|
||||
case .numberInputHeader:
|
||||
return .numberInputHeader
|
||||
case .numberInput:
|
||||
return .numberInput
|
||||
case .numberInputInfo:
|
||||
@ -418,8 +440,16 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
|
||||
return .numberCode
|
||||
case .numberVerifyInfo:
|
||||
return .numberVerifyInfo
|
||||
case .immediatelyAvailableEmail:
|
||||
return .immediatelyAvailableEmail
|
||||
case .immediatelyAvailableEmailInfo:
|
||||
return .immediatelyAvailableEmailInfo
|
||||
case .emailInputHeader:
|
||||
return .emailInputHeader
|
||||
case .emailAddress:
|
||||
return .emailAddress
|
||||
case .emailInputInfo:
|
||||
return .emailInputInfo
|
||||
case .emailCode:
|
||||
return .emailCode
|
||||
case .emailVerifyInfo:
|
||||
@ -441,6 +471,12 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case .numberInputHeader:
|
||||
if case .numberInputHeader = to {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .numberInput(countryCode, number):
|
||||
if case .numberInput(countryCode, number) = to {
|
||||
return true
|
||||
@ -465,8 +501,20 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case .emailVerifyInfo:
|
||||
if case .emailVerifyInfo = to {
|
||||
case let .immediatelyAvailableEmail(value):
|
||||
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
|
||||
} else {
|
||||
return false
|
||||
@ -477,12 +525,24 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case .emailInputInfo:
|
||||
if case .emailInputInfo = to {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .emailCode(code):
|
||||
if case .emailCode(code) = to {
|
||||
return true
|
||||
} else {
|
||||
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:
|
||||
return FormControllerTextItem(text: strings.Passport_Phone_UseTelegramNumberHelp)
|
||||
case .numberInputHeader:
|
||||
return FormControllerHeaderItem(text: strings.Passport_Phone_EnterOtherNumber)
|
||||
case let .numberInput(countryCode, number):
|
||||
var countryName = ""
|
||||
if let codeNumber = Int(countryCode), let codeId = AuthorizationSequenceCountrySelectionController.lookupCountryIdByCode(codeNumber) {
|
||||
@ -514,16 +576,26 @@ enum SecureIdPlaintextFormEntry: FormControllerEntry {
|
||||
})
|
||||
case .numberVerifyInfo:
|
||||
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):
|
||||
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)
|
||||
})
|
||||
case .emailInputInfo:
|
||||
return FormControllerTextItem(text: strings.Passport_Email_Help)
|
||||
case let .emailCode(code):
|
||||
return FormControllerTextInputItem(title: strings.TwoStepAuth_RecoveryCode, text: code, placeholder: strings.TwoStepAuth_RecoveryCode, type: .number, textUpdated: { value in
|
||||
params.updateTextField(.code, value)
|
||||
})
|
||||
case .emailVerifyInfo:
|
||||
return FormControllerTextItem(text: strings.TwoStepAuth_EmailSent)
|
||||
case let .emailVerifyInfo(address):
|
||||
return FormControllerTextItem(text: strings.Passport_Email_CodeHelp(address).0)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -583,6 +655,8 @@ final class SecureIdPlaintextFormControllerNode: FormControllerNode<SecureIdPlai
|
||||
strongSelf.updateInnerState(transition: .immediate, with: innerState)
|
||||
}, usePhone: { [weak self] value in
|
||||
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)
|
||||
|> deliverOnMainQueue).start(next: { [weak self] result in
|
||||
if let strongSelf = self {
|
||||
guard var innerState = strongSelf.innerState else {
|
||||
guard let innerState = strongSelf.innerState else {
|
||||
return
|
||||
}
|
||||
guard case .saving = innerState.actionState else {
|
||||
@ -661,45 +735,7 @@ final class SecureIdPlaintextFormControllerNode: FormControllerNode<SecureIdPlai
|
||||
case let .email(email):
|
||||
switch email {
|
||||
case let .input(input):
|
||||
guard case .nextAvailable = innerState.actionInputState() else {
|
||||
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)
|
||||
}
|
||||
}))
|
||||
self.saveEmailAddress(input.email)
|
||||
return
|
||||
case let .verify(verify):
|
||||
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)
|
||||
|> deliverOnMainQueue).start(next: { [weak self] result in
|
||||
if let strongSelf = self {
|
||||
guard var innerState = strongSelf.innerState else {
|
||||
guard let innerState = strongSelf.innerState else {
|
||||
return
|
||||
}
|
||||
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() {
|
||||
guard var innerState = self.innerState, let previousValue = innerState.previousValue else {
|
||||
return
|
||||
|
||||
@ -93,28 +93,14 @@ private final class WebEmbedVideoContentNode: ASDisplayNode, UniversalVideoConte
|
||||
|
||||
super.init()
|
||||
|
||||
self.addSubnode(self.playerNode)
|
||||
//self.addSubnode(self.playerNode)
|
||||
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.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 {
|
||||
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))
|
||||
|> deliverOnMainQueue).start(next: { [weak self] image in
|
||||
if let strongSelf = self {
|
||||
|
||||