LNUserSearchHistoryView.swift 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //
  2. // LNUserSearchHistoryView.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/12.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. protocol LNUserSearchHistoryViewDelegate: NSObject {
  11. func onUserSearchHistoryView(view: LNUserSearchHistoryView, didClick history: String)
  12. }
  13. class LNUserSearchHistoryView: UIView {
  14. private var history: [String] = LNUserDefaults[.userSearchHistory, []]
  15. private let stackView = LNAutoFillStackView()
  16. weak var delegate: LNUserSearchHistoryViewDelegate?
  17. override init(frame: CGRect) {
  18. super.init(frame: frame)
  19. setupViews()
  20. reload()
  21. }
  22. func addRecord(_ keyword: String) {
  23. let fixed = keyword.trimmingCharacters(in: .whitespacesAndNewlines)
  24. guard !fixed.isEmpty else { return }
  25. if history.first == keyword {
  26. return
  27. }
  28. history.removeAll { $0 == fixed }
  29. history.insert(fixed, at: 0)
  30. if history.count >= 10 {
  31. history.removeLast()
  32. }
  33. LNUserDefaults[.userSearchHistory] = history
  34. reload()
  35. }
  36. required init?(coder: NSCoder) {
  37. fatalError("init(coder:) has not been implemented")
  38. }
  39. }
  40. extension LNUserSearchHistoryView {
  41. private func reload() {
  42. var itemViews: [UIView] = []
  43. history.forEach { item in
  44. let container = UIView()
  45. container.layer.cornerRadius = 11
  46. container.layer.borderColor = UIColor.fill_4.cgColor
  47. container.layer.borderWidth = 1
  48. container.onTap { [weak self] in
  49. guard let self else { return }
  50. delegate?.onUserSearchHistoryView(view: self, didClick: item)
  51. }
  52. container.snp.makeConstraints { make in
  53. make.height.equalTo(22)
  54. }
  55. let title = UILabel()
  56. title.text = item
  57. title.font = .body_xs
  58. title.textColor = .text_3
  59. container.addSubview(title)
  60. title.snp.makeConstraints { make in
  61. make.centerY.equalToSuperview()
  62. make.horizontalEdges.equalToSuperview().inset(8)
  63. }
  64. container.layoutIfNeeded()
  65. itemViews.append(container)
  66. }
  67. stackView.update(itemViews)
  68. }
  69. private func setupViews() {
  70. let titleLabel = UILabel()
  71. titleLabel.text = .init(key: "A00242")
  72. titleLabel.font = .heading_h4
  73. titleLabel.textColor = .text_5
  74. addSubview(titleLabel)
  75. titleLabel.snp.makeConstraints { make in
  76. make.leading.top.equalToSuperview()
  77. }
  78. stackView.itemSpacing = 9
  79. stackView.spacing = 10
  80. addSubview(stackView)
  81. stackView.snp.makeConstraints { make in
  82. make.horizontalEdges.equalToSuperview()
  83. make.top.equalTo(titleLabel.snp.bottom).offset(10)
  84. make.bottom.equalToSuperview()
  85. make.height.equalTo(0).priority(.low)
  86. }
  87. }
  88. }