Newer
Older
import UIKit
import Shared
import SnapKit
final class SearchSegmentedControl: UIView {
enum Item: Int {
case username = 0
case email
case phone
case qr
}
private let trackView = UIView()
private let stackView = UIStackView()
private let trackIndicatorView = UIView()
private(set) var leftConstraint: Constraint?
private(set) var usernameButton = SearchSegmentedButton()
private(set) var emailButton = SearchSegmentedButton()
private(set) var phoneButton = SearchSegmentedButton()
private(set) var qrCodeButton = SearchSegmentedButton()
var actionPublisher: AnyPublisher<Item, Never> {
actionSubject.eraseToAnyPublisher()
}
private var cancellables = Set<AnyCancellable>()
private let actionSubject = PassthroughSubject<Item, Never>()
init() {
super.init(frame: .zero)
trackView.backgroundColor = Asset.neutralLine.color
trackIndicatorView.backgroundColor = Asset.brandPrimary.color
usernameButton.setup(
title: Localized.Ud.Tab.username,
icon: Asset.searchTabUsername.image,
iconColor: Asset.brandPrimary.color,
titleColor: Asset.brandPrimary.color
)
qrCodeButton.setup(title: Localized.Ud.Tab.qr, icon: Asset.searchTabQr.image)
emailButton.setup(title: Localized.Ud.Tab.email, icon: Asset.searchTabEmail.image)
phoneButton.setup(title: Localized.Ud.Tab.phone, icon: Asset.searchTabPhone.image)
stackView.distribution = .fillEqually
stackView.addArrangedSubview(usernameButton)
stackView.addArrangedSubview(emailButton)
stackView.addArrangedSubview(phoneButton)
stackView.addArrangedSubview(qrCodeButton)
stackView.backgroundColor = Asset.neutralWhite.color
addSubview(stackView)
addSubview(trackView)
trackView.addSubview(trackIndicatorView)
setupBindings()
setupConstraints()
}
required init?(coder: NSCoder) { nil }
private func setupBindings() {
usernameButton
.publisher(for: .touchUpInside)
.sink { [unowned self] in actionSubject.send(.username) }
.store(in: &cancellables)
emailButton
.publisher(for: .touchUpInside)
.sink { [unowned self] in actionSubject.send(.email) }
.store(in: &cancellables)
phoneButton
.publisher(for: .touchUpInside)
.sink { [unowned self] in actionSubject.send(.phone) }
.store(in: &cancellables)
qrCodeButton
.publisher(for: .touchUpInside)
.sink { [unowned self] in actionSubject.send(.qr) }
.store(in: &cancellables)
}
private func setupConstraints() {
stackView.snp.makeConstraints {
$0.edges.equalToSuperview()
}
trackView.snp.makeConstraints {
$0.left.equalToSuperview()
$0.right.equalToSuperview()
$0.bottom.equalToSuperview()
$0.height.equalTo(2)
}
trackIndicatorView.snp.makeConstraints {
$0.top.equalToSuperview()
leftConstraint = $0.left.equalToSuperview().constraint
$0.width.equalToSuperview().dividedBy(4)
$0.bottom.equalToSuperview()
}
}
}