QSLAddController.swift 13 KB

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