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.

429 lines
16 KiB

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