no message

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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 732 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

View File

@ -6,8 +6,8 @@ import TelegramCore
import SwiftSignalKit
import 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

View File

@ -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")

View File

@ -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])
}
}

View File

@ -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

View File

@ -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
}

View File

@ -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:

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

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

View File

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

View File

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

View File

@ -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:

View File

@ -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)

View File

@ -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

View File

@ -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 {