Skip to content
Snippets Groups Projects
Select Git revision
  • 976bea202c699bf12dbe91788efd2347912bbe26
  • 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

Extensions.swift

Blame
  • NicknameController.swift 2.59 KiB
    import UIKit
    import Shared
    import Combine
    import InputField
    import ScrollViewController
    
    public final class NicknameController: UIViewController {
        lazy private var screenView = NicknameView()
    
        private let prefilled: String
        private let completion: StringClosure
        private let viewModel = NicknameViewModel()
        private var cancellables = Set<AnyCancellable>()
        private let keyboardListener = KeyboardFrameChangeListener(notificationCenter: .default)
    
        public init(_ prefilled: String, _ completion: @escaping StringClosure) {
            self.prefilled = prefilled
            self.completion = completion
            super.init(nibName: nil, bundle: nil)
        }
    
        required init?(coder: NSCoder) { nil }
    
        public override func loadView() {
            let view = UIView()
            view.addSubview(screenView)
    
            screenView.snp.makeConstraints {
                $0.top.equalToSuperview()
                $0.left.equalToSuperview()
                $0.right.equalToSuperview()
                $0.bottom.equalToSuperview().offset(0)
            }
    
            self.view = view
        }
    
        public override func viewDidLoad() {
            super.viewDidLoad()
            setupKeyboard()
            setupBindings()
    
            screenView.inputField.update(content: prefilled)
            viewModel.didInput(prefilled)
        }
    
        private func setupKeyboard() {
            keyboardListener.keyboardFrameWillChange = { [weak self] keyboard in
                guard let self = self else { return }
    
                let inset = self.view.frame.height - self.view.convert(keyboard.frame, from: nil).minY
    
                self.screenView.snp.updateConstraints {
                    $0.bottom.equalToSuperview().offset(-inset)
                }
    
                self.view.setNeedsLayout()
    
                UIView.animate(withDuration: keyboard.animationDuration) {
                    self.view.layoutIfNeeded()
                }
            }
        }
    
        private func setupBindings() {
            viewModel.state
                .map(\.status)
                .receive(on: DispatchQueue.main)
                .sink { [weak screenView] in screenView?.update(status: $0) }
                .store(in: &cancellables)