QSLFriendController.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  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. if QSLBaseManager.shared.isVip() {
  84. ///点击添加好友埋点
  85. gravityInstance?.track(QSLGravityConst.vip_friend_click_add, properties: ["id": 04001])
  86. } else {
  87. ///点击添加好友埋点
  88. gravityInstance?.track(QSLGravityConst.friend_click_add, properties: ["id": 04002])
  89. }
  90. QSLJumpManager.shared.pushToAdd(type: .friend)
  91. }
  92. @objc func resortBtnAction() {
  93. gravityInstance?.track(QSLGravityConst.contact_shortcut_send)
  94. QSLNetwork().request(.contactMaydayFavor(dict: [:])) { response in
  95. self.view.toast(text: "求助信息发送成功")
  96. } fail: { code, error in
  97. self.view.toast(text: error)
  98. }
  99. }
  100. }
  101. extension QSLFriendController {
  102. // 请求好友列表
  103. @objc func requestFriendList() {
  104. self.friendList.removeAll()
  105. self.friendList.append(QSLBaseManager.shared.userModel)
  106. QSLNetwork().request(.friendList(dict: [:])) { response in
  107. self.friTableView.cr.endHeaderRefresh()
  108. let list = response.mapArray(QSLUserModel.self, modelKey: "data>list")
  109. self.friendList.append(contentsOf: list)
  110. self.friTableView.reloadData()
  111. } fail: { code, error in
  112. self.friTableView.cr.endHeaderRefresh()
  113. self.friTableView.reloadData()
  114. }
  115. }
  116. }
  117. extension QSLFriendController: QSLFriendTableViewCellDelegate {
  118. func roadBtnClickAction(model: QSLUserModel) {
  119. if !QSLBaseManager.shared.isLogin() {
  120. if let view = self.tabBarController?.view {
  121. QSLAlertView.alert(view: view, title: "温馨提示", content: "登录即可体验查看轨迹记录", secondBtnClosure: {
  122. QSLJumpManager.shared.pushToLogin(type: .road)
  123. })
  124. }
  125. return
  126. }
  127. if !QSLBaseManager.shared.isVip() {
  128. QSLJumpManager.shared.pushToVip(type: .friendRoad)
  129. return
  130. }
  131. QSLJumpManager.shared.pushToRoad(type: .friend, model: model)
  132. }
  133. func moreBtnAction(model: QSLUserModel, btn: UIButton) {
  134. var item3Text = ""
  135. if !model.blockedHim {
  136. item3Text = "不给TA看"
  137. } else {
  138. item3Text = "给TA看"
  139. }
  140. let items = [(UIImage(), "互删好友"), (UIImage(), "修改备注"), (UIImage(), item3Text), (UIImage(), "查看TA的手机号")]
  141. popView = QSLPopView(items: items) { index in
  142. print("选择了第 \(index) 项")
  143. switch index {
  144. case 0:
  145. self.deleteFri(model: model)
  146. break
  147. case 1:
  148. self.editRemark(model: model)
  149. break
  150. case 2:
  151. self.blockHime(model: model)
  152. break
  153. case 3:
  154. self.checkPhoneNum(model: model)
  155. break
  156. default:
  157. break
  158. }
  159. }
  160. popView?.contentWidth = 130.rpx
  161. popView?.isShowMaskView = true
  162. popView?.show(from: btn, selfVC: self)
  163. }
  164. // 删除好友
  165. func deleteFri(model: QSLUserModel) {
  166. gravityInstance?.track(QSLGravityConst.friend_delete)
  167. if let view = self.tabBarController?.view {
  168. QSLAlertView.alert(view: view, title: "温馨提示", content: "互删好友后,双方将停止位置的分享,以及清除相关定位记录,是否确认互删?", isOneBtn: false, secondBtnClosure: {
  169. QSLNetwork().request(.friendDelete(dict: ["friendId": model.friendId])) { response in
  170. gravityInstance?.track(QSLGravityConst.friend_delete_success)
  171. self.view.toast(text: "删除成功")
  172. NotificationCenter.default.post(name: QSLNotification.QSLRefreshFriend, object: nil)
  173. } fail: { code, error in
  174. gravityInstance?.track(QSLGravityConst.friend_delete_fail)
  175. }
  176. })
  177. }
  178. }
  179. // 修改备注
  180. func editRemark(model: QSLUserModel) {
  181. gravityInstance?.track(QSLGravityConst.friend_remark)
  182. if let view = self.tabBarController?.view {
  183. QSLFriendRemarkAlertView.alert(view: view) { remark in
  184. QSLNetwork().request(.friendRemark(dict: ["friendId": model.friendId, "remark": remark])) { response in
  185. UIApplication.keyWindow?.toast(text: "修改成功")
  186. NotificationCenter.default.post(name: QSLNotification.QSLRefreshFriend, object: nil)
  187. } fail: { code, error in
  188. }
  189. }
  190. }
  191. }
  192. // 给他看
  193. func blockHime(model: QSLUserModel) {
  194. if model.blockedHim {
  195. gravityInstance?.track(QSLGravityConst.friend_not_block_him)
  196. } else {
  197. gravityInstance?.track(QSLGravityConst.friend_block_him)
  198. }
  199. QSLNetwork().request(.friendBlocked(dict: ["friendId": model.friendId, "blocked": !model.blockedHim])) { response in
  200. NotificationCenter.default.post(name: QSLNotification.QSLRefreshFriend, object: nil)
  201. } fail: { code, error in
  202. }
  203. }
  204. // 查看手机号码
  205. func checkPhoneNum(model: QSLUserModel) {
  206. gravityInstance?.track(QSLGravityConst.friend_phoneNum)
  207. if let view = self.tabBarController?.view {
  208. QSLAlertView.alert(view: view, title: "Ta的手机号", content: model.phone, isOneBtn: true, oneBtnText: "复制号码", oneBtnClosure: {
  209. gravityInstance?.track(QSLGravityConst.friend_phoneNum_click)
  210. UIPasteboard.general.string = model.phone
  211. view.toast(text: "复制成功")
  212. })
  213. }
  214. }
  215. }
  216. // MARK: - 设置Tableview
  217. extension QSLFriendController: UITableViewDelegate, UITableViewDataSource {
  218. func numberOfSections(in tableView: UITableView) -> Int {
  219. return friendList.count
  220. }
  221. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  222. return 1
  223. }
  224. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  225. let cell = tableView.dequeueReusableCell(cellType: QSLFriendTableViewCell.self, cellForRowAt: indexPath)
  226. cell.delegate = self
  227. cell.selectionStyle = .none
  228. let model = self.friendList[indexPath.section]
  229. cell.config(model: model)
  230. return cell
  231. }
  232. func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  233. return 154.rpx
  234. }
  235. func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
  236. return 0.0001
  237. }
  238. func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
  239. return 8.rpx
  240. }
  241. }
  242. extension QSLFriendController {
  243. func initializeView() {
  244. self.view.addSubview(friendBg)
  245. friendBg.snp.makeConstraints { make in
  246. make.left.top.right.equalTo(0)
  247. }
  248. self.view.addSubview(friendTitle)
  249. friendTitle.snp.makeConstraints { make in
  250. make.size.equalTo(CGSize(width: 82.rpx, height: 26.rpx))
  251. make.left.equalTo(12.rpx)
  252. make.top.equalTo(QSLConst.qsl_kStatusBarFrameH)
  253. }
  254. self.view.addSubview(bottomView)
  255. bottomView.snp.makeConstraints { make in
  256. make.left.right.equalTo(0)
  257. make.bottom.equalTo(-QSLConst.qsl_kTabbarFrameH)
  258. make.height.equalTo(76.rpx)
  259. }
  260. bottomView.addSubview(friAddBtn)
  261. friAddBtn.snp.makeConstraints { make in
  262. make.left.top.equalTo(16.rpx)
  263. make.right.bottom.equalTo(-16.rpx)
  264. }
  265. self.view.addSubview(friTableView)
  266. friTableView.snp.makeConstraints { make in
  267. make.left.equalTo(12.rpx)
  268. make.right.equalTo(-12.rpx)
  269. make.top.equalTo(friendTitle.snp.bottom).offset(13.rpx)
  270. make.bottom.equalTo(bottomView.snp.top)
  271. }
  272. self.view.addSubview(resortBtn)
  273. resortBtn.snp.makeConstraints { make in
  274. make.size.equalTo(CGSize(width: 60.rpx, height: 60.rpx))
  275. make.right.equalTo(-12.rpx)
  276. make.bottom.equalTo(bottomView.snp.top).offset(-32.rpx)
  277. }
  278. }
  279. }