QSLAddController.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. //
  2. // QSLAddController.swift
  3. // QuickSearchLocation
  4. //
  5. // Created by Destiny on 2024/11/27.
  6. //
  7. import UIKit
  8. import Contacts
  9. import ContactsUI
  10. enum QSLAddJumpType: Int {
  11. case homesmall
  12. case homebig
  13. case friend
  14. }
  15. class QSLAddController: QSLBaseController {
  16. var type: QSLAddJumpType?
  17. lazy var bgImageView: UIImageView = {
  18. let imageView = UIImageView()
  19. imageView.image = UIImage(named: "add_bg")
  20. return imageView
  21. }()
  22. lazy var backButton: UIButton = {
  23. let button = UIButton()
  24. button.image(UIImage(named: "public_back_btn"))
  25. button.title("添加好友")
  26. button.mediumFont(17)
  27. button.textColor(QSLColor.Color_202020)
  28. button.setImageTitleLayout(.imgLeft, spacing: 4.rpx)
  29. button.addTarget(self, action: #selector(addBackBtnAction), for: .touchUpInside)
  30. return button
  31. }()
  32. lazy var addView: UIView = {
  33. let view = UIView()
  34. view.addRadius(radius: 8.rpx)
  35. view.backgroundColor = .white
  36. return view
  37. }()
  38. lazy var addTitleIcon: UIImageView = {
  39. let imageView = UIImageView()
  40. imageView.image = UIImage(named: "add_title_icon")
  41. return imageView
  42. }()
  43. lazy var addInputView: UIView = {
  44. let view = UIView()
  45. view.backgroundColor = QSLColor.backGroundColor
  46. view.addRadius(radius: 12.rpx)
  47. view.addBorder(borderWidth: 1.rpx, borderColor: .hexStringColor(hexString: "#F2F2F2"))
  48. return view
  49. }()
  50. lazy var phoneTextField: UITextField = {
  51. let textField = UITextField()
  52. textField.maxTextNumber = 11
  53. textField.keyboardType = .numberPad
  54. textField.textColor = QSLColor.Color_202020
  55. textField.font = UIFont.textF(16)
  56. textField.placeholder = "请输入对方的手机号码"
  57. textField.setPlaceholderAttribute(font: UIFont.textF(16), color: UIColor.hexStringColor(hexString: "#A7A7A7"))
  58. return textField
  59. }()
  60. lazy var lineView: UIView = {
  61. let view = UIView()
  62. view.backgroundColor = .hexStringColor(hexString: "#F2F2F2")
  63. return view
  64. }()
  65. lazy var addressBookBtn: UIButton = {
  66. let btn = UIButton()
  67. btn.image(UIImage(named: "add_address_btn"))
  68. btn.title("通讯录导入")
  69. btn.textColor(.hexStringColor(hexString: "#11B58F"))
  70. btn.font(13)
  71. btn.addTarget(self, action: #selector(addressBookAction), for: .touchUpInside)
  72. return btn
  73. }()
  74. lazy var addBtn: UIButton = {
  75. let btn = UIButton()
  76. btn.addRadius(radius: 22.rpx)
  77. btn.gradientBackgroundColor(color1: .hexStringColor(hexString: "#15CBA1"), color2: .hexStringColor(hexString: "#1FE0BA"), width: QSLConst.qsl_kScreenW - 32.rpx, height: 44.rpx, direction: .horizontal)
  78. btn.title("添加")
  79. btn.mediumFont(16)
  80. btn.textColor(.white)
  81. btn.setImageTitleLayout(.imgLeft, spacing: 0)
  82. btn.addTarget(self, action: #selector(addBtnAction), for: .touchUpInside)
  83. return btn
  84. }()
  85. lazy var infoLabel: UILabel = {
  86. let label = UILabel()
  87. label.text("定位功能需要双方同意方可使用")
  88. label.textColor = .hexStringColor(hexString: "#A7A7A7")
  89. label.font(13)
  90. return label
  91. }()
  92. override func viewDidLoad() {
  93. super.viewDidLoad()
  94. initializeView()
  95. if let type = self.type {
  96. switch type {
  97. case .homesmall:
  98. gravityInstance?.track(QSLGravityConst.add_show, properties: ["id": 1001])
  99. case .homebig:
  100. gravityInstance?.track(QSLGravityConst.add_show, properties: ["id": 1002])
  101. case .friend:
  102. gravityInstance?.track(QSLGravityConst.add_show, properties: ["id": 1003])
  103. }
  104. }
  105. }
  106. // 点击添加按钮
  107. @objc func addBtnAction() {
  108. self.view.keyboardEndEditing()
  109. gravityInstance?.track(QSLGravityConst.add_click)
  110. if !QSLBaseManager.shared.isLogin() {
  111. QSLAlertView.alert(view: self.view, title: "温馨提示", content: "登录之后才可以发送好友申请", oneBtnClosure: {
  112. QSLJumpManager.shared.pushToLogin(type: .add)
  113. })
  114. return
  115. }
  116. if !QSLBaseManager.shared.isVip() {
  117. QSLJumpManager.shared.pushToVip(type: .add)
  118. return
  119. }
  120. if self.phoneTextField.text?.count == 0 {
  121. gravityInstance?.track(QSLGravityConst.add_result, properties: ["id": 1001])
  122. }
  123. guard let phone = self.phoneTextField.text, phone.count == 11 else {
  124. self.view.toast(text: "请输入正确的电话号码")
  125. gravityInstance?.track(QSLGravityConst.add_result, properties: ["id": 1002])
  126. return
  127. }
  128. QSLAlertView.alert(view: self.view, title: "温馨提示", content: "1.在对方同意添加您为好友之后,才能查看对方的位置。\n\n2.如果您的好友还没有下载该应用,建议您邀请他们下载安装。\n\n3.通过同意添加该用户为您的好友,即表示您同意本软件合法地收集、存储和使用您的信息,并将位置等信息与该好友分享。", isOneBtn: true, contentTextAlignment: .left, oneBtnText: "我知道了", oneBtnClosure: { [weak self] in
  129. self?.requestAddFri()
  130. })
  131. }
  132. @objc func addressBookAction() {
  133. gravityInstance?.track(QSLGravityConst.add_addressBook)
  134. let status = CNContactStore.authorizationStatus(for: .contacts)
  135. if status != .authorized {
  136. let store = CNContactStore()
  137. store.requestAccess(for: .contacts) { granted, error in
  138. if granted {
  139. DispatchQueue.main.async {
  140. let vc = CNContactPickerViewController()
  141. vc.delegate = self
  142. self.present(vc, animated: true, completion: nil)
  143. }
  144. } else {
  145. DispatchQueue.main.async {
  146. self.view.toast(text: "请先开启通讯录权限")
  147. }
  148. }
  149. }
  150. } else {
  151. let vc = CNContactPickerViewController()
  152. vc.delegate = self
  153. self.present(vc, animated: true, completion: nil)
  154. }
  155. }
  156. @objc func addBackBtnAction() {
  157. gravityInstance?.track(QSLGravityConst.add_back)
  158. self.backBtnAction()
  159. }
  160. }
  161. extension QSLAddController {
  162. func requestAddFri() {
  163. guard let phone = self.phoneTextField.text else {
  164. return
  165. }
  166. QSLNetwork().request(.requestSend(dict: ["phone": phone])) { response in
  167. self.view.toast(text: "已发送好友请求")
  168. if QSLBaseManager.shared.isVip() {
  169. ///输入手机号添加成功
  170. gravityInstance?.track(QSLGravityConst.vip_friend_add_success_phone, properties: ["id": 04003])
  171. }
  172. } fail: { code, error in
  173. self.view.toast(text: error)
  174. if QSLBaseManager.shared.isVip() {
  175. ///输入手机号添加失败
  176. gravityInstance?.track(QSLGravityConst.vip_friend_add_fail_phone, properties: ["id": 04004])
  177. }
  178. switch code {
  179. case 1102:
  180. // 该好友已在好友列表
  181. gravityInstance?.track(QSLGravityConst.add_result, properties: ["id": 1003])
  182. break
  183. case 1103:
  184. // 不能添加自己
  185. gravityInstance?.track(QSLGravityConst.add_result, properties: ["id": 1005])
  186. break
  187. case 1100:
  188. // 好友未注册
  189. gravityInstance?.track(QSLGravityConst.add_result, properties: ["id": 1005])
  190. break
  191. default:
  192. gravityInstance?.track(QSLGravityConst.add_result, properties: ["id": 1006])
  193. break
  194. }
  195. }
  196. }
  197. }
  198. extension QSLAddController: CNContactPickerDelegate {
  199. // 通讯录选择电话
  200. func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
  201. let phoneArray = contact.phoneNumbers
  202. if let firstPhone = phoneArray.first {
  203. let phoneNum = firstPhone.value
  204. let code = phoneNum.stringValue
  205. let phone = code.replacingOccurrences(of: " ", with: "")
  206. self.phoneTextField.text = phone
  207. print("Phone number is --- \(code)")
  208. }
  209. let name = CNContactFormatter.string(from: contact, style: .fullName) ?? "Unknown"
  210. print("Full name is --- \(name)")
  211. }
  212. }
  213. extension QSLAddController {
  214. func initializeView() {
  215. self.view.backgroundColor = .hexStringColor(hexString: "#FAFAFA")
  216. self.view.addSubview(bgImageView)
  217. bgImageView.snp.makeConstraints { make in
  218. make.left.top.right.equalTo(0)
  219. make.height.equalTo(195.rpx)
  220. }
  221. self.view.addSubview(backButton)
  222. backButton.snp.makeConstraints { make in
  223. make.width.equalTo(100.rpx)
  224. make.height.equalTo(25.rpx)
  225. make.left.equalTo(12.rpx)
  226. make.top.equalTo(QSLConst.qsl_kStatusBarFrameH)
  227. }
  228. self.view.addSubview(addView)
  229. addView.snp.makeConstraints { make in
  230. make.top.equalTo(bgImageView.snp.bottom)
  231. make.left.equalTo(12.rpx)
  232. make.right.equalTo(-12.rpx)
  233. make.height.equalTo(236.rpx)
  234. }
  235. addView.addSubview(addTitleIcon)
  236. addTitleIcon.snp.makeConstraints { make in
  237. make.size.equalTo(CGSize(width: 157.rpx, height: 26.rpx))
  238. make.left.top.equalTo(24.rpx)
  239. }
  240. addView.addSubview(addInputView)
  241. addInputView.snp.makeConstraints { make in
  242. make.left.equalTo(16.rpx)
  243. make.right.equalTo(-16.rpx)
  244. make.height.equalTo(52.rpx)
  245. make.top.equalTo(74.rpx)
  246. }
  247. addInputView.addSubview(addressBookBtn)
  248. addressBookBtn.snp.makeConstraints { make in
  249. make.width.equalTo(104.rpx)
  250. make.top.bottom.right.equalTo(0)
  251. }
  252. addInputView.addSubview(lineView)
  253. lineView.snp.makeConstraints { make in
  254. make.top.equalTo(16.rpx)
  255. make.bottom.equalTo(-16.rpx)
  256. make.right.equalTo(addressBookBtn.snp.left)
  257. make.width.equalTo(1.rpx)
  258. }
  259. addInputView.addSubview(phoneTextField)
  260. phoneTextField.snp.makeConstraints { make in
  261. make.left.equalTo(12.rpx)
  262. make.top.bottom.equalTo(0)
  263. make.right.equalTo(lineView.snp.left).offset(-12.rpx)
  264. }
  265. addView.addSubview(addBtn)
  266. addBtn.snp.makeConstraints { make in
  267. make.left.equalTo(28.rpx)
  268. make.right.equalTo(-28.rpx)
  269. make.height.equalTo(44.rpx)
  270. make.bottom.equalTo(-30.rpx)
  271. }
  272. self.view.addSubview(infoLabel)
  273. infoLabel.snp.makeConstraints { make in
  274. make.centerX.equalToSuperview()
  275. make.bottom.equalTo(-QSLConst.qsl_kTabbarBottom - 26.rpx)
  276. }
  277. }
  278. }