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.

410 lines
16 KiB

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