Browse Source

redesign AutoDebitModule UI

pull/1/head
james 5 years ago
parent
commit
fa0e28614b
  1. 109
      GMERemittance/Module/AutoDebitModules/AddAccount/Application Logic/Interactor/AddAccountInteractor.swift
  2. 26
      GMERemittance/Module/AutoDebitModules/AddAccount/Application Logic/Interactor/AddAccountInteractorIO.swift
  3. 56
      GMERemittance/Module/AutoDebitModules/AddAccount/Application Logic/Model/KFTCBankList.swift
  4. 134
      GMERemittance/Module/AutoDebitModules/AddAccount/Application Logic/Service/AddAccountService.swift
  5. 30
      GMERemittance/Module/AutoDebitModules/AddAccount/Application Logic/Service/AddAccountServiceType.swift
  6. 144
      GMERemittance/Module/AutoDebitModules/AddAccount/User Interface/Presenter/AddAccountPresenter.swift
  7. 14
      GMERemittance/Module/AutoDebitModules/AddAccount/User Interface/View/AddAccount.storyboard
  8. 432
      GMERemittance/Module/AutoDebitModules/AddAccount/User Interface/View/AddAccountViewController.swift
  9. 18
      GMERemittance/Module/AutoDebitModules/AddAccount/User Interface/View/AddAccountViewInterface.swift
  10. 64
      GMERemittance/Module/AutoDebitModules/AddAccount/User Interface/Wireframe/AddAccountWireframe.swift
  11. 4
      GMERemittance/Module/AutoDebitModules/AddAccount/User Interface/Wireframe/AddAccountWireframeInput.swift
  12. 4
      GMERemittance/Module/RewardModules/OrderHistory/Application Logic/Service/OrderHistoryService.swift

109
GMERemittance/Module/AutoDebitModules/AddAccount/Application Logic/Interactor/AddAccountInteractor.swift

@ -9,58 +9,77 @@
import Foundation
class AddAccountInteractor {
// MARK: Properties
weak var output: AddAccountInteractorOutput?
private let service: AddAccountServiceType
// MARK: Initialization
init(service: AddAccountServiceType) {
self.service = service
}
// MARK: Converting entities
// MARK: Properties
weak var output: AddAccountInteractorOutput?
private let service: AddAccountServiceType
// MARK: Initialization
init(service: AddAccountServiceType) {
self.service = service
}
// MARK: Converting entities
}
// MARK: AddAccount interactor input interface
extension AddAccountInteractor: AddAccountInteractorInput {
func viewIsReady(model: KFTCModel?) {
//TODO: merge bank information
self.service.fetchBankList(success: {
self.output?.setModel(model: (bankList: $0, kftcModel: model))
}){
self.output?.failureSetModel(error: $0)
}
}
func viewIsReady(model: KFTCModel?) {
service.fetchBankList(
success: {[weak self] in
guard let `self` = self else {return}
self.output?.setModel(model: (bankList: $0, kftcModel: model))
},
failure: {[weak self] in
guard let `self` = self else {return}
self.output?.failureSetModel(error: $0)
}
)
}
func verifyAccount(
customerID: String,
bankCode: String,
accountNumber: String
) {
var params = ["CustomerId": customerID]
params["BankCode"] = bankCode
params["AccountNumber"] = accountNumber
func verifyAccount(
customerID: String,
bankCode: String,
accountNumber: String
) {
var params = ["CustomerId": customerID]
params["BankCode"] = bankCode
params["AccountNumber"] = accountNumber
service.verifyAccountService(
params: params,
success: {[weak self] in
guard let `self` = self else {return}
self.output?.successVerify()
},
failure: {[weak self] in
guard let `self` = self else {return}
self.output?.failure(error: $0)
}
)
}
func fetchKFTCUrl(url: String, header: [String: String]) {
service.fetchKftcUrlService(
url: url,
header: header,
success: {[weak self] in
guard
let `self` = self,
let response = $0
else {return}
self.service.verifyAccountService(
params: params,
success: { self.output?.successVerify() }){
self.output?.failure(error: $0)
}
}
func fetchKFTCUrl(url: String, header: [String: String]) {
self.service.fetchKftcUrlService(
url: url,
header: header,
success: {
guard let response = $0 else { return }
self.output?.successTestURL(url: response)
}){ self.output?.failure(error: $0)}
}
self.output?.successTestURL(url: response)
},
failure: {[weak self] in
guard let `self` = self else {return}
self.output?.failure(error: $0)
}
)
}
}

26
GMERemittance/Module/AutoDebitModules/AddAccount/Application Logic/Interactor/AddAccountInteractorIO.swift

@ -7,20 +7,20 @@
//
protocol AddAccountInteractorInput: class {
func viewIsReady(model: KFTCModel?)
func fetchKFTCUrl(url: String, header: [String: String])
func verifyAccount(
customerID: String,
bankCode: String,
accountNumber: String
)
func viewIsReady(model: KFTCModel?)
func fetchKFTCUrl(url: String, header: [String: String])
func verifyAccount(
customerID: String,
bankCode: String,
accountNumber: String
)
}
protocol AddAccountInteractorOutput: class {
func setModel(model: (bankList: [BankInformation]?, kftcModel: KFTCModel?))
func failureSetModel(error: Error)
func successTestURL(url: String)
func successVerify()
func failure(error: Error)
func setModel(model: (bankList: [BankInformation]?, kftcModel: KFTCModel?))
func failureSetModel(error: Error)
func successTestURL(url: String)
func successVerify()
func failure(error: Error)
}

56
GMERemittance/Module/AutoDebitModules/AddAccount/Application Logic/Model/KFTCBankList.swift

@ -10,35 +10,35 @@ import Foundation
import ObjectMapper
class BankInformation: Mappable {
var rowId: String?
var bankCode: String?
var bankName: String?
required init?(map: Map) {}
func mapping(map: Map) {
self.rowId <- map["RowId"]
self.bankCode <- map["BankCode"]
self.bankName <- map["BankName"]
}
var rowId: String?
var bankCode: String?
var bankName: String?
required init?(map: Map) {}
func mapping(map: Map) {
rowId <- map["RowId"]
bankCode <- map["BankCode"]
bankName <- map["BankName"]
}
}
class KFTCBankList: Mappable {
var errorCode: String?
var msg: String?
var id: String?
var extra: String?
var extra2: String?
var data: [BankInformation]?
required init?(map: Map) {}
func mapping(map: Map) {
self.errorCode <- map["ErrorCode"]
self.msg <- map["Msg"]
self.id <- map["Id"]
self.extra <- map["Extra"]
self.extra2 <- map["Extra2"]
self.data <- map["Data"]
}
var errorCode: String?
var msg: String?
var id: String?
var extra: String?
var extra2: String?
var data: [BankInformation]?
required init?(map: Map) {}
func mapping(map: Map) {
errorCode <- map["ErrorCode"]
msg <- map["Msg"]
id <- map["Id"]
extra <- map["Extra"]
extra2 <- map["Extra2"]
data <- map["Data"]
}
}

134
GMERemittance/Module/AutoDebitModules/AddAccount/Application Logic/Service/AddAccountService.swift

@ -10,79 +10,79 @@ import Foundation
import Alamofire
class AddAccountService: AddAccountServiceType {
// MARK: Properties
// MARK: Initialization
// MARK: Data management
func fetchBankList(success: @escaping ([BankInformation]?) -> (),
failure: @escaping (Error) -> ()) {
// MARK: Properties
// MARK: Initialization
// MARK: Data management
func fetchBankList(success: @escaping ([BankInformation]?) -> (),
failure: @escaping (Error) -> ()) {
auth.request(
method: .get,
url: baseUrl + "/kftc/KFTCBankList",
params: nil,
success: { (response: KFTCBankList) in
if (response.errorCode ?? "") == "1" {
let error = NSError.init(
domain: "Network",
code: 0,
userInfo: [NSLocalizedDescriptionKey : response.msg ?? ""]
)
failure(error)
}else {
success(response.data)
}
}) { (error) in
failure(error)
auth.request(
method: .get,
url: baseUrl + "/kftc/KFTCBankList",
params: nil,
success: { (response: KFTCBankList) in
if (response.errorCode ?? "") == "1" {
let error = NSError.init(
domain: "Network",
code: 0,
userInfo: [NSLocalizedDescriptionKey : response.msg ?? ""]
)
failure(error)
}else {
success(response.data)
}
}) { (error) in
failure(error)
}
}
func verifyAccountService(
params: [String: String],
success: @escaping () -> (),
failure: @escaping (Error) -> ()) {
func verifyAccountService(
params: [String: String],
success: @escaping () -> (),
failure: @escaping (Error) -> ()) {
auth.request(
method: .post,
url: baseUrl + "/kftc/CheckRealName",
params: params,
success: { (response: KFTCVerifyAccount) in
if (response.errorCode ?? "") == "1" {
let error = NSError.init(
domain: "Network",
code: 0,
userInfo: [NSLocalizedDescriptionKey : response.msg ?? ""]
)
failure(error)
}else {
success()
}
}) { (error) in
failure(error)
auth.request(
method: .post,
url: baseUrl + "/kftc/CheckRealName",
params: params,
success: { (response: KFTCVerifyAccount) in
if (response.errorCode ?? "") == "1" {
let error = NSError.init(
domain: "Network",
code: 0,
userInfo: [NSLocalizedDescriptionKey : response.msg ?? ""]
)
failure(error)
}else {
success()
}
}) { (error) in
failure(error)
}
}
func fetchKftcUrlService(
url: String,
header: [String: String],
success: @escaping (String?) -> (),
failure: @escaping (Error) -> ()) {
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)
}
auth.kftcRequest(
method: .get,
header: header,
url: url,
params: nil,
encoding: URLEncoding.default,
success: { (response: KFTCURL) in
success(response.value)
}) { (error) in
failure(error)
}
}
}

30
GMERemittance/Module/AutoDebitModules/AddAccount/Application Logic/Service/AddAccountServiceType.swift

@ -9,17 +9,21 @@
import Foundation
protocol AddAccountServiceType: ApiServiceType {
func fetchBankList(success: @escaping ([BankInformation]?) -> (),
failure: @escaping (Error) -> ())
func verifyAccountService(
params: [String: String],
success: @escaping () -> (),
failure: @escaping (Error) -> ())
func fetchKftcUrlService(
url: String,
header: [String: String],
success: @escaping (String?) -> (),
failure: @escaping (Error) -> ())
func fetchBankList(
success: @escaping ([BankInformation]?) -> (),
failure: @escaping (Error) -> ()
)
func verifyAccountService(
params: [String: String],
success: @escaping () -> (),
failure: @escaping (Error) -> ()
)
func fetchKftcUrlService(
url: String,
header: [String: String],
success: @escaping (String?) -> (),
failure: @escaping (Error) -> ()
)
}

144
GMERemittance/Module/AutoDebitModules/AddAccount/User Interface/Presenter/AddAccountPresenter.swift

@ -9,88 +9,88 @@
import Foundation
class AddAccountPresenter {
// MARK: Properties
weak var view: AddAccountViewInterface?
var interactor: AddAccountInteractorInput?
var wireframe: AddAccountWireframeInput?
private var model: KFTCModel?
init(with model: KFTCModel?) {
self.model = model
}
// MARK: Converting entities
// MARK: Properties
weak var view: AddAccountViewInterface?
var interactor: AddAccountInteractorInput?
var wireframe: AddAccountWireframeInput?
private var model: KFTCModel?
init(with model: KFTCModel?) {
self.model = model
}
// MARK: Converting entities
}
// MARK: AddAccount module interface
extension AddAccountPresenter: AddAccountModuleInterface {
func viewIsReady() {
self.interactor?.viewIsReady(model: self.model)
}
func viewIsReady() {
interactor?.viewIsReady(model: model)
}
func verifyAccount(
customerID: String,
bankCode: String,
accountNumber: String
){
func verifyAccount(
customerID: String,
bankCode: String,
accountNumber: String
){
if customerID == "" || bankCode == "" || accountNumber == "" {
let error = NSError.init(
domain: "Invalid Bank Account",
code: 0,
message: "Check your bank account information")
self.view?.failure(error: error)
} else {
self.view?.startLoading()
self.interactor?.verifyAccount(
customerID: customerID,
bankCode: bankCode,
accountNumber: accountNumber
)
}
}
func doGetTestURL(url: String, header: [String: String]) {
self.view?.startLoading()
self.interactor?.fetchKFTCUrl(url: url, header: header)
}
func goKFTC(url: String, header: [KftcHeader]?) {
self.wireframe?.pushKFTCViewControllerOf(
url: url.components(separatedBy: .whitespaces).joined(),
header: header)
if customerID == "" || bankCode == "" || accountNumber == "" {
let error = NSError.init(
domain: "Invalid Bank Account",
code: 0,
message: "Check your bank account information")
view?.failure(error: error)
} else {
view?.startLoading()
interactor?.verifyAccount(
customerID: customerID,
bankCode: bankCode,
accountNumber: accountNumber
)
}
}
func doGetTestURL(url: String, header: [String: String]) {
view?.startLoading()
interactor?.fetchKFTCUrl(url: url, header: header)
}
func goKFTC(url: String, header: [KftcHeader]?) {
wireframe?.pushKFTCViewControllerOf(
url: url.components(separatedBy: .whitespaces).joined(),
header: header)
}
}
// MARK: AddAccount interactor output interface
extension AddAccountPresenter: AddAccountInteractorOutput {
func setModel(model: (bankList: [BankInformation]?, kftcModel: KFTCModel?)) {
self.view?.setModel(model: model)
}
func failureSetModel(error: Error) {
self.view?.failureSetModel(error: error)
}
func successVerify() {
self.view?.endLoading()
self.view?.successVerify()
}
func failure(error: Error) {
self.view?.endLoading()
self.view?.failure(error: error)
}
func successTestURL(url: String) {
self.view?.endLoading()
self.view?.successTestURL(url: url)
}
func setModel(model: (bankList: [BankInformation]?, kftcModel: KFTCModel?)) {
view?.setModel(model: model)
}
func failureSetModel(error: Error) {
view?.failureSetModel(error: error)
}
func successVerify() {
view?.endLoading()
view?.successVerify()
}
func failure(error: Error) {
view?.endLoading()
view?.failure(error: error)
}
func successTestURL(url: String) {
view?.endLoading()
view?.successTestURL(url: url)
}
}

14
GMERemittance/Module/AutoDebitModules/AddAccount/User Interface/View/AddAccount.storyboard

@ -36,8 +36,8 @@
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalSpacing" spacing="13" translatesAutoresizingMaskIntoConstraints="NO" id="3ai-n4-gBZ" userLabel="ContentsView">
<rect key="frame" x="26" y="134" width="323" height="116"/>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalSpacing" spacing="25" translatesAutoresizingMaskIntoConstraints="NO" id="3ai-n4-gBZ" userLabel="ContentsView">
<rect key="frame" x="26" y="134" width="323" height="140"/>
<subviews>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="RZW-X0-sHf" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="323" height="30"/>
@ -51,7 +51,7 @@
</userDefinedRuntimeAttributes>
</textField>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="8ga-Pj-fFb" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="43" width="323" height="30"/>
<rect key="frame" x="0.0" y="55" width="323" height="30"/>
<color key="textColor" red="0.43529412150000002" green="0.4431372583" blue="0.47450980539999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="17"/>
<textInputTraits key="textInputTraits" keyboardType="numberPad"/>
@ -62,7 +62,7 @@
</userDefinedRuntimeAttributes>
</textField>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="1Ca-e4-yFh" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="86" width="323" height="30"/>
<rect key="frame" x="0.0" y="110" width="323" height="30"/>
<color key="tintColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="textColor" red="0.43529412150000002" green="0.4431372583" blue="0.47450980539999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="17"/>
@ -82,12 +82,11 @@
<constraint firstItem="8ga-Pj-fFb" firstAttribute="leading" secondItem="3ai-n4-gBZ" secondAttribute="leading" id="fgh-IM-DJD"/>
</constraints>
</stackView>
<button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bm7-r1-NLR">
<rect key="frame" x="87.5" y="280" width="200" height="50"/>
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bm7-r1-NLR">
<rect key="frame" x="26" y="304" width="323" height="50"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="WQG-ti-fgK"/>
<constraint firstAttribute="width" constant="200" id="rOK-V9-a6q"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="17"/>
<state key="normal" title="Verify Account">
@ -100,6 +99,7 @@
</subviews>
<color key="backgroundColor" red="0.90588235289999997" green="0.92941176469999998" blue="0.94901960780000005" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="bm7-r1-NLR" firstAttribute="width" secondItem="3ai-n4-gBZ" secondAttribute="width" id="0xW-3X-Q2Y"/>
<constraint firstAttribute="trailingMargin" secondItem="3ai-n4-gBZ" secondAttribute="trailing" constant="10" id="5fF-jb-9Eb"/>
<constraint firstItem="bm7-r1-NLR" firstAttribute="top" secondItem="3ai-n4-gBZ" secondAttribute="bottom" constant="30" id="Hee-LI-sTz"/>
<constraint firstItem="3ai-n4-gBZ" firstAttribute="leading" secondItem="9Uc-9s-KgO" secondAttribute="leadingMargin" constant="10" id="Ov0-8H-kTY"/>

432
GMERemittance/Module/AutoDebitModules/AddAccount/User Interface/View/AddAccountViewController.swift

@ -9,233 +9,237 @@
import UIKit
class AddAccountViewController: UIViewController {
// MARK: Properties
var presenter: AddAccountModuleInterface?
private lazy var languagePickerView = UIPickerView()
private lazy var bankPickerView = UIPickerView()
private var validDic = ["bank": false, "account": false, "language": false]
private var isValid = false {
didSet{
self.verifyAccountButton.isEnabled = self.isValid
self.verifyAccountButton.backgroundColor = self.isValid ? AppConstants.themeRedColor : .lightGray
}
}
private var model: (bankList: [BankInformation]?, kftcModel: KFTCModel?) {
didSet {
self.languagePickerView.delegate = self
self.languagePickerView.dataSource = self
self.languageTextField.inputView = languagePickerView
self.bankPickerView.delegate = self
self.bankPickerView.dataSource = self
self.bankNameTextField.inputView = bankPickerView
}
}
private var selectedLanguage: KftcLanguage? {
didSet {
self.languageTextField.text = self.selectedLanguage?.value
self.languageTextField.sendActions(for: .editingChanged)
}
}
private var selectedBank: BankInformation? {
didSet {
self.bankNameTextField.text = self.selectedBank?.bankName
self.bankNameTextField.sendActions(for: .editingChanged)
}
}
// MARK: IBOutlets
@IBOutlet private weak var bankNameTextField: ValidationTextField!
@IBOutlet private weak var accountTextField: ValidationTextField!
@IBOutlet private weak var languageTextField: ValidationTextField!
@IBOutlet private weak var verifyAccountButton: UIButton!
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
self.setup()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.title = "Add Auto Debit Account"
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.title = ""
self.view.endEditing(true)
}
// MARK: IBActions
@IBAction private func verifyAccountButtonTouch(_ sender: UIButton) {
self.presenter?.verifyAccount(
customerID: UserDefaults.standard.string(forKey: UserKeys.senderId) ?? "", // senderID
bankCode: self.selectedBank?.bankCode ?? "",
accountNumber: self.accountTextField.text ?? "")
}
@IBAction private func closeButtonTouch(_ sender: UIBarButtonItem) {
self.dismiss(animated: true, completion: nil)
}
// MARK: Other Functions
private func setup() {
// all setup should be done here
self.presenter?.viewIsReady()
self.verifyAccountButton.rounded()
self.setValidTextField()
}
private func setValidTextField(){
self.bankNameTextField.completedColor = UIColor(hex: "#6F7179")
self.bankNameTextField.completedTitleFont = UIFont(name: "SanfranciscoDisplay-Regular", size: 13)!
self.bankNameTextField.errorFont = UIFont(name: "SanfranciscoDisplay-Regular", size: 13)!
self.bankNameTextField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)
self.languageTextField.completedColor = UIColor(hex: "#6F7179")
self.languageTextField.completedTitleFont = UIFont(name: "SanfranciscoDisplay-Regular", size: 13)!
self.languageTextField.errorFont = UIFont(name: "SanfranciscoDisplay-Regular", size: 13)!
self.languageTextField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)
self.accountTextField.completedColor = UIColor(hex: "#6F7179")
self.accountTextField.completedTitleFont = UIFont(name: "SanfranciscoDisplay-Regular", size: 13)!
self.accountTextField.errorFont = UIFont(name: "SanfranciscoDisplay-Regular", size: 13)!
self.accountTextField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)
self.accountTextField.validCondition = {$0.count > 9}
}
@objc
func textFieldDidChange(_ textfield: UITextField) {
let tf = textfield as! ValidationTextField
switch tf {
case bankNameTextField:
validDic["bank"] = tf.isValid
case accountTextField:
validDic["account"] = tf.isValid
case languageTextField:
validDic["language"] = tf.isValid
default:
break
}
self.isValid = self.validDic.reduce(true){ $0 && $1.value}
}
// MARK: Properties
var presenter: AddAccountModuleInterface?
private lazy var languagePickerView = UIPickerView()
private lazy var bankPickerView = UIPickerView()
private var validDic = [
"bank": false,
"account": false,
"language": false
]
private var isValid = false {
didSet{
verifyAccountButton.isEnabled = isValid
verifyAccountButton.backgroundColor = isValid ? AppConstants.themeRedColor : .lightGray
}
}
private var model: (bankList: [BankInformation]?, kftcModel: KFTCModel?) {
didSet {
languagePickerView.delegate = self
languagePickerView.dataSource = self
languageTextField.inputView = languagePickerView
bankPickerView.delegate = self
bankPickerView.dataSource = self
bankNameTextField.inputView = bankPickerView
}
}
private var selectedLanguage: KftcLanguage? {
didSet {
languageTextField.text = selectedLanguage?.value
languageTextField.sendActions(for: .editingChanged)
}
}
private var selectedBank: BankInformation? {
didSet {
bankNameTextField.text = selectedBank?.bankName
bankNameTextField.sendActions(for: .editingChanged)
}
}
// MARK: IBOutlets
@IBOutlet private weak var bankNameTextField: ValidationTextField!
@IBOutlet private weak var accountTextField: ValidationTextField!
@IBOutlet private weak var languageTextField: ValidationTextField!
@IBOutlet private weak var verifyAccountButton: UIButton!
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
setup()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
title = "Add Auto Debit Account"
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
title = ""
view.endEditing(true)
}
// MARK: IBActions
@IBAction private func verifyAccountButtonTouch(_ sender: UIButton) {
presenter?.verifyAccount(
customerID: UserDefaults.standard.string(forKey: UserKeys.senderId) ?? "", // senderID
bankCode: selectedBank?.bankCode ?? "",
accountNumber: accountTextField.text ?? "")
}
@IBAction private func closeButtonTouch(_ sender: UIBarButtonItem) {
dismiss(animated: true, completion: nil)
}
// MARK: Other Functions
private func setup() {
// all setup should be done here
presenter?.viewIsReady()
verifyAccountButton.layer.cornerRadius = 10
setValidTextField()
}
private func setValidTextField(){
bankNameTextField.completedColor = AppConstants.themeBlueColor
bankNameTextField.completedTitleFont = UIFont(name: "SanfranciscoDisplay-Regular", size: 13)!
bankNameTextField.errorFont = UIFont(name: "SanfranciscoDisplay-Regular", size: 13)!
bankNameTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
languageTextField.completedColor = AppConstants.themeBlueColor
languageTextField.completedTitleFont = UIFont(name: "SanfranciscoDisplay-Regular", size: 13)!
languageTextField.errorFont = UIFont(name: "SanfranciscoDisplay-Regular", size: 13)!
languageTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
accountTextField.completedColor = AppConstants.themeBlueColor
accountTextField.completedTitleFont = UIFont(name: "SanfranciscoDisplay-Regular", size: 13)!
accountTextField.errorFont = UIFont(name: "SanfranciscoDisplay-Regular", size: 13)!
accountTextField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)
accountTextField.validCondition = {$0.count > 9}
}
@objc
func textFieldDidChange(_ textfield: UITextField) {
let tf = textfield as! ValidationTextField
switch tf {
case bankNameTextField:
validDic["bank"] = tf.isValid
case accountTextField:
validDic["account"] = tf.isValid
case languageTextField:
validDic["language"] = tf.isValid
default:
break
}
isValid = validDic.reduce(true){ $0 && $1.value}
}
}
// MARK: AddAccountViewInterface
extension AddAccountViewController: AddAccountViewInterface {
func setModel(model: (bankList: [BankInformation]?, kftcModel: KFTCModel?)) {
self.model = model
}
func failureSetModel(error: Error) {
self.alert(message: error.localizedDescription, title: "Warning"){
self.dismiss(animated: true, completion: nil)
}
}
func successVerify() {
let url = "\(self.model.kftcModel?.url ?? "")&lang=\(selectedLanguage?.key ?? "")"
var header = [String: String]()
self.model.kftcModel?.header?.forEach({
header[$0.key ?? ""] = $0.value ?? ""
})
header["Kftc-Bfop-BankCodeStd"] = self.selectedBank?.bankCode ?? ""
header["Kftc-Bfop-AccountNum"] = self.accountTextField.text ?? ""
self.presenter?.doGetTestURL(url: url, header: header)
}
func successTestURL(url: String) {
self.presenter?.goKFTC(url: url, header: self.model.kftcModel?.header)
}
func failure(error: Error) {
self.alert(message: error.localizedDescription, title: "Warning", okAction: nil)
}
func startLoading(){
self.showProgressHud()
}
func endLoading(){
self.hideProgressHud()
}
func setModel(model: (bankList: [BankInformation]?, kftcModel: KFTCModel?)) {
self.model = model
}
func failureSetModel(error: Error) {
alert(message: error.localizedDescription, title: "Warning"){
dismiss(animated: true, completion: nil)
}
}
func successVerify() {
let url = "\(model.kftcModel?.url ?? "")&lang=\(selectedLanguage?.key ?? "")"
var header = [String: String]()
model.kftcModel?.header?.forEach({
header[$0.key ?? ""] = $0.value ?? ""
})
header["Kftc-Bfop-BankCodeStd"] = selectedBank?.bankCode ?? ""
header["Kftc-Bfop-AccountNum"] = accountTextField.text ?? ""
presenter?.doGetTestURL(url: url, header: header)
}
func successTestURL(url: String) {
presenter?.goKFTC(url: url, header: self.model.kftcModel?.header)
}
func failure(error: Error) {
alert(message: error.localizedDescription, title: "Warning", okAction: nil)
}
func startLoading(){
showProgressHud()
}
func endLoading(){
hideProgressHud()
}
}
// MARK: UIPickerViewDataSource
extension AddAccountViewController: UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
guard
let model = self.model.kftcModel,
let bankList = self.model.bankList,
let languages = model.languages else { return 0 }
switch pickerView {
case languagePickerView:
return languages.count
case bankPickerView:
return bankList.count
default:
return 0
}
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
guard
let model = model.kftcModel,
let bankList = self.model.bankList,
let languages = model.languages else { return 0 }
switch pickerView {
case languagePickerView:
return languages.count
case bankPickerView:
return bankList.count
default:
return 0
}
}
}
// MARK: UIPickerViewDelegate
extension AddAccountViewController: UIPickerViewDelegate {
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
switch pickerView {
case languagePickerView:
return model.kftcModel?.languages?[row].value
case bankPickerView:
return model.bankList?[row].bankName
default:
return nil
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
switch pickerView {
case languagePickerView:
self.selectedLanguage = self.model.kftcModel?.languages?[row]
case bankPickerView:
self.selectedBank = self.model.bankList?[row]
default:
break
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
switch pickerView {
case languagePickerView:
return model.kftcModel?.languages?[row].value
case bankPickerView:
return model.bankList?[row].bankName
default:
return nil
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
switch pickerView {
case languagePickerView:
selectedLanguage = model.kftcModel?.languages?[row]
case bankPickerView:
selectedBank = model.bankList?[row]
default:
break
}
}
}

18
GMERemittance/Module/AutoDebitModules/AddAccount/User Interface/View/AddAccountViewInterface.swift

@ -7,13 +7,13 @@
//
protocol AddAccountViewInterface: class {
func setModel(model: (bankList: [BankInformation]?, kftcModel: KFTCModel?))
func failureSetModel(error: Error)
func successVerify()
func successTestURL(url: String)
func failure(error: Error)
func startLoading()
func endLoading()
func setModel(model: (bankList: [BankInformation]?, kftcModel: KFTCModel?))
func failureSetModel(error: Error)
func successVerify()
func successTestURL(url: String)
func failure(error: Error)
func startLoading()
func endLoading()
}

64
GMERemittance/Module/AutoDebitModules/AddAccount/User Interface/Wireframe/AddAccountWireframe.swift

@ -9,44 +9,44 @@
import UIKit
class AddAccountWireframe {
weak var view: UIViewController!
private var model: KFTCModel?
weak var view: UIViewController!
private var model: KFTCModel?
}
extension AddAccountWireframe: AddAccountWireframeInput {
var storyboardName: String {return "AddAccount"}
func getMainView() -> UIViewController {
let service = AddAccountService()
let interactor = AddAccountInteractor(service: service)
let presenter = AddAccountPresenter(with: model)
let viewController = viewControllerFromStoryboard(of: AddAccountViewController.self)
var storyboardName: String {return "AddAccount"}
viewController.presenter = presenter
interactor.output = presenter
presenter.interactor = interactor
presenter.wireframe = self
presenter.view = viewController
func getMainView() -> UIViewController {
let service = AddAccountService()
let interactor = AddAccountInteractor(service: service)
let presenter = AddAccountPresenter(with: model)
let viewController = viewControllerFromStoryboard(of: AddAccountViewController.self)
viewController.presenter = presenter
interactor.output = presenter
presenter.interactor = interactor
presenter.wireframe = self
presenter.view = viewController
self.view = viewController
return viewController
}
func openPushMainView(with model: KFTCModel?, source: UIViewController){
self.model = model
self.openViewControllerWithNavigation(viewController: self.getMainView(), source: source)
}
func pushKFTCViewControllerOf(url: String, header: [KftcHeader]?){
let viewcontroller = UIStoryboard.init(name: "WKWebView", bundle: nil).instantiateViewController(withIdentifier: "WkWebViewController") as! WkWebViewController
viewcontroller.url = url
viewcontroller.headers = header
self.view.navigationController?.pushViewController(viewcontroller, animated: true)
}
view = viewController
return viewController
}
func openPushMainView(with model: KFTCModel?, source: UIViewController){
self.model = model
openViewControllerWithNavigation(viewController: getMainView(), source: source)
}
func pushKFTCViewControllerOf(url: String, header: [KftcHeader]?){
let viewcontroller = UIStoryboard.init(name: "WKWebView", bundle: nil).instantiateViewController(withIdentifier: "WkWebViewController") as! WkWebViewController
viewcontroller.url = url
viewcontroller.headers = header
view.navigationController?.pushViewController(viewcontroller, animated: true)
}
}

4
GMERemittance/Module/AutoDebitModules/AddAccount/User Interface/Wireframe/AddAccountWireframeInput.swift

@ -9,6 +9,6 @@
import Foundation
protocol AddAccountWireframeInput: WireframeInput {
func openPushMainView(with model: KFTCModel?, source: UIViewController)
func pushKFTCViewControllerOf(url: String, header: [KftcHeader]?)
func openPushMainView(with model: KFTCModel?, source: UIViewController)
func pushKFTCViewControllerOf(url: String, header: [KftcHeader]?)
}

4
GMERemittance/Module/RewardModules/OrderHistory/Application Logic/Service/OrderHistoryService.swift

@ -32,8 +32,8 @@ class OrderHistoryService: OrderHistoryServiceType {
"endDate": endDate
]
// let url = baseUrlWithoutVersion + "v2/reward/productOrderedList"
let url = baseUrlWithoutVersion + "v2/reward/productOrderd"
let url = baseUrlWithoutVersion + "v2/reward/productOrderedList"
// let url = baseUrlWithoutVersion + "v2/reward/productOrderd"
auth.request(
method: .post,
url: url,

Loading…
Cancel
Save