// // PermissionApplyViews.swift // suixinkan // import SnapKit import UIKit /// 权限申请页橙色横幅(新景区申请入口暂 toast)。 final class PermissionApplyBannerView: UIView { var onApplyNewScenic: (() -> Void)? private let titleLabel = UILabel() private let applyButton = UIButton(type: .system) override init(frame: CGRect) { super.init(frame: frame) backgroundColor = AppColor.warningBackground titleLabel.text = "希望开通全新景区?" titleLabel.font = .systemFont(ofSize: 14, weight: .medium) titleLabel.textColor = AppColor.warning applyButton.setTitle("新景区申请 ›", for: .normal) applyButton.titleLabel?.font = .systemFont(ofSize: 14, weight: .medium) applyButton.setTitleColor(AppColor.warning, for: .normal) applyButton.addTarget(self, action: #selector(applyTapped), for: .touchUpInside) addSubview(titleLabel) addSubview(applyButton) titleLabel.snp.makeConstraints { make in make.leading.equalToSuperview().offset(16) make.centerY.equalToSuperview() } applyButton.snp.makeConstraints { make in make.trailing.equalToSuperview().offset(-16) make.centerY.equalToSuperview() } snp.makeConstraints { make in make.height.equalTo(44) } } @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @objc private func applyTapped() { onApplyNewScenic?() } } /// 表单字段选择行。 final class PermissionFormSelectorRow: UIView { var onTap: (() -> Void)? private let titleLabel = UILabel() private let subtitleLabel = UILabel() private let valueLabel = UILabel() private let chevron = UIImageView(image: UIImage(systemName: "chevron.down")) init(title: String, subtitle: String, placeholder: String) { super.init(frame: .zero) titleLabel.text = title titleLabel.font = .systemFont(ofSize: 16, weight: .medium) titleLabel.textColor = AppColor.textPrimary subtitleLabel.text = subtitle subtitleLabel.font = .systemFont(ofSize: 12) subtitleLabel.textColor = AppColor.textTertiary valueLabel.text = placeholder valueLabel.font = .systemFont(ofSize: 14) valueLabel.textColor = AppColor.textTertiary chevron.tintColor = AppColor.textTertiary chevron.contentMode = .scaleAspectFit let tap = UITapGestureRecognizer(target: self, action: #selector(rowTapped)) addGestureRecognizer(tap) addSubview(titleLabel) addSubview(subtitleLabel) addSubview(valueLabel) addSubview(chevron) titleLabel.snp.makeConstraints { make in make.top.leading.equalToSuperview() } subtitleLabel.snp.makeConstraints { make in make.top.equalTo(titleLabel.snp.bottom).offset(4) make.leading.equalToSuperview() } valueLabel.snp.makeConstraints { make in make.top.equalTo(subtitleLabel.snp.bottom).offset(12) make.leading.bottom.equalToSuperview() make.trailing.lessThanOrEqualTo(chevron.snp.leading).offset(-8) } chevron.snp.makeConstraints { make in make.trailing.equalToSuperview() make.centerY.equalTo(valueLabel) make.size.equalTo(14) } } @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setValue(_ text: String, isPlaceholder: Bool) { valueLabel.text = text valueLabel.textColor = isPlaceholder ? AppColor.textTertiary : AppColor.textPrimary } @objc private func rowTapped() { onTap?() } } /// 已选景区标签容器。 final class PermissionSelectedTagsView: UIView { private let titleLabel = UILabel() private let stackView = UIStackView() override init(frame: CGRect) { super.init(frame: frame) titleLabel.font = .systemFont(ofSize: 14, weight: .medium) titleLabel.textColor = AppColor.textPrimary stackView.axis = .vertical stackView.spacing = 8 addSubview(titleLabel) addSubview(stackView) titleLabel.snp.makeConstraints { make in make.top.leading.trailing.equalToSuperview() } stackView.snp.makeConstraints { make in make.top.equalTo(titleLabel.snp.bottom).offset(8) make.leading.trailing.bottom.equalToSuperview() } } @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } func apply(title: String, names: [String], onRemove: ((Int) -> Void)? = nil) { titleLabel.text = title stackView.arrangedSubviews.forEach { $0.removeFromSuperview() } guard !names.isEmpty else { isHidden = true return } isHidden = false let row = UIStackView() row.axis = .horizontal row.spacing = 8 row.alignment = .leading names.enumerated().forEach { index, name in let chip = PermissionTagChip(title: name) if let onRemove { chip.onRemove = { onRemove(index) } } row.addArrangedSubview(chip) } stackView.addArrangedSubview(row) } } /// 标签 Chip。 final class PermissionTagChip: UIView { var onRemove: (() -> Void)? private let label = UILabel() private let removeButton = UIButton(type: .system) init(title: String, showsRemove: Bool = true) { super.init(frame: .zero) layer.cornerRadius = 4 layer.borderWidth = 1 layer.borderColor = AppColor.primary.cgColor backgroundColor = .white label.text = title label.font = .systemFont(ofSize: 14) label.textColor = AppColor.primary removeButton.setImage(UIImage(systemName: "xmark"), for: .normal) removeButton.tintColor = AppColor.primary removeButton.addTarget(self, action: #selector(removeTapped), for: .touchUpInside) removeButton.isHidden = !showsRemove addSubview(label) addSubview(removeButton) label.snp.makeConstraints { make in make.leading.equalToSuperview().offset(12) make.top.bottom.equalToSuperview().inset(8) if showsRemove { make.trailing.equalTo(removeButton.snp.leading).offset(-4) } else { make.trailing.equalToSuperview().offset(-12) } } removeButton.snp.makeConstraints { make in make.trailing.equalToSuperview().offset(-8) make.centerY.equalToSuperview() make.size.equalTo(20) } } @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @objc private func removeTapped() { onRemove?() } } /// 底部主按钮。 final class PermissionSubmitButton: UIButton { override init(frame: CGRect) { super.init(frame: frame) setTitle("提交申请", for: .normal) setTitleColor(.white, for: .normal) titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) backgroundColor = AppColor.primary layer.cornerRadius = 8 snp.makeConstraints { make in make.height.equalTo(48) } } @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setSubmitting(_ submitting: Bool) { isEnabled = !submitting alpha = submitting ? 0.6 : 1 setTitle(submitting ? "提交中..." : "提交申请", for: .normal) } }