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.

292 lines
10 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. //
  2. // AddReciepientViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by gme_2 on 26/08/2018.
  6. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. class AddReciepientViewController: UIViewController {
  10. // MARK: IBOutlets
  11. @IBOutlet weak var firstNameTextField: UITextField!
  12. @IBOutlet weak var middleNameTextField: UITextField!
  13. @IBOutlet weak var lastNameTextField: UITextField!
  14. @IBOutlet weak var countryTextField: UITextField!
  15. @IBOutlet weak var stateProvinceTextField: UITextField!
  16. @IBOutlet weak var districtTextField: UITextField!
  17. @IBOutlet weak var addressTextField: UITextField!
  18. @IBOutlet weak var relationTextField: UITextField!
  19. @IBOutlet weak var mobileTextField: UITextField!
  20. @IBOutlet weak var emailTextField: UITextField!
  21. @IBOutlet weak var transferReasonTextField: UITextField!
  22. @IBOutlet weak var saveButton: UIButton!
  23. @IBOutlet weak var provienceStackView: UIStackView!
  24. @IBOutlet weak var districtStackView: UIStackView!
  25. // MARK: Properties
  26. var presenter: AddReciepientModuleInterface?
  27. var countries: [SendMoneyCountryViewModel]?
  28. var transferReasons: [SendMoneyTransferReasonViewModel]?
  29. var relations: [SendMoneyRelationViewModel]?
  30. var reciepient: ReceipientViewModel?
  31. var selectedCountry: SendMoneyCountryViewModel? {
  32. didSet {
  33. self.countryTextField.text = selectedCountry?.name
  34. let shouldShowProvienceField = (selectedCountry?.proviencesRequired ?? "" ) == "true"
  35. self.provienceStackView.isHidden = !shouldShowProvienceField
  36. self.districtStackView.isHidden = !shouldShowProvienceField
  37. self.reciepient?.countryId = self.selectedCountry?.id
  38. }
  39. }
  40. var selectedProvience: SendMoneyProvienceViewModel? {
  41. didSet {
  42. self.stateProvinceTextField.text = selectedProvience?.name
  43. self.reciepient?.stateId = self.selectedProvience?.id
  44. }
  45. }
  46. var selectedDistrict: SendMoneyDistrictViewModel? {
  47. didSet {
  48. self.districtTextField.text = selectedDistrict?.name
  49. self.reciepient?.districtId = self.selectedDistrict?.id
  50. }
  51. }
  52. var selectedRelation: SendMoneyRelationViewModel? {
  53. didSet {
  54. self.relationTextField.text = selectedRelation?.title
  55. self.reciepient?.relationId = self.selectedRelation?.id
  56. }
  57. }
  58. var selectedTransferReason: SendMoneyTransferReasonViewModel? {
  59. didSet {
  60. self.transferReasonTextField.text = selectedTransferReason?.title
  61. self.reciepient?.reasonId = selectedTransferReason?.id
  62. }
  63. }
  64. // MARK: VC's Life cycle
  65. override func viewDidLoad() {
  66. super.viewDidLoad()
  67. self.setup()
  68. self.setupDelegates()
  69. self.setupTargets()
  70. self.reciepient = ReceipientViewModel()
  71. self.presenter?.viewIsReady()
  72. }
  73. override func viewWillAppear(_ animated: Bool) {
  74. super.viewWillAppear(animated)
  75. self.navigationItem.title = "Add Receipient"
  76. }
  77. override func viewWillDisappear(_ animated: Bool) {
  78. super.viewWillAppear(animated)
  79. self.navigationItem.title = ""
  80. }
  81. // MARK: IBActions
  82. @IBAction func save(_ sender: UIButton) {
  83. if let reciepient = self.reciepient {
  84. self.presenter?.save(model: reciepient)
  85. }
  86. }
  87. // MARK: Other Functions
  88. private func setup() {
  89. // all setup should be done here
  90. self.setupNavigation()
  91. self.configureView()
  92. }
  93. private func configureView() {
  94. self.provienceStackView.isHidden = true
  95. self.districtStackView.isHidden = true
  96. }
  97. private func setupDelegates() {
  98. self.countryTextField.delegate = self
  99. self.stateProvinceTextField.delegate = self
  100. self.districtTextField.delegate = self
  101. self.relationTextField.delegate = self
  102. self.transferReasonTextField.delegate = self
  103. }
  104. private func setupTargets() {
  105. [firstNameTextField, middleNameTextField, lastNameTextField, countryTextField, stateProvinceTextField, districtTextField, addressTextField, relationTextField, mobileTextField, emailTextField, transferReasonTextField].forEach({
  106. $0.addTarget(self, action: #selector(self.textFieldChanged(sender:)), for: UIControlEvents.editingChanged)
  107. })
  108. }
  109. @objc private func textFieldChanged(sender: UITextField) {
  110. switch sender {
  111. case firstNameTextField:
  112. self.reciepient?.firstName = firstNameTextField.text!
  113. case middleNameTextField:
  114. self.reciepient?.middleName = middleNameTextField.text!
  115. case lastNameTextField:
  116. self.reciepient?.lastName = lastNameTextField.text!
  117. case addressTextField:
  118. self.reciepient?.address = addressTextField.text!
  119. case mobileTextField:
  120. self.reciepient?.mobileNumber = mobileTextField.text!
  121. case emailTextField:
  122. self.reciepient?.email = emailTextField.text!
  123. default:
  124. break
  125. }
  126. }
  127. private func setupNavigation() {
  128. self.navigationItem.backBarButtonItem?.image =
  129. #imageLiteral(resourceName: "backIconBlack")
  130. self.navigationController?.navigationBar.tintColor = UIColor.black
  131. }
  132. private func showCountryPickerview() {
  133. let viewcontroller = UIStoryboard.init(name: "CountryPicker", bundle: nil).instantiateViewController(withIdentifier: "CountryPickerViewController") as! CountryPickerViewController
  134. viewcontroller.data = self.countries ?? []
  135. viewcontroller.doneAction = self.countrySelected
  136. viewcontroller.defaultSelectedData = [self.selectedCountry]
  137. viewcontroller.type = PickerTitle.country
  138. self.present(viewcontroller, animated: true, completion: nil)
  139. }
  140. private func getPickerViewController()-> ItemsPickerViewController {
  141. return UIStoryboard.init(name: "ItemsPicker", bundle: nil).instantiateViewController(withIdentifier: "ItemsPickerViewController") as! ItemsPickerViewController
  142. }
  143. private func showProviencePickerview() {
  144. let viewcontroller = self.getPickerViewController()
  145. let proviences = self.selectedCountry?.proviences ?? []
  146. let names = proviences.compactMap({$0.name})
  147. viewcontroller.data = names
  148. viewcontroller.type = PickerTitle.state
  149. viewcontroller.doneAction = self.provienceSelected
  150. viewcontroller.defaultSelectedData = [self.selectedProvience?.name ?? ""]
  151. self.present(viewcontroller, animated: true, completion: nil)
  152. }
  153. private func showDistrictPickerview() {
  154. let viewcontroller = self.getPickerViewController()
  155. let districts = self.selectedProvience?.districts ?? []
  156. let names = districts.compactMap({$0.name})
  157. viewcontroller.data = names
  158. viewcontroller.type = PickerTitle.district
  159. viewcontroller.doneAction = self.districtSelected
  160. viewcontroller.defaultSelectedData = [self.selectedDistrict?.name ?? ""]
  161. self.present(viewcontroller, animated: true, completion: nil)
  162. }
  163. private func showRelationPickerView() {
  164. let viewcontroller = self.getPickerViewController()
  165. let relations = self.relations ?? []
  166. let names = relations.compactMap({$0.title})
  167. viewcontroller.data = names
  168. viewcontroller.type = PickerTitle.relation
  169. viewcontroller.doneAction = self.relationSelected
  170. viewcontroller.defaultSelectedData = [self.selectedRelation?.title ?? ""]
  171. self.present(viewcontroller, animated: true, completion: nil)
  172. }
  173. private func showTransferReasonPickerView() {
  174. let viewcontroller = self.getPickerViewController()
  175. let transferReasons = self.transferReasons ?? []
  176. let names = transferReasons.compactMap({$0.title})
  177. viewcontroller.data = names
  178. viewcontroller.type = PickerTitle.transferReasons
  179. viewcontroller.doneAction = self.transferReasonSelected
  180. viewcontroller.defaultSelectedData = [self.selectedTransferReason?.title ?? ""]
  181. self.present(viewcontroller, animated: true, completion: nil)
  182. }
  183. func transferReasonSelected(reasons: [String]) {
  184. let _reason = self.transferReasons?.filter({($0.title ?? "") == (reasons.first ?? "") }).first
  185. self.selectedTransferReason = _reason
  186. }
  187. func relationSelected(relations: [String]) {
  188. let _relations = self.relations?.filter({($0.title ?? "") == (relations.first ?? "") }).first
  189. self.selectedRelation = _relations
  190. }
  191. func districtSelected(district: [String]) {
  192. let _district = (self.selectedProvience?.districts ?? []).filter({
  193. ( $0.name ?? "" ) == ( district.first ?? "" )
  194. }).first
  195. self.selectedDistrict = _district
  196. }
  197. func provienceSelected(provience: [String]) {
  198. let _provience = (self.selectedCountry?.proviences ?? []).filter({
  199. ($0.name ?? "") == (provience.first ?? "")
  200. })
  201. self.selectedProvience = _provience.first
  202. }
  203. func countrySelected(models: [SendMoneyCountryViewModel]) {
  204. self.selectedCountry = models.first
  205. }
  206. func showLoading() {
  207. self.showProgressHud()
  208. }
  209. func hideLoading() {
  210. self.hideProgressHud()
  211. }
  212. func show(error: String) {
  213. self.alert(message: error)
  214. }
  215. }
  216. // MARK: AddReciepientViewInterface
  217. extension AddReciepientViewController: AddReciepientViewInterface {
  218. func show(countries: [SendMoneyCountryViewModel]) {
  219. self.countries = countries
  220. }
  221. func show(transferReasons: [SendMoneyTransferReasonViewModel]) {
  222. self.transferReasons = transferReasons
  223. }
  224. func show(relations: [SendMoneyRelationViewModel]) {
  225. self.relations = relations
  226. }
  227. }
  228. extension AddReciepientViewController: UITextFieldDelegate {
  229. func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
  230. switch textField {
  231. case countryTextField:
  232. showCountryPickerview()
  233. return false
  234. case stateProvinceTextField:
  235. self.showProviencePickerview()
  236. return false
  237. case districtTextField:
  238. self.showDistrictPickerview()
  239. return false
  240. case relationTextField:
  241. self.showRelationPickerView()
  242. return false
  243. case transferReasonTextField:
  244. self.showTransferReasonPickerView()
  245. return false
  246. default:
  247. return true
  248. }
  249. }
  250. }