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.

321 lines
12 KiB

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