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.

597 lines
22 KiB

6 years ago
  1. //
  2. // KYCPersonalInfoViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by Sujal on 12/18/17.
  6. // Copyright © 2017 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import Foundation
  9. import UIKit
  10. //import SDWebImage
  11. class KYCPersonalInfoViewController: UIViewController {
  12. @IBOutlet weak var scrollView: UIScrollView!
  13. @IBOutlet weak var viewOutlet: UIView!
  14. @IBOutlet weak var viewProgressBarOutlet: UIView!
  15. private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
  16. private var kycviewmodel = KYCViewModel()
  17. let pickerView = UIPickerView()
  18. var pickerData: [String] = [String]()
  19. let datePicker = UIDatePicker()
  20. @IBOutlet weak var textFieldFirstName: UITextField!
  21. @IBOutlet weak var textFieldMiddleName: UITextField!
  22. @IBOutlet weak var textFieldLastName: UITextField!
  23. @IBOutlet weak var textFieldNickName: UITextField!
  24. @IBOutlet weak var textFieldGender: UITextField!
  25. @IBOutlet weak var textFieldDOB: UITextField!
  26. @IBOutlet weak var textFieldPhone: UITextField!
  27. @IBOutlet weak var textFieldEmail: UITextField!
  28. @IBOutlet weak var textFieldNativeCountry: UITextField!
  29. @IBOutlet weak var textFieldCountry: UITextField!
  30. @IBOutlet weak var textFieldProvince: UITextField!
  31. @IBOutlet weak var textFieldOccupation: UITextField!
  32. var activeTextField: UITextField?
  33. var arrayOftextFields: [UITextField]!
  34. var selectedIndexFor: [String: Int] = [String: Int]()
  35. var personalInfo: [String]!
  36. var isPhone: Bool!
  37. var noConnectionTimeOutDialog: Bool?
  38. @IBOutlet weak var kycFirstStep: UIView!
  39. @IBOutlet weak var kycProgessOne: UIView!
  40. @IBOutlet weak var kycSecondStep: UIView!
  41. @IBOutlet weak var kycProgessSecond: UIView!
  42. @IBOutlet weak var kycFinalStep: UIView!
  43. var referralCodepopUpViewController: ReferralCodeViewController!
  44. @IBAction func submitPersonalInformation(_ sender: Any) {
  45. activeTextField?.resignFirstResponder()
  46. personalInfo = [textFieldFirstName.text!, textFieldLastName.text!, textFieldGender.text!, textFieldDOB.text!,
  47. textFieldPhone.text!, textFieldEmail.text!, textFieldNativeCountry.text!, textFieldCountry.text!, textFieldProvince.text!, textFieldOccupation.text!]
  48. guard kycviewmodel.allFieldsFilled(arrayofInfo: personalInfo) else {
  49. self.popUpMessageError(value: 11, message: "Please fill all the fields")
  50. return
  51. }
  52. guard kycviewmodel.isValidAge(dob: textFieldDOB.text!) else {
  53. self.popUpMessageError(value: 11, message: "User is under age")
  54. return
  55. }
  56. if isPhone {
  57. kycviewmodel.updateSetMobileNumber(inputDigit: textFieldPhone.text!)
  58. } else {
  59. kycviewmodel.updateSetEmail(email: textFieldEmail.text!)
  60. }
  61. performSegue(withIdentifier: "fillKYCSecurityInfo", sender: nil)
  62. }
  63. @objc func keyboardWillShow(notification: NSNotification) {
  64. var userInfo = notification.userInfo!
  65. var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
  66. keyboardFrame = self.view.convert(keyboardFrame, from: nil)
  67. var contentInset:UIEdgeInsets = self.scrollView.contentInset
  68. contentInset.bottom = keyboardFrame.size.height + 100
  69. scrollView.contentInset = contentInset
  70. }
  71. @objc func keyboardWillHide(notification: NSNotification) {
  72. self.scrollView.contentInset = UIEdgeInsets.zero
  73. }
  74. @objc func clearKeyboard() {
  75. activeTextField?.resignFirstResponder()
  76. }
  77. /**
  78. Date limit to current date
  79. */
  80. func setDatePickerLimit() {
  81. var components = DateComponents()
  82. components.year = -0
  83. let maxDate = Calendar.current.date(byAdding: components, to: Date())
  84. datePicker.maximumDate = maxDate
  85. }
  86. /**
  87. Update Country and occupation name to picker view
  88. */
  89. func bindCountryAndOccupationToUI() {
  90. kycviewmodel.countryAndOccupationFetched.bind { [unowned self] in
  91. guard $0 != nil else {
  92. return
  93. }
  94. guard $0! != 0 else {
  95. self.kycviewmodel.countryAndOccupationFetched.value = nil
  96. return
  97. }
  98. if $0! == 1 {
  99. self.kycviewmodel.countryAndOccupationFetched.value = nil
  100. //SET COUNTRY TEXT FIELD AND COUNTRY ID
  101. self.pickerData = self.kycviewmodel.getCountryName()
  102. self.showCountryWithFlag(textField: self.textFieldCountry, flagUrlString: self.kycviewmodel.getCountryFlagUrl(), index: 0)
  103. } else if $0 == 2 {
  104. self.kycviewmodel.countryAndOccupationFetched.value = nil
  105. //SET OCCUPATION TEXT FIELD
  106. let defaultOccupationIndex = self.kycviewmodel.getIndexForDefaultOccupation()
  107. self.selectedIndexFor["occupation"] = defaultOccupationIndex
  108. self.textFieldOccupation.text = self.kycviewmodel.getDefaultOccupation(index: defaultOccupationIndex)
  109. self.kycviewmodel.setOccupation(referenceIndex: defaultOccupationIndex)
  110. }
  111. }
  112. }
  113. /**
  114. Display dialog to add referral code
  115. */
  116. func showReferralCodeDialog() {
  117. let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
  118. referralCodepopUpViewController = storyboard.instantiateViewController(withIdentifier: "referralCodepopUp") as? ReferralCodeViewController
  119. self.navigationController?.navigationBar.isHidden = true
  120. self.addChildViewController(referralCodepopUpViewController)
  121. referralCodepopUpViewController.view.frame = self.view.bounds
  122. self.view.addSubview(referralCodepopUpViewController.view)
  123. referralCodepopUpViewController.didMove(toParentViewController: self)
  124. referralCodepopUpViewController.referralCodeAvailable.bind { [unowned self] in
  125. guard $0 != nil else {
  126. return
  127. }
  128. self.setUpNavBar(id: 102, title: "")
  129. if $0! {
  130. self.kycviewmodel.setReferralCode(referralCode: self.referralCodepopUpViewController.getReferralCode())
  131. }
  132. //self.showWelcomeMessage()
  133. }
  134. }
  135. /**
  136. Display welcome dialog
  137. */
  138. func showWelcomeMessage() {
  139. let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
  140. if let popUpViewController = storyboard.instantiateViewController(withIdentifier: "popUpInfo") as? PopUpGeneralInfo {
  141. self.navigationController?.navigationBar.isHidden = true
  142. popUpViewController.indexValue = 0
  143. self.addChildViewController(popUpViewController)
  144. popUpViewController.view.frame = self.view.bounds
  145. self.view.addSubview(popUpViewController.view)
  146. popUpViewController.didMove(toParentViewController: self)
  147. }
  148. }
  149. /**
  150. internet check
  151. */
  152. func setUpNetworkListener() {
  153. kycviewmodel.internetConnection.bind { [unowned self] in
  154. guard $0 != nil else {
  155. return
  156. }
  157. if !$0! {
  158. self.popUpMessage(value: 15)
  159. self.kycviewmodel.internetConnection.value = nil
  160. }
  161. }
  162. }
  163. override func viewDidAppear(_ animated: Bool) {
  164. setUpNetworkListener()
  165. }
  166. override func viewDidLoad() {
  167. super.viewDidLoad()
  168. setUpAnotherLoginListener(genericviewmodel: kycviewmodel)
  169. setUpNavBar(id: 102, title: "")
  170. noConnectionTimeOutDialog = false
  171. viewOutlet.backgroundColor = UIColor(hex:0xec1c24)
  172. viewProgressBarOutlet.backgroundColor = UIColor(hex:0xec1c24)
  173. self.showWelcomeDialog()
  174. setDatePickerLimit()
  175. kycviewmodel.kycViewModelConnectionTimeOut.value = nil
  176. /**
  177. connection timeout
  178. */
  179. kycviewmodel.kycViewModelConnectionTimeOut.bind { [unowned self] in
  180. guard $0 != nil else {
  181. return
  182. }
  183. if !self.noConnectionTimeOutDialog! {
  184. self.enableUserInteractions()
  185. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  186. self.popUpMessage(value: 20)
  187. }
  188. self.noConnectionTimeOutDialog = true
  189. }
  190. bindCountryAndOccupationToUI()
  191. kycviewmodel.fetchRequiredCDDValues()
  192. NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
  193. NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
  194. let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard))
  195. view.addGestureRecognizer(tap)
  196. let userId: String = UserDefaults.standard.object(forKey: "com.gmeremit.username") as! String
  197. if let _ = Int(userId) {
  198. isPhone = true
  199. textFieldPhone.text = userId
  200. } else {
  201. isPhone = false
  202. textFieldEmail.text = userId
  203. }
  204. arrayOftextFields = [textFieldFirstName, textFieldMiddleName, textFieldLastName, textFieldNickName, textFieldGender, textFieldDOB, textFieldPhone, textFieldEmail, textFieldNativeCountry, textFieldCountry, textFieldProvince, textFieldOccupation]
  205. selectedIndexFor["gender"] = 0
  206. selectedIndexFor["nativeCountry"] = 0
  207. selectedIndexFor["province"] = 0
  208. selectedIndexFor["occupation"] = 0
  209. for textField in arrayOftextFields! {
  210. textField.delegate = self
  211. }
  212. pickerView.dataSource = self
  213. pickerView.delegate = self
  214. textFieldGender.inputView = pickerView
  215. textFieldNativeCountry.inputView = pickerView
  216. textFieldProvince.inputView = pickerView
  217. textFieldOccupation.inputView = pickerView
  218. datePicker.datePickerMode = .date
  219. textFieldDOB.inputView = datePicker
  220. datePicker.addTarget(self, action: #selector(handleDatePicker(sender:)), for: .valueChanged)
  221. kycFirstStep.layer.cornerRadius = kycFirstStep.frame.size.width/2
  222. kycFirstStep.layer.borderColor = UIColor.white.cgColor
  223. kycFirstStep.layer.borderWidth = 1.0
  224. kycSecondStep.layer.cornerRadius = kycSecondStep.frame.size.width/2
  225. //kycSecondStep.layer.borderColor = UIColor(red:0.91, green:0.93, blue:0.95, alpha:1.0).cgColor
  226. //kycSecondStep.layer.borderWidth = 1.0
  227. kycFinalStep.layer.cornerRadius = kycFinalStep.frame.size.width/2
  228. //kycFinalStep.layer.borderColor = UIColor(red:0.91, green:0.93, blue:0.95, alpha:1.0).cgColor
  229. // kycFinalStep.layer.borderWidth = 1.0
  230. keyboardInteractionForTextFields()
  231. }
  232. /**
  233. To display keboard on text field according to user id i.e email or phone no
  234. */
  235. func keyboardInteractionForTextFields(){
  236. if isPhone {
  237. textFieldPhone.isEnabled = false
  238. } else {
  239. textFieldEmail.isEnabled = false
  240. }
  241. textFieldCountry.isEnabled = false
  242. }
  243. /**
  244. Set the Date format to "MM/dd/yyyy"
  245. */
  246. @objc func handleDatePicker(sender: UIDatePicker) {
  247. let dateFormatter = DateFormatter()
  248. dateFormatter.dateFormat = "MM/dd/yyyy"
  249. textFieldDOB.text = dateFormatter.string(from: sender.date)
  250. kycviewmodel.setDOB(dob: textFieldDOB.text!)
  251. }
  252. /**
  253. Show welcome dialog message when referral status is true
  254. */
  255. func showWelcomeDialog(){
  256. if let referralStatus = UserDefaults.standard.object(forKey: "com.gmeremit.isReferred") as? Bool {
  257. if referralStatus {
  258. showWelcomeMessage()
  259. } else {
  260. showReferralCodeDialog()
  261. }
  262. }
  263. }
  264. }
  265. extension KYCPersonalInfoViewController: UITextFieldDelegate {
  266. func textFieldDidBeginEditing(_ textField: UITextField) {
  267. activeTextField = textField
  268. if textField == textFieldGender ||
  269. textField == textFieldNativeCountry ||
  270. textField == textFieldProvince ||
  271. textField == textFieldOccupation {
  272. switch textField {
  273. case textFieldGender:
  274. pickerData = kycviewmodel.getCddGenderList()
  275. case textFieldNativeCountry:
  276. pickerData = kycviewmodel.getNativeCountryName()
  277. case textFieldProvince:
  278. pickerData = kycviewmodel.getProvince()
  279. case textFieldOccupation:
  280. pickerData = kycviewmodel.getCddOccupationList()
  281. default:
  282. return
  283. }
  284. guard pickerData.count > 0 else {
  285. self.popUpMessageInfo(value: 16, title: "Fetching data", message: "Please fill other fields while some data are being loaded")
  286. return
  287. }
  288. pickerView.reloadAllComponents()
  289. switch textField {
  290. case textFieldGender:
  291. if let genderIndex = selectedIndexFor["gender"] {
  292. pickerView.selectRow(genderIndex, inComponent: 0, animated: true)
  293. }
  294. if let genderIndex = selectedIndexFor["gender"] {
  295. textField.text = pickerData[genderIndex]
  296. }
  297. if let genderIndex = selectedIndexFor["gender"]{
  298. kycviewmodel.setGender(referenceIndex: genderIndex)
  299. }
  300. case textFieldNativeCountry:
  301. if let countryIndex = selectedIndexFor["nativeCountry"]{
  302. pickerView.selectRow(countryIndex, inComponent: 0, animated: true)
  303. }
  304. if let countryIndex = selectedIndexFor["nativeCountry"]{
  305. showCountryWithFlag(textField: textField, flagUrlString: kycviewmodel.getNativeCountryFlagUrl(index: countryIndex), index: countryIndex)
  306. }
  307. if let countryIndex = selectedIndexFor["nativeCountry"]{
  308. kycviewmodel.setNativeCountry(referenceIndex: countryIndex)
  309. }
  310. case textFieldOccupation:
  311. if let occupationIndex = selectedIndexFor["occupation"]{
  312. pickerView.selectRow(occupationIndex, inComponent: 0, animated: true)
  313. }
  314. if let occupationIndex = selectedIndexFor["occupation"]{
  315. textField.text = pickerData[occupationIndex]
  316. }
  317. if let occupationIndex = selectedIndexFor["occupation"]{
  318. kycviewmodel.setOccupation(referenceIndex: occupationIndex)
  319. }
  320. case textFieldProvince:
  321. if let provinceIndex = selectedIndexFor["province"]{
  322. pickerView.selectRow(provinceIndex, inComponent: 0, animated: true)
  323. }
  324. if let provinceIndex = selectedIndexFor["province"]{
  325. textField.text = pickerData[provinceIndex]
  326. }
  327. if let provinceIndex = selectedIndexFor["province"]{
  328. kycviewmodel.setProvince(referenceIndex: provinceIndex)
  329. }
  330. default:
  331. return
  332. }
  333. }
  334. }
  335. func textFieldShouldReturn(_ textField: UITextField) -> Bool {
  336. let index: Int = arrayOftextFields.index(of: textField)!
  337. guard index == (arrayOftextFields.count-1) else {
  338. arrayOftextFields[index+1].becomeFirstResponder()
  339. return true
  340. }
  341. //textField.resignFirstResponder()
  342. return true
  343. }
  344. func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
  345. if textField == textFieldGender ||
  346. textField == textFieldOccupation ||
  347. textField == textFieldCountry ||
  348. textField == textFieldNativeCountry ||
  349. textField == textFieldProvince ||
  350. textField == textFieldDOB {
  351. return false
  352. }
  353. let inputText = (textField.text! as NSString).replacingCharacters(in: range, with: string)
  354. switch textField {
  355. case textFieldFirstName:
  356. self.kycviewmodel.updateName(namePart: 1, inputString: inputText)
  357. case textFieldMiddleName:
  358. self.kycviewmodel.updateName(namePart: 2, inputString: inputText)
  359. case textFieldLastName:
  360. self.kycviewmodel.updateName(namePart: 3, inputString: inputText)
  361. case textFieldNickName:
  362. self.kycviewmodel.updateName(namePart: 0, inputString: inputText)
  363. case textFieldPhone:
  364. if isPhone {
  365. return false
  366. } else {
  367. self.kycviewmodel.updateSetMobileNumber(inputDigit: inputText)
  368. return true
  369. }
  370. case textFieldEmail:
  371. if isPhone {
  372. self.kycviewmodel.updateSetEmail(email: inputText)
  373. return true
  374. } else {
  375. return false
  376. }
  377. default:
  378. return false
  379. }
  380. return true
  381. }
  382. }
  383. extension KYCPersonalInfoViewController: UIPickerViewDataSource, UIPickerViewDelegate {
  384. func numberOfComponents(in pickerView: UIPickerView) -> Int {
  385. return 1
  386. }
  387. func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
  388. return pickerData.count
  389. }
  390. func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  391. if activeTextField == textFieldNativeCountry {
  392. selectedIndexFor["nativeCountry"] = row
  393. self.kycviewmodel.setNativeCountry(referenceIndex: row)
  394. let flagUrl = kycviewmodel.getNativeCountryFlagUrl(index: row)
  395. showCountryWithFlag(textField: activeTextField!, flagUrlString: flagUrl, index: row)
  396. } else {
  397. switch activeTextField! {
  398. case self.textFieldGender:
  399. selectedIndexFor["gender"] = row
  400. self.kycviewmodel.setGender(referenceIndex: row)
  401. case self.textFieldOccupation:
  402. selectedIndexFor["occupation"] = row
  403. self.kycviewmodel.setOccupation(referenceIndex: row)
  404. case self.textFieldProvince:
  405. selectedIndexFor["province"] = row
  406. self.kycviewmodel.setProvince(referenceIndex: row)
  407. default:
  408. break
  409. }
  410. activeTextField!.text = pickerData[row]
  411. }
  412. }
  413. func showCountryWithFlag(textField: UITextField, flagUrlString: String, index: Int) {
  414. let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
  415. let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
  416. imageView.center = paddingView.center
  417. paddingView.addSubview(imageView)
  418. if let flagUrl = URL(string: flagUrlString) {
  419. imageView.sd_setImage(with: flagUrl, placeholderImage: nil, options: [.progressiveDownload,.scaleDownLargeImages], completed: nil)
  420. }
  421. textField.leftViewMode = UITextFieldViewMode.always
  422. textField.leftView = paddingView
  423. textField.text = pickerData[index]
  424. }
  425. func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
  426. return 60
  427. }
  428. func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
  429. var myImageView: UIImageView?
  430. let myView = UIView(frame: CGRect(x: 0, y: 0, width: pickerView.bounds.width - 30, height: 60))
  431. let myLabel = UILabel(frame: CGRect(x: 60, y: 0, width: pickerView.bounds.width - 90, height: 60 ))
  432. myLabel.text = pickerData[row]
  433. myView.addSubview(myLabel)
  434. if activeTextField == textFieldNativeCountry {
  435. myImageView = UIImageView(frame: CGRect(x: 0, y: 5, width: 50, height: 50))
  436. let flagUrlString = kycviewmodel.getNativeCountryFlagUrl(index: row)
  437. if let flagUrl = URL(string: flagUrlString) {
  438. myImageView?.sd_setImage(with: flagUrl, placeholderImage: nil, options: [.progressiveDownload,.scaleDownLargeImages], completed: nil)
  439. myView.addSubview(myImageView!)
  440. }
  441. }
  442. return myView
  443. }
  444. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  445. if segue.identifier == "fillKYCSecurityInfo" {
  446. let kycBankIDViewController
  447. = segue.destination as! KYCBankAndIDViewController
  448. kycBankIDViewController.kycviewmodel = self.kycviewmodel
  449. }
  450. }
  451. }