mirror of https://github.com/oxen-io/session-ios
Sketch out the 'onboarding code verification' view.
parent
0e62514541
commit
d193eec371
@ -0,0 +1,374 @@
|
||||
//
|
||||
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import PromiseKit
|
||||
|
||||
private class OnboardingCodeView: UIView {
|
||||
}
|
||||
|
||||
@objc
|
||||
public class OnboardingVerificationViewController: OnboardingBaseViewController {
|
||||
|
||||
// // MARK: - Dependencies
|
||||
//
|
||||
// private var tsAccountManager: TSAccountManager {
|
||||
// return TSAccountManager.sharedInstance()
|
||||
// }
|
||||
|
||||
// MARK: -
|
||||
|
||||
private let phoneNumberTextField = UITextField()
|
||||
// private var nextButton: OWSFlatButton?
|
||||
private var resendCodeLabel: OWSFlatButton?
|
||||
private var resendCodeLink: OWSFlatButton?
|
||||
|
||||
override public func loadView() {
|
||||
super.loadView()
|
||||
|
||||
// populateDefaults()
|
||||
|
||||
view.backgroundColor = Theme.backgroundColor
|
||||
view.layoutMargins = .zero
|
||||
|
||||
var e164PhoneNumber = ""
|
||||
if let phoneNumber = onboardingController.phoneNumber {
|
||||
e164PhoneNumber = phoneNumber.e164
|
||||
}
|
||||
let formattedPhoneNumber = PhoneNumber.bestEffortLocalizedPhoneNumber(withE164: e164PhoneNumber)
|
||||
let titleText = String(format: NSLocalizedString("ONBOARDING_VERIFICATION_TITLE_FORMAT",
|
||||
comment: "Format for the title of the 'onboarding verification' view. Embeds {{the user's phone number}}."),
|
||||
formattedPhoneNumber)
|
||||
let titleLabel = self.titleLabel(text: titleText)
|
||||
|
||||
let backLink = self.linkButton(title: NSLocalizedString("ONBOARDING_VERIFICATION_BACK_LINK",
|
||||
comment: "Label for the link that lets users change their phone number."),
|
||||
selector: #selector(backLinkTapped))
|
||||
|
||||
let onboardingCodeView = OnboardingCodeView()
|
||||
onboardingCodeView.addRedBorder()
|
||||
|
||||
// resendCodeLabel.text = NSLocalizedString("ONBOARDING_VERIFICATION_BACK_LINK",
|
||||
// comment: "Label for the link that lets users change their phone number."),
|
||||
// resendCodeLabel.text = "TODO"
|
||||
// resendCodeLabel.textColor = Theme.secondaryColor
|
||||
// resendCodeLabel.font = UIFont.ows_dynamicTypeBodyClamped
|
||||
|
||||
// TODO: Copy.
|
||||
let resendCodeLabel = disabledLinkButton(title: NSLocalizedString("ONBOARDING_VERIFICATION_RESEND_CODE_LINK",
|
||||
comment: "Label for the link that lets users request another verification code."),
|
||||
selector: #selector(ignoreEvent))
|
||||
self.resendCodeLabel = resendCodeLabel
|
||||
|
||||
let resendCodeLink = self.linkButton(title: NSLocalizedString("ONBOARDING_VERIFICATION_RESEND_CODE_LINK",
|
||||
comment: "Label for the link that lets users request another verification code."),
|
||||
selector: #selector(resendCodeLinkTapped))
|
||||
self.resendCodeLink = resendCodeLink
|
||||
|
||||
let resentCodeWrapper = UIView.container()
|
||||
resentCodeWrapper.addSubview(resendCodeLabel)
|
||||
resentCodeWrapper.addSubview(resendCodeLink)
|
||||
resendCodeLabel.autoPinEdgesToSuperviewEdges()
|
||||
resendCodeLink.autoPinEdgesToSuperviewEdges()
|
||||
|
||||
// TODO: Finalize copy.
|
||||
|
||||
// let nextButton = self.button(title: NSLocalizedString("BUTTON_NEXT",
|
||||
// comment: "Label for the 'next' button."),
|
||||
// selector: #selector(nextPressed))
|
||||
// self.nextButton = nextButton
|
||||
let topSpacer = UIView.vStretchingSpacer()
|
||||
let bottomSpacer = UIView.vStretchingSpacer()
|
||||
|
||||
let stackView = UIStackView(arrangedSubviews: [
|
||||
titleLabel,
|
||||
UIView.spacer(withHeight: 21),
|
||||
backLink,
|
||||
topSpacer,
|
||||
onboardingCodeView,
|
||||
// countryRow,
|
||||
// UIView.spacer(withHeight: 8),
|
||||
// phoneNumberRow,
|
||||
bottomSpacer,
|
||||
resentCodeWrapper
|
||||
])
|
||||
stackView.axis = .vertical
|
||||
stackView.alignment = .fill
|
||||
stackView.layoutMargins = UIEdgeInsets(top: 32, left: 32, bottom: 32, right: 32)
|
||||
stackView.isLayoutMarginsRelativeArrangement = true
|
||||
view.addSubview(stackView)
|
||||
stackView.autoPinWidthToSuperview()
|
||||
stackView.autoPin(toTopLayoutGuideOf: self, withInset: 0)
|
||||
autoPinView(toBottomOfViewControllerOrKeyboard: stackView, avoidNotch: true)
|
||||
|
||||
// Ensure whitespace is balanced, so inputs are vertically centered.
|
||||
topSpacer.autoMatch(.height, to: .height, of: bottomSpacer)
|
||||
}
|
||||
|
||||
// private func addBottomStroke(_ view: UIView) {
|
||||
// let strokeView = UIView()
|
||||
// strokeView.backgroundColor = Theme.middleGrayColor
|
||||
// view.addSubview(strokeView)
|
||||
// strokeView.autoSetDimension(.height, toSize: CGHairlineWidth())
|
||||
// strokeView.autoPinWidthToSuperview()
|
||||
// strokeView.autoPinEdge(toSuperviewEdge: .bottom)
|
||||
// }
|
||||
//
|
||||
// public override func viewDidAppear(_ animated: Bool) {
|
||||
// super.viewDidAppear(animated)
|
||||
//
|
||||
// phoneNumberTextField.becomeFirstResponder()
|
||||
//
|
||||
// if tsAccountManager.isReregistering() {
|
||||
// // If re-registering, pre-populate the country (country code, calling code, country name)
|
||||
// // and phone number state.
|
||||
// guard let phoneNumberE164 = tsAccountManager.reregisterationPhoneNumber() else {
|
||||
// owsFailDebug("Could not resume re-registration; missing phone number.")
|
||||
// return
|
||||
// }
|
||||
// tryToReregister(phoneNumberE164: phoneNumberE164)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// private func tryToReregister(phoneNumberE164: String) {
|
||||
// guard phoneNumberE164.count > 0 else {
|
||||
// owsFailDebug("Could not resume re-registration; invalid phoneNumberE164.")
|
||||
// return
|
||||
// }
|
||||
// guard let parsedPhoneNumber = PhoneNumber(fromE164: phoneNumberE164) else {
|
||||
// owsFailDebug("Could not resume re-registration; couldn't parse phoneNumberE164.")
|
||||
// return
|
||||
// }
|
||||
// guard let callingCodeNumeric = parsedPhoneNumber.getCountryCode() else {
|
||||
// owsFailDebug("Could not resume re-registration; missing callingCode.")
|
||||
// return
|
||||
// }
|
||||
// let callingCode = "\(COUNTRY_CODE_PREFIX)\(callingCodeNumeric)"
|
||||
// let countryCodes: [String] =
|
||||
// PhoneNumberUtil.sharedThreadLocal().countryCodes(fromCallingCode: callingCode)
|
||||
// guard let countryCode = countryCodes.first else {
|
||||
// owsFailDebug("Could not resume re-registration; unknown countryCode.")
|
||||
// return
|
||||
// }
|
||||
// guard let countryName = PhoneNumberUtil.countryName(fromCountryCode: countryCode) else {
|
||||
// owsFailDebug("Could not resume re-registration; unknown countryName.")
|
||||
// return
|
||||
// }
|
||||
// if !phoneNumberE164.hasPrefix(callingCode) {
|
||||
// owsFailDebug("Could not resume re-registration; non-matching calling code.")
|
||||
// return
|
||||
// }
|
||||
// let phoneNumberWithoutCallingCode = phoneNumberE164.substring(from: callingCode.count)
|
||||
//
|
||||
// guard countryCode.count > 0 else {
|
||||
// owsFailDebug("Invalid country code.")
|
||||
// return
|
||||
// }
|
||||
// guard countryName.count > 0 else {
|
||||
// owsFailDebug("Invalid country name.")
|
||||
// return
|
||||
// }
|
||||
// guard callingCode.count > 0 else {
|
||||
// owsFailDebug("Invalid calling code.")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// let countryState = OnboardingCountryState(countryName: countryName, callingCode: callingCode, countryCode: countryCode)
|
||||
// onboardingController.update(countryState: countryState)
|
||||
//
|
||||
// updateState()
|
||||
//
|
||||
// phoneNumberTextField.text = phoneNumberWithoutCallingCode
|
||||
// // Don't let user edit their phone number while re-registering.
|
||||
// phoneNumberTextField.isEnabled = false
|
||||
// }
|
||||
//
|
||||
// // MARK: -
|
||||
//
|
||||
// private var countryName: String {
|
||||
// get {
|
||||
// return onboardingController.countryState.countryName
|
||||
// }
|
||||
// }
|
||||
// private var callingCode: String {
|
||||
// get {
|
||||
// AssertIsOnMainThread()
|
||||
//
|
||||
// return onboardingController.countryState.callingCode
|
||||
// }
|
||||
// }
|
||||
// private var countryCode: String {
|
||||
// get {
|
||||
// AssertIsOnMainThread()
|
||||
//
|
||||
// return onboardingController.countryState.countryCode
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// private func populateDefaults() {
|
||||
// if let lastRegisteredPhoneNumber = OnboardingController.lastRegisteredPhoneNumber(),
|
||||
// lastRegisteredPhoneNumber.count > 0,
|
||||
// lastRegisteredPhoneNumber.hasPrefix(callingCode) {
|
||||
// phoneNumberTextField.text = lastRegisteredPhoneNumber.substring(from: callingCode.count)
|
||||
// } else if let phoneNumber = onboardingController.phoneNumber {
|
||||
// phoneNumberTextField.text = phoneNumber.userInput
|
||||
// }
|
||||
//
|
||||
// updateState()
|
||||
// }
|
||||
//
|
||||
// private func updateState() {
|
||||
// AssertIsOnMainThread()
|
||||
//
|
||||
// countryNameLabel.text = countryName
|
||||
// callingCodeLabel.text = callingCode
|
||||
//
|
||||
// self.phoneNumberTextField.placeholder = ViewControllerUtils.examplePhoneNumber(forCountryCode: countryCode, callingCode: callingCode)
|
||||
// }
|
||||
//
|
||||
// // MARK: - Events
|
||||
//
|
||||
// @objc func countryRowTapped(sender: UIGestureRecognizer) {
|
||||
// guard sender.state == .recognized else {
|
||||
// return
|
||||
// }
|
||||
// showCountryPicker()
|
||||
// }
|
||||
//
|
||||
// @objc func countryCodeTapped(sender: UIGestureRecognizer) {
|
||||
// guard sender.state == .recognized else {
|
||||
// return
|
||||
// }
|
||||
// showCountryPicker()
|
||||
// }
|
||||
//
|
||||
// @objc func nextPressed() {
|
||||
// Logger.info("")
|
||||
//
|
||||
// parseAndTryToRegister()
|
||||
// }
|
||||
//
|
||||
// // MARK: - Country Picker
|
||||
//
|
||||
// private func showCountryPicker() {
|
||||
// guard !tsAccountManager.isReregistering() else {
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// let countryCodeController = CountryCodeViewController()
|
||||
// countryCodeController.countryCodeDelegate = self
|
||||
// countryCodeController.interfaceOrientationMask = .portrait
|
||||
// let navigationController = OWSNavigationController(rootViewController: countryCodeController)
|
||||
// self.present(navigationController, animated: true, completion: nil)
|
||||
// }
|
||||
//
|
||||
// // MARK: - Register
|
||||
//
|
||||
// private func parseAndTryToRegister() {
|
||||
// guard let phoneNumberText = phoneNumberTextField.text?.ows_stripped(),
|
||||
// phoneNumberText.count > 0 else {
|
||||
// OWSAlerts.showAlert(title:
|
||||
// NSLocalizedString("REGISTRATION_VIEW_NO_VERIFICATION_ALERT_TITLE",
|
||||
// comment: "Title of alert indicating that users needs to enter a phone number to register."),
|
||||
// message:
|
||||
// NSLocalizedString("REGISTRATION_VIEW_NO_VERIFICATION_ALERT_MESSAGE",
|
||||
// comment: "Message of alert indicating that users needs to enter a phone number to register."))
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// let phoneNumber = "\(callingCode)\(phoneNumberText)"
|
||||
// guard let localNumber = PhoneNumber.tryParsePhoneNumber(fromUserSpecifiedText: phoneNumber),
|
||||
// localNumber.toE164().count > 0,
|
||||
// PhoneNumberValidator().isValidForRegistration(phoneNumber: localNumber) else {
|
||||
// OWSAlerts.showAlert(title:
|
||||
// NSLocalizedString("REGISTRATION_VIEW_INVALID_VERIFICATION_ALERT_TITLE",
|
||||
// comment: "Title of alert indicating that users needs to enter a valid phone number to register."),
|
||||
// message:
|
||||
// NSLocalizedString("REGISTRATION_VIEW_INVALID_VERIFICATION_ALERT_MESSAGE",
|
||||
// comment: "Message of alert indicating that users needs to enter a valid phone number to register."))
|
||||
// return
|
||||
// }
|
||||
// let e164PhoneNumber = localNumber.toE164()
|
||||
//
|
||||
// onboardingController.update(phoneNumber: OnboardingPhoneNumber(e164: e164PhoneNumber, userInput: phoneNumberText))
|
||||
//
|
||||
// if UIDevice.current.isIPad {
|
||||
// OWSAlerts.showConfirmationAlert(title: NSLocalizedString("REGISTRATION_IPAD_CONFIRM_TITLE",
|
||||
// comment: "alert title when registering an iPad"),
|
||||
// message: NSLocalizedString("REGISTRATION_IPAD_CONFIRM_BODY",
|
||||
// comment: "alert body when registering an iPad"),
|
||||
// proceedTitle: NSLocalizedString("REGISTRATION_IPAD_CONFIRM_BUTTON",
|
||||
// comment: "button text to proceed with registration when on an iPad"),
|
||||
// proceedAction: { (_) in
|
||||
// self.onboardingController.tryToRegister(fromViewController: self, smsVerification: false)
|
||||
// })
|
||||
// } else {
|
||||
// onboardingController.tryToRegister(fromViewController: self, smsVerification: false)
|
||||
// }
|
||||
// }
|
||||
|
||||
// MARK: - Events
|
||||
|
||||
@objc func backLinkTapped() {
|
||||
Logger.info("")
|
||||
|
||||
self.navigationController?.popViewController(animated: true)
|
||||
}
|
||||
|
||||
@objc func ignoreEvent() {
|
||||
Logger.info("")
|
||||
}
|
||||
|
||||
@objc func resendCodeLinkTapped() {
|
||||
Logger.info("")
|
||||
|
||||
// TODO:
|
||||
// self.navigationController?.popViewController(animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
//// MARK: -
|
||||
//
|
||||
//extension OnboardingVerificationViewController: UITextFieldDelegate {
|
||||
// public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
|
||||
// // TODO: Fix auto-format of phone numbers.
|
||||
// ViewControllerUtils.phoneNumber(textField, shouldChangeCharactersIn: range, replacementString: string, countryCode: countryCode)
|
||||
//
|
||||
// // Inform our caller that we took care of performing the change.
|
||||
// return false
|
||||
// }
|
||||
//
|
||||
// public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
||||
// parseAndTryToRegister()
|
||||
// return false
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//// MARK: -
|
||||
//
|
||||
//extension OnboardingVerificationViewController: CountryCodeViewControllerDelegate {
|
||||
// public func countryCodeViewController(_ vc: CountryCodeViewController, didSelectCountryCode countryCode: String, countryName: String, callingCode: String) {
|
||||
// guard countryCode.count > 0 else {
|
||||
// owsFailDebug("Invalid country code.")
|
||||
// return
|
||||
// }
|
||||
// guard countryName.count > 0 else {
|
||||
// owsFailDebug("Invalid country name.")
|
||||
// return
|
||||
// }
|
||||
// guard callingCode.count > 0 else {
|
||||
// owsFailDebug("Invalid calling code.")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// let countryState = OnboardingCountryState(countryName: countryName, callingCode: callingCode, countryCode: countryCode)
|
||||
//
|
||||
// onboardingController.update(countryState: countryState)
|
||||
//
|
||||
// updateState()
|
||||
//
|
||||
// // Trigger the formatting logic with a no-op edit.
|
||||
// _ = textField(phoneNumberTextField, shouldChangeCharactersIn: NSRange(location: 0, length: 0), replacementString: "")
|
||||
// }
|
||||
//}
|
Loading…
Reference in New Issue