// // SPHomeSearchHistoryView.swift // Thimra // // Created by Overseas on 2025/4/22. // import UIKit class SPHomeSearchHistoryView: UIView { override var intrinsicContentSize: CGSize { return CGSize(width: kSPScreenWidth, height: 30 + self.tagView.intrinsicContentSize.height) } var viewModel: SPSearchViewModel? { didSet { viewModel?.addObserver(self, forKeyPath: "searchHistoryArr", context: nil) self.tagView.reloadData() self.invalidateIntrinsicContentSize() } } var searchTextBlock: ((_ text: String) -> Void)? private lazy var titleLabel: UILabel = { let label = UILabel() label.font = .fontBold(ofSize: 16) label.textColor = .colorE7F5FF() label.text = "Historical search".localized return label }() private lazy var deleteButton: UIButton = { let button = UIButton(type: .custom) button.setImage(UIImage(named: "delete_icon_03"), for: .normal) button.addTarget(self, action: #selector(handleDeleteButton), for: .touchUpInside) return button }() private lazy var tagView: JXTagView = { let view = JXTagView() view.delegate = self view.dataSource = self view.tagBorderWidth = 1 view.tagBorderColor = .colorFFFFFF(alpha: 0.2) view.tagHeight = 20 view.tagCornerRadius = 10 view.tagBackgroundColor = .clear view.textFont = .fontRegular(ofSize: 12) view.textColor = .colorFFFFFF(alpha: 0.8) view.textMargin = 8 view.tagHorizontalGap = 12 view.tagVerticalGap = 12 view.leftAndRightMargin = 16 return view }() deinit { viewModel?.removeObserver(self, forKeyPath: "searchHistoryArr") } override init(frame: CGRect) { super.init(frame: frame) _setupUI() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "searchHistoryArr" { self.tagView.reloadData() } } @objc private func handleDeleteButton() { self.viewModel?.cleanSearchHistory() } } extension SPHomeSearchHistoryView { private func _setupUI() { addSubview(titleLabel) addSubview(deleteButton) addSubview(tagView) titleLabel.snp.makeConstraints { make in make.left.equalToSuperview().offset(16) make.centerY.equalTo(deleteButton) } deleteButton.snp.makeConstraints { make in make.right.equalToSuperview().offset(-16) make.top.equalToSuperview() } tagView.snp.makeConstraints { make in make.left.right.equalToSuperview() make.bottom.equalToSuperview() // make.top.equalTo(self.titleLabel.snp.bottom).offset(12) make.top.equalToSuperview().offset(30) } } } //MARK: -------------- JXTagViewDelegate & JXTagViewDataSource -------------- extension SPHomeSearchHistoryView: JXTagViewDelegate, JXTagViewDataSource { func jx_tagView(tagView: JXTagView, titleForIndex index: Int) -> String? { return viewModel?.searchHistoryArr[index] } func jx_number(in tagView: JXTagView) -> Int { return viewModel?.searchHistoryArr.count ?? 0 } func jx_tagView(tagView: JXTagView, didSelectedTagAt index: Int) { guard let text = viewModel?.searchHistoryArr[index] else { return } self.searchTextBlock?(text) } }