mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Various fixes
This commit is contained in:
parent
6866f03e4e
commit
319c164369
@ -551,6 +551,8 @@ public final class AuthorizationSequenceController: NavigationController, MFMail
|
||||
|
||||
controller?.inProgress = true
|
||||
|
||||
strongSelf.currentEmail = email
|
||||
|
||||
strongSelf.actionDisposable.set((sendLoginEmailCode(account: strongSelf.account, email: email)
|
||||
|> deliverOnMainQueue).start(error: { error in
|
||||
if let strongSelf = self, let controller = controller {
|
||||
@ -572,12 +574,8 @@ public final class AuthorizationSequenceController: NavigationController, MFMail
|
||||
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: strongSelf.presentationData), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}
|
||||
}, completed: { [weak self] in
|
||||
}, completed: {
|
||||
controller?.inProgress = false
|
||||
|
||||
if let strongSelf = self {
|
||||
strongSelf.currentEmail = email
|
||||
}
|
||||
}))
|
||||
}
|
||||
controller.signInWithApple = { [weak self] in
|
||||
|
@ -77,6 +77,14 @@ final class AuthorizationSequenceEmailEntryControllerNode: ASDisplayNode, UIText
|
||||
var inProgress: Bool = false {
|
||||
didSet {
|
||||
self.codeField.alpha = self.inProgress ? 0.6 : 1.0
|
||||
|
||||
if self.inProgress != oldValue {
|
||||
if self.inProgress {
|
||||
self.proceedNode.transitionToProgress()
|
||||
} else {
|
||||
self.proceedNode.transitionFromProgress()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -15,6 +15,8 @@ final class AuthorizationSequenceSignUpController: ViewController {
|
||||
return self.displayNode as! AuthorizationSequenceSignUpControllerNode
|
||||
}
|
||||
|
||||
private var validLayout: ContainerViewLayout?
|
||||
|
||||
private let presentationData: PresentationData
|
||||
private let back: () -> Void
|
||||
|
||||
@ -30,12 +32,7 @@ final class AuthorizationSequenceSignUpController: ViewController {
|
||||
|
||||
var inProgress: Bool = false {
|
||||
didSet {
|
||||
if self.inProgress {
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.presentationData.theme.rootController.navigationBar.accentTextColor))
|
||||
self.navigationItem.rightBarButtonItem = item
|
||||
} else {
|
||||
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Next, style: .done, target: self, action: #selector(self.nextPressed))
|
||||
}
|
||||
self.updateNavigationItems()
|
||||
self.controllerNode.inProgress = self.inProgress
|
||||
}
|
||||
}
|
||||
@ -81,6 +78,19 @@ final class AuthorizationSequenceSignUpController: ViewController {
|
||||
})]), in: .window(.root))
|
||||
}
|
||||
|
||||
func updateNavigationItems() {
|
||||
guard let layout = self.validLayout, layout.size.width < 360.0 else {
|
||||
return
|
||||
}
|
||||
|
||||
if self.inProgress {
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.presentationData.theme.rootController.navigationBar.accentTextColor))
|
||||
self.navigationItem.rightBarButtonItem = item
|
||||
} else {
|
||||
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Next, style: .done, target: self, action: #selector(self.nextPressed))
|
||||
}
|
||||
}
|
||||
|
||||
override public func loadDisplayNode() {
|
||||
let currentAvatarMixin = Atomic<NSObject?>(value: nil)
|
||||
|
||||
@ -138,6 +148,13 @@ final class AuthorizationSequenceSignUpController: ViewController {
|
||||
override func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
|
||||
super.containerLayoutUpdated(layout, transition: transition)
|
||||
|
||||
let hadLayout = self.validLayout != nil
|
||||
self.validLayout = layout
|
||||
|
||||
if !hadLayout {
|
||||
self.updateNavigationItems()
|
||||
}
|
||||
|
||||
self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationLayout(layout: layout).navigationFrame.maxY, transition: transition)
|
||||
}
|
||||
|
||||
|
@ -67,6 +67,14 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
|
||||
didSet {
|
||||
self.firstNameField.alpha = self.inProgress ? 0.6 : 1.0
|
||||
self.lastNameField.alpha = self.inProgress ? 0.6 : 1.0
|
||||
|
||||
if self.inProgress != oldValue {
|
||||
if self.inProgress {
|
||||
self.proceedNode.transitionToProgress()
|
||||
} else {
|
||||
self.proceedNode.transitionFromProgress()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -206,88 +214,19 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
|
||||
if let inputHeight = layout.inputHeight {
|
||||
insets.bottom += max(inputHeight, layout.standardInputHeight)
|
||||
}
|
||||
|
||||
let additionalBottomInset: CGFloat = layout.size.width > 320.0 ? 80.0 : 10.0
|
||||
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_InfoTitle, font: Font.semibold(28.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
let titleSize = self.titleNode.measure(CGSize(width: layout.size.width, height: CGFloat.greatestFiniteMagnitude))
|
||||
|
||||
// let additionalTitleSpacing: CGFloat
|
||||
// if titleSize.width > layout.size.width - 160.0 {
|
||||
// additionalTitleSpacing = 44.0
|
||||
// } else {
|
||||
// additionalTitleSpacing = 0.0
|
||||
// }
|
||||
|
||||
let fieldHeight: CGFloat = 54.0
|
||||
|
||||
let sideInset: CGFloat = 24.0
|
||||
let innerInset: CGFloat = 16.0
|
||||
|
||||
// let minimalNoticeSpacing: CGFloat = 11.0
|
||||
// let maxNoticeSpacing: CGFloat = 35.0
|
||||
let noticeSize = self.currentOptionNode.measure(CGSize(width: layout.size.width - 28.0, height: CGFloat.greatestFiniteMagnitude))
|
||||
let termsSize = self.termsNode.updateLayout(CGSize(width: layout.size.width - 28.0, height: CGFloat.greatestFiniteMagnitude))
|
||||
//
|
||||
// let noticeHeight: CGFloat = noticeSize.height + (self.termsNode.isHidden ? 0.0 : (termsSize.height + 4.0))
|
||||
//
|
||||
// let minimalTermsOfServiceSpacing: CGFloat = 6.0
|
||||
// let maxTermsOfServiceSpacing: CGFloat = 20.0
|
||||
// let minTrailingSpacing: CGFloat = 10.0
|
||||
//
|
||||
// let inputHeight = inputFieldsHeight
|
||||
// let essentialHeight = additionalTitleSpacing + titleSize.height + minimalTitleSpacing + inputHeight + minimalNoticeSpacing + noticeHeight
|
||||
// let additionalHeight = minimalTermsOfServiceSpacing + minTrailingSpacing
|
||||
//
|
||||
// let navigationHeight: CGFloat
|
||||
// if essentialHeight + additionalHeight > availableHeight || availableHeight * 0.66 - inputHeight < additionalHeight {
|
||||
// navigationHeight = min(floor(availableHeight * 0.3), availableHeight - inputFieldsHeight)
|
||||
// } else {
|
||||
// navigationHeight = floor(availableHeight * 0.3)
|
||||
// }
|
||||
//
|
||||
// let titleOffset: CGFloat
|
||||
// if navigationHeight * 0.5 < titleSize.height + minimalTitleSpacing {
|
||||
// titleOffset = max(navigationBarHeight, floor((navigationHeight - titleSize.height) / 2.0))
|
||||
// } else {
|
||||
// titleOffset = max(navigationBarHeight, max(navigationHeight * 0.5, navigationHeight - maxTitleSpacing - titleSize.height))
|
||||
// }
|
||||
// transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((layout.size.width - titleSize.width) / 2.0), y: titleOffset), size: titleSize))
|
||||
//
|
||||
// let avatarSize: CGSize = CGSize(width: 110.0, height: 110.0)
|
||||
// let addPhotoButtonFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((layout.size.width - avatarSize.width) / 2.0), y: navigationHeight + 10.0), size: avatarSize)
|
||||
// transition.updateFrame(node: self.addPhotoButton, frame: addPhotoButtonFrame)
|
||||
// self.currentPhotoNode.frame = CGRect(origin: CGPoint(), size: addPhotoButtonFrame.size)
|
||||
//
|
||||
//
|
||||
//
|
||||
// let firstFieldFrame = CGRect(origin: CGPoint(x: sideInset + innerInset, y: navigationHeight + 3.0), size: CGSize(width: layout.size.width - (sideInset + innerInset) * 2.0, height: fieldHeight))
|
||||
// transition.updateFrame(node: self.firstNameField, frame: firstFieldFrame)
|
||||
//
|
||||
// let lastFieldFrame = CGRect(origin: CGPoint(x: firstFieldFrame.minX, y: firstFieldFrame.maxY), size: CGSize(width: firstFieldFrame.size.width, height: fieldHeight))
|
||||
// transition.updateFrame(node: self.lastNameField, frame: lastFieldFrame)
|
||||
//
|
||||
// transition.updateFrame(node: self.firstSeparatorNode, frame: CGRect(origin: CGPoint(x: sideInset, y: firstFieldFrame.maxY), size: CGSize(width: layout.size.width - sideInset * 2.0, height: UIScreenPixel)))
|
||||
// transition.updateFrame(node: self.lastSeparatorNode, frame: CGRect(origin: CGPoint(x: sideInset, y: lastFieldFrame.maxY), size: CGSize(width: layout.size.width - sideInset * 2.0, height: UIScreenPixel)))
|
||||
//
|
||||
// let additionalAvailableHeight = max(1.0, availableHeight - lastFieldFrame.maxY)
|
||||
// let additionalAvailableSpacing = max(1.0, additionalAvailableHeight - noticeHeight)
|
||||
// let noticeSpacingFactor = maxNoticeSpacing / (maxNoticeSpacing + maxTermsOfServiceSpacing + minTrailingSpacing)
|
||||
// let termsOfServiceSpacingFactor = maxTermsOfServiceSpacing / (maxNoticeSpacing + maxTermsOfServiceSpacing + minTrailingSpacing)
|
||||
//
|
||||
// let noticeSpacing: CGFloat
|
||||
// let termsOfServiceSpacing: CGFloat
|
||||
// if additionalAvailableHeight <= maxNoticeSpacing + noticeHeight + maxTermsOfServiceSpacing + minTrailingSpacing {
|
||||
// termsOfServiceSpacing = min(floor(termsOfServiceSpacingFactor * additionalAvailableSpacing), maxTermsOfServiceSpacing)
|
||||
// noticeSpacing = floor((additionalAvailableHeight - termsOfServiceSpacing - noticeHeight) / 2.0)
|
||||
// } else {
|
||||
// noticeSpacing = min(floor(noticeSpacingFactor * additionalAvailableSpacing), maxNoticeSpacing)
|
||||
// termsOfServiceSpacing = min(floor(termsOfServiceSpacingFactor * additionalAvailableSpacing), maxTermsOfServiceSpacing)
|
||||
// }
|
||||
//
|
||||
// let currentOptionFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - noticeSize.width) / 2.0), y: lastFieldFrame.maxY + max(0.0, noticeSpacing)), size: noticeSize)
|
||||
// transition.updateFrame(node: self.currentOptionNode, frame: currentOptionFrame)
|
||||
// let termsFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - termsSize.width) / 2.0), y: layout.size.height - insets.bottom - termsSize.height - 4.0), size: termsSize)
|
||||
// transition.updateFrame(node: self.termsNode, frame: termsFrame)
|
||||
//
|
||||
|
||||
let avatarSize: CGSize = CGSize(width: 110.0, height: 110.0)
|
||||
var items: [AuthorizationLayoutItem] = []
|
||||
@ -305,11 +244,19 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
|
||||
|
||||
items.append(AuthorizationLayoutItem(node: self.termsNode, size: termsSize, spacingBefore: AuthorizationLayoutItemSpacing(weight: 48.0, maxValue: 100.0), spacingAfter: AuthorizationLayoutItemSpacing(weight: 0.0, maxValue: 0.0)))
|
||||
|
||||
let proceedHeight = self.proceedNode.updateLayout(width: layout.size.width - 48.0, transition: transition)
|
||||
let proceedSize = CGSize(width: layout.size.width - 48.0, height: proceedHeight)
|
||||
items.append(AuthorizationLayoutItem(node: self.proceedNode, size: proceedSize, spacingBefore: AuthorizationLayoutItemSpacing(weight: 20.0, maxValue: 20.0), spacingAfter: AuthorizationLayoutItemSpacing(weight: 0.0, maxValue: 0.0)))
|
||||
|
||||
let _ = layoutAuthorizationItems(bounds: CGRect(origin: CGPoint(x: 0.0, y: insets.top), size: CGSize(width: layout.size.width, height: layout.size.height - insets.top - insets.bottom - 20.0)), items: items, transition: transition, failIfDoesNotFit: false)
|
||||
if layout.size.width > 320.0 {
|
||||
self.proceedNode.isHidden = false
|
||||
|
||||
let inset: CGFloat = 24.0
|
||||
let proceedHeight = self.proceedNode.updateLayout(width: layout.size.width - 48.0, transition: transition)
|
||||
let proceedSize = CGSize(width: layout.size.width - 48.0, height: proceedHeight)
|
||||
transition.updateFrame(node: self.proceedNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((layout.size.width - proceedSize.width) / 2.0), y: layout.size.height - insets.bottom - proceedSize.height - inset), size: proceedSize))
|
||||
} else {
|
||||
insets.top = navigationBarHeight
|
||||
self.proceedNode.isHidden = true
|
||||
}
|
||||
|
||||
let _ = layoutAuthorizationItems(bounds: CGRect(origin: CGPoint(x: 0.0, y: insets.top), size: CGSize(width: layout.size.width, height: layout.size.height - insets.top - insets.bottom - additionalBottomInset)), items: items, transition: transition, failIfDoesNotFit: false)
|
||||
}
|
||||
|
||||
func activateInput() {
|
||||
|
@ -1078,6 +1078,28 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting
|
||||
updateHasTwoStepAuth()
|
||||
}
|
||||
|
||||
let emailChangeCompletion: (AuthorizationSequenceCodeEntryController?) -> Void = { codeController in
|
||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
|
||||
codeController?.animateSuccess()
|
||||
Queue.mainQueue().after(0.75) {
|
||||
if let navigationController = getNavigationControllerImpl?() {
|
||||
let controllers = navigationController.viewControllers.filter { controller in
|
||||
if controller is AuthorizationSequenceEmailEntryController || controller is AuthorizationSequenceCodeEntryController {
|
||||
return false
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
}
|
||||
navigationController.setViewControllers(controllers, animated: true)
|
||||
|
||||
navigationController.presentOverlay(controller: UndoOverlayController(presentationData: presentationData, content: .emoji(name: "IntroLetter", text: presentationData.strings.Login_EmailChanged), elevatedLayout: false, animateInAsReplacement: false, action: { _ in
|
||||
return false
|
||||
}))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setupEmailImpl = { emailPattern in
|
||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
var dismissEmailControllerImpl: (() -> Void)?
|
||||
@ -1093,27 +1115,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting
|
||||
let codeController = AuthorizationSequenceCodeEntryController(presentationData: presentationData, openUrl: { _ in }, back: {
|
||||
dismissCodeControllerImpl?()
|
||||
})
|
||||
|
||||
let emailChangeCompletion = { [weak codeController] in
|
||||
codeController?.animateSuccess()
|
||||
Queue.mainQueue().after(0.75) {
|
||||
if let navigationController = getNavigationControllerImpl?() {
|
||||
let controllers = navigationController.viewControllers.filter { controller in
|
||||
if controller is AuthorizationSequenceEmailEntryController || controller is AuthorizationSequenceCodeEntryController {
|
||||
return false
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
}
|
||||
navigationController.setViewControllers(controllers, animated: true)
|
||||
|
||||
navigationController.presentOverlay(controller: UndoOverlayController(presentationData: presentationData, content: .emoji(name: "IntroLetter", text: presentationData.strings.Login_EmailChanged), elevatedLayout: false, animateInAsReplacement: false, action: { _ in
|
||||
return false
|
||||
}))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
codeController.loginWithCode = { [weak codeController] code in
|
||||
actionsDisposable.add((verifyLoginEmailChange(account: context.account, code: .emailCode(code))
|
||||
|> deliverOnMainQueue).start(error: { error in
|
||||
@ -1151,61 +1153,10 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting
|
||||
presentControllerImpl?(standardTextAlertController(theme: AlertControllerTheme(presentationData: presentationData), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]))
|
||||
}
|
||||
}
|
||||
}, completed: {
|
||||
emailChangeCompletion()
|
||||
}, completed: { [weak codeController] in
|
||||
emailChangeCompletion(codeController)
|
||||
}))
|
||||
}
|
||||
codeController.signInWithApple = { [weak controller, weak codeController] in
|
||||
if #available(iOS 13.0, *) {
|
||||
let appleIdProvider = ASAuthorizationAppleIDProvider()
|
||||
let passwordProvider = ASAuthorizationPasswordProvider()
|
||||
let request = appleIdProvider.createRequest()
|
||||
|
||||
let passwordRequest = passwordProvider.createRequest()
|
||||
|
||||
let authorizationController = ASAuthorizationController(authorizationRequests: [request, passwordRequest])
|
||||
authorizationController.delegate = controller
|
||||
authorizationController.presentationContextProvider = controller
|
||||
authorizationController.performRequests()
|
||||
|
||||
controller?.authorizationCompletion = { [weak controller, weak codeController] credential in
|
||||
guard let credential = credential as? ASAuthorizationCredential else {
|
||||
return
|
||||
}
|
||||
switch credential {
|
||||
case let appleIdCredential as ASAuthorizationAppleIDCredential:
|
||||
guard let tokenData = appleIdCredential.identityToken, let token = String(data: tokenData, encoding: .utf8) else {
|
||||
codeController?.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: presentationData), title: nil, text: presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
return
|
||||
}
|
||||
actionsDisposable.add((verifyLoginEmailChange(account: context.account, code: .appleToken(token))
|
||||
|> deliverOnMainQueue).start(error: { error in
|
||||
let text: String
|
||||
switch error {
|
||||
case .limitExceeded:
|
||||
text = presentationData.strings.Login_CodeFloodError
|
||||
case .generic, .codeExpired:
|
||||
text = presentationData.strings.Login_UnknownError
|
||||
case .invalidCode:
|
||||
text = presentationData.strings.Login_InvalidCodeError
|
||||
case .timeout:
|
||||
text = presentationData.strings.Login_NetworkError
|
||||
case .invalidEmailToken:
|
||||
text = presentationData.strings.Login_InvalidEmailTokenError
|
||||
case .emailNotAllowed:
|
||||
text = presentationData.strings.Login_EmailNotAllowedError
|
||||
}
|
||||
codeController?.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: presentationData), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}, completed: { [weak controller] in
|
||||
controller?.authorizationCompletion = nil
|
||||
emailChangeCompletion()
|
||||
}))
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
codeController.updateData(number: "", email: email, codeType: .email(emailPattern: "", length: data.length, nextPhoneLoginDate: nil, appleSignInAllowed: false, setup: true), nextType: nil, timeout: nil, termsOfService: nil)
|
||||
pushControllerImpl?(codeController, true)
|
||||
dismissCodeControllerImpl = { [weak codeController] in
|
||||
@ -1233,8 +1184,56 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting
|
||||
emailController?.inProgress = false
|
||||
}))
|
||||
}
|
||||
emailController.signInWithApple = {
|
||||
|
||||
emailController.signInWithApple = { [weak controller, weak emailController] in
|
||||
if #available(iOS 13.0, *) {
|
||||
let appleIdProvider = ASAuthorizationAppleIDProvider()
|
||||
let passwordProvider = ASAuthorizationPasswordProvider()
|
||||
let request = appleIdProvider.createRequest()
|
||||
|
||||
let passwordRequest = passwordProvider.createRequest()
|
||||
|
||||
let authorizationController = ASAuthorizationController(authorizationRequests: [request, passwordRequest])
|
||||
authorizationController.delegate = controller
|
||||
authorizationController.presentationContextProvider = controller
|
||||
authorizationController.performRequests()
|
||||
|
||||
controller?.authorizationCompletion = { [weak controller, weak emailController] credential in
|
||||
guard let credential = credential as? ASAuthorizationCredential else {
|
||||
return
|
||||
}
|
||||
switch credential {
|
||||
case let appleIdCredential as ASAuthorizationAppleIDCredential:
|
||||
guard let tokenData = appleIdCredential.identityToken, let token = String(data: tokenData, encoding: .utf8) else {
|
||||
emailController?.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: presentationData), title: nil, text: presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
return
|
||||
}
|
||||
actionsDisposable.add((verifyLoginEmailChange(account: context.account, code: .appleToken(token))
|
||||
|> deliverOnMainQueue).start(error: { error in
|
||||
let text: String
|
||||
switch error {
|
||||
case .limitExceeded:
|
||||
text = presentationData.strings.Login_CodeFloodError
|
||||
case .generic, .codeExpired:
|
||||
text = presentationData.strings.Login_UnknownError
|
||||
case .invalidCode:
|
||||
text = presentationData.strings.Login_InvalidCodeError
|
||||
case .timeout:
|
||||
text = presentationData.strings.Login_NetworkError
|
||||
case .invalidEmailToken:
|
||||
text = presentationData.strings.Login_InvalidEmailTokenError
|
||||
case .emailNotAllowed:
|
||||
text = presentationData.strings.Login_EmailNotAllowedError
|
||||
}
|
||||
emailController?.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: presentationData), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}, completed: { [weak controller] in
|
||||
controller?.authorizationCompletion = nil
|
||||
emailChangeCompletion(nil)
|
||||
}))
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
emailController.updateData(appleSignInAllowed: true)
|
||||
pushControllerImpl?(emailController, true)
|
||||
|
@ -802,6 +802,10 @@ public func resolveUrlImpl(context: AccountContext, peerId: PeerId?, url: String
|
||||
for basePath in baseTelegramMePaths {
|
||||
for scheme in schemes {
|
||||
let basePrefix = scheme + basePath + "/"
|
||||
var url = url
|
||||
if (url.lowercased().hasPrefix(scheme) && url.lowercased().hasSuffix(".\(basePath)")) {
|
||||
url = basePrefix + String(url[scheme.endIndex...]).replacingOccurrences(of: ".\(basePath)", with: "")
|
||||
}
|
||||
if url.lowercased().hasPrefix(basePrefix) {
|
||||
if let internalUrl = parseInternalUrl(query: String(url[basePrefix.endIndex...])) {
|
||||
return resolveInternalUrl(context: context, url: internalUrl)
|
||||
|
Loading…
x
Reference in New Issue
Block a user