Skip to content
Snippets Groups Projects
Select Git revision
  • 0fffda7bcfaa7e434d872d691fb3df8728593923
  • main default protected
  • dev protected
  • hotfixes-oct-2022
  • refactor/avatar-cell
  • 1.1.5
  • 1.1.4
  • 1.1.3
  • 1.1
  • 1.0.8
  • 1.0.7
  • 1.0.6
12 results

ProfileCodeController.swift

Blame
  • ProfileCodeController.swift 3.99 KiB
    import UIKit
    import Shared
    import Combine
    import AppCore
    import AppResources
    import Dependencies
    import AppNavigation
    import ScrollViewController
    
    public final class ProfileCodeController: UIViewController {
      @Dependency(\.navigator) var navigator
      @Dependency(\.app.statusBar) var statusBar
    
      private lazy var screenView = ProfileCodeView()
      private lazy var scrollViewController = ScrollViewController()
    
      private let isEmail: Bool
      private let content: String
      private let viewModel: ProfileCodeViewModel
      private var cancellables = Set<AnyCancellable>()
    
      public init(
        _ isEmail: Bool,
        _ content: String,
        _ confirmationId: String
      ) {
        self.viewModel = .init(
          isEmail: isEmail,
          content: content,
          confirmationId: confirmationId
        )
        self.isEmail = isEmail
        self.content = content
        super.init(nibName: nil, bundle: nil)
      }
    
      required init?(coder: NSCoder) { nil }
    
      public override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationItem.backButtonTitle = ""
        navigationController?.navigationBar
          .customize(backgroundColor: Asset.neutralWhite.color)
      }
    
      public override func viewDidLoad() {
        super.viewDidLoad()
        setupScrollView()
        setupBindings()
    
        if isEmail {
          screenView.set(content, isEmail: true)
        } else {
          let country = Country.findFrom(content)
          screenView.set(
            "\(country.prefix)\(content.dropLast(2))",
            isEmail: false
          )
        }
      }
    
      private func setupScrollView() {
        scrollViewController.contentView = screenView
        scrollViewController.scrollView.backgroundColor = Asset.neutralWhite.color
        addChild(scrollViewController)
        view.addSubview(scrollViewController.view)
        scrollViewController.view.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
          scrollViewController.view.topAnchor.constraint(equalTo: view.topAnchor),
          scrollViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
          scrollViewController.view.leftAnchor.constraint(equalTo: view.leftAnchor),
          scrollViewController.view.rightAnchor.constraint(equalTo: view.rightAnchor),
        ])
        view.setNeedsLayout()
        view.layoutIfNeeded()
        scrollViewController.didMove(toParent: self)
      }
    
      private func setupBindings() {
        screenView
          .inputField
          .textPublisher
          .sink { [unowned self] in
            viewModel.didInput($0)
          }.store(in: &cancellables)
    
        viewModel
          .statePublisher
          .map(\.status)
          .removeDuplicates()
          .receive(on: DispatchQueue.main)
          .sink { [unowned self] in
            switch $0 {
            case .valid:
              screenView.saveButton.isEnabled = true
            case .invalid, .unknown:
              screenView.saveButton.isEnabled = false
            }
          }.store(in: &cancellables)
    
        screenView
          .saveButton
          .publisher(for: .touchUpInside)
          .receive(on: DispatchQueue.main)
          .sink { [unowned self] in
            viewModel.didTapNext()
          }.store(in: &cancellables)
    
        viewModel
          .statePublisher
          .map(\.resendDebouncer)
          .receive(on: DispatchQueue.main)
          .sink { [unowned self] in
            screenView.resendButton.isEnabled = $0 == 0
            if $0 == 0 {
              screenView.resendButton.setTitle(
                Localized.Profile.Code.resend(""), for: .normal
              )
            } else {
              screenView.resendButton.setTitle(
                Localized.Profile.Code.resend("(\($0))"), for: .disabled
              )
            }
          }.store(in: &cancellables)
    
        screenView
          .resendButton
          .publisher(for: .touchUpInside)
          .receive(on: DispatchQueue.main)
          .sink { [unowned self] in
            viewModel.didTapResend()
          }.store(in: &cancellables)
    
        viewModel
          .statePublisher
          .map(\.didConfirm)
          .receive(on: DispatchQueue.main)
          .sink { [unowned self] in
            guard let navigationController, $0 == true else { return }
            navigator.perform(PopToRoot(on: navigationController))
          }.store(in: &cancellables)
      }
    }