Skip to content
Snippets Groups Projects
CreateGroupController.swift 2.09 KiB
Newer Older
import UIKit
import Combine
import XXModels

public final class CreateGroupController: UIViewController {
  private lazy var screenView = CreateGroupView()

  private let groupMembers: [Contact]
  private let viewModel = CreateGroupViewModel()
  private var cancellables = Set<AnyCancellable>()

  public init(_ groupMembers: [Contact]) {
    self.groupMembers = groupMembers
    super.init(nibName: nil, bundle: nil)
  }

  required init?(coder: NSCoder) { nil }

  public override func loadView() {
    view = screenView
  }

  public override func viewDidLoad() {
    super.viewDidLoad()
    screenView.set(count: groupMembers.count, didTap: {})

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

    viewModel
      .statePublisher
      .map(\.shouldDismiss)
      .filter { $0 == true }
      .receive(on: DispatchQueue.main)
      .sink { [unowned self] _ in
        dismiss(animated: true)
      }.store(in: &cancellables)

    screenView
      .cancelButton
      .publisher(for: .touchUpInside)
      .receive(on: DispatchQueue.main)
      .sink { [unowned self] in
        dismiss(animated: true)
      }.store(in: &cancellables)

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

    screenView
      .otherInputField
      .textPublisher
      .sink { [unowned self] in
        viewModel.didOtherInput($0)
      }.store(in: &cancellables)

    screenView
      .inputField
      .returnPublisher
      .sink { [unowned self] in
        screenView.inputField.endEditing(true)
      }.store(in: &cancellables)

    screenView
      .otherInputField
      .returnPublisher
      .sink { [unowned self] in
        screenView.otherInputField.endEditing(true)
      }.store(in: &cancellables)

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