QSLFriendController.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. //
  2. // QSLFriendController.swift
  3. // QuickSearchLocation
  4. //
  5. // Created by mac on 2024/4/10.
  6. //
  7. import UIKit
  8. import CRRefresh
  9. import WMZDropDownMenu
  10. class QSLFriendController: QSLBaseController {
  11. var friendList: [QSLUserModel] = [QSLUserModel]()
  12. lazy var friendBg: UIImageView = {
  13. let imageView = UIImageView()
  14. imageView.image = UIImage(named: "mine_bg")
  15. return imageView
  16. }()
  17. lazy var friendTitle: UIImageView = {
  18. let imageView = UIImageView()
  19. imageView.image = UIImage(named: "friends_title")
  20. return imageView
  21. }()
  22. lazy var friTableView: UITableView = {
  23. let tableView = UITableView(frame: .zero, style: .grouped)
  24. tableView.backgroundColor = .clear
  25. tableView.separatorStyle = .none
  26. tableView.showsVerticalScrollIndicator = false
  27. tableView.delegate = self
  28. tableView.dataSource = self
  29. tableView.tableViewNeverAdjustContentInset()
  30. tableView.bounces = true
  31. tableView.isUserInteractionEnabled = true
  32. tableView.isScrollEnabled = true
  33. tableView.contentInsetAdjustmentBehavior = .never
  34. tableView.register(cellClass: QSLFriendTableViewCell.self)
  35. tableView.cr.addHeadRefresh(animator: NormalHeaderAnimator()) { [weak self] in
  36. self?.requestFriendList()
  37. }
  38. return tableView
  39. }()
  40. lazy var bottomView: UIView = {
  41. let view = UIView()
  42. view.backgroundColor = .white
  43. view.layer.cornerRadius = 12.rpx
  44. view.layer.shadowOffset = CGSize(width: 0, height: -1)
  45. view.layer.shadowColor = UIColor.hexStringColor(hexString: "#A7A7A7", alpha: 0.1).cgColor
  46. view.layer.shadowOpacity = 5
  47. view.layer.shadowRadius = 0
  48. return view
  49. }()
  50. lazy var friAddBtn: UIButton = {
  51. let btn = UIButton()
  52. btn.addRadius(radius: 22.rpx)
  53. btn.gradientBackgroundColor(color1: .hexStringColor(hexString: "#15CBA1"), color2: .hexStringColor(hexString: "#1FE0BA"), width: QSLConst.qsl_kScreenW - 32.rpx, height: 44.rpx, direction: .horizontal)
  54. btn.image(UIImage(named: "home_friends_header_add_icon"))
  55. btn.title("添加好友")
  56. btn.mediumFont(16)
  57. btn.textColor(.white)
  58. btn.setImageTitleLayout(.imgLeft, spacing: 0)
  59. btn.addTarget(self, action: #selector(addButtonAction), for: .touchUpInside)
  60. return btn
  61. }()
  62. lazy var resortBtn: UIButton = {
  63. let btn = UIButton()
  64. btn.setBackgroundImage(UIImage(named: "friends_resort_btn"), for: .normal)
  65. btn.addTarget(self, action: #selector(resortBtnAction), for: .touchUpInside)
  66. return btn
  67. }()
  68. private var popView: QSLPopView?
  69. override func viewDidLoad() {
  70. super.viewDidLoad()
  71. initializeView()
  72. friendList.append(QSLBaseManager.shared.userModel)
  73. self.friTableView.reloadData()
  74. self.friTableView.cr.beginHeaderRefresh()
  75. NotificationCenter.default.addObserver(self, selector: #selector(requestFriendList), name: QSLNotification.QSLLogin, object: nil)
  76. NotificationCenter.default.addObserver(self, selector: #selector(requestFriendList), name: QSLNotification.QSLLogout, object: nil)
  77. NotificationCenter.default.addObserver(self, selector: #selector(requestFriendList), name: QSLNotification.QSLRefreshRequest, object: nil)
  78. NotificationCenter.default.addObserver(self, selector: #selector(requestFriendList), name: QSLNotification.QSLRefreshFriend, object: nil)
  79. }
  80. }
  81. extension QSLFriendController {
  82. @objc func addButtonAction() {
  83. QSLJumpManager.shared.pushToAdd(type: .friend)
  84. }
  85. @objc func resortBtnAction() {
  86. gravityInstance?.track(QSLGravityConst.contact_shortcut_send)
  87. QSLNetwork().request(.contactMaydayFavor(dict: [:])) { response in
  88. self.view.toast(text: "求助信息发送成功")
  89. } fail: { code, error in
  90. self.view.toast(text: error)
  91. }
  92. }
  93. }
  94. extension QSLFriendController {
  95. // 请求好友列表
  96. @objc func requestFriendList() {
  97. self.friendList.removeAll()
  98. self.friendList.append(QSLBaseManager.shared.userModel)
  99. QSLNetwork().request(.friendList(dict: [:])) { response in
  100. self.friTableView.cr.endHeaderRefresh()
  101. let list = response.mapArray(QSLUserModel.self, modelKey: "data>list")
  102. self.friendList.append(contentsOf: list)
  103. self.friTableView.reloadData()
  104. } fail: { code, error in
  105. self.friTableView.cr.endHeaderRefresh()
  106. self.friTableView.reloadData()
  107. }
  108. }
  109. }
  110. extension QSLFriendController: QSLFriendTableViewCellDelegate {
  111. func roadBtnClickAction(model: QSLUserModel) {
  112. if !QSLBaseManager.shared.isLogin() {
  113. if let view = self.tabBarController?.view {
  114. QSLAlertView.alert(view: view, title: "温馨提示", content: "登录即可体验查看轨迹记录", secondBtnClosure: {
  115. QSLJumpManager.shared.pushToLogin(type: .road)
  116. })
  117. }
  118. return
  119. }
  120. if !QSLBaseManager.shared.isVip() {
  121. QSLJumpManager.shared.pushToVip(type: .friendRoad)
  122. return
  123. }
  124. QSLJumpManager.shared.pushToRoad(type: .friend, model: model)
  125. }
  126. func moreBtnAction(model: QSLUserModel, btn: UIButton) {
  127. var item3Text = ""
  128. if !model.blockedHim {
  129. item3Text = "不给TA看"
  130. } else {
  131. item3Text = "给TA看"
  132. }
  133. let items = [(UIImage(), "互删好友"), (UIImage(), "修改备注"), (UIImage(), item3Text), (UIImage(), "查看TA的手机号")]
  134. popView = QSLPopView(items: items) { index in
  135. print("选择了第 \(index) 项")
  136. switch index {
  137. case 0:
  138. self.deleteFri(model: model)
  139. break
  140. case 1:
  141. self.editRemark(model: model)
  142. break
  143. case 2:
  144. self.blockHime(model: model)
  145. break
  146. case 3:
  147. self.checkPhoneNum(model: model)
  148. break
  149. default:
  150. break
  151. }
  152. }
  153. popView?.contentWidth = 130.rpx
  154. popView?.isShowMaskView = true
  155. popView?.show(from: btn, selfVC: self)
  156. }
  157. // 删除好友
  158. func deleteFri(model: QSLUserModel) {
  159. gravityInstance?.track(QSLGravityConst.friend_delete)
  160. if let view = self.tabBarController?.view {
  161. QSLAlertView.alert(view: view, title: "温馨提示", content: "互删好友后,双方将停止位置的分享,以及清除相关定位记录,是否确认互删?", isOneBtn: false, secondBtnClosure: {
  162. QSLNetwork().request(.friendDelete(dict: ["friendId": model.friendId])) { response in
  163. gravityInstance?.track(QSLGravityConst.friend_delete_success)
  164. self.view.toast(text: "删除成功")
  165. NotificationCenter.default.post(name: QSLNotification.QSLRefreshFriend, object: nil)
  166. } fail: { code, error in
  167. gravityInstance?.track(QSLGravityConst.friend_delete_fail)
  168. }
  169. })
  170. }
  171. }
  172. // 修改备注
  173. func editRemark(model: QSLUserModel) {
  174. gravityInstance?.track(QSLGravityConst.friend_remark)
  175. if let view = self.tabBarController?.view {
  176. QSLFriendRemarkAlertView.alert(view: view) { remark in
  177. QSLNetwork().request(.friendRemark(dict: ["friendId": model.friendId, "remark": remark])) { response in
  178. UIApplication.keyWindow?.toast(text: "修改成功")
  179. NotificationCenter.default.post(name: QSLNotification.QSLRefreshFriend, object: nil)
  180. } fail: { code, error in
  181. }
  182. }
  183. }
  184. }
  185. // 给他看
  186. func blockHime(model: QSLUserModel) {
  187. if model.blockedHim {
  188. gravityInstance?.track(QSLGravityConst.friend_not_block_him)
  189. } else {
  190. gravityInstance?.track(QSLGravityConst.friend_block_him)
  191. }
  192. QSLNetwork().request(.friendBlocked(dict: ["friendId": model.friendId, "blocked": !model.blockedHim])) { response in
  193. NotificationCenter.default.post(name: QSLNotification.QSLRefreshFriend, object: nil)
  194. } fail: { code, error in
  195. }
  196. }
  197. // 查看手机号码
  198. func checkPhoneNum(model: QSLUserModel) {
  199. gravityInstance?.track(QSLGravityConst.friend_phoneNum)
  200. if let view = self.tabBarController?.view {
  201. QSLAlertView.alert(view: view, title: "Ta的手机号", content: model.phone, isOneBtn: true, oneBtnText: "复制号码", oneBtnClosure: {
  202. gravityInstance?.track(QSLGravityConst.friend_phoneNum_click)
  203. UIPasteboard.general.string = model.phone
  204. view.toast(text: "复制成功")
  205. })
  206. }
  207. }
  208. }
  209. // MARK: - 设置Tableview
  210. extension QSLFriendController: UITableViewDelegate, UITableViewDataSource {
  211. func numberOfSections(in tableView: UITableView) -> Int {
  212. return friendList.count
  213. }
  214. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  215. return 1
  216. }
  217. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  218. let cell = tableView.dequeueReusableCell(cellType: QSLFriendTableViewCell.self, cellForRowAt: indexPath)
  219. cell.delegate = self
  220. cell.selectionStyle = .none
  221. let model = self.friendList[indexPath.section]
  222. cell.config(model: model)
  223. return cell
  224. }
  225. func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  226. return 154.rpx
  227. }
  228. func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
  229. return 0.0001
  230. }
  231. func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
  232. return 8.rpx
  233. }
  234. }
  235. extension QSLFriendController {
  236. func initializeView() {
  237. self.view.addSubview(friendBg)
  238. friendBg.snp.makeConstraints { make in
  239. make.left.top.right.equalTo(0)
  240. }
  241. self.view.addSubview(friendTitle)
  242. friendTitle.snp.makeConstraints { make in
  243. make.size.equalTo(CGSize(width: 82.rpx, height: 26.rpx))
  244. make.left.equalTo(12.rpx)
  245. make.top.equalTo(QSLConst.qsl_kStatusBarFrameH)
  246. }
  247. self.view.addSubview(bottomView)
  248. bottomView.snp.makeConstraints { make in
  249. make.left.right.equalTo(0)
  250. make.bottom.equalTo(-QSLConst.qsl_kTabbarFrameH)
  251. make.height.equalTo(76.rpx)
  252. }
  253. bottomView.addSubview(friAddBtn)
  254. friAddBtn.snp.makeConstraints { make in
  255. make.left.top.equalTo(16.rpx)
  256. make.right.bottom.equalTo(-16.rpx)
  257. }
  258. self.view.addSubview(friTableView)
  259. friTableView.snp.makeConstraints { make in
  260. make.left.equalTo(12.rpx)
  261. make.right.equalTo(-12.rpx)
  262. make.top.equalTo(friendTitle.snp.bottom).offset(13.rpx)
  263. make.bottom.equalTo(bottomView.snp.top)
  264. }
  265. self.view.addSubview(resortBtn)
  266. resortBtn.snp.makeConstraints { make in
  267. make.size.equalTo(CGSize(width: 60.rpx, height: 60.rpx))
  268. make.right.equalTo(-12.rpx)
  269. make.bottom.equalTo(bottomView.snp.top).offset(-32.rpx)
  270. }
  271. }
  272. }