Browse Source

AutoDebit refactored unnecessary code & changed code style base on raywenderlich-code-style

pull/1/head
james 5 years ago
parent
commit
ba61b69984
  1. 36
      GMERemittance/Module/AutoDebitModules/AutoDebit/Application Logic/Interactor/AutoDebitInteractor.swift
  2. 27
      GMERemittance/Module/AutoDebitModules/AutoDebit/Application Logic/Interactor/AutoDebitInteractorIO.swift
  3. 79
      GMERemittance/Module/AutoDebitModules/AutoDebit/Application Logic/Service/AutoDebitService.swift
  4. 29
      GMERemittance/Module/AutoDebitModules/AutoDebit/Application Logic/Service/AutoDebitServiceType.swift
  5. 16
      GMERemittance/Module/AutoDebitModules/AutoDebit/Module Interface/AutoDebitModuleInterface.swift
  6. 30
      GMERemittance/Module/AutoDebitModules/AutoDebit/User Interface/Presenter/AutoDebitPresenter.swift
  7. 9
      GMERemittance/Module/AutoDebitModules/AutoDebit/User Interface/View/AutoDebitTableViewCell.swift
  8. 224
      GMERemittance/Module/AutoDebitModules/AutoDebit/User Interface/View/AutoDebitViewController.swift
  9. 28
      GMERemittance/Module/AutoDebitModules/AutoDebit/User Interface/View/AutoDebitViewInterface.swift
  10. 4
      GMERemittance/Module/AutoDebitModules/AutoDebit/User Interface/Wireframe/AutoDebitWireframe.swift
  11. 8
      GMERemittance/Module/AutoDebitModules/AutoDebit/User Interface/Wireframe/AutoDebitWireframeInput.swift

36
GMERemittance/Module/AutoDebitModules/AutoDebit/Application Logic/Interactor/AutoDebitInteractor.swift

@ -27,5 +27,41 @@ class AutoDebitInteractor {
// MARK: AutoDebit interactor input interface
extension AutoDebitInteractor: AutoDebitInteractorInput {
func fetchKFTCBankAccountList() {
guard let email = UserDefaults.standard.string(forKey: UserKeys.email)
else {
return
}
self.service.fetchAccountList(
username: email,
success: { [weak self] in
guard let `self` = self else { return }
self.output?.setModel(with: $0)
},
failure: { [weak self] in
guard let `self` = self else { return }
self.output?.didFailSetModel(with: $0)
}
)
}
func deleteKFTCBankAccount(of username: String, with account: Account) {
self.service.deleteAccount(
username: username,
account: account,
success: {[weak self] in
guard let `self` = self else { return }
self.output?.didDeleteAccount()
},
failure: {[weak self] in
guard let `self` = self else { return }
self.output?.didFailDeleteAccount(with: $0)
}
)
}
}

27
GMERemittance/Module/AutoDebitModules/AutoDebit/Application Logic/Interactor/AutoDebitInteractorIO.swift

@ -8,8 +8,35 @@
protocol AutoDebitInteractorInput: class {
/// Fetch KFTC registerd bank account list
func fetchKFTCBankAccountList()
/// Delete selected bank account
///
/// - Parameters:
/// - username: customer name
/// - account: bank account
func deleteKFTCBankAccount(of username: String, with account: Account)
}
protocol AutoDebitInteractorOutput: class {
/// If did success delete KFTC bank account
func didDeleteAccount()
/// If did fail delete KFTC bank account
func didFailDeleteAccount(with error: Error)
/// Set KFTCModel
///
/// - Parameter model: KFTCModel
func setModel(with model: KFTCModel?)
/// If did fail fetch KFTC bank account list
///
/// - Parameter error: Error
func didFailSetModel(with error: Error)
}

79
GMERemittance/Module/AutoDebitModules/AutoDebit/Application Logic/Service/AutoDebitService.swift

@ -16,21 +16,21 @@ class AutoDebitService: AutoDebitServiceType {
// MARK: Initialization
// MARK: Data management
}
protocol FetchAccountList: ApiServiceType {
func fetchAccountList(username: String, success: @escaping (KFTCModel?) -> (), failure: @escaping (Error) -> ())
}
// kftc/GetKftcParameters/
extension FetchAccountList {
func fetchAccountList(username: String, success: @escaping (KFTCModel?) -> (), failure: @escaping (Error) -> ()) {
// MARK: Netword Service
func fetchAccountList(
username: String,
success: @escaping (KFTCModel?) -> Void,
failure: @escaping (Error) -> Void
) {
let url = baseUrl + "/kftc/GetKftcParameters/" + username
auth.request(method: .get, url: url, params: nil, encoding: URLEncoding.default, success: { (response: KftcAccountContainer) in
auth.request(
method: .get,
url: url,
params: nil,
encoding: URLEncoding.default,
success: { (response: KftcAccountContainer) in
if (response.errorCode ?? "") == "1" {
let error = NSError.init(domain: "Network", code: 0, userInfo: [NSLocalizedDescriptionKey : response.message ?? ""])
failure(error)
@ -38,54 +38,39 @@ extension FetchAccountList {
let model = response.data
success(model)
}
}) { (error) in
},
failure: { (error) in
failure(error)
}
)
}
}
//http://localhost:9500/api/v1/mobile/receiver/remove/sisir@mailinator.com/?receiverId=143313
protocol DeleteAccountService: ApiServiceType {
func deleteAccount(username: String, account: Account, success: @escaping () -> (), failure: @escaping (Error) -> ())
}
extension DeleteAccountService {
func deleteAccount(username: String, account: Account, success: @escaping () -> (), failure: @escaping (Error) -> ()) {
func deleteAccount(
username: String,
account: Account,
success: @escaping () -> Void,
failure: @escaping (Error) -> Void
) {
let url = baseUrl + "/kftc/DeleteAccount/\(username)"
let params =
[
"KftcLogId" : account.kftcLogId ?? ""
]
auth.request(method: .post, url: url, params: params, encoding: JSONEncoding.default, success: { (response: KftcAccountContainer) in
let params = ["KftcLogId" : account.kftcLogId ?? ""]
auth.request(
method: .post,
url: url,
params: params,
encoding: JSONEncoding.default,
success: { (response: KftcAccountContainer) in
if (response.errorCode ?? "") == "1" {
let error = NSError.init(domain: "Network", code: 0, userInfo: [NSLocalizedDescriptionKey : response.message ?? ""])
failure(error)
}else {
success()
}
}) { (error) in
},
failure:{ (error) in
failure(error)
}
)
}
}
protocol FetchKftcUrlService: ApiServiceType {
func fetchKftcUrlService(url: String, header: [String: String], success: @escaping (String?) -> (), failure: @escaping (Error) -> ())
}
extension FetchKftcUrlService {
func fetchKftcUrlService(url: String, header: [String: String], success: @escaping (String?) -> (), failure: @escaping (Error) -> ()) {
auth.kftcRequest(method: .get, header: header, url: url, params: nil, encoding: URLEncoding.default, success: { (response: KFTCURL) in
success(response.value)
}) { (error) in
failure(error)
}
}
}

29
GMERemittance/Module/AutoDebitModules/AutoDebit/Application Logic/Service/AutoDebitServiceType.swift

@ -6,8 +6,33 @@
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
protocol AutoDebitServiceType: class, ApiServiceType {
protocol AutoDebitServiceType: class {
/// Fetch KFTC registerd bank account list
///
/// - Parameters:
/// - username: customer name
/// - success: KFTCModel? -> Void
/// - failure: Error -> Void
/// - Returns: Void
func fetchAccountList(
username: String,
success: @escaping (KFTCModel?) -> Void,
failure: @escaping (Error) -> Void
)
/// Delete selected row's KFTC bank account
///
/// - Parameters:
/// - username: customer name
/// - account: bank account for delete
/// - success: () -> Void
/// - failure: Error -> Void
func deleteAccount(
username: String,
account: Account,
success: @escaping () -> Void,
failure: @escaping (Error) -> Void
)
}

16
GMERemittance/Module/AutoDebitModules/AutoDebit/Module Interface/AutoDebitModuleInterface.swift

@ -7,5 +7,21 @@
//
protocol AutoDebitModuleInterface: class {
/// Fetch KFTC registed bank account list
func fetchKFTCBankAccountList()
/// Delete selected KFTC bank account
///
/// - Parameters:
/// - username: customer name
/// - account: bank account for delete
func deleteKFTCBankAccount(of username: String, with account: Account)
/// Present AddAccount ViewController in front of these ViewController
///
/// - Parameter model: KFTCModel
func goAddAccount(model: KFTCModel?)
}

30
GMERemittance/Module/AutoDebitModules/AutoDebit/User Interface/Presenter/AutoDebitPresenter.swift

@ -22,13 +22,41 @@ class AutoDebitPresenter {
// MARK: AutoDebit module interface
extension AutoDebitPresenter: AutoDebitModuleInterface {
func fetchKFTCBankAccountList() {
view?.startLoading()
interactor?.fetchKFTCBankAccountList()
}
func deleteKFTCBankAccount(of username: String, with account: Account) {
view?.startLoading()
interactor?.deleteKFTCBankAccount(of: username, with: account)
}
func goAddAccount(model: KFTCModel?){
self.wireframe?.goAddAccountViewController(model: model)
wireframe?.goAddAccountViewController(with: model)
}
}
// MARK: AutoDebit interactor output interface
extension AutoDebitPresenter: AutoDebitInteractorOutput {
func setModel(with model: KFTCModel?) {
view?.endLoading()
view?.setModel(with: model)
}
func didFailSetModel(with error: Error) {
view?.endLoading()
view?.didFailSetModel(with: error)
}
func didDeleteAccount(){
view?.endLoading()
view?.didDeleteAccount()
}
func didFailDeleteAccount(with error: Error){
view?.endLoading()
view?.didFailDeleteAccount(with: error)
}
}

9
GMERemittance/Module/AutoDebitModules/AutoDebit/User Interface/View/AutoDebitTableViewCell.swift

@ -12,14 +12,7 @@ class AutoDebitTableViewCell: UITableViewCell {
@IBOutlet weak var labelRecipientName: UILabel!
@IBOutlet weak var accountNumnerLabel: UILabel!
var model: Account?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
func setup() {
func setup(with model: Account?) {
let name = model?.bankName
labelRecipientName.text = name
accountNumnerLabel.text = model?.accountNumMasked

224
GMERemittance/Module/AutoDebitModules/AutoDebit/User Interface/View/AutoDebitViewController.swift

@ -10,7 +10,7 @@ import UIKit
class AutoDebitViewController: UIViewController {
struct StringConstants {
struct MultiLanguages {
let navigationTitle = "auto_debit_title_text".localized()
let languageUnavailableError = "no_lanugages_available_text".localized()
let pickerTitle = "select_language_text".localized()
@ -24,186 +24,176 @@ class AutoDebitViewController: UIViewController {
}
// MARK:- IBOutlets
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var viewAddAccount: UIView! // this is the view that contains add reciepient. should be header
@IBOutlet weak var labelSwipeInfo: UILabel!
@IBOutlet private weak var tableView: UITableView!
@IBOutlet private weak var viewAddAccount: UIView!
@IBOutlet private weak var labelSwipeInfo: UILabel!
@IBOutlet private weak var addAccountLabel: UILabel!
@IBOutlet weak var addAccountLabel: UILabel!
var presenter: AutoDebitPresenter?
// MARK:- properties
var kftcDetail: KFTCModel? {
didSet {
self.accounts = kftcDetail?.model ?? []
self.languages = kftcDetail?.languages
self.header = kftcDetail?.header
self.url = kftcDetail?.url
self.tableView.reloadData()
}
}
var accounts: [Account]? {
var presenter: AutoDebitPresenter?
private var kftcDetail: KFTCModel? {
didSet {
if (accounts ?? []).isEmpty {
}else {
self.tableView.isHidden = false
self.labelSwipeInfo.isHidden = false
}
accounts = kftcDetail?.model
tableView.reloadData()
}
}
var languages: [KftcLanguage]?
var header: [KftcHeader]?
var url: String?
var selectedLanguage: KftcLanguage? {
private var accounts: [Account]? {
didSet {
if var url = self.url {
let string = "&lang=\(selectedLanguage?.key ?? "")"
url.append(string)
var _header: [String: String] = [:]
self.header?.forEach({ (header) in
_header[header.key ?? ""] = header.value ?? ""
})
self.showProgressHud()
self.fetchKftcUrlService(url: url, header: _header , success: { (location) in
guard var location = location else {
self.hideProgressHud()
print("cannot get location from server")
guard
let account = accounts,
!account.isEmpty
else {
return
}
location = location.components(separatedBy: .whitespaces).joined()
self.hideProgressHud()
self.openWkWebViewWith(url: location)
}) { (error) in
self.alert(message: error.localizedDescription)
}
}
tableView.isHidden = false
labelSwipeInfo.isHidden = false
}
}
private let multiLanguages = MultiLanguages()
// MARK:- Life Cycle
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setupNormalNavigation()
self.navigationItem.title = StringConstants().navigationTitle
fetchReceipients()
setupNormalNavigation()
navigationItem.title = multiLanguages.navigationTitle
presenter?.fetchKFTCBankAccountList()
}
override func viewDidLoad() {
super.viewDidLoad()
self.setupDelegates()
setupDelegates()
viewAddAccount.layer.cornerRadius = 10
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// self.title = ""
self.navigationItem.title = ""
navigationItem.title = ""
}
private func openWkWebViewWith(url: String) {
let viewcontroller = UIStoryboard.init(name: "WKWebView", bundle: nil).instantiateViewController(withIdentifier: "WkWebViewController") as! WkWebViewController
viewcontroller.url = url
viewcontroller.headers = self.header
let nvc = UINavigationController.init(rootViewController: viewcontroller)
self.present(nvc, animated: true, completion: nil)
}
// MARK:- IBAction
@IBAction func loadMoreAction(_ sender: Any) {
}
@IBAction func addNewAccount(_ sender: UITapGestureRecognizer) {
if (self.languages ?? []).isEmpty {
self.alert(message: StringConstants().languageUnavailableError)
}
showLanguageSelection()
@IBAction
private func addNewAccount(_ sender: UITapGestureRecognizer) {
presenter?.goAddAccount(model: kftcDetail)
}
// MARK:- other functions
private func setupDelegates() {
self.tableView.delegate = self
self.tableView.dataSource = self
tableView.delegate = self
tableView.dataSource = self
configureText()
}
private func configureText() {
self.addAccountLabel.text = StringConstants().addAccountText
self.labelSwipeInfo.text = StringConstants().swipeInfoText
}
private func showLanguageSelection() {
//TODO: addAccount presenter
self.presenter?.goAddAccount(model: self.kftcDetail)
addAccountLabel.text = multiLanguages.addAccountText
labelSwipeInfo.text = multiLanguages.swipeInfoText
}
}
extension AutoDebitViewController: UITableViewDelegate,UITableViewDataSource {
// MARK: - UITableViewDataSource
extension AutoDebitViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 120.0
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.accounts?.count ?? 0
return accounts?.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "AutoDebitTableViewCell", for: indexPath) as! AutoDebitTableViewCell
cell.model = self.accounts?.elementAt(index: indexPath.row)
cell.setup()
let cell = tableView.dequeueReusableCell(
withIdentifier: "AutoDebitTableViewCell",
for: indexPath
) as! AutoDebitTableViewCell
cell.setup(with: accounts?.elementAt(index: indexPath.row))
return cell
}
}
// MARK: - UITableViewDelegate
extension AutoDebitViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let delete = UITableViewRowAction(style: .destructive, title: StringConstants().deleteText) { (action, indexPath) in
self.alertWithOkCancel(message: StringConstants().deleteTitleText, title: StringConstants().confirmationText, okTitle: StringConstants().deleteText ,OkStyle: UIAlertActionStyle.destructive, okAction: {
let defaults = UserDefaults.standard
let myUsername = defaults.string(forKey: "com.gmeremit.username") ?? ""
self.showProgressHud()
if let account = self.accounts?.elementAt(index: indexPath.row) {
self.deleteAccount(username: myUsername, account: account, success: {
self.fetchReceipients()
}, failure: { (error) in
self.hideProgressHud()
self.alert(message: error.localizedDescription)
})
self.showProgressHud()
}
})
}
delete.backgroundColor = UIColor.init(hex: "DE333C")
return [delete]
}
let delete = UITableViewRowAction(
style: .destructive,
title: multiLanguages.deleteText
) { [weak self] (action, indexPath) in
guard let `self` = self else { return }
self.alertWithOkCancel(
message: self.multiLanguages.deleteTitleText,
title: self.multiLanguages.confirmationText,
okTitle: self.multiLanguages.deleteText,
OkStyle: UIAlertActionStyle.destructive,
okAction: { [weak self] in
guard let `self` = self else { return }
func fetchReceipients() {
self.showProgressHud()
let defaults = UserDefaults.standard
let myUsername = defaults.string(forKey: UserKeys.email) ?? ""
self.fetchAccountList(username: myUsername, success: { (kftc) in
self.hideProgressHud()
self.kftcDetail = kftc
}) { (error) in
self.hideProgressHud()
self.alert(message: error.localizedDescription)
let email = UserDefaults
.standard
.string(forKey: "com.gmeremit.username") ?? ""
guard let account = self.accounts?.elementAt(index: indexPath.row) else { return }
self.presenter?.deleteKFTCBankAccount(of: email, with: account)
}
)
}
private func showAddNewReciepientViewController() {
let viewcontroller = AddReciepientWireframe().getMainView()
self.navigationController?.pushViewController(viewcontroller, animated: true)
delete.backgroundColor = UIColor.init(hex: "DE333C")
return [delete]
}
}
extension AutoDebitViewController: FetchAccountList, DeleteAccountService {
}
// MARK: - AutoDebitViewInterface
extension AutoDebitViewController: AutoDebitViewInterface {
func didDeleteAccount() {
presenter?.fetchKFTCBankAccountList()
}
}
func didFailDeleteAccount(with error: Error) {
alert(
message: error.localizedDescription,
title: "Failed Delete",
okAction: nil
)
}
extension AutoDebitViewController: FetchKftcUrlService {
func startLoading() {
showProgressHud()
}
func endLoading() {
hideProgressHud()
}
func setModel(with model: KFTCModel?){
kftcDetail = model
}
func didFailSetModel(with error: Error) {
alert(
message: error.localizedDescription,
title: "Failed Fetch KFTC Account List",
okAction: nil
)
}
}

28
GMERemittance/Module/AutoDebitModules/AutoDebit/User Interface/View/AutoDebitViewInterface.swift

@ -8,4 +8,32 @@
protocol AutoDebitViewInterface: class {
/// Set KFTCModel
///
/// - Parameter model: KFTCModel
func setModel(with model: KFTCModel?)
/// If did fail fetch KFTC bank account list
///
/// - Parameter error: Error
func didFailSetModel(with error: Error)
/// If did success delete KFTC bank account
func didDeleteAccount()
/// If did fail delete KFTC bank account
///
/// - Parameter error: Error
func didFailDeleteAccount(with error: Error)
/// Start ActivityIndicator
func startLoading()
/// Stop ActivityIndicator
func endLoading()
}

4
GMERemittance/Module/AutoDebitModules/AutoDebit/User Interface/Wireframe/AutoDebitWireframe.swift

@ -32,7 +32,7 @@ extension AutoDebitWireframe: AutoDebitWireframeInput {
return viewController
}
func goAddAccountViewController(model: KFTCModel?) {
AddAccountWireframe().openPushMainView(with: model, source: self.view)
func goAddAccountViewController(with model: KFTCModel?) {
AddAccountWireframe().openPushMainView(with: model, source: view)
}
}

8
GMERemittance/Module/AutoDebitModules/AutoDebit/User Interface/Wireframe/AutoDebitWireframeInput.swift

@ -6,8 +6,10 @@
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
protocol AutoDebitWireframeInput: WireframeInput {
func goAddAccountViewController(model: KFTCModel?)
/// Present AddAccount ViewController in front of these ViewController
///
/// - Parameter model: KFTCModel
func goAddAccountViewController(with model: KFTCModel?)
}
Loading…
Cancel
Save