Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // LoginViewController.swift
- // digipass
- //
- // Created by Сергей Сивагин on 9/13/18.
- // Copyright © 2018 CardPay. All rights reserved.
- //
- import UIKit
- class LoginViewController: BaseViewController {
- // MARK: - Private properties
- private var progress: ProgressHUD?
- private var isActivated: Bool = false
- var isBackImageViewEnabled: Bool = false
- // MARK: - IBOutlet properties
- @IBOutlet weak var loginTextField: ExtendedTextField!
- @IBOutlet weak var passwordTextField: ExtendedTextField!
- @IBOutlet weak var loginView: UIView!
- @IBOutlet weak var phoneLabel: LinkedLabel!
- @IBOutlet weak var mailLabel: LinkedLabel!
- @IBOutlet weak var showFAQImageView: UIImageView!
- @IBOutlet weak var nextButton: BlueButton!
- @IBOutlet weak var scrollView: UIScrollView!
- @IBOutlet weak var contentView: UIView!
- @IBOutlet weak var backStackView: UIStackView!
- @IBOutlet weak var backImageView: UIImageView!
- @IBOutlet weak var screenTitleLabel: UILabel!
- // MARK: - Override methods
- override func viewWillAppear(_ animated: Bool) {
- super.viewWillAppear(animated)
- addNavigationBarLogotype()
- isNeedExpireTimeout = false
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- ActivationOverseerUtils.shared.delegate = self
- progress = ProgressHUD(with: view)
- progress?.simplyShow()
- progress?.suspendOperation()
- configureCommonView()
- configureLoginTextField()
- configurePasswordTextField()
- configurePhoneLabel()
- configureEmailLabel()
- configureShowFAQImageView()
- configureNextButton()
- setupRecognizer()
- if #available(iOS 11.0, *) {
- scrollView.contentInsetAdjustmentBehavior = .never
- } else {
- automaticallyAdjustsScrollViewInsets = false
- }
- scrollView.contentInset = UIEdgeInsets.zero
- }
- override func onKeyboardBegin(_ notification: Notification) {
- guard let info: NSDictionary = notification.userInfo as NSDictionary? else {
- return
- }
- let keyboardSize = info.object(forKey: UIKeyboardFrameBeginUserInfoKey) as? CGRect
- let offset = UIEdgeInsetsMake(0, 0, (keyboardSize?.height)!, 0)
- scrollView.contentInset = offset
- }
- override func onKeyboardEnd() {
- scrollView.contentInset = UIEdgeInsets.zero
- }
- // MARK: - Private methods
- private func configureCommonView() {
- if isBackImageViewEnabled {
- screenTitleLabel.isHidden = true
- backStackView.isHidden = false
- let onBackTap = UITapGestureRecognizer(target: self, action: #selector(onBackTapped(_:)))
- backImageView.isUserInteractionEnabled = true
- backImageView.addGestureRecognizer(onBackTap)
- }
- }
- private func configureLoginTextField() {
- loginTextField.label = "\(getString(with: "Login")):"
- loginTextField.textField.returnKeyType = .next
- loginTextField.delegate = self
- loginTextField.length = Constants.LoginViewController.loginMaxLength
- }
- private func configurePasswordTextField() {
- passwordTextField.label = "\(getString(with: "Password")):"
- passwordTextField.textField.returnKeyType = .done
- passwordTextField.delegate = self
- passwordTextField.isPassword = true
- passwordTextField.addEndView(getShowPasswordView())
- passwordTextField.length = Constants.LoginViewController.passwordMaxLength
- }
- private func getShowPasswordView() -> UIView {
- let onViewLongTap = UILongPressGestureRecognizer().apply {
- $0.addTarget(self, action: #selector(showPassword(_:)))
- }
- return UIImageView(frame: CGRect(x: 0, y: 0, width: 32, height: 32)).apply({
- $0.isUserInteractionEnabled = true
- $0.addGestureRecognizer(onViewLongTap)
- $0.image = #imageLiteral(resourceName: "password_field_eye")
- $0.contentMode = .center
- })
- }
- private func configurePhoneLabel() {
- phoneLabel.setLinkType(.phoneNumber)
- }
- private func configureEmailLabel() {
- mailLabel.setLinkType(.email, with: self)
- }
- private func configureShowFAQImageView() {
- let onTapGesture = UITapGestureRecognizer(target: self, action: #selector(showFAQ(_:)))
- showFAQImageView.isUserInteractionEnabled = true
- showFAQImageView.addGestureRecognizer(onTapGesture)
- }
- private func configureNextButton() {
- nextButton.setTitle(getString(with: "Next"), for: .normal)
- }
- private func setupRecognizer() {
- let onTapGesture = UITapGestureRecognizer(target: self, action: #selector(onHideKeyboardTap))
- loginView.addGestureRecognizer(onTapGesture)
- view.addGestureRecognizer(onTapGesture)
- }
- private func showSetPINCodeScreen(for check: Bool = false) {
- isActivated = check
- performSegue(withIdentifier: "SetPINCodeSegue", sender: self)
- progress?.suspendOperation()
- }
- private func showSetCompanyNameScreen() {
- let controller = storyboard?.instantiateViewController(withIdentifier: "SetCompanyNameViewController")
- let navigationController = BaseNavigationController(rootViewController: controller!)
- present(navigationController, animated: true, completion: nil)
- progress?.suspendOperation()
- }
- private func saveUser() {
- let username = loginTextField.textField.text
- guard let userId = username else {
- return
- }
- DataManager.shared.addUser(userId)
- }
- private func isPINEmpty() -> Bool {
- let defaults = UserDefaults.standard
- return defaults.string(forKey: Constants.UserDefaults.userPINKey)?.isEmpty ?? true
- }
- private func showBlockedActivationDialog() {
- showDialog(title: "Activation Blocked!", message: "Too many activation attempts. Please, try again in 3 hours.")
- }
- private func isUserActivatedOnDevice(_ userId: String) -> Bool {
- guard let result = DataManager.shared.getUsers() else {
- return false
- }
- var isFounded = false
- Array(result).forEach { user in
- if user.userId == userId {
- isFounded = true
- return
- }
- }
- return isFounded
- }
- // MARK: - OBJC methods
- @objc func onHideKeyboardTap() {
- view.endEditing(true)
- }
- @objc func showPassword(_ recognizer: UILongPressGestureRecognizer) {
- if recognizer.state == .began {
- passwordTextField.isPassword = false
- }
- if recognizer.state == .ended {
- passwordTextField.isPassword = true
- }
- }
- @objc func showFAQ(_ recognizer: UITapGestureRecognizer ) {
- onHideKeyboardTap()
- }
- @objc func onBackTapped(_ recognizer: UITapGestureRecognizer) {
- navigationController?.popViewController(animated: true)
- }
- @IBAction func onNextTap() {
- onHideKeyboardTap()
- if ActivationOverseerUtils.shared.isActivationBlocked() {
- showBlockedActivationDialog()
- return
- }
- if !isConnectedToNetwork() {
- showDialog(title: getString(with: "No Internet Connection"),
- message: getString(with: "Please, turn on Wi-Fi or Cellular Data"))
- return
- }
- guard let userId = loginTextField.textField.text else {
- return
- }
- guard let password = passwordTextField.textField.text else {
- return
- }
- if isUserActivatedOnDevice(userId) {
- loginTextField.error = getString(with: "This user is activated")
- return
- }
- progress?.launchOperation {
- OrchestrationManager.shared.login(username: userId, password: password, delegate: self)
- }
- }
- }
- // MARK: - ExtendedTextFieldDelegate
- extension LoginViewController: ExtendedTextFieldDelegate {
- func extendedTextFieldShouldReturn(_ sender: ExtendedTextField) {
- switch sender {
- case loginTextField:
- passwordTextField.textField.becomeFirstResponder()
- case passwordTextField:
- passwordTextField.textField.resignFirstResponder()
- default:
- break
- }
- }
- }
- // MARK: - ActivationDelegate
- extension LoginViewController: ActivationDelegate {
- func activationDidCompleted(_ sender: ActivationUtils) {
- saveUser()
- if isPINEmpty() {
- showSetPINCodeScreen()
- } else {
- showSetCompanyNameScreen()
- }
- }
- func activationDidAborted(_ sender: ActivationUtils) {
- progress?.suspendOperation()
- }
- func activation(_ sender: ActivationUtils, notCompletedWith error: String) {
- switch error {
- case LoginError.emptyPassword.rawValue:
- passwordTextField.error = getString(with: "Password should not be empty")
- case LoginError.invalidPassword.rawValue:
- ActivationOverseerUtils.shared.addActivationAttempt()
- passwordTextField.error = getString(with: "Invalid password")
- case LoginError.emptyLogin.rawValue:
- loginTextField.error = getString(with: "Login should not be empty")
- case LoginError.worngPasswordLength.rawValue:
- passwordTextField.error = getString(with: "Password has a wrong length")
- default:
- loginTextField.error = getString(with: "Unknown error")
- }
- progress?.suspendOperation()
- }
- }
- // MARK: - ActivationOverseerUtils
- extension LoginViewController: ActivationOverseerUtilsDelegate {
- func onActivationBlock(_ sender: ActivationOverseerUtils) {
- showBlockedActivationDialog()
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement