From 21240092d7236e3b428ed117880897d4d3abc53c Mon Sep 17 00:00:00 2001 From: gme_2 Date: Tue, 28 Aug 2018 11:01:56 +0900 Subject: [PATCH] reciepient converted to viewmodelc --- .../Interactor/EditReciepientInteractor.swift | 23 +- .../EditReciepientInteractorIO.swift | 8 +- .../Service/EditReciepientServiceType.swift | 2 +- .../EditReciepientModuleInterface.swift | 3 +- .../Presenter/EditReciepientPresenter.swift | 125 +++++- .../View/EditReciepient.storyboard | 371 +++++++++++++++++- .../View/EditReciepientViewController.swift | 250 +++++++++++- .../View/EditReciepientViewInterface.swift | 8 +- .../Wireframe/EditReciepientWireframe.swift | 10 +- .../RecipientListViewController.swift | 1 + 10 files changed, 776 insertions(+), 25 deletions(-) diff --git a/GMERemittance/Module/EditReciepient/Application Logic/Interactor/EditReciepientInteractor.swift b/GMERemittance/Module/EditReciepient/Application Logic/Interactor/EditReciepientInteractor.swift index 3ccf8d40..f6f36c0f 100644 --- a/GMERemittance/Module/EditReciepient/Application Logic/Interactor/EditReciepientInteractor.swift +++ b/GMERemittance/Module/EditReciepient/Application Logic/Interactor/EditReciepientInteractor.swift @@ -14,18 +14,37 @@ class EditReciepientInteractor { weak var output: EditReciepientInteractorOutput? private let service: EditReciepientServiceType - + var reciepient: Recipient // MARK: Initialization - init(service: EditReciepientServiceType) { + init(service: EditReciepientServiceType, reciepient: Recipient) { self.service = service + self.reciepient = reciepient } // MARK: Converting entities + } // MARK: EditReciepient interactor input interface extension EditReciepientInteractor: EditReciepientInteractorInput { + func viewIsReady() { + self.output?.show(recipient: self.reciepient) + self.service.fetch(success: { (model) in + self.output?.show(model: model) + }) { (error) in + self.output?.show(error: error) + } + } + func save(reciepient: Recipient) { + let defaults = UserDefaults.standard + let myUsername = defaults.string(forKey: "com.gmeremit.username") ?? "" + self.service.save(model: reciepient.serialize(), username: myUsername, success: { (reciepient) in + self.output?.success() + }) { (error) in + self.output?.show(error: error) + } + } } diff --git a/GMERemittance/Module/EditReciepient/Application Logic/Interactor/EditReciepientInteractorIO.swift b/GMERemittance/Module/EditReciepient/Application Logic/Interactor/EditReciepientInteractorIO.swift index f89306eb..e60cae02 100644 --- a/GMERemittance/Module/EditReciepient/Application Logic/Interactor/EditReciepientInteractorIO.swift +++ b/GMERemittance/Module/EditReciepient/Application Logic/Interactor/EditReciepientInteractorIO.swift @@ -7,9 +7,13 @@ // protocol EditReciepientInteractorInput: class { - + func viewIsReady() + func save(reciepient: Recipient) } protocol EditReciepientInteractorOutput: class { - + func show(error: Error) + func show(model: SendMoneyModel?) + func success() + func show(recipient: Recipient) } diff --git a/GMERemittance/Module/EditReciepient/Application Logic/Service/EditReciepientServiceType.swift b/GMERemittance/Module/EditReciepient/Application Logic/Service/EditReciepientServiceType.swift index 91f3c32b..99c9dfc4 100644 --- a/GMERemittance/Module/EditReciepient/Application Logic/Service/EditReciepientServiceType.swift +++ b/GMERemittance/Module/EditReciepient/Application Logic/Service/EditReciepientServiceType.swift @@ -8,6 +8,6 @@ import Foundation -protocol EditReciepientServiceType: class { +protocol EditReciepientServiceType: class, FetchSendMoneyInformation, SaveReciepientService { } diff --git a/GMERemittance/Module/EditReciepient/Module Interface/EditReciepientModuleInterface.swift b/GMERemittance/Module/EditReciepient/Module Interface/EditReciepientModuleInterface.swift index fd395e97..25b6ec7a 100644 --- a/GMERemittance/Module/EditReciepient/Module Interface/EditReciepientModuleInterface.swift +++ b/GMERemittance/Module/EditReciepient/Module Interface/EditReciepientModuleInterface.swift @@ -7,5 +7,6 @@ // protocol EditReciepientModuleInterface: class { - + func viewIsReady() + func save(model: ReceipientViewModel) } diff --git a/GMERemittance/Module/EditReciepient/User Interface/Presenter/EditReciepientPresenter.swift b/GMERemittance/Module/EditReciepient/User Interface/Presenter/EditReciepientPresenter.swift index 17f1f1bd..0338405a 100644 --- a/GMERemittance/Module/EditReciepient/User Interface/Presenter/EditReciepientPresenter.swift +++ b/GMERemittance/Module/EditReciepient/User Interface/Presenter/EditReciepientPresenter.swift @@ -10,23 +10,146 @@ import Foundation class EditReciepientPresenter { - // MARK: Properties + // MARK: Properties + + var transferReasons: [TransferReason] = [] + var relations: [Relation] = [] + var countries: [CountryModel] = [] + weak var view: EditReciepientViewInterface? var interactor: EditReciepientInteractorInput? var wireframe: EditReciepientWireframeInput? // MARK: Converting entities + + func convert(models: [CountryModel]) { + let viewmodels: [SendMoneyCountryViewModel] = models.map({ + let viewmodel = SendMoneyCountryViewModel() + viewmodel.name = $0.name + viewmodel.code = $0.code + viewmodel.id = $0.id + viewmodel.proviencesRequired = $0.provienceRequired + viewmodel.proviences = self.convert(models: $0.proviences ?? []) + return viewmodel + }) + self.view?.show(countries: viewmodels) + } + + func convert(models: [Provience]) -> [SendMoneyProvienceViewModel] { + return models.map({ + var viewmodel = SendMoneyProvienceViewModel() + viewmodel.name = $0.name + viewmodel.id = $0.id + viewmodel.districts = self.convert(models: $0.districts ?? []) + return viewmodel + }) + } + + func convert(models: [District]) -> [SendMoneyDistrictViewModel] { + let viewmodels: [SendMoneyDistrictViewModel] = models.map({ + let viewmodel = SendMoneyDistrictViewModel() + viewmodel.name = $0.name + viewmodel.id = $0.id + return viewmodel + }) + return viewmodels + } + + func convert(models: [TransferReason]) { + let viewmodels: [SendMoneyTransferReasonViewModel] = models.map({ + var viewmodel = SendMoneyTransferReasonViewModel() + viewmodel.title = $0.title + viewmodel.id = $0.id + return viewmodel + }) + + self.view?.show(transferReasons: viewmodels) + } + + func convert(models: [Relation]) { + let viewmodels: [SendMoneyRelationViewModel] = models.map({ + var viemodel = SendMoneyRelationViewModel() + viemodel.title = $0.title + viemodel.id = $0.id + return viemodel + }) + self.view?.show(relations: viewmodels) + } + + func convert(model: ReceipientViewModel) { + var reciepient = Recipient() + reciepient.firstName = model.firstName + reciepient.middleName = model.middleName + reciepient.lastName = model.lastName + reciepient.countryId = model.countryId + reciepient.stateId = model.stateId + reciepient.districtId = model.districtId + reciepient.address = model.address + reciepient.relationId = model.relationId + reciepient.reasonId = model.reasonId + reciepient.mobileNumber = model.mobileNumber + reciepient.email = model.email + self.interactor?.save(reciepient: reciepient) + } + + func convert(model: Recipient) { + let reciepient = ReceipientViewModel() + reciepient.id = model.recipientId + reciepient.firstName = model.firstName + reciepient.middleName = model.middleName + reciepient.lastName = model.lastName + reciepient.countryId = model.countryId + reciepient.stateId = model.stateId + reciepient.districtId = model.districtId + reciepient.address = model.address + reciepient.relationId = model.relationId + reciepient.reasonId = model.reasonId + reciepient.mobileNumber = model.mobileNumber + reciepient.email = model.email + self.view?.show(recipient: reciepient) + } } // MARK: EditReciepient module interface extension EditReciepientPresenter: EditReciepientModuleInterface { + func viewIsReady() { + self.view?.showLoading() + self.interactor?.viewIsReady() + } + func save(model: ReceipientViewModel) { + self.convert(model: model) + } } // MARK: EditReciepient interactor output interface extension EditReciepientPresenter: EditReciepientInteractorOutput { + func show(model: SendMoneyModel?) { + self.transferReasons = model?.transferReasons ?? [] + self.relations = model?.relations ?? [] + self.countries = model?.countries ?? [] + self.view?.hideLoading() + + self.convert(models: self.countries) + self.convert(models: self.transferReasons) + self.convert(models: self.relations) + + } + + func show(error: Error) { + self.view?.hideLoading() + self.view?.show(error: error.localizedDescription) + } + + func success() { + print("successfully added") +// self.wireframe?.dismiss() + } + func show(recipient: Recipient) { + + } } diff --git a/GMERemittance/Module/EditReciepient/User Interface/View/EditReciepient.storyboard b/GMERemittance/Module/EditReciepient/User Interface/View/EditReciepient.storyboard index 98a911a3..ddfaf6ea 100644 --- a/GMERemittance/Module/EditReciepient/User Interface/View/EditReciepient.storyboard +++ b/GMERemittance/Module/EditReciepient/User Interface/View/EditReciepient.storyboard @@ -1,30 +1,373 @@ - + - + + + + + + SanFranciscoDisplay-Regular + + + SanFranciscoText-Regular + + - - + + - - - - - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + diff --git a/GMERemittance/Module/EditReciepient/User Interface/View/EditReciepientViewController.swift b/GMERemittance/Module/EditReciepient/User Interface/View/EditReciepientViewController.swift index 7ac754b7..21b1460e 100644 --- a/GMERemittance/Module/EditReciepient/User Interface/View/EditReciepientViewController.swift +++ b/GMERemittance/Module/EditReciepient/User Interface/View/EditReciepientViewController.swift @@ -10,29 +10,277 @@ import UIKit class EditReciepientViewController: UIViewController { + // MARK: IBOutlets + @IBOutlet weak var firstNameTextField: UITextField! + @IBOutlet weak var middleNameTextField: UITextField! + @IBOutlet weak var lastNameTextField: UITextField! + @IBOutlet weak var countryTextField: UITextField! + @IBOutlet weak var stateProvinceTextField: UITextField! + @IBOutlet weak var districtTextField: UITextField! + @IBOutlet weak var addressTextField: UITextField! + @IBOutlet weak var relationTextField: UITextField! + @IBOutlet weak var mobileTextField: UITextField! + @IBOutlet weak var emailTextField: UITextField! + @IBOutlet weak var transferReasonTextField: UITextField! + @IBOutlet weak var saveButton: UIButton! + @IBOutlet weak var provienceStackView: UIStackView! + @IBOutlet weak var districtStackView: UIStackView! + + // MARK: Properties var presenter: EditReciepientModuleInterface? + var countries: [SendMoneyCountryViewModel]? + var transferReasons: [SendMoneyTransferReasonViewModel]? + var relations: [SendMoneyRelationViewModel]? + var reciepient: ReceipientViewModel? - // MARK: IBOutlets + + var selectedCountry: SendMoneyCountryViewModel? { + didSet { + self.countryTextField.text = selectedCountry?.name + let shouldShowProvienceField = (selectedCountry?.proviencesRequired ?? "" ) == "true" + self.provienceStackView.isHidden = !shouldShowProvienceField + self.districtStackView.isHidden = !shouldShowProvienceField + self.reciepient?.countryId = self.selectedCountry?.id + } + } + + var selectedProvience: SendMoneyProvienceViewModel? { + didSet { + self.stateProvinceTextField.text = selectedProvience?.name + self.reciepient?.stateId = self.selectedProvience?.id + } + } + + var selectedDistrict: SendMoneyDistrictViewModel? { + didSet { + self.districtTextField.text = selectedDistrict?.name + self.reciepient?.districtId = self.selectedDistrict?.id + } + } + + var selectedRelation: SendMoneyRelationViewModel? { + didSet { + self.relationTextField.text = selectedRelation?.title + self.reciepient?.relationId = self.selectedRelation?.id + } + } + + var selectedTransferReason: SendMoneyTransferReasonViewModel? { + didSet { + self.transferReasonTextField.text = selectedTransferReason?.title + self.reciepient?.reasonId = selectedTransferReason?.id + } + } // MARK: VC's Life cycle override func viewDidLoad() { super.viewDidLoad() self.setup() + self.setup() + self.setupDelegates() + self.setupTargets() + self.populateInformations() } // MARK: IBActions // MARK: Other Functions + private func setup() { // all setup should be done here + self.setupNavigation() + self.configureView() + } + + private func configureView() { + self.provienceStackView.isHidden = true + self.districtStackView.isHidden = true + } + + private func setupDelegates() { + self.countryTextField.delegate = self + self.stateProvinceTextField.delegate = self + self.districtTextField.delegate = self + self.relationTextField.delegate = self + self.transferReasonTextField.delegate = self + } + + private func setupTargets() { + [firstNameTextField, middleNameTextField, lastNameTextField, countryTextField, stateProvinceTextField, districtTextField, addressTextField, relationTextField, mobileTextField, emailTextField, transferReasonTextField].forEach({ + $0?.addTarget(self, action: #selector(self.textFieldChanged(sender:)), for: UIControlEvents.editingChanged) + }) + } + + @objc private func textFieldChanged(sender: UITextField) { + switch sender { + case firstNameTextField: + self.reciepient?.firstName = firstNameTextField.text! + case middleNameTextField: + self.reciepient?.middleName = middleNameTextField.text! + case lastNameTextField: + self.reciepient?.lastName = lastNameTextField.text! + case addressTextField: + self.reciepient?.address = addressTextField.text! + case mobileTextField: + self.reciepient?.mobileNumber = mobileTextField.text! + case emailTextField: + self.reciepient?.email = emailTextField.text! + default: + break + } + } + + private func populateInformations() { + print(self.reciepient?.firstName) + } + + private func setupNavigation() { + self.navigationItem.backBarButtonItem?.image = + #imageLiteral(resourceName: "backIconBlack") + self.navigationController?.navigationBar.tintColor = UIColor.black + } + + private func showCountryPickerview() { + let viewcontroller = UIStoryboard.init(name: "CountryPicker", bundle: nil).instantiateViewController(withIdentifier: "CountryPickerViewController") as! CountryPickerViewController + viewcontroller.data = self.countries ?? [] + viewcontroller.doneAction = self.countrySelected + viewcontroller.defaultSelectedData = [self.selectedCountry] + viewcontroller.type = PickerTitle.country + self.present(viewcontroller, animated: true, completion: nil) + } + + private func getPickerViewController()-> ItemsPickerViewController { + return UIStoryboard.init(name: "ItemsPicker", bundle: nil).instantiateViewController(withIdentifier: "ItemsPickerViewController") as! ItemsPickerViewController + } + + private func showProviencePickerview() { + let viewcontroller = self.getPickerViewController() + let proviences = self.selectedCountry?.proviences ?? [] + let names = proviences.compactMap({$0.name}) + viewcontroller.data = names + viewcontroller.type = PickerTitle.state + viewcontroller.doneAction = self.provienceSelected + viewcontroller.defaultSelectedData = [self.selectedProvience?.name ?? ""] + self.present(viewcontroller, animated: true, completion: nil) + } + + private func showDistrictPickerview() { + let viewcontroller = self.getPickerViewController() + let districts = self.selectedProvience?.districts ?? [] + let names = districts.compactMap({$0.name}) + viewcontroller.data = names + viewcontroller.type = PickerTitle.district + viewcontroller.doneAction = self.districtSelected + viewcontroller.defaultSelectedData = [self.selectedDistrict?.name ?? ""] + self.present(viewcontroller, animated: true, completion: nil) + } + + private func showRelationPickerView() { + let viewcontroller = self.getPickerViewController() + let relations = self.relations ?? [] + let names = relations.compactMap({$0.title}) + viewcontroller.data = names + viewcontroller.type = PickerTitle.relation + viewcontroller.doneAction = self.relationSelected + viewcontroller.defaultSelectedData = [self.selectedRelation?.title ?? ""] + self.present(viewcontroller, animated: true, completion: nil) + } + + private func showTransferReasonPickerView() { + let viewcontroller = self.getPickerViewController() + let transferReasons = self.transferReasons ?? [] + let names = transferReasons.compactMap({$0.title}) + viewcontroller.data = names + viewcontroller.type = PickerTitle.transferReasons + viewcontroller.doneAction = self.transferReasonSelected + viewcontroller.defaultSelectedData = [self.selectedTransferReason?.title ?? ""] + self.present(viewcontroller, animated: true, completion: nil) + } + + func transferReasonSelected(reasons: [String]) { + let _reason = self.transferReasons?.filter({($0.title ?? "") == (reasons.first ?? "") }).first + self.selectedTransferReason = _reason + } + + func relationSelected(relations: [String]) { + let _relations = self.relations?.filter({($0.title ?? "") == (relations.first ?? "") }).first + self.selectedRelation = _relations + } + + func districtSelected(district: [String]) { + let _district = (self.selectedProvience?.districts ?? []).filter({ + ( $0.name ?? "" ) == ( district.first ?? "" ) + }).first + self.selectedDistrict = _district + + } + + func provienceSelected(provience: [String]) { + let _provience = (self.selectedCountry?.proviences ?? []).filter({ + ($0.name ?? "") == (provience.first ?? "") + }) + self.selectedProvience = _provience.first + } + + func countrySelected(models: [SendMoneyCountryViewModel]) { + self.selectedCountry = models.first } + + func showLoading() { + self.showProgressHud() + } + + func hideLoading() { + self.hideProgressHud() + } + + func show(error: String) { + self.alert(message: error) + } + + + } // MARK: EditReciepientViewInterface extension EditReciepientViewController: EditReciepientViewInterface { + func show(countries: [SendMoneyCountryViewModel]) { + self.countries = countries + } + + func show(transferReasons: [SendMoneyTransferReasonViewModel]) { + self.transferReasons = transferReasons + } + func show(relations: [SendMoneyRelationViewModel]) { + self.relations = relations + } +} + +extension EditReciepientViewController: UITextFieldDelegate { + func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { + switch textField { + case countryTextField: + showCountryPickerview() + return false + case stateProvinceTextField: + self.showProviencePickerview() + return false + case districtTextField: + self.showDistrictPickerview() + return false + case relationTextField: + self.showRelationPickerView() + return false + case transferReasonTextField: + self.showTransferReasonPickerView() + return false + default: + return true + } + } } diff --git a/GMERemittance/Module/EditReciepient/User Interface/View/EditReciepientViewInterface.swift b/GMERemittance/Module/EditReciepient/User Interface/View/EditReciepientViewInterface.swift index 21ea4260..a3ed3beb 100644 --- a/GMERemittance/Module/EditReciepient/User Interface/View/EditReciepientViewInterface.swift +++ b/GMERemittance/Module/EditReciepient/User Interface/View/EditReciepientViewInterface.swift @@ -7,5 +7,11 @@ // protocol EditReciepientViewInterface: class { - + func show(error: String) + func show(countries: [SendMoneyCountryViewModel]) + func show(transferReasons: [SendMoneyTransferReasonViewModel]) + func show(relations: [SendMoneyRelationViewModel]) + func show(recipient: ReceipientViewModel) + func showLoading() + func hideLoading() } diff --git a/GMERemittance/Module/EditReciepient/User Interface/Wireframe/EditReciepientWireframe.swift b/GMERemittance/Module/EditReciepient/User Interface/Wireframe/EditReciepientWireframe.swift index 5cbe8d2a..2070e644 100644 --- a/GMERemittance/Module/EditReciepient/User Interface/Wireframe/EditReciepientWireframe.swift +++ b/GMERemittance/Module/EditReciepient/User Interface/Wireframe/EditReciepientWireframe.swift @@ -10,6 +10,7 @@ import UIKit class EditReciepientWireframe { weak var view: UIViewController! + var receipient: Recipient! } extension EditReciepientWireframe: EditReciepientWireframeInput { @@ -18,10 +19,10 @@ extension EditReciepientWireframe: EditReciepientWireframeInput { func getMainView() -> UIViewController { let service = EditReciepientService() - let interactor = EditReciepientInteractor(service: service) + let interactor = EditReciepientInteractor.init(service: service, reciepient: receipient) let presenter = EditReciepientPresenter() let viewController = viewControllerFromStoryboard(of: EditReciepientViewController.self) - + viewController.presenter = presenter interactor.output = presenter presenter.interactor = interactor @@ -31,4 +32,9 @@ extension EditReciepientWireframe: EditReciepientWireframeInput { self.view = viewController return viewController } + + func open(reciepient: Recipient) { + self.receipient = reciepient + } } + diff --git a/GMERemittance/Recipient/RecipientListViewController.swift b/GMERemittance/Recipient/RecipientListViewController.swift index b5c27945..59e64d4d 100644 --- a/GMERemittance/Recipient/RecipientListViewController.swift +++ b/GMERemittance/Recipient/RecipientListViewController.swift @@ -140,6 +140,7 @@ extension RecipientListViewController: UITableViewDelegate,UITableViewDataSource } let edit = UITableViewRowAction(style: .normal, title: "Edit") { (action, indexPath) in + let wireFrame = EditReciepientWireframe() }