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.

362 lines
14 KiB

6 years ago
6 years ago
6 years ago
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. 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. let addRecipientTitle = "add_recipient_text".localized()
  24. // placeholder
  25. let firstnamePlaceholder = "placeholder_enter_receiver_firstname_text".localized()
  26. let lastnamePlaceholder = "placeholder_enter_receiver_middle_text".localized()
  27. let middlenamePlaceholder = "placeholder_enter_receiver_lastname_text".localized()
  28. let countryPlaceholder = "placeholder_select_country_text".localized()
  29. let statePlaceholder = "state_placeholder_text".localized()
  30. let districtPlaceholder = "district_placeholder_text".localized()
  31. let addressPlaceholder = "placeholder_enter_receiver_address_text".localized()
  32. let relationPlaceholder = "placeholder_select_relation_text".localized()
  33. let mobilePlaceholder = "placeholder_enter_reciever_mobile_number_text".localized()
  34. let transferPlaceholder = "placeholder_select_transfer_reason_text".localized()
  35. }
  36. // MARK: IBOutlets
  37. @IBOutlet weak var firstNameTextField: UITextField!
  38. @IBOutlet weak var middleNameTextField: UITextField!
  39. @IBOutlet weak var lastNameTextField: UITextField!
  40. @IBOutlet weak var countryTextField: UITextField!
  41. @IBOutlet weak var stateProvinceTextField: UITextField!
  42. @IBOutlet weak var districtTextField: UITextField!
  43. @IBOutlet weak var addressTextField: UITextField!
  44. @IBOutlet weak var relationTextField: UITextField!
  45. @IBOutlet weak var mobileTextField: UITextField!
  46. @IBOutlet weak var emailTextField: UITextField!
  47. @IBOutlet weak var transferReasonTextField: UITextField!
  48. @IBOutlet weak var saveButton: UIButton!
  49. @IBOutlet weak var provienceStackView: UIStackView!
  50. @IBOutlet weak var districtStackView: UIStackView!
  51. // titles
  52. @IBOutlet weak var headerTItleLabel: UILabel!
  53. @IBOutlet weak var firstNameTitleLabel: UILabel!
  54. @IBOutlet weak var middleNameTitleLabel: UILabel!
  55. @IBOutlet weak var lastNametitleLabel: UILabel!
  56. @IBOutlet weak var countryNameTitleLabel: UILabel!
  57. @IBOutlet weak var stateTitleLabel: UILabel!
  58. @IBOutlet weak var districtTitleLabel: UILabel!
  59. @IBOutlet weak var addressTitleLabel: UILabel!
  60. @IBOutlet weak var relationTitleLabel: UILabel!
  61. @IBOutlet weak var mobileTitleLabel: UILabel!
  62. @IBOutlet weak var transferTitleLabel: UILabel!
  63. // MARK: Properties
  64. var presenter: AddReciepientModuleInterface?
  65. var countries: [SendMoneyCountryViewModel]?
  66. var transferReasons: [SendMoneyTransferReasonViewModel]?
  67. var relations: [SendMoneyRelationViewModel]?
  68. var reciepient: ReceipientViewModel?
  69. var selectedCountry: SendMoneyCountryViewModel? {
  70. didSet {
  71. self.countryTextField.text = selectedCountry?.name
  72. let shouldShowProvienceField = (selectedCountry?.proviencesRequired ?? "" ) == "true"
  73. self.provienceStackView.isHidden = !shouldShowProvienceField
  74. self.districtStackView.isHidden = !shouldShowProvienceField
  75. self.reciepient?.countryId = self.selectedCountry?.id
  76. }
  77. }
  78. var selectedProvience: SendMoneyProvienceViewModel? {
  79. didSet {
  80. self.stateProvinceTextField.text = selectedProvience?.name
  81. self.reciepient?.stateId = self.selectedProvience?.id
  82. }
  83. }
  84. var selectedDistrict: SendMoneyDistrictViewModel? {
  85. didSet {
  86. self.districtTextField.text = selectedDistrict?.name
  87. self.reciepient?.districtId = self.selectedDistrict?.id
  88. }
  89. }
  90. var selectedRelation: SendMoneyRelationViewModel? {
  91. didSet {
  92. self.relationTextField.text = selectedRelation?.title
  93. self.reciepient?.relationId = self.selectedRelation?.id
  94. }
  95. }
  96. var selectedTransferReason: SendMoneyTransferReasonViewModel? {
  97. didSet {
  98. self.transferReasonTextField.text = selectedTransferReason?.title
  99. self.reciepient?.reasonId = selectedTransferReason?.id
  100. }
  101. }
  102. // MARK: VC's Life cycle
  103. override func viewDidLoad() {
  104. super.viewDidLoad()
  105. self.setup()
  106. self.setupDelegates()
  107. self.setupTargets()
  108. self.reciepient = ReceipientViewModel()
  109. self.presenter?.viewIsReady()
  110. }
  111. override func viewWillAppear(_ animated: Bool) {
  112. super.viewWillAppear(animated)
  113. self.navigationItem.title = StringConstants().addRecipientTitle
  114. }
  115. override func viewWillDisappear(_ animated: Bool) {
  116. super.viewWillAppear(animated)
  117. self.navigationItem.title = ""
  118. }
  119. // MARK: IBActions
  120. @IBAction func save(_ sender: UIButton) {
  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 setupNavigation() {
  192. self.navigationItem.backBarButtonItem?.image =
  193. #imageLiteral(resourceName: "backIconBlack")
  194. self.navigationController?.navigationBar.tintColor = UIColor.black
  195. }
  196. private func showCountryPickerview() {
  197. let viewcontroller = UIStoryboard.init(name: "CountryPicker", bundle: nil).instantiateViewController(withIdentifier: "CountryPickerViewController") as! CountryPickerViewController
  198. viewcontroller.data = self.countries ?? []
  199. viewcontroller.doneAction = self.countrySelected
  200. viewcontroller.defaultSelectedData = [self.selectedCountry]
  201. viewcontroller.type = PickerTitle.country
  202. self.present(viewcontroller, animated: true, completion: nil)
  203. }
  204. private func getPickerViewController()-> ItemsPickerViewController {
  205. return UIStoryboard.init(name: "ItemsPicker", bundle: nil).instantiateViewController(withIdentifier: "ItemsPickerViewController") as! ItemsPickerViewController
  206. }
  207. private func showProviencePickerview() {
  208. let viewcontroller = self.getPickerViewController()
  209. let proviences = self.selectedCountry?.proviences ?? []
  210. let names = proviences.compactMap({$0.name})
  211. viewcontroller.data = names
  212. viewcontroller.type = PickerTitle.state
  213. viewcontroller.doneAction = self.provienceSelected
  214. viewcontroller.defaultSelectedData = [self.selectedProvience?.name ?? ""]
  215. self.present(viewcontroller, animated: true, completion: nil)
  216. }
  217. private func showDistrictPickerview() {
  218. let viewcontroller = self.getPickerViewController()
  219. let districts = self.selectedProvience?.districts ?? []
  220. let names = districts.compactMap({$0.name})
  221. viewcontroller.data = names
  222. viewcontroller.type = PickerTitle.district
  223. viewcontroller.doneAction = self.districtSelected
  224. viewcontroller.defaultSelectedData = [self.selectedDistrict?.name ?? ""]
  225. self.present(viewcontroller, animated: true, completion: nil)
  226. }
  227. private func showRelationPickerView() {
  228. let viewcontroller = self.getPickerViewController()
  229. let relations = self.relations ?? []
  230. let names = relations.compactMap({$0.title})
  231. viewcontroller.data = names
  232. viewcontroller.type = PickerTitle.relation
  233. viewcontroller.doneAction = self.relationSelected
  234. viewcontroller.defaultSelectedData = [self.selectedRelation?.title ?? ""]
  235. self.present(viewcontroller, animated: true, completion: nil)
  236. }
  237. private func showTransferReasonPickerView() {
  238. let viewcontroller = self.getPickerViewController()
  239. let transferReasons = self.transferReasons ?? []
  240. let names = transferReasons.compactMap({$0.title})
  241. viewcontroller.data = names
  242. viewcontroller.type = PickerTitle.transferReasons
  243. viewcontroller.doneAction = self.transferReasonSelected
  244. viewcontroller.defaultSelectedData = [self.selectedTransferReason?.title ?? ""]
  245. self.present(viewcontroller, animated: true, completion: nil)
  246. }
  247. func transferReasonSelected(reasons: [String]) {
  248. let _reason = self.transferReasons?.filter({($0.title ?? "") == (reasons.first ?? "") }).first
  249. self.selectedTransferReason = _reason
  250. }
  251. func relationSelected(relations: [String]) {
  252. let _relations = self.relations?.filter({($0.title ?? "") == (relations.first ?? "") }).first
  253. self.selectedRelation = _relations
  254. }
  255. func districtSelected(district: [String]) {
  256. let _district = (self.selectedProvience?.districts ?? []).filter({
  257. ( $0.name ?? "" ) == ( district.first ?? "" )
  258. }).first
  259. self.selectedDistrict = _district
  260. }
  261. func provienceSelected(provience: [String]) {
  262. let _provience = (self.selectedCountry?.proviences ?? []).filter({
  263. ($0.name ?? "") == (provience.first ?? "")
  264. })
  265. self.selectedProvience = _provience.first
  266. }
  267. func countrySelected(models: [SendMoneyCountryViewModel]) {
  268. self.selectedCountry = models.first
  269. }
  270. func showLoading() {
  271. self.showProgressHud()
  272. }
  273. func hideLoading() {
  274. self.hideProgressHud()
  275. }
  276. func show(error: String) {
  277. self.alert(message: error)
  278. }
  279. }
  280. // MARK: AddReciepientViewInterface
  281. extension AddReciepientViewController: AddReciepientViewInterface {
  282. func show(countries: [SendMoneyCountryViewModel]) {
  283. self.countries = countries
  284. }
  285. func show(transferReasons: [SendMoneyTransferReasonViewModel]) {
  286. self.transferReasons = transferReasons
  287. }
  288. func show(relations: [SendMoneyRelationViewModel]) {
  289. self.relations = relations
  290. }
  291. }
  292. extension AddReciepientViewController: UITextFieldDelegate {
  293. func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
  294. switch textField {
  295. case countryTextField:
  296. showCountryPickerview()
  297. return false
  298. case stateProvinceTextField:
  299. self.showProviencePickerview()
  300. return false
  301. case districtTextField:
  302. self.showDistrictPickerview()
  303. return false
  304. case relationTextField:
  305. self.showRelationPickerView()
  306. return false
  307. case transferReasonTextField:
  308. self.showTransferReasonPickerView()
  309. return false
  310. default:
  311. return true
  312. }
  313. }
  314. }