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.

391 lines
16 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. struct StringConstants {
  11. let headerText = "who_to_send_text".localized()
  12. let firstNameText = "first_name_text".localized()
  13. let middleNameText = "enter_receiver_middlename_text".localized()
  14. let lastNameText = "last_name_text".localized()
  15. let countryNameText = "country_text".localized()
  16. let stateText = "state_text".localized()
  17. let districtText = "district_text".localized()
  18. let addressText = "address_text".localized()
  19. let relationText = "relation_text".localized()
  20. let mobileText = "mobile_number_text".localized()
  21. let transferText = "transfer_reason_text".localized()
  22. let saveText = "save_text".localized()
  23. // placeholder
  24. let firstnamePlaceholder = "placeholder_enter_receiver_firstname_text".localized()
  25. let lastnamePlaceholder = "placeholder_enter_receiver_middle_text".localized()
  26. let middlenamePlaceholder = "placeholder_enter_receiver_lastname_text".localized()
  27. let countryPlaceholder = "placeholder_select_country_text".localized()
  28. let statePlaceholder = "state_placeholder_text".localized()
  29. let districtPlaceholder = "district_placeholder_text".localized()
  30. let addressPlaceholder = "placeholder_enter_receiver_address_text".localized()
  31. let relationPlaceholder = "placeholder_select_relation_text".localized()
  32. let mobilePlaceholder = "placeholder_enter_reciever_mobile_number_text".localized()
  33. let transferPlaceholder = "placeholder_select_transfer_reason_text".localized()
  34. }
  35. // MARK: IBOutlets
  36. @IBOutlet weak var firstNameTextField: UITextField!
  37. @IBOutlet weak var middleNameTextField: UITextField!
  38. @IBOutlet weak var lastNameTextField: UITextField!
  39. @IBOutlet weak var countryTextField: UITextField!
  40. @IBOutlet weak var stateProvinceTextField: UITextField!
  41. @IBOutlet weak var districtTextField: UITextField!
  42. @IBOutlet weak var addressTextField: UITextField!
  43. @IBOutlet weak var relationTextField: UITextField!
  44. @IBOutlet weak var mobileTextField: UITextField!
  45. @IBOutlet weak var emailTextField: UITextField!
  46. @IBOutlet weak var transferReasonTextField: UITextField!
  47. @IBOutlet weak var saveButton: UIButton!
  48. @IBOutlet weak var provienceStackView: UIStackView!
  49. @IBOutlet weak var districtStackView: UIStackView!
  50. // titles
  51. @IBOutlet weak var headerTItleLabel: UILabel!
  52. @IBOutlet weak var firstNameTitleLabel: UILabel!
  53. @IBOutlet weak var middleNameTitleLabel: UILabel!
  54. @IBOutlet weak var lastNametitleLabel: UILabel!
  55. @IBOutlet weak var countryNameTitleLabel: UILabel!
  56. @IBOutlet weak var stateTitleLabel: UILabel!
  57. @IBOutlet weak var districtTitleLabel: UILabel!
  58. @IBOutlet weak var addressTitleLabel: UILabel!
  59. @IBOutlet weak var relationTitleLabel: UILabel!
  60. @IBOutlet weak var mobileTitleLabel: UILabel!
  61. @IBOutlet weak var transferTitleLabel: UILabel!
  62. // MARK: Properties
  63. var presenter: EditReciepientModuleInterface?
  64. var countries: [SendMoneyCountryViewModel]?
  65. var transferReasons: [SendMoneyTransferReasonViewModel]?
  66. var relations: [SendMoneyRelationViewModel]?
  67. var reciepient: EditRecipientRecipientViewModel? {
  68. didSet {
  69. self.populateInformations()
  70. }
  71. }
  72. var selectedCountry: SendMoneyCountryViewModel? {
  73. didSet {
  74. self.countryTextField.text = selectedCountry?.name
  75. let shouldShowProvienceField = (selectedCountry?.proviencesRequired ?? "" ) == "true"
  76. self.provienceStackView.isHidden = !shouldShowProvienceField
  77. self.districtStackView.isHidden = !shouldShowProvienceField
  78. self.reciepient?.countryId = self.selectedCountry?.id
  79. self.reciepient?.country = self.selectedCountry?.name
  80. }
  81. }
  82. var selectedProvience: SendMoneyProvienceViewModel? {
  83. didSet {
  84. self.stateProvinceTextField.text = selectedProvience?.name
  85. self.reciepient?.stateId = self.selectedProvience?.id
  86. }
  87. }
  88. var selectedDistrict: SendMoneyDistrictViewModel? {
  89. didSet {
  90. self.districtTextField.text = selectedDistrict?.name
  91. self.reciepient?.districtId = self.selectedDistrict?.id
  92. }
  93. }
  94. var selectedRelation: SendMoneyRelationViewModel? {
  95. didSet {
  96. self.relationTextField.text = selectedRelation?.title
  97. self.reciepient?.relationId = self.selectedRelation?.id
  98. }
  99. }
  100. var selectedTransferReason: SendMoneyTransferReasonViewModel? {
  101. didSet {
  102. self.transferReasonTextField.text = selectedTransferReason?.title
  103. self.reciepient?.reasonId = selectedTransferReason?.id
  104. }
  105. }
  106. // MARK: VC's Life cycle
  107. override func viewDidLoad() {
  108. super.viewDidLoad()
  109. self.setup()
  110. self.setupDelegates()
  111. self.setupTargets()
  112. self.presenter?.viewIsReady()
  113. }
  114. override func viewWillAppear(_ animated: Bool) {
  115. super.viewWillAppear(animated)
  116. self.navigationItem.title = "Edit Receipient"
  117. }
  118. // MARK: IBActions
  119. @IBAction func save(_ sender: UIButton) {
  120. self.view.endEditing(true)
  121. if let reciepient = self.reciepient {
  122. self.presenter?.save(model: reciepient)
  123. }
  124. }
  125. // MARK: Other Functions
  126. private func setup() {
  127. // all setup should be done here
  128. self.setupNavigation()
  129. self.configureView()
  130. self.configureLanguage()
  131. }
  132. private func configureLanguage() {
  133. self.headerTItleLabel.text = StringConstants().headerText
  134. self.firstNameTitleLabel.text = StringConstants().firstNameText
  135. self.middleNameTitleLabel.text = StringConstants().middleNameText
  136. self.lastNametitleLabel.text = StringConstants().lastNameText
  137. self.countryNameTitleLabel.text = StringConstants().countryNameText
  138. self.stateTitleLabel.text = StringConstants().stateText
  139. self.districtTitleLabel.text = StringConstants().districtText
  140. self.addressTitleLabel.text = StringConstants().addressText
  141. self.relationTitleLabel.text = StringConstants().relationText
  142. self.mobileTitleLabel.text = StringConstants().mobileText
  143. self.transferTitleLabel.text = StringConstants().transferText
  144. saveButton.setTitle(StringConstants().saveText, for: .normal)
  145. // placeholders
  146. self.firstNameTextField.placeholder = StringConstants().firstnamePlaceholder
  147. self.middleNameTextField.placeholder = StringConstants().middlenamePlaceholder
  148. self.lastNameTextField.placeholder = StringConstants().lastnamePlaceholder
  149. self.countryTextField.placeholder = StringConstants().countryPlaceholder
  150. self.stateProvinceTextField.placeholder = StringConstants().statePlaceholder
  151. self.districtTextField.placeholder = StringConstants().districtPlaceholder
  152. self.addressTextField.placeholder = StringConstants().addressPlaceholder
  153. self.relationTextField.placeholder = StringConstants().relationPlaceholder
  154. self.mobileTextField.placeholder = StringConstants().mobilePlaceholder
  155. self.transferReasonTextField.placeholder = StringConstants().transferPlaceholder
  156. }
  157. private func configureView() {
  158. self.provienceStackView.isHidden = true
  159. self.districtStackView.isHidden = true
  160. }
  161. private func setupDelegates() {
  162. self.countryTextField.delegate = self
  163. self.stateProvinceTextField.delegate = self
  164. self.districtTextField.delegate = self
  165. self.relationTextField.delegate = self
  166. self.transferReasonTextField.delegate = self
  167. }
  168. private func setupTargets() {
  169. [firstNameTextField, middleNameTextField, lastNameTextField, countryTextField, stateProvinceTextField, districtTextField, addressTextField, relationTextField, mobileTextField, emailTextField, transferReasonTextField].forEach({
  170. $0?.addTarget(self, action: #selector(self.textFieldChanged(sender:)), for: UIControlEvents.editingChanged)
  171. })
  172. }
  173. @objc private func textFieldChanged(sender: UITextField) {
  174. switch sender {
  175. case firstNameTextField:
  176. self.reciepient?.firstName = firstNameTextField.text!
  177. case middleNameTextField:
  178. self.reciepient?.middleName = middleNameTextField.text!
  179. case lastNameTextField:
  180. self.reciepient?.lastName = lastNameTextField.text!
  181. case addressTextField:
  182. self.reciepient?.address = addressTextField.text!
  183. case mobileTextField:
  184. self.reciepient?.mobileNumber = mobileTextField.text!
  185. case emailTextField:
  186. self.reciepient?.email = emailTextField.text!
  187. default:
  188. break
  189. }
  190. }
  191. private func populateInformations() {
  192. self.firstNameTextField.text = self.reciepient?.firstName
  193. self.middleNameTextField.text = self.reciepient?.middleName
  194. self.lastNameTextField.text = self.reciepient?.lastName
  195. let country = self.countries?.filter({
  196. $0.name == self.reciepient?.country
  197. }).first?.name
  198. self.countryTextField.text = country
  199. self.addressTextField.text = reciepient?.address
  200. let relation = self.relations?.filter({
  201. $0.title == self.reciepient?.relation
  202. }).first?.title
  203. self.relationTextField.text = relation
  204. self.mobileTextField.text = self.reciepient?.mobileNumber
  205. self.emailTextField.text = self.reciepient?.email
  206. let transferReason = self.transferReasons?.filter({
  207. $0.title == self.reciepient?.reason
  208. }).first?.title
  209. self.transferReasonTextField.text = transferReason
  210. }
  211. private func setupNavigation() {
  212. self.navigationItem.backBarButtonItem?.image =
  213. #imageLiteral(resourceName: "backIconBlack")
  214. self.navigationController?.navigationBar.tintColor = UIColor.black
  215. }
  216. private func showCountryPickerview() {
  217. let viewcontroller = UIStoryboard.init(name: "CountryPicker", bundle: nil).instantiateViewController(withIdentifier: "CountryPickerViewController") as! CountryPickerViewController
  218. viewcontroller.data = self.countries ?? []
  219. viewcontroller.doneAction = self.countrySelected
  220. viewcontroller.defaultSelectedData = [self.selectedCountry]
  221. viewcontroller.type = PickerTitle.country
  222. self.present(viewcontroller, animated: true, completion: nil)
  223. }
  224. private func getPickerViewController()-> ItemsPickerViewController {
  225. return UIStoryboard.init(name: "ItemsPicker", bundle: nil).instantiateViewController(withIdentifier: "ItemsPickerViewController") as! ItemsPickerViewController
  226. }
  227. private func showProviencePickerview() {
  228. let viewcontroller = self.getPickerViewController()
  229. let proviences = self.selectedCountry?.proviences ?? []
  230. let names = proviences.compactMap({$0.name})
  231. viewcontroller.data = names
  232. viewcontroller.type = PickerTitle.state
  233. viewcontroller.doneAction = self.provienceSelected
  234. viewcontroller.defaultSelectedData = [self.selectedProvience?.name ?? ""]
  235. self.present(viewcontroller, animated: true, completion: nil)
  236. }
  237. private func showDistrictPickerview() {
  238. let viewcontroller = self.getPickerViewController()
  239. let districts = self.selectedProvience?.districts ?? []
  240. let names = districts.compactMap({$0.name})
  241. viewcontroller.data = names
  242. viewcontroller.type = PickerTitle.district
  243. viewcontroller.doneAction = self.districtSelected
  244. viewcontroller.defaultSelectedData = [self.selectedDistrict?.name ?? ""]
  245. self.present(viewcontroller, animated: true, completion: nil)
  246. }
  247. private func showRelationPickerView() {
  248. let viewcontroller = self.getPickerViewController()
  249. let relations = self.relations ?? []
  250. let names = relations.compactMap({$0.title})
  251. viewcontroller.data = names
  252. viewcontroller.type = PickerTitle.relation
  253. viewcontroller.doneAction = self.relationSelected
  254. viewcontroller.defaultSelectedData = [self.selectedRelation?.title ?? ""]
  255. self.present(viewcontroller, animated: true, completion: nil)
  256. }
  257. private func showTransferReasonPickerView() {
  258. let viewcontroller = self.getPickerViewController()
  259. let transferReasons = self.transferReasons ?? []
  260. let names = transferReasons.compactMap({$0.title})
  261. viewcontroller.data = names
  262. viewcontroller.type = PickerTitle.transferReasons
  263. viewcontroller.doneAction = self.transferReasonSelected
  264. viewcontroller.defaultSelectedData = [self.selectedTransferReason?.title ?? ""]
  265. self.present(viewcontroller, animated: true, completion: nil)
  266. }
  267. func transferReasonSelected(reasons: [String]) {
  268. let _reason = self.transferReasons?.filter({($0.title ?? "") == (reasons.first ?? "") }).first
  269. self.selectedTransferReason = _reason
  270. }
  271. func relationSelected(relations: [String]) {
  272. let _relations = self.relations?.filter({($0.title ?? "") == (relations.first ?? "") }).first
  273. self.selectedRelation = _relations
  274. }
  275. func districtSelected(district: [String]) {
  276. let _district = (self.selectedProvience?.districts ?? []).filter({
  277. ( $0.name ?? "" ) == ( district.first ?? "" )
  278. }).first
  279. self.selectedDistrict = _district
  280. }
  281. func provienceSelected(provience: [String]) {
  282. let _provience = (self.selectedCountry?.proviences ?? []).filter({
  283. ($0.name ?? "") == (provience.first ?? "")
  284. })
  285. self.selectedProvience = _provience.first
  286. }
  287. func countrySelected(models: [SendMoneyCountryViewModel]) {
  288. self.selectedCountry = models.first
  289. }
  290. func showLoading() {
  291. self.showProgressHud()
  292. }
  293. func hideLoading() {
  294. self.hideProgressHud()
  295. }
  296. func show(error: String) {
  297. self.alert(message: error)
  298. }
  299. }
  300. // MARK: EditReciepientViewInterface
  301. extension EditReciepientViewController: EditReciepientViewInterface {
  302. func show(countries: [SendMoneyCountryViewModel]) {
  303. self.countries = countries
  304. }
  305. func show(transferReasons: [SendMoneyTransferReasonViewModel]) {
  306. self.transferReasons = transferReasons
  307. }
  308. func show(relations: [SendMoneyRelationViewModel]) {
  309. self.relations = relations
  310. }
  311. func show(recipient: EditRecipientRecipientViewModel) {
  312. self.reciepient = recipient
  313. }
  314. }
  315. extension EditReciepientViewController: UITextFieldDelegate {
  316. func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
  317. switch textField {
  318. case countryTextField:
  319. showCountryPickerview()
  320. return false
  321. case stateProvinceTextField:
  322. self.showProviencePickerview()
  323. return false
  324. case districtTextField:
  325. self.showDistrictPickerview()
  326. return false
  327. case relationTextField:
  328. self.showRelationPickerView()
  329. return false
  330. case transferReasonTextField:
  331. self.showTransferReasonPickerView()
  332. return false
  333. default:
  334. return true
  335. }
  336. }
  337. }