LNUserRelationListView.swift 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. //
  2. // LNUserRelationListView.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/22.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. import MJRefresh
  11. protocol LNUserRelationListViewDelegate: AnyObject {
  12. func onUserRelationListViewTotalChanged(view: LNUserRelationListView, total: Int)
  13. }
  14. class LNUserRelationListView: UIView {
  15. private let emptyView = LNNoMoreDataView()
  16. private let tableView = UITableView()
  17. let curType: LNUserRelationTabType
  18. private var curList: [LNRelationUserVO] = []
  19. private var nextTag: String = ""
  20. weak var delegate: LNUserRelationListViewDelegate?
  21. init(curType: LNUserRelationTabType) {
  22. self.curType = curType
  23. super.init(frame: .zero)
  24. setupViews()
  25. tableView.mj_header?.beginRefreshing()
  26. }
  27. required init?(coder: NSCoder) {
  28. fatalError("init(coder:) has not been implemented")
  29. }
  30. }
  31. extension LNUserRelationListView {
  32. private func loadList() {
  33. let completion: ([LNRelationUserVO]?, String?, Int?) -> Void = { [weak self] list, next, total in
  34. guard let self else { return }
  35. if let list, let next, let total {
  36. if nextTag.isEmpty {
  37. curList = list
  38. } else {
  39. curList.append(contentsOf: list)
  40. }
  41. tableView.reloadData()
  42. nextTag = next
  43. delegate?.onUserRelationListViewTotalChanged(view: self, total: total)
  44. if curList.isEmpty {
  45. let text: String = switch curType {
  46. case .follow: .init(key: "A00236")
  47. case .fans: .init(key: "A00237")
  48. }
  49. emptyView.showNoData(icon: .icNoDataRelationEmpty, tips: text)
  50. } else {
  51. emptyView.hide()
  52. }
  53. } else {
  54. if curList.isEmpty {
  55. emptyView.showNetworkError()
  56. }
  57. }
  58. self.tableView.mj_header?.endRefreshing()
  59. if next?.isEmpty != false {
  60. tableView.mj_footer?.endRefreshingWithNoMoreData()
  61. } else {
  62. tableView.mj_footer?.endRefreshing()
  63. }
  64. }
  65. switch curType {
  66. case .follow:
  67. LNRelationManager.shared.getUserFollowList(next: nextTag, handler: completion)
  68. case .fans:
  69. LNRelationManager.shared.getUserFansList(next: nextTag, handler: completion)
  70. }
  71. }
  72. }
  73. extension LNUserRelationListView: UITableViewDataSource, UITableViewDelegate {
  74. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  75. curList.count
  76. }
  77. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  78. let cell = tableView.dequeueReusableCell(withIdentifier: LNUserRelationItemCell.className, for: indexPath) as! LNUserRelationItemCell
  79. let item = curList[indexPath.row]
  80. cell.update(item)
  81. return cell
  82. }
  83. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  84. tableView.deselectRow(at: indexPath, animated: false)
  85. let item = curList[indexPath.row]
  86. pushToProfile(uid: item.userNo)
  87. }
  88. }
  89. extension LNUserRelationListView {
  90. private func setupViews() {
  91. let header = MJRefreshNormalHeader { [weak self] in
  92. guard let self else { return }
  93. self.nextTag = ""
  94. self.loadList()
  95. }
  96. header.lastUpdatedTimeLabel?.isHidden = true
  97. header.stateLabel?.isHidden = true
  98. tableView.mj_header = header
  99. let footer = MJRefreshAutoNormalFooter { [weak self] in
  100. guard let self else { return }
  101. self.loadList()
  102. }
  103. footer.setTitle("", for: .noMoreData)
  104. footer.setTitle(.init(key: "A00046"), for: .idle)
  105. tableView.mj_footer = footer
  106. tableView.dataSource = self
  107. tableView.delegate = self
  108. tableView.separatorStyle = .none
  109. tableView.register(LNUserRelationItemCell.self, forCellReuseIdentifier: LNUserRelationItemCell.className)
  110. addSubview(tableView)
  111. tableView.snp.makeConstraints { make in
  112. make.edges.equalToSuperview()
  113. }
  114. tableView.addSubview(emptyView)
  115. emptyView.snp.makeConstraints { make in
  116. make.centerX.equalToSuperview()
  117. make.centerY.equalToSuperview().multipliedBy(0.6)
  118. }
  119. }
  120. }