QSLFriendController.swift 12 KB

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