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 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
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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]?
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||