You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

805 lines
30 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. //
  2. // MobileRechargeViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by Sujal on 1/13/18.
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import ContactsUI
  10. class MobileRechargeViewController: UIViewController {
  11. @IBOutlet weak var moneyUnitLableOutlet: UILabel!
  12. @IBOutlet weak var operatorTypeTextField: UITextField!
  13. @IBOutlet weak var segmentedControl: UISegmentedControl!
  14. @IBOutlet weak var mobileOperatorsViewOutlet: UIView!
  15. @IBOutlet weak var topUpViewOutlet: UIView!
  16. @IBOutlet weak var buttonRecharge: UIButton!
  17. @IBOutlet weak var viewBinding: UIView!
  18. @IBOutlet weak var viewPhoneNumber: UIView!
  19. @IBOutlet weak var viewRechargeAmount: UIView!
  20. @IBOutlet weak var viewOperator: UIView!
  21. @IBOutlet weak var imageViewOperator: UIImageView!
  22. @IBOutlet weak var textFieldNumber: UITextField!
  23. @IBOutlet weak var textFieldAmount: UITextField!
  24. @IBOutlet weak var labelCountryCode: UILabel!
  25. @IBOutlet weak var labelTopUp: UILabel!
  26. @IBOutlet weak var labelOperator: UILabel!
  27. @IBOutlet weak var textFieldCountryName: UITextField!
  28. private let contactPicker = CNContactPickerViewController()
  29. private var pickerView: UIPickerView = UIPickerView()
  30. private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
  31. private var opertorArray = [String]()
  32. private var pickerData: [String] = [String]()
  33. private var nativeCountry: Bool = true
  34. private var operatorSelected: String = "nil"
  35. private var amountSelected: String = "nil"
  36. private var status:String??
  37. private var amountSelectedFromList: String = "nil"
  38. private var amountUnitSelectedFromList: String = "nil"
  39. private var mobilerechargeviewmodel = MobileRechargeViewModel()
  40. public var amountList = [String]()
  41. public var availableAmountBoth: [AvailableAmounts]?
  42. public static var mobileRechargeConnectionTimeOutCheck = 0
  43. private var countCheck: Box<Bool?> = Box(nil)
  44. override func viewDidLoad() {
  45. super.viewDidLoad()
  46. textFieldNumber.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
  47. setUpAnotherLoginListener(genericviewmodel: mobilerechargeviewmodel)
  48. setUpNavBar(id: 201, title: "Mobile Recharge")
  49. self.viewBinding.clipsToBounds = true
  50. self.textFieldNumber.placeholder = "98########"
  51. self.mobileOperatorViewListener()
  52. self.topUpOperatorViewListener()
  53. self.hideKeyboardWhenTappedAround()
  54. self.hideMobileDetails()
  55. self.requestMobileOperatorApi()
  56. mobilerechargeviewmodel.rechargeConnectionTimeOut.value = nil
  57. /**
  58. connection timeout
  59. */
  60. mobilerechargeviewmodel.rechargeConnectionTimeOut.bind { [unowned self] in
  61. guard $0 != nil else {
  62. return
  63. }
  64. self.stopLoading()
  65. if MobileRechargeViewController.mobileRechargeConnectionTimeOutCheck == 0{
  66. MobileRechargeViewController.mobileRechargeConnectionTimeOutCheck = MobileRechargeViewController.mobileRechargeConnectionTimeOutCheck+1
  67. self.popUpMessage(value: 38)
  68. }
  69. }
  70. /**
  71. Check interent connection
  72. */
  73. mobilerechargeviewmodel.internetConnection.bind { [unowned self] in
  74. guard $0 != nil else {
  75. return
  76. }
  77. self.enableUserInteractions()
  78. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  79. self.popUpMessage(value: 15)
  80. }
  81. /**
  82. Get list of mobile operators like NTC,NCELL and list of amounts as per operator
  83. */
  84. mobilerechargeviewmodel.mobileRechargeListBool.bind { [unowned self] in
  85. guard $0 != nil else {
  86. return
  87. }
  88. guard $0! else{
  89. self.stopLoading()
  90. self.hideMobileDetails()
  91. self.textFieldNumber.text = ""
  92. self.popUpMessageError(value: 10, message: self.mobilerechargeviewmodel.getInvalideDeviceMessageError());
  93. return
  94. }
  95. if let object = self.mobilerechargeviewmodel.getRechargeAmounts(){
  96. self.setRechargeAmountsList(availableAmounts : object)
  97. }
  98. }
  99. mobilerechargeviewmodel.isValidNumber.bind{ [unowned self] in
  100. guard $0 != nil else {
  101. return
  102. }
  103. guard $0! else {
  104. self.hideMobileDetails()
  105. return
  106. }
  107. if Reachability.isConnectedToNetwork() == true{
  108. let position = self.getIndex(operatorName: self.operatorTypeTextField.text!)
  109. self.requestApiForListofAmount(telecomId: self.self.mobilerechargeviewmodel.getMobileOperator()[position].telecomId!, mobileNumber: self.textFieldNumber.text!)
  110. }else{
  111. self.stopLoading()
  112. self.popUpMessage(value: 15)
  113. }
  114. }
  115. mobilerechargeviewmodel.mobileOperatorBool.bind{ [unowned self] in
  116. guard $0 != nil else {
  117. return
  118. }
  119. self.textFieldCountryName.text = self.mobilerechargeviewmodel.getMobileOperator().first?.country
  120. if self.mobilerechargeviewmodel.getMobileOperator().count>0{
  121. for i in self.mobilerechargeviewmodel.getMobileOperator()[0..<self.mobilerechargeviewmodel.getMobileOperator().count]{
  122. if let abbreviation = i.abbreviation{
  123. self.opertorArray.append(abbreviation)
  124. }
  125. }
  126. }
  127. if self.mobilerechargeviewmodel.getMobileOperator().count > 0{
  128. if let abbreviation = self.mobilerechargeviewmodel.getMobileOperator()[0].abbreviation{
  129. self.operatorTypeTextField.text = abbreviation
  130. if self.operatorTypeTextField.text != ""{
  131. self.setInitialValue(operatorType: self.operatorTypeTextField.text!)
  132. }
  133. }
  134. }
  135. self.stopLoading()
  136. }
  137. self.setDelegateAndDataSource()
  138. }
  139. /**
  140. After valid number
  141. Api call for amount list
  142. */
  143. @objc func textFieldDidChange(){
  144. if textFieldNumber.text?.count == 10{
  145. if Reachability.isConnectedToNetwork(){
  146. self.mobilerechargeviewmodel.updateMobileNumber(enteredNumber: textFieldNumber.text!)
  147. if (operatorTypeTextField.text?.count)!>0{
  148. let position = self.getIndex(operatorName: self.operatorTypeTextField.text!)
  149. self.requestApiForListofAmount(telecomId: self.mobilerechargeviewmodel.getMobileOperator()[position].telecomId!, mobileNumber: self.textFieldNumber.text!)
  150. } else {
  151. self.popUpMessageInfo(value: 16, title: "Alert!", message: "Operator is not selected") }
  152. } else {
  153. stopLoading()
  154. self.popUpMessage(value: 15)
  155. }
  156. }else{
  157. hideMobileDetails()
  158. }
  159. }
  160. /**
  161. To call list of amount for topup through phone contact
  162. */
  163. func apiCallFromContact(){
  164. if Reachability.isConnectedToNetwork(){
  165. if (operatorTypeTextField.text?.count)!>0{
  166. let position = self.getIndex(operatorName: self.operatorTypeTextField.text!)
  167. self.requestApiForListofAmount(telecomId: self.mobilerechargeviewmodel.getMobileOperator()[position].telecomId!, mobileNumber: self.textFieldNumber.text!)
  168. } else {
  169. self.popUpMessageInfo(value: 16, title: "Alert!", message: "Operator is not selected.") }
  170. } else {
  171. stopLoading()
  172. self.popUpMessage(value: 15)
  173. }
  174. }
  175. /**
  176. Set recharge amount list in local object
  177. */
  178. func setRechargeAmountsList(availableAmounts: AvailableRechargeAmounts){
  179. self.stopLoading()
  180. self.textFieldNumber.resignFirstResponder()
  181. self.showMobileDetails()
  182. if self.operatorTypeTextField.text != ""{
  183. let index = self.getIndex(operatorName: operatorTypeTextField.text!)
  184. if index != 100000{
  185. labelOperator.text = mobilerechargeviewmodel.getMobileOperator()[index].operatorName
  186. if let url = mobilerechargeviewmodel.getMobileOperator()[index].iconUrl{
  187. downloadImage(url: Foundation.URL(string: url)!)
  188. }
  189. }
  190. }
  191. self.availableAmountBoth?.removeAll()
  192. self.amountList.removeAll()
  193. self.availableAmountBoth = availableAmounts.availableAmounts
  194. if let amountListOfObject = availableAmounts.availableAmounts{
  195. for amount in amountListOfObject{
  196. let value = Float (amount.original)
  197. amountList.append((value?.cleanValue)!)
  198. }
  199. }
  200. self.textFieldAmount.text = self.amountList[0]
  201. self.moneyUnitLableOutlet.text = "NPR(=\(availableAmountBoth![0].converted) KRW)"
  202. }
  203. /**
  204. Request api for list of amount
  205. */
  206. func requestApiForListofAmount(telecomId: String , mobileNumber: String){
  207. self.startLoading()
  208. self.mobilerechargeviewmodel.callApiForListofRechargeAmounts(telecomId: telecomId, mobileNumber: mobileNumber)
  209. }
  210. /**
  211. Set delegate and datasource to number of textfield and pickerview
  212. */
  213. func setDelegateAndDataSource(){
  214. self.textFieldCountryName.delegate = self
  215. self.operatorTypeTextField.delegate = self
  216. self.textFieldNumber.delegate = self
  217. self.textFieldAmount.delegate = self
  218. self.pickerView.dataSource = self
  219. self.pickerView.delegate = self
  220. self.textFieldAmount.inputView = pickerView
  221. }
  222. /**
  223. Add a view listener for user easilibility
  224. */
  225. func topUpOperatorViewListener(){
  226. let tap = UITapGestureRecognizer(target: self, action: #selector(self.topUpOperatorTouchHappen(_:)))
  227. topUpViewOutlet.addGestureRecognizer(tap)
  228. topUpViewOutlet.isUserInteractionEnabled = true
  229. }
  230. /**
  231. Add a view listener for user easilibility
  232. */
  233. func mobileOperatorViewListener(){
  234. let tap = UITapGestureRecognizer(target: self, action: #selector(self.mobileOperatorTouchHappen(_:)))
  235. mobileOperatorsViewOutlet.addGestureRecognizer(tap)
  236. mobileOperatorsViewOutlet.isUserInteractionEnabled = true
  237. }
  238. /**
  239. Action when user want to fetch number from there contact list
  240. */
  241. @IBAction func accessContacts(_ sender: Any) {
  242. hideMobileDetails()
  243. contactPicker.delegate = self
  244. self.present(contactPicker, animated: true, completion: nil)
  245. }
  246. /**
  247. Action when operator value and recharge amount is selected.
  248. */
  249. @IBAction func reviewRecharge(_ sender: Any) {
  250. guard textFieldAmount.text != "" else {
  251. self.popUpMessageError(value: 11, message: "Please select the recharge amount")
  252. return
  253. }
  254. self.performSegue(withIdentifier: "reviewRecharge", sender: nil)
  255. }
  256. /**
  257. Active mobile operator pickerview
  258. */
  259. @objc func mobileOperatorTouchHappen(_ sender: UITapGestureRecognizer){
  260. clickLogic(textFieldType: "mobileOperator")
  261. }
  262. /**
  263. Active mobile operator pickerview
  264. */
  265. @IBAction func mobileOperatorPickerActionButton(_ sender: Any) {
  266. clickLogic(textFieldType: "mobileOperator")
  267. }
  268. /**
  269. Active topUp amount pickerview
  270. */
  271. @objc func topUpOperatorTouchHappen(_ sender: UITapGestureRecognizer){
  272. clickLogic(textFieldType: "topUpAmount")
  273. }
  274. /**
  275. Active topUp amount pickerview
  276. */
  277. @IBAction func selectTopUpAmount(_ sender: Any) {
  278. clickLogic(textFieldType: "topUpAmount")
  279. }
  280. /**
  281. Func to active pickerview as per parameter provided
  282. - parameter textFieldType: check which textfield is active
  283. */
  284. func clickLogic(textFieldType: String){
  285. switch textFieldType {
  286. case "mobileOperator":
  287. if let operatorText = operatorTypeTextField.text{
  288. if let index = self.opertorArray.index(of: operatorText){
  289. self.operatorTypeTextField.inputView = self.pickerView
  290. self.status = "mobileOperator"
  291. operatorTypeTextField.becomeFirstResponder()
  292. self.pickerView.selectRow(index, inComponent: 0, animated: true)
  293. }
  294. }
  295. case "topUpAmount":
  296. self.textFieldAmount.inputView = self.pickerView
  297. self.status = "topUpAmount"
  298. textFieldAmount.becomeFirstResponder()
  299. if let index = amountList.index(where: { $0 == textFieldAmount.text}) {
  300. self.pickerView.selectRow(index, inComponent: 0, animated: true)
  301. }
  302. default:
  303. break
  304. }
  305. }
  306. /**
  307. Only support to nepal for now.
  308. */
  309. @IBAction func countryDropDownButtonAction(_ sender: Any) {
  310. self.popUpMessageInfo(value: 16, title: "Info", message: "Support only to Nepal.")
  311. }
  312. /**
  313. Request api for mobile operator and topup amount
  314. */
  315. func requestMobileOperatorApi(){
  316. if mobilerechargeviewmodel.getMobileOperator().count == 0{
  317. mobilerechargeviewmodel.callMobileOperatorApi()
  318. self.startLoading()
  319. }
  320. mobilerechargeviewmodel.setCountryCode(countryCode: labelCountryCode.text!)
  321. }
  322. /**
  323. Request api for mobile operator and topup amount
  324. - parameter operatorType: operator selected by user like NTC,NCELL,UTL
  325. */
  326. func setInitialValue(operatorType: String){
  327. let position = getIndex(operatorName: operatorType)
  328. if self.getTopUpAmount(position: position).count > 0{
  329. textFieldCountryName.text = "Nepal"
  330. let floatValue = Float (self.getTopUpAmount(position: position)[0])
  331. textFieldAmount.text = floatValue?.cleanValue
  332. moneyUnitLableOutlet.text = "NPR(=\(mobilerechargeviewmodel.getMobileOperator()[position].availableAmounts![0].converted) KRW)"
  333. }
  334. self.pickerData = self.getTopUpAmount(position: position)
  335. }
  336. /**
  337. Disable user interaction while fetching data from api
  338. */
  339. func startLoading(){
  340. self.showProgressHud()
  341. // disableUserInteractions()
  342. // showActivityIndicator(activityIndicator: activityIndicator)
  343. }
  344. /**
  345. Enable user interaction while fetching data from api
  346. */
  347. func stopLoading(){
  348. self.hideProgressHud()
  349. }
  350. /**
  351. Get list of topUp amount as per operator selected
  352. - parameter position: operator array index
  353. - returns: List of topUp amount
  354. */
  355. func getTopUpAmount(position: Int) -> [String]{
  356. var topUpAmount = [String]()
  357. if let availableAmount = self.mobilerechargeviewmodel.getMobileOperator()[position].availableAmounts{
  358. print("*******available Amount*******", availableAmount)
  359. for i in availableAmount[0..<((availableAmount.count))]{
  360. let value = Float (i.original)
  361. topUpAmount.append((value?.cleanValue)!)
  362. }
  363. }
  364. return topUpAmount
  365. }
  366. /**
  367. Picker view done and cancel button
  368. */
  369. func pickUp(_ textField : UITextField){
  370. // UIPickerView
  371. self.pickerView = UIPickerView(frame:CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216))
  372. self.pickerView.delegate = self
  373. self.pickerView.dataSource = self
  374. //self.pickerView.backgroundColor = UIColor.white
  375. textField.inputView = self.pickerView
  376. // ToolBar
  377. let toolBar = UIToolbar()
  378. toolBar.barStyle = .default
  379. toolBar.isTranslucent = true
  380. toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1)
  381. toolBar.sizeToFit()
  382. // Adding Button ToolBar
  383. let customButton = UIButton()
  384. customButton.setTitle("Done", for: .normal)
  385. var cancel = UIBarButtonItem()
  386. if textField == textFieldAmount {
  387. customButton.addTarget(self, action: #selector(MobileRechargeViewController.doneClick), for: .touchUpInside)
  388. cancel = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(self.cancelClick))
  389. cancel.tintColor = UIColor.black
  390. }else if textField == operatorTypeTextField{
  391. customButton.addTarget(self, action: #selector(MobileRechargeViewController.doneClickOperator), for: .touchUpInside)
  392. cancel = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(self.cancelClickOperator))
  393. cancel.tintColor = UIColor.black
  394. }
  395. customButton.setTitleColor(UIColor(hex : 0xED1C24), for: .normal)
  396. customButton.frame = CGRect(x: 0, y: 0, width: 60, height: 30)
  397. let doneButton = UIBarButtonItem(customView: customButton)
  398. let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
  399. toolBar.setItems([cancel,spaceButton, doneButton], animated: false)
  400. toolBar.isUserInteractionEnabled = true
  401. textField.inputAccessoryView = toolBar
  402. }
  403. /**
  404. Done action in topup pickerview
  405. */
  406. @objc func doneClick() {
  407. if self.amountSelected != "nil"{
  408. if self.amountSelectedFromList != "nil" && self.amountUnitSelectedFromList != "nil"{
  409. self.textFieldAmount.text = self.amountSelectedFromList
  410. self.moneyUnitLableOutlet.text = amountUnitSelectedFromList
  411. }
  412. }else{
  413. if self.operatorTypeTextField.text != "" {
  414. if self.opertorArray.count > 0{
  415. self.textFieldAmount.text = self.amountList[0]
  416. }
  417. }
  418. }
  419. self.textFieldAmount.resignFirstResponder()
  420. }
  421. /**
  422. Done action in operator pickerview
  423. */
  424. @objc func doneClickOperator(){
  425. if self.operatorSelected != "nil"{
  426. self.operatorTypeTextField.text = self.operatorSelected
  427. hideMobileDetails()
  428. textFieldNumber.text = ""
  429. }else{
  430. if self.mobilerechargeviewmodel.getMobileOperator().count > 0{
  431. self.operatorTypeTextField.text = mobilerechargeviewmodel.getMobileOperator()[0].abbreviation
  432. }
  433. }
  434. self.operatorTypeTextField.resignFirstResponder()
  435. }
  436. /**
  437. Cancel action in topUp pickerview
  438. */
  439. @objc func cancelClick(){
  440. self.textFieldAmount.resignFirstResponder()
  441. }
  442. /**
  443. Cancel action in operator pickerview
  444. */
  445. @objc func cancelClickOperator(){
  446. self.operatorTypeTextField.resignFirstResponder()
  447. }
  448. /**
  449. Get operator posotion checking operator name
  450. - parameter operatorName : operator name like NTC,NCELL,UTL
  451. - returns : operator position
  452. */
  453. func getIndex(operatorName: String) -> Int{
  454. if let index = opertorArray.index(of: operatorName){
  455. return index
  456. }
  457. return 100000
  458. }
  459. /**
  460. Update UI showing list of operators and topUp amount
  461. */
  462. func showMobileDetails() {
  463. viewRechargeAmount.isHidden = false
  464. viewOperator.isHidden = false
  465. viewPhoneNumber.layer.cornerRadius = 0
  466. viewBinding.layer.cornerRadius = 10
  467. buttonRecharge.isHidden = false
  468. let telecom_index = mobilerechargeviewmodel.getTelecomOperator(isNativeCountry: nativeCountry, mobileNumber: textFieldNumber.text!)
  469. textFieldAmount.text = mobilerechargeviewmodel.getTopUpAmount()
  470. if nativeCountry {
  471. if telecom_index == 1 {
  472. labelOperator.text = "NTC"
  473. imageViewOperator.image = UIImage(named: "ic_ntc")
  474. } else if telecom_index == 2 {
  475. labelOperator.text = "NCell"
  476. imageViewOperator.image = UIImage(named: "ic_contacts")
  477. } else {
  478. labelOperator.text = "Operator unknown"
  479. imageViewOperator.image = UIImage(named: "ic_contacts")
  480. }
  481. } else {
  482. labelOperator.text = "Korean Telecom"
  483. imageViewOperator.image = UIImage(named: "ic_contacts")
  484. }
  485. textFieldAmount.layer.masksToBounds = true
  486. textFieldAmount.layer.borderWidth = 1
  487. textFieldAmount.layer.borderColor = UIColor.white.cgColor
  488. if let index = opertorArray.index(of: operatorTypeTextField.text!){
  489. if let availableAmounts = mobilerechargeviewmodel.getMobileOperator()[index].availableAmounts{
  490. if availableAmounts.count > 0{
  491. if let cleanValue = Float (mobilerechargeviewmodel.getMobileOperator()[index].availableAmounts![0].original)?.cleanValue{
  492. textFieldAmount.text = cleanValue
  493. }
  494. if let abbreviationValue = mobilerechargeviewmodel.getMobileOperator()[index].abbreviation{
  495. labelOperator.text = abbreviationValue
  496. }
  497. if let url = mobilerechargeviewmodel.getMobileOperator()[index].iconUrl{
  498. downloadImage(url: Foundation.URL(string: url)!)
  499. }
  500. }
  501. }else{
  502. textFieldAmount.text = ""
  503. moneyUnitLableOutlet.text = ""
  504. }
  505. }
  506. }
  507. /**
  508. Hide view if no data is available
  509. */
  510. func hideMobileDetails() {
  511. viewBinding.layer.cornerRadius = 0.0
  512. viewPhoneNumber.layer.cornerRadius = 10
  513. viewRechargeAmount.isHidden = true
  514. viewOperator.isHidden = true
  515. buttonRecharge.isHidden = true
  516. }
  517. override func didReceiveMemoryWarning() {
  518. super.didReceiveMemoryWarning()
  519. // Dispose of any resources that can be recreated.
  520. }
  521. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  522. if segue.identifier == "reviewRecharge" {
  523. if operatorTypeTextField.text != ""{
  524. let position = getIndex(operatorName: operatorTypeTextField.text!)
  525. if position != 100000{
  526. if let telecomId = mobilerechargeviewmodel.getMobileOperator()[position].telecomId{
  527. mobilerechargeviewmodel.setTelecomId(telecomId: telecomId)
  528. }
  529. }
  530. }
  531. let reviewRechargeViewController = segue.destination as! MobileRechargeReviewViewController
  532. reviewRechargeViewController.convertedData = "\(self.moneyUnitLableOutlet.text!)"
  533. reviewRechargeViewController.transferAmount = self.textFieldAmount.text
  534. if let operatorType = operatorTypeTextField.text {
  535. if operatorTypeTextField.text != ""{
  536. if let index = self.opertorArray.index(of: operatorType){
  537. reviewRechargeViewController.operatorUrl = self.mobilerechargeviewmodel.getMobileOperator()[index].iconUrl
  538. }
  539. }
  540. }
  541. reviewRechargeViewController.mobilerechargeviewmodel = self.mobilerechargeviewmodel
  542. }
  543. }
  544. func getDataFromUrl(url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) {
  545. URLSession.shared.dataTask(with: url) { data, response, error in
  546. completion(data, response, error)
  547. }.resume()
  548. }
  549. /**
  550. Set image in imageview
  551. - parameter url: image url provided by API
  552. */
  553. func downloadImage(url: URL) {
  554. getDataFromUrl(url: url) { data, response, error in
  555. guard let data = data, error == nil else { return }
  556. DispatchQueue.main.async() {
  557. if let data = UIImage(data: data){
  558. self.imageViewOperator.image = data
  559. }
  560. }
  561. }
  562. }
  563. }
  564. extension MobileRechargeViewController: UITextFieldDelegate {
  565. func textFieldDidBeginEditing(_ textField: UITextField) {
  566. if textField == textFieldAmount {
  567. self.status = "topUpAmount"
  568. self.pickUp(textField)
  569. if let index = pickerData.index(where: { $0 == textFieldAmount.text}) {
  570. self.pickerView.selectRow(index, inComponent: 0, animated: true)
  571. }
  572. }
  573. else if textField == operatorTypeTextField{
  574. self.status = "mobileOperator"
  575. self.pickUp(textField)
  576. if self.operatorTypeTextField.text != ""{
  577. let position = getIndex(operatorName: self.operatorTypeTextField.text!)
  578. if self.getTopUpAmount(position: position).count > 0{
  579. let floatValue = Float (self.getTopUpAmount(position: position)[0])
  580. textFieldAmount.text = floatValue?.cleanValue
  581. if mobilerechargeviewmodel.getMobileOperator().count > 0{
  582. //moneyUnitLableOutlet.text = "NPR(=\(mobilerechargeviewmodel.getMobileOperator()[position].availableAmounts![0].converted) KRW)"
  583. }
  584. }
  585. self.pickerData = self.getTopUpAmount(position: position)
  586. }
  587. }
  588. }
  589. func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
  590. if textField == textFieldNumber{
  591. let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
  592. if newString.count > 10{
  593. return false
  594. } else {
  595. return true
  596. }
  597. } else if textField == textFieldCountryName {
  598. textField.resignFirstResponder()
  599. }
  600. return false
  601. }
  602. func textFieldDidEndEditing(_ textField: UITextField) {
  603. if textField == textFieldAmount{
  604. self.textFieldAmount.resignFirstResponder()
  605. }
  606. }
  607. }
  608. extension MobileRechargeViewController: UIPickerViewDataSource, UIPickerViewDelegate {
  609. func numberOfComponents(in pickerView: UIPickerView) -> Int {
  610. return 1
  611. }
  612. func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
  613. if self.status == "topUpAmount"{
  614. return amountList.count
  615. }
  616. else if self.status == "mobileOperator"{
  617. return opertorArray.count
  618. }
  619. return 0
  620. }
  621. func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
  622. if self.status == "topUpAmount"{
  623. return amountList[row]
  624. }
  625. else if self.status == "mobileOperator"{
  626. return opertorArray[row]
  627. }
  628. return ""
  629. }
  630. func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  631. if self.status == "topUpAmount"{
  632. self.amountSelected = amountList[row]
  633. if self.amountSelected != "nil"{
  634. if self.operatorTypeTextField.text != ""{
  635. if mobilerechargeviewmodel.getMobileOperator().count > 0{
  636. amountSelectedFromList = self.amountSelected
  637. amountUnitSelectedFromList = "NPR(=\(availableAmountBoth![row].converted) KRW)"
  638. }
  639. }
  640. }
  641. }
  642. else if self.status == "mobileOperator"{
  643. self.operatorSelected = opertorArray[row]
  644. }
  645. }
  646. }
  647. extension MobileRechargeViewController: CNContactPickerDelegate {
  648. func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
  649. let phoneNumberCount = contact.phoneNumbers.count
  650. guard phoneNumberCount > 0 else {
  651. dismiss(animated: true) {
  652. self.popUpMessageError(value: 10, message: "Selected contact does not have a number")
  653. }
  654. return
  655. }
  656. if phoneNumberCount == 1 {
  657. setNumberFromContact(contactNumber: contact.phoneNumbers[0].value.stringValue)
  658. self.apiCallFromContact()
  659. } else {
  660. let alertController = UIAlertController(title: "Select one of the numbers", message: nil, preferredStyle: .alert)
  661. for i in 0...phoneNumberCount-1 {
  662. let phoneAction = UIAlertAction(title: contact.phoneNumbers[i].value.stringValue, style: .default, handler: {
  663. alert -> Void in
  664. self.setNumberFromContact(contactNumber: contact.phoneNumbers[i].value.stringValue)
  665. self.apiCallFromContact()
  666. })
  667. alertController.addAction(phoneAction)
  668. }
  669. let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: {
  670. alert -> Void in
  671. })
  672. alertController.addAction(cancelAction)
  673. dismiss(animated: true) {
  674. self.present(alertController, animated: true, completion: nil)
  675. }
  676. }
  677. }
  678. func setNumberFromContact(contactNumber: String) {
  679. var contactNumber = contactNumber.replacingOccurrences(of: "-", with: "")
  680. contactNumber = contactNumber.replacingOccurrences(of: "(", with: "")
  681. contactNumber = contactNumber.replacingOccurrences(of: ")", with: "")
  682. contactNumber = contactNumber.removeWhitespacesInBetween()
  683. guard contactNumber.count >= 10 else {
  684. dismiss(animated: true) {
  685. self.popUpMessageError(value: 10, message: "Selected contact does not have a valid number")
  686. }
  687. return
  688. }
  689. textFieldNumber.text = String(contactNumber.suffix(10))
  690. mobilerechargeviewmodel.updateMobileNumber(enteredNumber: textFieldNumber.text!)
  691. }
  692. func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
  693. }
  694. }
  695. extension Float {
  696. var cleanValue: String {
  697. return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
  698. }
  699. }