Skip to content
Snippets Groups Projects
OnboardingUsernameController.swift 4.79 KiB
Newer Older
Bruno Muniz's avatar
Bruno Muniz committed
import HUD
import Theme
import UIKit
import Shared
import Combine
import DrawerFeature
Bruno Muniz's avatar
Bruno Muniz committed
import DependencyInjection
import ScrollViewController

public final class OnboardingUsernameController: UIViewController {
Bruno Muniz's avatar
Bruno Muniz committed
    @Dependency private var hud: HUD
Bruno Muniz's avatar
Bruno Muniz committed
    @Dependency private var coordinator: OnboardingCoordinating
    @Dependency private var statusBarController: StatusBarStyleControlling

    lazy private var screenView = OnboardingUsernameView()
    lazy private var scrollViewController = ScrollViewController()

    private let ndf: String
Bruno Muniz's avatar
Bruno Muniz committed
    private var cancellables = Set<AnyCancellable>()
    private let viewModel: OnboardingUsernameViewModel!
    private var drawerCancellables = Set<AnyCancellable>()
Bruno Muniz's avatar
Bruno Muniz committed

    public override func viewWillAppear(_ animated: Bool) {
Bruno Muniz's avatar
Bruno Muniz committed
        super.viewWillAppear(animated)
        statusBarController.style.send(.darkContent)
Bruno Muniz's avatar
Bruno Muniz committed
        navigationItem.backButtonTitle = ""
Bruno Muniz's avatar
Bruno Muniz committed
        navigationController?.navigationBar.customize(translucent: true)
    }

    public init(_ ndf: String) {
        self.ndf = ndf
Bruno Muniz's avatar
Bruno Muniz committed
        self.viewModel = OnboardingUsernameViewModel(ndf: ndf)
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) { nil }

    public override func viewDidLoad() {
Bruno Muniz's avatar
Bruno Muniz committed
        super.viewDidLoad()
Bruno Muniz's avatar
Bruno Muniz committed
        setupNavigationBar()
Bruno Muniz's avatar
Bruno Muniz committed
        setupScrollView()
        setupBindings()

        screenView.didTapInfo = { [weak self] in
            self?.presentInfo(
                title: Localized.Onboarding.Username.Info.title,
                subtitle: Localized.Onboarding.Username.Info.subtitle,
                urlString: "https://links.xx.network/ud"
            )
        }
    }

    private func setupScrollView() {
        scrollViewController.scrollView.backgroundColor = .white

        addChild(scrollViewController)
        view.addSubview(scrollViewController.view)
        scrollViewController.view.snp.makeConstraints { $0.edges.equalToSuperview() }
        scrollViewController.didMove(toParent: self)
        scrollViewController.contentView = screenView
    }

    private func setupBindings() {
        viewModel.hud
            .receive(on: DispatchQueue.main)
            .sink { [hud] in hud.update(with: $0) }
            .store(in: &cancellables)

        screenView.inputField.textPublisher
            .removeDuplicates()
            .compactMap { $0 }
            .sink { [unowned self] in viewModel.didInput($0) }
            .store(in: &cancellables)

        screenView.restoreView.restoreButton
            .publisher(for: .touchUpInside)
            .receive(on: DispatchQueue.main)
            .sink { [unowned self] in coordinator.toRestoreList(with: ndf, from: self) }
            .store(in: &cancellables)

Bruno Muniz's avatar
Bruno Muniz committed
        screenView.inputField.returnPublisher
            .sink { [unowned self] in
                if screenView.nextButton.isEnabled {
                    viewModel.didTapRegister()
                } else {
                    screenView.inputField.endEditing(true)
                }
            }.store(in: &cancellables)

        screenView.nextButton.publisher(for: .touchUpInside)
            .sink { [unowned self] in viewModel.didTapRegister() }
            .store(in: &cancellables)

        viewModel.greenPublisher
            .receive(on: DispatchQueue.main)
            .sink { [unowned self] in coordinator.toWelcome(from: self) }
            .store(in: &cancellables)

        viewModel.state
            .map(\.status)
            .removeDuplicates()
            .receive(on: DispatchQueue.main)
            .sink { [unowned self] in screenView.update(status: $0) }
            .store(in: &cancellables)
    }

    private func presentInfo(
        title: String,
        subtitle: String,
        urlString: String = ""
    ) {
        let actionButton = CapsuleButton()
        actionButton.set(
            style: .seeThrough,
            title: Localized.Settings.InfoDrawer.action
        let drawer = DrawerController(with: [
            DrawerText(
Bruno Muniz's avatar
Bruno Muniz committed
                font: Fonts.Mulish.bold.font(size: 26.0),
                text: title,
                color: Asset.neutralActive.color,
                alignment: .left,
                spacingAfter: 19
            ),
            DrawerLinkText(
Bruno Muniz's avatar
Bruno Muniz committed
                text: subtitle,
                urlString: urlString,
                spacingAfter: 37
            ),
            DrawerStack(views: [
                actionButton,
                FlexibleSpace()
            ])
Bruno Muniz's avatar
Bruno Muniz committed
        ])

        actionButton.publisher(for: .touchUpInside)
            .receive(on: DispatchQueue.main)
            .sink {
                drawer.dismiss(animated: true) { [weak self] in
Bruno Muniz's avatar
Bruno Muniz committed
                    guard let self = self else { return }
                    self.drawerCancellables.removeAll()
Bruno Muniz's avatar
Bruno Muniz committed
                }
            }.store(in: &drawerCancellables)
Bruno Muniz's avatar
Bruno Muniz committed

        coordinator.toDrawer(drawer, from: self)
Bruno Muniz's avatar
Bruno Muniz committed
    }
}