LNVisitorsViewController.swift 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. //
  2. // LNVisitorsViewController.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/1/25.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. import Combine
  11. import MJRefresh
  12. extension UIView {
  13. func pushToVisitors() {
  14. let vc = LNVisitorsViewController()
  15. navigationController?.pushViewController(vc, animated: true)
  16. }
  17. }
  18. class LNVisitorsViewController: LNViewController {
  19. private let emptyView = LNNoMoreDataView()
  20. private let permissionView = LNIMNotificationPermissionView()
  21. private let tableView = UITableView()
  22. private var visitors: [LNVisitorItemVO] = []
  23. private var nextTag: String?
  24. override func viewDidLoad() {
  25. super.viewDidLoad()
  26. setupViews()
  27. tableView.mj_header?.beginRefreshing()
  28. }
  29. }
  30. extension LNVisitorsViewController {
  31. private func loadList() {
  32. LNGameMateManager.shared.getVisitorsList(next: nextTag)
  33. { [weak self] list, next in
  34. guard let self else { return }
  35. guard let list else {
  36. tableView.mj_header?.endRefreshing()
  37. tableView.mj_footer?.endRefreshingWithNoMoreData()
  38. return
  39. }
  40. if nextTag?.isEmpty != false {
  41. visitors = list
  42. } else {
  43. visitors.append(contentsOf: list)
  44. }
  45. nextTag = next
  46. if visitors.isEmpty {
  47. emptyView.showNoData(icon: .icNoDataRelationEmpty)
  48. } else {
  49. emptyView.hide()
  50. }
  51. tableView.reloadData()
  52. self.tableView.mj_header?.endRefreshing()
  53. if next?.isEmpty != false {
  54. tableView.mj_footer?.endRefreshingWithNoMoreData()
  55. } else {
  56. tableView.mj_footer?.endRefreshing()
  57. }
  58. }
  59. }
  60. }
  61. extension LNVisitorsViewController: UITableViewDataSource, UITableViewDelegate {
  62. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  63. visitors.count
  64. }
  65. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  66. let cell = tableView.dequeueReusableCell(withIdentifier: LNVisitorItemCell.className, for: indexPath) as! LNVisitorItemCell
  67. let item = visitors[indexPath.row]
  68. cell.update(item)
  69. return cell
  70. }
  71. }
  72. extension LNVisitorsViewController {
  73. private func setupViews() {
  74. title = .init(key: "B00091")
  75. view.backgroundColor = .primary_1
  76. view.addSubview(emptyView)
  77. emptyView.snp.makeConstraints { make in
  78. make.centerX.equalToSuperview()
  79. make.centerY.equalToSuperview().multipliedBy(0.6)
  80. }
  81. let stackView = UIStackView()
  82. stackView.axis = .vertical
  83. view.addSubview(stackView)
  84. stackView.snp.makeConstraints { make in
  85. make.horizontalEdges.equalToSuperview()
  86. make.top.equalToSuperview().offset(10)
  87. make.bottom.equalToSuperview()
  88. }
  89. stackView.addArrangedSubview(buildPermission())
  90. stackView.addArrangedSubview(buildList())
  91. }
  92. private func buildPermission() -> UIView {
  93. let container = UIView()
  94. permissionView.publisher(for: \.isHidden).removeDuplicates().sink
  95. { [weak container] newValue in
  96. guard let container else { return }
  97. container.isHidden = newValue
  98. }.store(in: &cancellables)
  99. container.addSubview(permissionView)
  100. permissionView.snp.makeConstraints { make in
  101. make.horizontalEdges.equalToSuperview()
  102. make.bottom.equalToSuperview().offset(-10)
  103. make.top.equalToSuperview()
  104. }
  105. return container
  106. }
  107. private func buildList() -> UIView {
  108. let header = MJRefreshNormalHeader { [weak self] in
  109. guard let self else { return }
  110. nextTag = nil
  111. loadList()
  112. }
  113. header.lastUpdatedTimeLabel?.isHidden = true
  114. header.stateLabel?.isHidden = true
  115. tableView.mj_header = header
  116. let footer = MJRefreshAutoNormalFooter { [weak self] in
  117. guard let self else { return }
  118. loadList()
  119. }
  120. footer.setTitle("", for: .noMoreData)
  121. footer.setTitle(.init(key: "A00046"), for: .idle)
  122. tableView.delegate = self
  123. tableView.dataSource = self
  124. tableView.allowsSelection = false
  125. tableView.showsVerticalScrollIndicator = false
  126. tableView.separatorStyle = .none
  127. tableView.backgroundColor = .clear
  128. tableView.contentInset = .init(top: 0, left: 0, bottom: -view.commonBottomInset, right: 0)
  129. tableView.register(LNVisitorItemCell.self, forCellReuseIdentifier: LNVisitorItemCell.className)
  130. return tableView
  131. }
  132. }