Browse Source

Apply SwiftLint

pull/1/head
InKwon James Kim 5 years ago
parent
commit
73199b8739
  1. 4
      GME Remit/AppDelegate.swift
  2. 3
      GME Remit/Modules/SideMenu/Auto refund/AutoRefundsViewController.swift
  3. 82
      GME Remit/Modules/SideMenu/SettingViewController.swift
  4. 493
      GME Remit/Modules/SideMenu/SideMenuViewController.swift
  5. 1
      GME Remit/Modules/SplashScreen/User Interface/Wireframe/SplashScreenWireframe.swift
  6. 84
      GME Remit/Modules/TransactionHistoryModules/MessageCompose/Application Logic/Interactor/MessageComposeInteractor.swift
  7. 8
      GME Remit/Modules/TransactionHistoryModules/MessageCompose/Application Logic/Interactor/MessageComposeInteractorIO.swift
  8. 126
      GME Remit/Modules/TransactionHistoryModules/MessageCompose/Application Logic/Service/MessageComposeServiceType.swift
  9. 6
      GME Remit/Modules/TransactionHistoryModules/MessageCompose/Module Interface/MessageComposeModuleInterface.swift
  10. 58
      GME Remit/Modules/TransactionHistoryModules/MessageCompose/User Interface/Presenter/MessageComposePresenter.swift
  11. 4
      GME Remit/Modules/TransactionHistoryModules/MessageCompose/User Interface/View/MessageComposeViewInterface.swift
  12. 68
      GME Remit/Modules/TransactionHistoryModules/MessageCompose/User Interface/Wireframe/MessageComposeWireframe.swift
  13. 2
      GME Remit/Modules/TransactionHistoryModules/MessageCompose/User Interface/Wireframe/MessageComposeWireframeInput.swift
  14. 6
      GME Remit/Modules/TransactionHistoryModules/TransactionHistory/Application Logic/Interactor/TransactionHistoryInteractorIO.swift
  15. 51
      GME Remit/Modules/TransactionHistoryModules/TransactionHistory/Application Logic/Service/TransactionHistoryServiceType.swift
  16. 10
      GME Remit/Modules/TransactionHistoryModules/TransactionHistory/Module Interface/TransactionHistoryModuleInterface.swift
  17. 157
      GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/Presenter/TransactionHistoryPresenter.swift
  18. 68
      GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/View/Cell/TransactionHistoryTableViewCell.swift
  19. 14
      GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/View/DatePickerViewController.swift
  20. 374
      GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/View/TransactionHistoryViewController.swift
  21. 8
      GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/View/TransactionHistoryViewInterface.swift
  22. 55
      GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/Wireframe/TransactionHistoryWireframe.swift
  23. 2
      GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/Wireframe/TransactionHistoryWireframeInput.swift
  24. 69
      GME Remit/Modules/WalletStatement/Application Logic/Interactor/WalletStatementInteractor.swift
  25. 6
      GME Remit/Modules/WalletStatement/Application Logic/Interactor/WalletStatementInteractorIO.swift
  26. 52
      GME Remit/Modules/WalletStatement/Application Logic/Service/WalletStatementServiceType.swift
  27. 6
      GME Remit/Modules/WalletStatement/Module Interface/WalletStatementModuleInterface.swift
  28. 78
      GME Remit/Modules/WalletStatement/User Interface/Presenter/WalletStatementPresenter.swift
  29. 104
      GME Remit/Modules/WalletStatement/User Interface/View/Cell/WalletStatementTableViewCell.swift
  30. 306
      GME Remit/Modules/WalletStatement/User Interface/View/WalletStatementViewController.swift
  31. 8
      GME Remit/Modules/WalletStatement/User Interface/View/WalletStatementViewInterface.swift
  32. 42
      GME Remit/Modules/WalletStatement/User Interface/Wireframe/WalletStatementWireframe.swift

4
GME Remit/AppDelegate.swift

@ -62,9 +62,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
.shared
.app
.remove([.isOpenedTokenRenwalAlert, .isOpenedPopupNotification])
// FIXME: For Test
GMEDB.shared.user.set("autodebit", .redirectTo)
return true
}

3
GME Remit/Modules/SideMenu/Auto refund/AutoRefundsViewController.swift

@ -110,7 +110,8 @@ class AutoRefundsViewController: UIViewController {
}
if !isValidRefundable(amount: amount) {
self.show(error: "Amount cannot be minimum than \(Utility.getCommaSeperatedString(numberString: minAmnt) ?? "")")
let min = Utility.getCommaSeperatedString(numberString: minAmnt) ?? ""
self.show(error: "Amount cannot be minimum than \(min)")
return
}
let chargeAmt = self.autorefund?.chargeAmount ?? ""

82
GME Remit/Modules/SideMenu/SettingViewController.swift

@ -20,41 +20,25 @@ class SettingViewController: UIViewController {
var languages: [SendMoneyCountryViewModel] = []
var selectedLanguage: SendMoneyCountryViewModel? {
didSet {
let code = selectedLanguage?.code ?? "en"
if code == "lk" {
Localize.setCurrentLanguage("si")
}else
if code == "kh" {
Localize.setCurrentLanguage("km")
}else
if code == "kr" {
Localize.setCurrentLanguage("ko")
}else
if code == "mm" {
Localize.setCurrentLanguage("my")
}else
if code == "bd" {
Localize.setCurrentLanguage("bn")
}
else
if code == "np" {
Localize.setCurrentLanguage("ne")
}else
if code == "ru" {
Localize.setCurrentLanguage("ru-RU")
}else
if code == "vn" {
Localize.setCurrentLanguage("vi-VN")
}
else {
Localize.setCurrentLanguage(code)
} else if code == "kh" {
Localize.setCurrentLanguage("km")
} else if code == "kr" {
Localize.setCurrentLanguage("ko")
} else if code == "mm" {
Localize.setCurrentLanguage("my")
} else if code == "bd" {
Localize.setCurrentLanguage("bn")
} else if code == "np" {
Localize.setCurrentLanguage("ne")
} else if code == "ru" {
Localize.setCurrentLanguage("ru-RU")
} else if code == "vn" {
Localize.setCurrentLanguage("vi-VN")
} else {
Localize.setCurrentLanguage(code)
}
print("code: \(code)")
GMEDB.shared.app.set(code, .firstTimeLanguageIsSet)
@ -67,30 +51,36 @@ class SettingViewController: UIViewController {
@IBOutlet weak var settingButton: UIButton!
@IBOutlet weak var useBiometricAuthSwitch: UISwitch!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(setText), name: NSNotification.Name(LCLLanguageChangeNotification), object: nil)
NotificationCenter.default.addObserver(
self,
selector: #selector(setText),
name: NSNotification.Name(LCLLanguageChangeNotification),
object: nil
)
setupLanguages()
configureLanguage()
let userBiometricAuth = (KeyChain.shared.get(key: .biometricAuth) ?? "0" ) == "1" ? true : false
self.useBiometricAuthSwitch.setOn(userBiometricAuth, animated: true)
self.useBiometricAuthSwitch.onTintColor = AppConstants.themeBlueColor
self.useBiometricAuthSwitch.addTarget(self, action: #selector(self.changeBiometricAuthSwitch(_:)), for: .valueChanged)
self.useBiometricAuthSwitch.addTarget(
self,
action: #selector(self.changeBiometricAuthSwitch(_:)),
for: .valueChanged
)
}
@objc
func changeBiometricAuthSwitch(_ sender: UISwitch){
@objc func changeBiometricAuthSwitch(_ sender: UISwitch) {
let isOn = sender.isOn ? "1" : "0"
if sender.isOn {
BiometricAuthenticationWireframe().showBiometricAuthentication() { error in
BiometricAuthenticationWireframe().showBiometricAuthentication { error in
if error != nil {
DispatchQueue.main.async {
self.alert(type: .error, message: error!.message)
self.useBiometricAuthSwitch.setOn(false, animated: true)
}
} else {
@ -103,7 +93,6 @@ class SettingViewController: UIViewController {
}
@objc func setText() {
self.changePasswordButton.setTitle("change_password_text".localized(), for: .normal)
self.settingButton.setTitle("language_text".localized(), for: .normal)
@ -135,7 +124,9 @@ class SettingViewController: UIViewController {
@IBAction func redirectToChangePassword(_ sender: Any) {
let storyboard = UIStoryboard.init(name: "Profile", bundle: Bundle.main)
if let changePasswordViewController = storyboard.instantiateViewController(withIdentifier: "changePassword") as? ProfileChangePasswordViewController {
if let changePasswordViewController = storyboard.instantiateViewController(
withIdentifier: "changePassword"
) as? ProfileChangePasswordViewController {
self.navigationController!.pushViewController(changePasswordViewController, animated: true)
}
}
@ -160,8 +151,6 @@ class SettingViewController: UIViewController {
}
extension SettingViewController: TablePresenterDelegate {
func tablePresenterView(_ viewController: TablePresenterViewController) -> TablePresenterConfiguration {
return TablePresenterConfiguration(
@ -173,7 +162,10 @@ extension SettingViewController: TablePresenterDelegate {
)
}
func tablePresenterView(_ viewController: TablePresenterViewController, didSelectModel model: TablePresenterProtocol?) {
func tablePresenterView(
_ viewController: TablePresenterViewController,
didSelectModel model: TablePresenterProtocol?
) {
self.selectedLanguage = model as? SendMoneyCountryViewModel
}

493
GME Remit/Modules/SideMenu/SideMenuViewController.swift

@ -12,252 +12,257 @@ import LGSideMenuController
import Localize_Swift
struct SideMenuNavigationNotifications {
static let aboutGme = "aboutGme"
static let support = "support"
static let setting = "setting"
static let availableBalance = "Available_Balance"
static let withdraw = "withdraw"
static let KftcAccountList = "KftcAccountList"
static let transactionHistory = "transaction_History_from_sidemenu"
static let aboutGme = "aboutGme"
static let support = "support"
static let setting = "setting"
static let availableBalance = "Available_Balance"
static let withdraw = "withdraw"
static let KftcAccountList = "KftcAccountList"
static let transactionHistory = "transaction_History_from_sidemenu"
}
class SideMenuViewController: UIViewController {
struct StringConstants {
let logoutTitleText = "logout_text".localized()
let logoutConfirmationText = "logout_confirmation_text".localized()
let noText = "no_text".localized()
let yesText = "yes_text".localized()
let autoDebitMenuText = "auto_debit_account_text".localized()
let aboutGmeMenuText = "about_gme_text".localized()
let settingMenuText = "settings_text".localized()
let availableBalanceTitleLabelText = "available_balance_text".localized()
let withdrawButtonText = "withdraw_text".localized()
let gmeWalletNoTitleText = "gme_wallet_no_text".localized()
}
// @IBOutlets
@IBOutlet weak var imageViewProfileSetting: UIImageView!
@IBOutlet weak var labelProfileName: UILabel!
@IBOutlet weak var labelPhone: UILabel!
@IBOutlet weak var labelEmail: UILabel!
@IBOutlet weak var roundedBgView: UIView!
@IBOutlet weak var labelBalance: UILabel!
@IBOutlet weak var labelWalletNumber: UILabel!
@IBOutlet weak var labelBank: UILabel!
@IBOutlet weak var labelUserNameInitial: UILabel!
@IBOutlet weak var settingButton: UIButton!
@IBOutlet weak var aboutGmeButton: UIButton!
@IBOutlet weak var autoDebitAccountButton: UIButton!
@IBOutlet weak var logoutButton: UIButton!
@IBOutlet weak var aboutIconImageView: UIImageView!
@IBOutlet weak var settingIconImageView: UIImageView!
@IBOutlet weak var logoutIconImageView: UIImageView!
@IBOutlet weak var withdrawButton: UIButton!
@IBOutlet weak var manageAccountStackView: UIStackView!
@IBOutlet weak var availableBalanceTitleLabel: UILabel!
@IBOutlet weak var gmeWalletNoTitleLabel: UILabel!
@IBOutlet weak var transactionHistryButton: UIButton!
// Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
setUpSettingsScreen()
setup()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setUpSettingsScreen()
NotificationCenter.default.addObserver(self, selector: #selector(configureText), name: NSNotification.Name(LCLLanguageChangeNotification), object: nil)
}
// Other Functions
private func addShadow(view: UIView) {
view.layer.shadowColor = UIColor.darkGray.cgColor
view.layer.shadowOpacity = 0.5
view.layer.shadowRadius = 2
let offset = CGSize(width: 1, height: 1)
view.layer.shadowOffset = offset
}
private func setup() {
configureText()
let shouldShowWithdrawButton = Utility.pennyTestVerified() && Utility.isVerifiedUser()
self.withdrawButton.isHidden = !shouldShowWithdrawButton
self.manageAccountStackView.isHidden = !shouldShowWithdrawButton
// self.manageAccountStackView.isHidden = true
self.view.backgroundColor = AppConstants.themeRedColor
self.roundedBgView.layer.cornerRadius = 20
self.labelBalance.text = "0"
NotificationCenter.default.addObserver(self, selector: #selector(self.updateBalance(sender:)), name: self.getAvailableBalanceNotificationName(), object: nil)
self.addShadow(view: withdrawButton)
}
@objc private func configureText() {
autoDebitAccountButton.setTitle(StringConstants().autoDebitMenuText, for: UIControl.State.normal)
aboutGmeButton.setTitle(StringConstants().aboutGmeMenuText, for: UIControl.State.normal)
settingButton.setTitle(StringConstants().settingMenuText, for: UIControl.State.normal)
logoutButton.setTitle(StringConstants().logoutTitleText, for: UIControl.State.normal)
self.availableBalanceTitleLabel.text = StringConstants().availableBalanceTitleLabelText
self.gmeWalletNoTitleLabel.text = StringConstants().gmeWalletNoTitleText
self.withdrawButton.setTitle(StringConstants().withdrawButtonText, for: UIControl.State.normal)
self.transactionHistryButton.setTitle("transaction_report_text".localized(), for: UIControl.State.normal)
}
@objc private func updateBalance(sender: Notification) {
let balance = sender.userInfo?[SideMenuNavigationNotifications.availableBalance] as? String
self.labelBalance.text = balance
let shouldShowWithdrawButton = Utility.pennyTestVerified() && Utility.isVerifiedUser()
self.withdrawButton.isHidden = !shouldShowWithdrawButton
self.manageAccountStackView.isHidden = !shouldShowWithdrawButton
// self.manageAccountStackView.isHidden = true
}
private func setupBlueBackGroundTheme() {
self.roundedBgView.backgroundColor = AppConstants.themeBlueColor
[ labelPhone, labelEmail, labelBalance, labelWalletNumber, labelBank, labelUserNameInitial].forEach({
$0?.textColor = AppConstants.themWhiteColor
})
[aboutGmeButton, settingButton, logoutButton].forEach({
$0?.setTitleColor(AppConstants.themWhiteColor, for: UIControl.State.normal)
})
aboutIconImageView.tintColor = AppConstants.themWhiteColor
}
@IBAction func withdraw(_ sender: UIButton) {
self.sideMenuController?.hideLeftView()
NotificationCenter.default.post(name: self.getWithdrawNotificationName(), object: nil, userInfo: nil)
}
@IBAction func openTransactionHistory(_ sender: Any) {
self.sideMenuController?.hideLeftView()
NotificationCenter.default.post(name: self.getTransactionHistoryNotificationName(), object: nil, userInfo: nil)
}
@IBAction func openKftcAccountList(_ sender: UIButton) {
self.sideMenuController?.hideLeftView()
NotificationCenter.default.post(name: self.getKftcAccountListNotificationName(), object: nil, userInfo: nil)
}
@IBAction func aboutGme(_ sender: UIButton) {
self.sideMenuController?.hideLeftView()
NotificationCenter.default.post(name: self.getAboutGmeNotificationName(), object: nil, userInfo: nil)
}
@IBAction func support(_ sender: UIButton) {
self.sideMenuController?.hideLeftView()
NotificationCenter.default.post(name: self.getSupportNotificationName(), object: nil, userInfo: nil)
struct StringConstants {
let logoutTitleText = "logout_text".localized()
let logoutConfirmationText = "logout_confirmation_text".localized()
let noText = "no_text".localized()
let yesText = "yes_text".localized()
let autoDebitMenuText = "auto_debit_account_text".localized()
let aboutGmeMenuText = "about_gme_text".localized()
let settingMenuText = "settings_text".localized()
let availableBalanceTitleLabelText = "available_balance_text".localized()
let withdrawButtonText = "withdraw_text".localized()
let gmeWalletNoTitleText = "gme_wallet_no_text".localized()
}
// @IBOutlets
@IBOutlet weak var imageViewProfileSetting: UIImageView!
@IBOutlet weak var labelProfileName: UILabel!
@IBOutlet weak var labelPhone: UILabel!
@IBOutlet weak var labelEmail: UILabel!
@IBOutlet weak var roundedBgView: UIView!
@IBOutlet weak var labelBalance: UILabel!
@IBOutlet weak var labelWalletNumber: UILabel!
@IBOutlet weak var labelBank: UILabel!
@IBOutlet weak var labelUserNameInitial: UILabel!
@IBOutlet weak var settingButton: UIButton!
@IBOutlet weak var aboutGmeButton: UIButton!
@IBOutlet weak var autoDebitAccountButton: UIButton!
@IBOutlet weak var logoutButton: UIButton!
@IBOutlet weak var aboutIconImageView: UIImageView!
@IBOutlet weak var settingIconImageView: UIImageView!
@IBOutlet weak var logoutIconImageView: UIImageView!
@IBOutlet weak var withdrawButton: UIButton!
@IBOutlet weak var manageAccountStackView: UIStackView!
@IBOutlet weak var availableBalanceTitleLabel: UILabel!
@IBOutlet weak var gmeWalletNoTitleLabel: UILabel!
@IBOutlet weak var transactionHistryButton: UIButton!
// Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
setUpSettingsScreen()
setup()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setUpSettingsScreen()
NotificationCenter.default.addObserver(
self,
selector: #selector(configureText),
name: NSNotification.Name(LCLLanguageChangeNotification),
object: nil
)
}
// Other Functions
private func addShadow(view: UIView) {
view.layer.shadowColor = UIColor.darkGray.cgColor
view.layer.shadowOpacity = 0.5
view.layer.shadowRadius = 2
let offset = CGSize(width: 1, height: 1)
view.layer.shadowOffset = offset
}
private func setup() {
configureText()
let shouldShowWithdrawButton = Utility.pennyTestVerified() && Utility.isVerifiedUser()
self.withdrawButton.isHidden = !shouldShowWithdrawButton
self.manageAccountStackView.isHidden = !shouldShowWithdrawButton
// self.manageAccountStackView.isHidden = true
self.view.backgroundColor = AppConstants.themeRedColor
self.roundedBgView.layer.cornerRadius = 20
self.labelBalance.text = "0"
NotificationCenter.default.addObserver(
self,
selector: #selector(self.updateBalance(sender:)),
name: self.getAvailableBalanceNotificationName(),
object: nil
)
self.addShadow(view: withdrawButton)
}
@objc private func configureText() {
autoDebitAccountButton.setTitle(StringConstants().autoDebitMenuText, for: UIControl.State.normal)
aboutGmeButton.setTitle(StringConstants().aboutGmeMenuText, for: UIControl.State.normal)
settingButton.setTitle(StringConstants().settingMenuText, for: UIControl.State.normal)
logoutButton.setTitle(StringConstants().logoutTitleText, for: UIControl.State.normal)
self.availableBalanceTitleLabel.text = StringConstants().availableBalanceTitleLabelText
self.gmeWalletNoTitleLabel.text = StringConstants().gmeWalletNoTitleText
self.withdrawButton.setTitle(StringConstants().withdrawButtonText, for: UIControl.State.normal)
self.transactionHistryButton.setTitle("transaction_report_text".localized(), for: UIControl.State.normal)
}
@objc private func updateBalance(sender: Notification) {
let balance = sender.userInfo?[SideMenuNavigationNotifications.availableBalance] as? String
self.labelBalance.text = balance
let shouldShowWithdrawButton = Utility.pennyTestVerified() && Utility.isVerifiedUser()
self.withdrawButton.isHidden = !shouldShowWithdrawButton
self.manageAccountStackView.isHidden = !shouldShowWithdrawButton
// self.manageAccountStackView.isHidden = true
}
private func setupBlueBackGroundTheme() {
self.roundedBgView.backgroundColor = AppConstants.themeBlueColor
[ labelPhone, labelEmail, labelBalance, labelWalletNumber, labelBank, labelUserNameInitial].forEach({
$0?.textColor = AppConstants.themWhiteColor
})
[aboutGmeButton, settingButton, logoutButton].forEach({
$0?.setTitleColor(AppConstants.themWhiteColor, for: UIControl.State.normal)
})
aboutIconImageView.tintColor = AppConstants.themWhiteColor
}
@IBAction func withdraw(_ sender: UIButton) {
self.sideMenuController?.hideLeftView()
NotificationCenter.default.post(name: self.getWithdrawNotificationName(), object: nil, userInfo: nil)
}
@IBAction func openTransactionHistory(_ sender: Any) {
self.sideMenuController?.hideLeftView()
NotificationCenter.default.post(
name: self.getTransactionHistoryNotificationName(),
object: nil,
userInfo: nil
)
}
@IBAction func openKftcAccountList(_ sender: UIButton) {
self.sideMenuController?.hideLeftView()
NotificationCenter.default.post(
name: self.getKftcAccountListNotificationName(),
object: nil,
userInfo: nil
)
}
@IBAction func aboutGme(_ sender: UIButton) {
self.sideMenuController?.hideLeftView()
NotificationCenter.default.post(name: self.getAboutGmeNotificationName(), object: nil, userInfo: nil)
}
@IBAction func support(_ sender: UIButton) {
self.sideMenuController?.hideLeftView()
NotificationCenter.default.post(name: self.getSupportNotificationName(), object: nil, userInfo: nil)
}
@IBAction func setting(_ sender: UIButton) {
self.sideMenuController?.hideLeftView()
NotificationCenter.default.post(name: self.getSettingNotificationName(), object: nil, userInfo: nil)
}
@IBAction func logout(_ sender: Any) {
alertWithOkCancel(
type: .normal,
message: StringConstants().logoutConfirmationText,
title: StringConstants().logoutTitleText,
okTitle: "Yes",
cancelTitle: "No",
okAction: { MainWireframe.logout() }
)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func setUpSettingsScreen() {
//PHONE
labelPhone.text = GMEDB.shared.user.string(.mobileNumber)
//EMAIL
labelEmail.text = GMEDB.shared.user.string(.email)
//NAME
labelProfileName.text = GMEDB.shared.user.string(.firstName)?.capitalized
//WALLET NUMBER
labelWalletNumber.text = GMEDB.shared.user.string(.walletNumber)
//BALANCE
let balance = GMEDB.shared.user.string(.availableBalance)
labelBalance.text = Utility.getCommaSeperatedString(numberString: balance ?? "")
//BANK NAME
labelBank.text = GMEDB.shared.user.string(.primaryBankName)
//IMAGE
let userDpString = GMEDB.shared.user.string(.dpUrl) ?? ""
if let userDpUrl = URL(string: userDpString) {
SDImageCache.shared().clearMemory()
SDImageCache.shared().clearDisk()
self.imageViewProfileSetting.sd_setImage(with: userDpUrl, completed: nil)
labelUserNameInitial.isHidden = true
imageViewProfileSetting.isHidden = false
imageViewProfileSetting.contentMode = .scaleAspectFill
} else {
labelUserNameInitial.layer.backgroundColor = UIColor(hex: 0x2e3192).cgColor
labelUserNameInitial.layer.cornerRadius = labelUserNameInitial.frame.height / 2
labelUserNameInitial.text = labelProfileName.text?.prefix(1).uppercased()
labelUserNameInitial.isHidden = false
imageViewProfileSetting.isHidden = true
}
@IBAction func setting(_ sender: UIButton) {
self.sideMenuController?.hideLeftView()
NotificationCenter.default.post(name: self.getSettingNotificationName(), object: nil, userInfo: nil)
}
@IBAction func logout(_ sender: Any) {
alertWithOkCancel(
type: .normal,
message: StringConstants().logoutConfirmationText,
title: StringConstants().logoutTitleText,
okTitle: "Yes",
cancelTitle: "No",
okAction: { MainWireframe.logout() }
)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func setUpSettingsScreen() {
//PHONE
labelPhone.text = GMEDB.shared.user.string(.mobileNumber)
//EMAIL
labelEmail.text = GMEDB.shared.user.string(.email)
//NAME
labelProfileName.text = GMEDB.shared.user.string(.firstName)?.capitalized
//WALLET NUMBER
labelWalletNumber.text = GMEDB.shared.user.string(.walletNumber)
//BALANCE
let balance = GMEDB.shared.user.string(.availableBalance)
labelBalance.text = Utility.getCommaSeperatedString(numberString: balance ?? "")
//BANK NAME
labelBank.text = GMEDB.shared.user.string(.primaryBankName)
//IMAGE
let userDpString = GMEDB.shared.user.string(.dpUrl) ?? ""
if let userDpUrl = URL(string: userDpString) {
SDImageCache.shared().clearMemory()
SDImageCache.shared().clearDisk()
self.imageViewProfileSetting.sd_setImage(with: userDpUrl, completed: nil)
labelUserNameInitial.isHidden = true
imageViewProfileSetting.isHidden = false
imageViewProfileSetting.contentMode = .scaleAspectFill
} else {
labelUserNameInitial.layer.backgroundColor = UIColor(hex: 0x2e3192).cgColor
labelUserNameInitial.layer.cornerRadius = labelUserNameInitial.frame.height / 2
labelUserNameInitial.text = labelProfileName.text?.prefix(1).uppercased()
labelUserNameInitial.isHidden = false
imageViewProfileSetting.isHidden = true
}
imageViewProfileSetting.layer.cornerRadius = imageViewProfileSetting.frame.height / 2
}
// Notification Names
func getAboutGmeNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.aboutGme)
}
func getSupportNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.support)
}
func getSettingNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.setting)
}
func getAvailableBalanceNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.availableBalance)
}
func getWithdrawNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.withdraw)
}
func getTransactionHistoryNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.transactionHistory)
}
func getKftcAccountListNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.KftcAccountList)
}
imageViewProfileSetting.layer.cornerRadius = imageViewProfileSetting.frame.height / 2
}
// Notification Names
func getAboutGmeNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.aboutGme)
}
func getSupportNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.support)
}
func getSettingNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.setting)
}
func getAvailableBalanceNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.availableBalance)
}
func getWithdrawNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.withdraw)
}
func getTransactionHistoryNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.transactionHistory)
}
func getKftcAccountListNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.KftcAccountList)
}
}

1
GME Remit/Modules/SplashScreen/User Interface/Wireframe/SplashScreenWireframe.swift

@ -46,4 +46,3 @@ extension SplashScreenWireframe: SplashScreenWireframeInput {
}
}
}

84
GME Remit/Modules/TransactionHistoryModules/MessageCompose/Application Logic/Interactor/MessageComposeInteractor.swift

@ -9,53 +9,53 @@
import Foundation
class MessageComposeInteractor {
// MARK: Properties
weak var output: MessageComposeInteractorOutput?
private let service: MessageComposeServiceType
// MARK: Initialization
init(service: MessageComposeServiceType) {
self.service = service
}
// MARK: Converting entities
// MARK: Properties
weak var output: MessageComposeInteractorOutput?
private let service: MessageComposeServiceType
// MARK: Initialization
init(service: MessageComposeServiceType) {
self.service = service
}
// MARK: Converting entities
}
// MARK: MessageCompose interactor input interface
extension MessageComposeInteractor: MessageComposeInteractorInput {
func cancel(control: String, transId: String, subject: String, body: String) {
let param = [
"controlNo" : control,
"tranId" : transId,
"body": body,
"subject": subject,
"UserId": Utility.getMyUserName()
]
self.service.cancelTransactionRequest(param: param, success: { (message) in
self.output?.show(model: message)
}) { (error) in
self.output?.show(error: error)
}
func cancel(control: String, transId: String, subject: String, body: String) {
let param = [
"controlNo" : control,
"tranId" : transId,
"body": body,
"subject": subject,
"UserId": Utility.getMyUserName()
]
self.service.cancelTransactionRequest(param: param, success: { (message) in
self.output?.show(model: message)
}) { (error) in
self.output?.show(error: error)
}
func edit(control: String, transId: String, subject: String, body: String) {
let param = [
"controlNo" : control,
"tranId" : transId,
"body": body,
"subject": subject,
"UserId": Utility.getMyUserName()
]
self.service.editTransactionRequest(param: param, success: { (message) in
self.output?.show(model: message)
}) { (error) in
self.output?.show(error: error)
}
}
func edit(control: String, transId: String, subject: String, body: String) {
let param = [
"controlNo" : control,
"tranId" : transId,
"body": body,
"subject": subject,
"UserId": Utility.getMyUserName()
]
self.service.editTransactionRequest(param: param, success: { (message) in
self.output?.show(model: message)
}) { (error) in
self.output?.show(error: error)
}
}
}

8
GME Remit/Modules/TransactionHistoryModules/MessageCompose/Application Logic/Interactor/MessageComposeInteractorIO.swift

@ -7,11 +7,11 @@
//
protocol MessageComposeInteractorInput: class {
func cancel(control: String, transId: String, subject: String, body: String)
func edit(control: String, transId: String, subject: String, body: String)
func cancel(control: String, transId: String, subject: String, body: String)
func edit(control: String, transId: String, subject: String, body: String)
}
protocol MessageComposeInteractorOutput: class {
func show(model: SuccessMessage)
func show(error: Error)
func show(model: SuccessMessage)
func show(error: Error)
}

126
GME Remit/Modules/TransactionHistoryModules/MessageCompose/Application Logic/Service/MessageComposeServiceType.swift

@ -8,62 +8,100 @@
import Foundation
protocol MessageComposeServiceType: class, MessageCancellationRequestApiService, MessageEditRequestApiService {
}
protocol MessageComposeServiceType: class,
MessageCancellationRequestApiService,
MessageEditRequestApiService { }
protocol MessageCancellationRequestApiService: ApiServiceType {
func cancelTransactionRequest(param: [String: String], success: @escaping (SuccessMessage) -> (), failure: @escaping (Error) -> ())
func cancelTransactionRequest(
param: [String: String],
success: @escaping (SuccessMessage) -> Void,
failure: @escaping (Error) -> Void
)
}
extension MessageCancellationRequestApiService {
func cancelTransactionRequest(param: [String: String], success: @escaping (SuccessMessage) -> (), failure: @escaping (Error) -> ()) {
let url = baseUrl + "/mobile/sendmoney/canceltransaction"
self.auth.request(method: .post, url: url, params: param, success: { (response: SuccessMessageContainer) in
if (response.errorCode ?? "") == "1" {
let error = NSError.init(domain: "Network", code: 0, userInfo: [NSLocalizedDescriptionKey : response.message ?? ""])
failure(error)
}else {
if let model = response.data {
success(model)
}else {
let error = NSError.init(domain: "MessageCancellationRequestApiService", code: 0, userInfo: [NSLocalizedDescriptionKey : "Could not map info from server"])
failure(error)
}
}
}) { (error) in
func cancelTransactionRequest(
param: [String: String],
success: @escaping (SuccessMessage) -> Void,
failure: @escaping (Error) -> Void
) {
let url = baseUrl + "/mobile/sendmoney/canceltransaction"
self.auth.request(
method: .post,
url: url,
params: param,
success: { (response: SuccessMessageContainer) in
if (response.errorCode ?? "") == "1" {
let error = NSError(
domain: "Network",
code: 0,
userInfo: [NSLocalizedDescriptionKey : response.message ?? ""]
)
failure(error)
} else {
if let model = response.data {
success(model)
} else {
let error = NSError(
domain: "MessageCancellationRequestApiService",
code: 0,
userInfo: [NSLocalizedDescriptionKey : "Could not map info from server"]
)
failure(error)
}
}
}
},
failure: { (error) in
failure(error)
}
)
}
}
protocol MessageEditRequestApiService: ApiServiceType {
func editTransactionRequest(param: [String: String], success: @escaping (SuccessMessage) -> (), failure: @escaping (Error) -> ())
func editTransactionRequest(
param: [String: String],
success: @escaping (SuccessMessage) -> Void,
failure: @escaping (Error) -> Void
)
}
extension MessageEditRequestApiService {
func editTransactionRequest(param: [String: String], success: @escaping (SuccessMessage) -> (), failure: @escaping (Error) -> ()) {
let url = baseUrl + "/mobile/sendmoney/amendtransaction"
self.auth.request(method: .post, url: url, params: param, success: { (response: SuccessMessageContainer) in
if (response.errorCode ?? "") == "1" {
let error = NSError.init(domain: "Network", code: 0, userInfo: [NSLocalizedDescriptionKey : response.message ?? ""])
failure(error)
}else {
if let model = response.data {
success(model)
}else {
let error = NSError.init(domain: "MessageCancellationRequestApiService", code: 0, userInfo: [NSLocalizedDescriptionKey : "Could not map info from server"])
failure(error)
}
}
}) { (error) in
func editTransactionRequest(
param: [String: String],
success: @escaping (SuccessMessage) -> Void,
failure: @escaping (Error) -> Void
) {
let url = baseUrl + "/mobile/sendmoney/amendtransaction"
self.auth.request(
method: .post,
url: url,
params: param,
success: { (response: SuccessMessageContainer) in
if (response.errorCode ?? "") == "1" {
let error = NSError(
domain: "Network",
code: 0,
userInfo: [NSLocalizedDescriptionKey : response.message ?? ""]
)
failure(error)
} else {
if let model = response.data {
success(model)
} else {
let error = NSError(
domain: "MessageCancellationRequestApiService",
code: 0,
userInfo: [NSLocalizedDescriptionKey : "Could not map info from server"]
)
failure(error)
}
}
}
}
},
failure: { (error) in
failure(error)
}
)
}
}

6
GME Remit/Modules/TransactionHistoryModules/MessageCompose/Module Interface/MessageComposeModuleInterface.swift

@ -7,7 +7,7 @@
//
protocol MessageComposeModuleInterface: class {
func cancel(control: String, transId: String, subject: String, body: String)
func edit(control: String, transId: String, subject: String, body: String)
func dismiss()
func cancel(control: String, transId: String, subject: String, body: String)
func edit(control: String, transId: String, subject: String, body: String)
func dismiss()
}

58
GME Remit/Modules/TransactionHistoryModules/MessageCompose/User Interface/Presenter/MessageComposePresenter.swift

@ -9,42 +9,42 @@
import Foundation
class MessageComposePresenter {
// MARK: Properties
weak var view: MessageComposeViewInterface?
var interactor: MessageComposeInteractorInput?
var wireframe: MessageComposeWireframeInput?
// MARK: Converting entities
// MARK: Properties
weak var view: MessageComposeViewInterface?
var interactor: MessageComposeInteractorInput?
var wireframe: MessageComposeWireframeInput?
// MARK: Converting entities
}
// MARK: MessageCompose module interface
// MARK: MessageCompose module interface
extension MessageComposePresenter: MessageComposeModuleInterface {
func cancel(control: String, transId: String, subject: String, body: String) {
self.interactor?.cancel(control: control, transId: transId, subject: subject, body: body)
}
func edit(control: String, transId: String, subject: String, body: String) {
self.interactor?.edit(control: control, transId: transId, subject: subject, body: body)
}
func dismiss() {
self.wireframe?.dismiss()
}
func cancel(control: String, transId: String, subject: String, body: String) {
self.interactor?.cancel(control: control, transId: transId, subject: subject, body: body)
}
func edit(control: String, transId: String, subject: String, body: String) {
self.interactor?.edit(control: control, transId: transId, subject: subject, body: body)
}
func dismiss() {
self.wireframe?.dismiss()
}
}
// MARK: MessageCompose interactor output interface
extension MessageComposePresenter: MessageComposeInteractorOutput {
func show(error: Error) {
self.view?.show(error: error.localizedDescription)
}
func show(model: SuccessMessage) {
self.view?.show(model: model)
}
func show(error: Error) {
self.view?.show(error: error.localizedDescription)
}
func show(model: SuccessMessage) {
self.view?.show(model: model)
}
}

4
GME Remit/Modules/TransactionHistoryModules/MessageCompose/User Interface/View/MessageComposeViewInterface.swift

@ -7,6 +7,6 @@
//
protocol MessageComposeViewInterface: class {
func show(error: String)
func show(model: SuccessMessage)
func show(error: String)
func show(model: SuccessMessage)
}

68
GME Remit/Modules/TransactionHistoryModules/MessageCompose/User Interface/Wireframe/MessageComposeWireframe.swift

@ -9,43 +9,43 @@
import UIKit
class MessageComposeWireframe {
weak var view: UIViewController!
var control:String?
var transactionId:String?
var type: MailBoxType?
weak var view: UIViewController!
var control:String?
var transactionId:String?
var type: MailBoxType?
}
extension MessageComposeWireframe: MessageComposeWireframeInput {
var storyboardName: String {return "MessageCompose"}
func getMainView() -> UIViewController {
let service = MessageComposeService()
let interactor = MessageComposeInteractor(service: service)
let presenter = MessageComposePresenter()
let viewController = viewControllerFromStoryboard(of: MessageComposeViewController.self)
viewController.controlNO = control
viewController.transactionId = transactionId
viewController.type = self.type
viewController.presenter = presenter
interactor.output = presenter
presenter.interactor = interactor
presenter.wireframe = self
presenter.view = viewController
var storyboardName: String {return "MessageCompose"}
func getMainView() -> UIViewController {
let service = MessageComposeService()
let interactor = MessageComposeInteractor(service: service)
let presenter = MessageComposePresenter()
let viewController = viewControllerFromStoryboard(of: MessageComposeViewController.self)
viewController.controlNO = control
viewController.transactionId = transactionId
viewController.type = self.type
viewController.presenter = presenter
interactor.output = presenter
presenter.interactor = interactor
presenter.wireframe = self
presenter.view = viewController
self.view = viewController
return viewController
}
func openMail(controlNO: String, transactionId: String, type: MailBoxType, source: UINavigationController) {
self.control = controlNO
self.transactionId = transactionId
self.type = type
self.pushMainView(in: source)
}
func dismiss() {
self.view.navigationController?.popToRootViewController(animated: true)
}
self.view = viewController
return viewController
}
func openMail(controlNO: String, transactionId: String, type: MailBoxType, source: UINavigationController) {
self.control = controlNO
self.transactionId = transactionId
self.type = type
self.pushMainView(in: source)
}
func dismiss() {
self.view.navigationController?.popToRootViewController(animated: true)
}
}

2
GME Remit/Modules/TransactionHistoryModules/MessageCompose/User Interface/Wireframe/MessageComposeWireframeInput.swift

@ -9,5 +9,5 @@
import Foundation
protocol MessageComposeWireframeInput: WireframeInput {
func dismiss()
func dismiss()
}

6
GME Remit/Modules/TransactionHistoryModules/TransactionHistory/Application Logic/Interactor/TransactionHistoryInteractorIO.swift

@ -7,10 +7,10 @@
//
protocol TransactionHistoryInteractorInput: class {
func fetchTransactionHistories(fromDate: String?, toDate: String?)
func fetchTransactionHistories(fromDate: String?, toDate: String?)
}
protocol TransactionHistoryInteractorOutput: class {
func show(error: Error)
func show(models: [TransactionModel])
func show(error: Error)
func show(models: [TransactionModel])
}

51
GME Remit/Modules/TransactionHistoryModules/TransactionHistory/Application Logic/Service/TransactionHistoryServiceType.swift

@ -9,28 +9,47 @@
import Foundation
protocol TransactionHistoryServiceType: class, FetchTransactionHistoryService {
}
protocol FetchTransactionHistoryService: ApiServiceType {
func fetchTransactionHistories(user: String, param: [String: String]?, success: @escaping (([TransactionModel]) -> ()), failure: @escaping ((Error) -> ()))
func fetchTransactionHistories(
user: String,
param: [String: String]?,
success: @escaping (([TransactionModel]) -> Void),
failure: @escaping ((Error) -> Void)
)
}
extension FetchTransactionHistoryService {
func fetchTransactionHistories(user: String, param: [String: String]?, success: @escaping (([TransactionModel]) -> ()), failure: @escaping ((Error) -> ())) {
let url = baseUrl + "/mobile/tranhistory/" + "\(user)"
self.auth.request(method: .post, url: url, params: param, success: { (response: TransactionModelContainer) in
if (response.errorCode ?? "") == "1" {
let error = NSError.init(domain: "Network", code: 0, userInfo: [NSLocalizedDescriptionKey : response.message ?? ""])
failure(error)
}else {
let model = response.data
success(model ?? [])
}
}) { (error) in
failure(error)
func fetchTransactionHistories(
user: String,
param: [String: String]?,
success: @escaping (([TransactionModel]) -> Void),
failure: @escaping ((Error) -> Void)
) {
let url = baseUrl + "/mobile/tranhistory/" + "\(user)"
self.auth.request(
method: .post,
url: url,
params: param,
success: { (response: TransactionModelContainer) in
if (response.errorCode ?? "") == "1" {
let error = NSError(
domain: "Network",
code: 0,
userInfo: [NSLocalizedDescriptionKey : response.message ?? ""]
)
failure(error)
} else {
let model = response.data
success(model ?? [])
}
}
},
failure: { (error) in
failure(error)
}
)
}
}

10
GME Remit/Modules/TransactionHistoryModules/TransactionHistory/Module Interface/TransactionHistoryModuleInterface.swift

@ -7,9 +7,9 @@
//
protocol TransactionHistoryModuleInterface: class {
func viewIsReady()
func showDetailOf(index: Int)
func search(text: String)
func filterTransaction(type: TransactionModelType)
func fetchTransactionHistories(fromDate: String?, toDate: String?)
func viewIsReady()
func showDetailOf(index: Int)
func search(text: String)
func filterTransaction(type: TransactionModelType)
func fetchTransactionHistories(fromDate: String?, toDate: String?)
}

157
GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/Presenter/TransactionHistoryPresenter.swift

@ -9,97 +9,96 @@
import Foundation
class TransactionHistoryPresenter {
// MARK: Properties
var models: [TransactionModel] = []
var filteredModels: [TransactionModel] = [] {
didSet {
self.view?.show(models: filteredModels)
}
// MARK: Properties
var models: [TransactionModel] = []
var filteredModels: [TransactionModel] = [] {
didSet {
self.view?.show(models: filteredModels)
}
weak var view: TransactionHistoryViewInterface?
var interactor: TransactionHistoryInteractorInput?
var wireframe: TransactionHistoryWireframeInput?
// MARK: Converting entities
}
weak var view: TransactionHistoryViewInterface?
var interactor: TransactionHistoryInteractorInput?
var wireframe: TransactionHistoryWireframeInput?
// MARK: Converting entities
}
// MARK: TransactionHistory module interface
// MARK: TransactionHistory module interface
extension TransactionHistoryPresenter: TransactionHistoryModuleInterface {
func fetchTransactionHistories(fromDate: String?, toDate: String?) {
self.view?.showLoading()
interactor?.fetchTransactionHistories(fromDate: fromDate, toDate: toDate)
}
func viewIsReady() {
self.fetchTransactionHistories(fromDate: nil, toDate: nil)
}
func filterTransaction(type: TransactionModelType) {
switch type {
case .all:
self.filteredModels = models
case .paid: // sent
self.filteredModels = models.filter({
($0.payStatus ?? "" ).lowercased() == type.rawValue.lowercased()
})
case .unpaid: // paid
self.filteredModels = models.filter({
($0.payStatus ?? "" ).lowercased() == type.rawValue.lowercased()
})
}
}
func showDetailOf(index: Int) {
let element = self.filteredModels.elementAt(index: index)
guard let id = element?.transactionId, let controlNo = element?.controlNumber else {return}
let status = (element?.payStatus ?? "").lowercased()
if status == TransactionModelType.paid.rawValue.lowercased() || status == "cancel" {
wireframe?.openReciept(transactionId: id, shouldShowCancelAmmendButton: false, control: controlNo)
} else {
wireframe?.openReciept(transactionId: id, shouldShowCancelAmmendButton: true, control: controlNo)
}
func fetchTransactionHistories(fromDate: String?, toDate: String?) {
self.view?.showLoading()
interactor?.fetchTransactionHistories(fromDate: fromDate, toDate: toDate)
}
func viewIsReady() {
self.fetchTransactionHistories(fromDate: nil, toDate: nil)
}
func filterTransaction(type: TransactionModelType) {
switch type {
case .all:
self.filteredModels = models
case .paid: // sent
self.filteredModels = models.filter({
($0.payStatus ?? "" ).lowercased() == type.rawValue.lowercased()
})
case .unpaid: // paid
self.filteredModels = models.filter({
($0.payStatus ?? "" ).lowercased() == type.rawValue.lowercased()
})
}
func search(text: String) {
let searchText = text.lowercased()
self.filteredModels = (models).filter( {model in
return searchText.isEmpty || (model.controlNumber ?? "").contains(searchText)
})
}
func showDetailOf(index: Int) {
let element = self.filteredModels.elementAt(index: index)
guard let id = element?.transactionId, let controlNo = element?.controlNumber else {return}
let status = (element?.payStatus ?? "").lowercased()
if status == TransactionModelType.paid.rawValue.lowercased() || status == "cancel" {
wireframe?.openReciept(transactionId: id, shouldShowCancelAmmendButton: false, control: controlNo)
} else {
wireframe?.openReciept(transactionId: id, shouldShowCancelAmmendButton: true, control: controlNo)
}
}
func search(text: String) {
let searchText = text.lowercased()
self.filteredModels = (models).filter( {model in
return searchText.isEmpty || (model.controlNumber ?? "").contains(searchText)
})
}
}
// MARK: TransactionHistory interactor output interface
extension TransactionHistoryPresenter: TransactionHistoryInteractorOutput {
func show(error: Error) {
self.view?.hideLoading()
self.view?.show(error: error.localizedDescription)
}
func show(models: [TransactionModel]) {
self.view?.hideLoading()
let newModels: [TransactionModel] = models.map({
let status = ($0.payStatus ?? "").lowercased()
let statusIsPaid = status == TransactionModelType.paid.rawValue.lowercased()
let statusIsUnpaid = status == TransactionModelType.unpaid.rawValue.lowercased()
let statusIsCancel = status == "Cancel".lowercased()
let shouldNotUpdateStatus = statusIsPaid || statusIsUnpaid || statusIsCancel
if !shouldNotUpdateStatus {
$0.payStatus = "Unpaid"
return $0
}
return $0
})
func show(error: Error) {
self.view?.hideLoading()
self.view?.show(error: error.localizedDescription)
}
func show(models: [TransactionModel]) {
self.view?.hideLoading()
let newModels: [TransactionModel] = models.map({
let status = ($0.payStatus ?? "").lowercased()
let statusIsPaid = status == TransactionModelType.paid.rawValue.lowercased()
let statusIsUnpaid = status == TransactionModelType.unpaid.rawValue.lowercased()
let statusIsCancel = status == "Cancel".lowercased()
let shouldNotUpdateStatus = statusIsPaid || statusIsUnpaid || statusIsCancel
if !shouldNotUpdateStatus {
$0.payStatus = "Unpaid"
return $0
}
return $0
})
self.models = newModels
self.models = newModels
self.filteredModels = self.models
}
self.filteredModels = self.models
}
}

68
GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/View/Cell/TransactionHistoryTableViewCell.swift

@ -9,39 +9,41 @@
import UIKit
class TransactionHistoryTableViewCell: UITableViewCell {
enum Status: String {
case paid
case unpaid
}
@IBOutlet weak var bgView: UIView!
@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var amountLabel: UILabel!
@IBOutlet weak var paymentMethodLabel: UILabel!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var transactionNumberLabel: UILabel!
@IBOutlet weak var controlNumberLabel: UILabel!
var model: TransactionModel?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
func setup() {
self.dateLabel.text = model?.sendDate
self.amountLabel.text = (model?.pAmt ?? "") + " " + (model?.pCurrency ?? "")
self.paymentMethodLabel.text = model?.payOutMode
self.nameLabel.text = model?.user
let paystatus = model?.payStatus ?? ""
self.transactionNumberLabel.text = paystatus.uppercased() // show pay status, paid or unpaid
self.transactionNumberLabel.textColor = .white
self.transactionNumberLabel.layer.cornerRadius = 5
self.controlNumberLabel.text = self.model?.controlNumber
let status = Status.init(rawValue: paystatus.lowercased()) ?? .unpaid
enum Status: String {
case paid = "paid"
case unpaid = "unpaid"
}
self.transactionNumberLabel
.backgroundColor = status == .paid ? AppConstants.themeBlueColor : AppConstants.themeRedColor
@IBOutlet weak var bgView: UIView!
@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var amountLabel: UILabel!
@IBOutlet weak var paymentMethodLabel: UILabel!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var transactionNumberLabel: UILabel!
@IBOutlet weak var controlNumberLabel: UILabel!
var model: TransactionModel?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
func setup() {
self.dateLabel.text = model?.sendDate
self.amountLabel.text = (model?.pAmt ?? "") + " " + (model?.pCurrency ?? "")
self.paymentMethodLabel.text = model?.payOutMode
self.nameLabel.text = model?.user
let paystatus = model?.payStatus ?? ""
self.transactionNumberLabel.text = paystatus.uppercased() // show pay status, paid or unpaid
self.transactionNumberLabel.textColor = .white
self.transactionNumberLabel.layer.cornerRadius = 5
self.controlNumberLabel.text = self.model?.controlNumber
let status = Status.init(rawValue: paystatus.lowercased()) ?? .unpaid
self.transactionNumberLabel.backgroundColor = status == .paid ? AppConstants.themeBlueColor : AppConstants.themeRedColor
}
}
}

14
GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/View/DatePickerViewController.swift

@ -24,7 +24,7 @@ class DatePickerViewController: UIViewController {
let searchButtonText = "search_text".localized()
}
var completion: ((_ from: String?, _ to: String?) -> ())?
var completion: ((_ from: String?, _ to: String?) -> Void)?
private var from: String?
private var to: String?
@ -59,17 +59,13 @@ class DatePickerViewController: UIViewController {
@IBAction func searcg(_ sender: UIButton) {
view.endEditing(true)
dismiss(animated: true){[weak self] in
guard let `self` = self else {
return
}
dismiss(animated: true) {[weak self] in
guard let `self` = self else { return }
self.completion?(self.from, self.to)
}
}
// private functions
private func setup() {
setupToDatePicker()
@ -81,8 +77,8 @@ class DatePickerViewController: UIViewController {
value: -1,
to: Date()) else {
return
}
}
fromDatePicker.date = aMonthAgo
handleFromDatePicker(sender: fromDatePicker)

374
GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/View/TransactionHistoryViewController.swift

@ -9,207 +9,207 @@
import UIKit
enum TransactionModelType: String {
case paid = "paid" // sent but not delivered
case all = "all"
case unpaid = "unpaid" // sent and delivered
case paid
case all
case unpaid
}
class TransactionHistoryViewController: UIViewController {
enum SegmentIndex: Int {
case all = 0
case sent
case delivered
}
struct Constant {
static let heightOfDateRangeLabel: CGFloat = 35
}
struct StringConstants {
let searchPlaceholderText = "search_with_controlno_text".localized()
// see TransactionModelType abobve for more
// static let paidText = "paid"
// static let allText = "all"
// static let unpaid = "unpaid"
}
// MARK: IBOutlets
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet weak var dateRangeLabelHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var emptyLabel: UILabel!
@IBOutlet weak var fromDateLabel: UILabel!
@IBOutlet weak var toDateLabel: UILabel!
@IBOutlet weak var searchTextField: UITextField!
// MARK: Properties
var from: String?
var to: String?
var transactions: [TransactionModel] = [] {
didSet {
self.emptyLabel.isHidden = !transactions.isEmpty
self.tableView.reloadData()
guard let fromDate = from, let toDate = to else {
self.dateRangeLabelHeightConstraint.constant = 0
return
}
self.fromDateLabel.text = self.getHUmanReadableDate(date: fromDate)
self.toDateLabel.text = self.getHUmanReadableDate(date: toDate)
UIView.animate(withDuration: 0.33, animations: {
self.dateRangeLabelHeightConstraint.constant = Constant.heightOfDateRangeLabel
})
}
}
var transactionType: TransactionModelType? {
didSet {
// filter for transaction type
if self.transactionType != oldValue {
guard let type = self.transactionType else {return}
self.presenter?.filterTransaction(type: type)
}
}
}
var presenter: TransactionHistoryModuleInterface?
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
self.setupNormalNavigation()
self.setup()
presenter?.viewIsReady()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = "transaction_report_text".localized()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = ""
}
// MARK: IBActions
@IBAction func openSearchFilter(_ sender: UIButton) {
// open search filter
let viewController = UIStoryboard.init(name: "TransactionHistoryDatePicker", bundle: nil).instantiateViewController(withIdentifier: "DatePickerViewController") as! DatePickerViewController
viewController.completion = self.selectedDate
self.present(viewController, animated: true, completion: nil)
}
@IBAction func segmentChanged(_ sender: UISegmentedControl) {
self.searchTextField.text = ""
guard let index = SegmentIndex(rawValue: sender.selectedSegmentIndex) else {return}
switch index {
case .all:
self.transactionType = .all
case .sent:
self.transactionType = .unpaid
case .delivered:
self.transactionType = .paid
}
}
// MARK: Other Functions
private func selectedDate(from: String?, to: String?) {
self.from = from
self.to = to
guard let fromDate = from, let toDate = to else {return}
self.presenter?.fetchTransactionHistories(fromDate: fromDate, toDate: toDate)
}
private func getHUmanReadableDate(date: String?) -> String? {
if let date = DateFormatter.toDate(dateString: date ?? "", format: AppConstants.dateFormat) {
let dateString = DateFormatter.toString(date: date, format: AppConstants.humanReadableDateFormat)
return dateString
}
return nil
}
private func setup() {
// all setup should be done here
setupSearchTextField()
setupDelegates()
self.transactionType = .all
enum SegmentIndex: Int {
case all = 0
case sent
case delivered
}
struct Constant {
static let heightOfDateRangeLabel: CGFloat = 35
}
struct StringConstants {
let searchPlaceholderText = "search_with_controlno_text".localized()
}
// MARK: IBOutlets
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet weak var dateRangeLabelHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var emptyLabel: UILabel!
@IBOutlet weak var fromDateLabel: UILabel!
@IBOutlet weak var toDateLabel: UILabel!
@IBOutlet weak var searchTextField: UITextField!
// MARK: Properties
var from: String?
var to: String?
var transactions: [TransactionModel] = [] {
didSet {
self.emptyLabel.isHidden = !transactions.isEmpty
self.tableView.reloadData()
guard let fromDate = from, let toDate = to else {
self.dateRangeLabelHeightConstraint.constant = 0
segmentedControl.setTitle("all_text".localized(), forSegmentAt: 0)
segmentedControl.setTitle("unpaid_text".localized(), forSegmentAt: 1)
segmentedControl.setTitle("paid_text".localized(), forSegmentAt: 2)
}
private func setupSearchTextField() {
searchTextField.placeholder = StringConstants().searchPlaceholderText
let imageview = UIImageView(image: #imageLiteral(resourceName: "ic_search"))
self.searchTextField.leftView = imageview
self.searchTextField.leftViewMode = .always
self.searchTextField.addTarget(self, action: #selector(search(sender:)), for: UIControl.Event.editingChanged)
}
@objc func search(sender: UITextField) {
let searchText = sender.text!
self.presenter?.search(text: searchText)
}
private func setupDelegates() {
self.tableView.delegate = self
self.tableView.dataSource = self
}
return
}
self.fromDateLabel.text = self.getHUmanReadableDate(date: fromDate)
self.toDateLabel.text = self.getHUmanReadableDate(date: toDate)
UIView.animate(withDuration: 0.33, animations: {
self.dateRangeLabelHeightConstraint.constant = Constant.heightOfDateRangeLabel
})
}
}
var transactionType: TransactionModelType? {
didSet {
// filter for transaction type
if self.transactionType != oldValue {
guard let type = self.transactionType else {return}
self.presenter?.filterTransaction(type: type)
}
}
}
var presenter: TransactionHistoryModuleInterface?
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
self.setupNormalNavigation()
self.setup()
presenter?.viewIsReady()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = "transaction_report_text".localized()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = ""
}
// MARK: IBActions
@IBAction func openSearchFilter(_ sender: UIButton) {
// open search filter
guard let viewController = UIStoryboard(name: "TransactionHistoryDatePicker", bundle: nil)
.instantiateViewController(withIdentifier: "DatePickerViewController") as? DatePickerViewController else {
return
}
viewController.completion = self.selectedDate
self.present(viewController, animated: true, completion: nil)
}
@IBAction func segmentChanged(_ sender: UISegmentedControl) {
self.searchTextField.text = ""
guard let index = SegmentIndex(rawValue: sender.selectedSegmentIndex) else {return}
switch index {
case .all:
self.transactionType = .all
case .sent:
self.transactionType = .unpaid
case .delivered:
self.transactionType = .paid
}
}
// MARK: Other Functions
private func selectedDate(from: String?, to: String?) {
self.from = from
self.to = to
guard let fromDate = from, let toDate = to else {return}
self.presenter?.fetchTransactionHistories(fromDate: fromDate, toDate: toDate)
}
private func getHUmanReadableDate(date: String?) -> String? {
if let date = DateFormatter.toDate(dateString: date ?? "", format: AppConstants.dateFormat) {
let dateString = DateFormatter.toString(date: date, format: AppConstants.humanReadableDateFormat)
return dateString
}
return nil
}
private func setup() {
// all setup should be done here
setupSearchTextField()
setupDelegates()
self.transactionType = .all
self.dateRangeLabelHeightConstraint.constant = 0
segmentedControl.setTitle("all_text".localized(), forSegmentAt: 0)
segmentedControl.setTitle("unpaid_text".localized(), forSegmentAt: 1)
segmentedControl.setTitle("paid_text".localized(), forSegmentAt: 2)
}
private func setupSearchTextField() {
searchTextField.placeholder = StringConstants().searchPlaceholderText
let imageview = UIImageView(image: #imageLiteral(resourceName: "ic_search"))
self.searchTextField.leftView = imageview
self.searchTextField.leftViewMode = .always
self.searchTextField.addTarget(
self,
action: #selector(search(sender:)),
for: .editingChanged
)
}
@objc func search(sender: UITextField) {
let searchText = sender.text!
self.presenter?.search(text: searchText)
}
private func setupDelegates() {
self.tableView.delegate = self
self.tableView.dataSource = self
}
}
// MARK: TransactionHistoryViewInterface
extension TransactionHistoryViewController: TransactionHistoryViewInterface {
func showLoading() {
self.showProgressHud()
}
func hideLoading() {
self.hideProgressHud()
}
func show(error: String) {
self.alert(message: error)
}
func show(models: [TransactionModel]) {
self.transactions = models
}
func showLoading() {
self.showProgressHud()
}
func hideLoading() {
self.hideProgressHud()
}
func show(error: String) {
self.alert(message: error)
}
func show(models: [TransactionModel]) {
self.transactions = models
}
}
// MARK: TableViewDelegate
extension TransactionHistoryViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.presenter?.showDetailOf(index: indexPath.row)
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.presenter?.showDetailOf(index: indexPath.row)
}
}
// MARK: TableViewDatasource
extension TransactionHistoryViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return transactions.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TransactionHistoryTableViewCell") as! TransactionHistoryTableViewCell
cell.model = self.transactions.elementAt(index: indexPath.row)
cell.setup()
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return transactions.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(
withIdentifier: "TransactionHistoryTableViewCell"
) as? TransactionHistoryTableViewCell else {
return UITableViewCell()
}
cell.model = self.transactions.elementAt(index: indexPath.row)
cell.setup()
return cell
}
}

8
GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/View/TransactionHistoryViewInterface.swift

@ -7,8 +7,8 @@
//
protocol TransactionHistoryViewInterface: class {
func showLoading()
func hideLoading()
func show(error: String)
func show(models: [TransactionModel])
func showLoading()
func hideLoading()
func show(error: String)
func show(models: [TransactionModel])
}

55
GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/Wireframe/TransactionHistoryWireframe.swift

@ -9,35 +9,40 @@
import UIKit
class TransactionHistoryWireframe {
weak var view: UIViewController!
let reciptWireframe = SendMoneyReceiptWireframe()
weak var view: UIViewController!
let reciptWireframe = SendMoneyReceiptWireframe()
}
extension TransactionHistoryWireframe: TransactionHistoryWireframeInput {
var storyboardName: String {return "TransactionHistory"}
func getMainView() -> UIViewController {
let service = TransactionHistoryService()
let interactor = TransactionHistoryInteractor(service: service)
let presenter = TransactionHistoryPresenter()
let viewController = viewControllerFromStoryboard(of: TransactionHistoryViewController.self)
var storyboardName: String {return "TransactionHistory"}
viewController.presenter = presenter
interactor.output = presenter
presenter.interactor = interactor
presenter.wireframe = self
presenter.view = viewController
func getMainView() -> UIViewController {
let service = TransactionHistoryService()
let interactor = TransactionHistoryInteractor(service: service)
let presenter = TransactionHistoryPresenter()
let viewController = viewControllerFromStoryboard(of: TransactionHistoryViewController.self)
viewController.presenter = presenter
interactor.output = presenter
presenter.interactor = interactor
presenter.wireframe = self
presenter.view = viewController
self.view = viewController
return viewController
self.view = viewController
return viewController
}
func openReciept(transactionId: String, shouldShowCancelAmmendButton: Bool, control: String) {
if let navigation = self.view.navigationController {
reciptWireframe.openRecieptFromTransactionReport(
controlNo: control,
transactionId: transactionId,
shouldShowCancelAmmendButton: shouldShowCancelAmmendButton,
source: navigation
)
}
func openReciept(transactionId: String, shouldShowCancelAmmendButton: Bool, control: String) {
if let navigation = self.view.navigationController {
reciptWireframe.openRecieptFromTransactionReport(controlNo: control, transactionId: transactionId, shouldShowCancelAmmendButton: shouldShowCancelAmmendButton, source: navigation)
}
}
}
}

2
GME Remit/Modules/TransactionHistoryModules/TransactionHistory/User Interface/Wireframe/TransactionHistoryWireframeInput.swift

@ -9,5 +9,5 @@
import Foundation
protocol TransactionHistoryWireframeInput: WireframeInput {
func openReciept(transactionId: String, shouldShowCancelAmmendButton: Bool, control: String)
func openReciept(transactionId: String, shouldShowCancelAmmendButton: Bool, control: String)
}

69
GME Remit/Modules/WalletStatement/Application Logic/Interactor/WalletStatementInteractor.swift

@ -9,42 +9,47 @@
import Foundation
class WalletStatementInteractor {
// MARK: Properties
weak var output: WalletStatementInteractorOutput?
private let service: WalletStatementServiceType
// MARK: Initialization
init(service: WalletStatementServiceType) {
self.service = service
}
// MARK: Converting entities
// MARK: Properties
weak var output: WalletStatementInteractorOutput?
private let service: WalletStatementServiceType
// MARK: Initialization
init(service: WalletStatementServiceType) {
self.service = service
}
// MARK: Converting entities
}
// MARK: WalletStatement interactor input interface
extension WalletStatementInteractor: WalletStatementInteractorInput {
func fetchWalletSatement(fromDate: String?, toDate: String?) {
let userName = Utility.getMyUserName()
var param: [String: String] = [:]
if let from = fromDate {
param["FromDate"] = from
}
if let to = toDate {
param["ToDate"] = to
}
let parameters = (param.isEmpty) ? nil : param
self.service.fetchWalletStatement(user: userName, param: parameters, success: { (model) in
self.output?.show(models: model)
}) { (error) in
self.output?.show(error: error)
}
func fetchWalletSatement(fromDate: String?, toDate: String?) {
let userName = Utility.getMyUserName()
var param: [String: String] = [:]
if let from = fromDate {
param["FromDate"] = from
}
if let to = toDate {
param["ToDate"] = to
}
let parameters = (param.isEmpty) ? nil : param
self.service.fetchWalletStatement(
user: userName,
param: parameters,
success: { (model) in
self.output?.show(models: model)
},
failure: { (error) in
self.output?.show(error: error)
}
)
}
}

6
GME Remit/Modules/WalletStatement/Application Logic/Interactor/WalletStatementInteractorIO.swift

@ -7,10 +7,10 @@
//
protocol WalletStatementInteractorInput: class {
func fetchWalletSatement(fromDate: String?, toDate: String?)
func fetchWalletSatement(fromDate: String?, toDate: String?)
}
protocol WalletStatementInteractorOutput: class {
func show(error: Error)
func show(models: [WalletStatement])
func show(error: Error)
func show(models: [WalletStatement])
}

52
GME Remit/Modules/WalletStatement/Application Logic/Service/WalletStatementServiceType.swift

@ -9,28 +9,46 @@
import Foundation
protocol WalletStatementServiceType: class, FetchWalletStatementService {
}
protocol FetchWalletStatementService: ApiServiceType {
func fetchWalletStatement(user: String, param: [String: String]?, success: @escaping (([WalletStatement]) -> ()), failure: @escaping ((Error) -> ()))
func fetchWalletStatement(
user: String,
param: [String: String]?,
success: @escaping (([WalletStatement]) -> Void),
failure: @escaping ((Error) -> Void)
)
}
extension FetchWalletStatementService {
func fetchWalletStatement(user: String, param: [String: String]?, success: @escaping (([WalletStatement]) -> ()), failure: @escaping ((Error) -> ())) {
let url = baseUrl + "/mobile/walletstatement/" + "\(user)"
self.auth.request(method: .post, url: url, params: param, success: { (response: WalletStatementContainer) in
if (response.errorCode ?? "") == "1" {
let error = NSError.init(domain: "Network", code: 0, userInfo: [NSLocalizedDescriptionKey : response.message ?? ""])
failure(error)
}else {
let model = response.data
success(model ?? [])
}
}) { (error) in
failure(error)
func fetchWalletStatement(
user: String,
param: [String: String]?,
success: @escaping (([WalletStatement]) -> Void),
failure: @escaping ((Error) -> Void)
) {
let url = baseUrl + "/mobile/walletstatement/" + "\(user)"
self.auth.request(
method: .post,
url: url,
params: param,
success: { (response: WalletStatementContainer) in
if (response.errorCode ?? "") == "1" {
let error = NSError(
domain: "Network",
code: 0,
userInfo: [NSLocalizedDescriptionKey : response.message ?? ""]
)
failure(error)
} else {
let model = response.data
success(model ?? [])
}
}
},
failure: { (error) in
failure(error)
}
)
}
}

6
GME Remit/Modules/WalletStatement/Module Interface/WalletStatementModuleInterface.swift

@ -7,7 +7,7 @@
//
protocol WalletStatementModuleInterface: class {
func viewIsReady()
func filterWalletInStatements()
func fetchWalletSatement(fromDate: String?, toDate: String?)
func viewIsReady()
func filterWalletInStatements()
func fetchWalletSatement(fromDate: String?, toDate: String?)
}

78
GME Remit/Modules/WalletStatement/User Interface/Presenter/WalletStatementPresenter.swift

@ -9,53 +9,53 @@
import Foundation
class WalletStatementPresenter {
// MARK: Properties
var models: [WalletStatement] = []
var filteredModels: [WalletStatement] = [] {
didSet {
self.view?.show(models: filteredModels)
}
// MARK: Properties
var models: [WalletStatement] = []
var filteredModels: [WalletStatement] = [] {
didSet {
self.view?.show(models: filteredModels)
}
weak var view: WalletStatementViewInterface?
var interactor: WalletStatementInteractorInput?
var wireframe: WalletStatementWireframeInput?
// MARK: Converting entities
}
weak var view: WalletStatementViewInterface?
var interactor: WalletStatementInteractorInput?
var wireframe: WalletStatementWireframeInput?
// MARK: Converting entities
}
// MARK: WalletStatement module interface
// MARK: WalletStatement module interface
extension WalletStatementPresenter: WalletStatementModuleInterface {
func viewIsReady() {
self.fetchWalletSatement(fromDate: nil, toDate: nil)
}
func filterWalletInStatements() {
}
func fetchWalletSatement(fromDate: String?, toDate: String?) {
self.view?.showLoading()
self.interactor?.fetchWalletSatement(fromDate: fromDate, toDate: toDate)
}
func viewIsReady() {
self.fetchWalletSatement(fromDate: nil, toDate: nil)
}
func filterWalletInStatements() {
}
func fetchWalletSatement(fromDate: String?, toDate: String?) {
self.view?.showLoading()
self.interactor?.fetchWalletSatement(fromDate: fromDate, toDate: toDate)
}
}
// MARK: WalletStatement interactor output interface
extension WalletStatementPresenter: WalletStatementInteractorOutput {
func show(error: Error) {
self.view?.hideLoading()
self.view?.show(error: error.localizedDescription)
}
func show(models: [WalletStatement]) {
self.view?.hideLoading()
self.models = models
self.filteredModels = self.models
}
func show(error: Error) {
self.view?.hideLoading()
self.view?.show(error: error.localizedDescription)
}
func show(models: [WalletStatement]) {
self.view?.hideLoading()
self.models = models
self.filteredModels = self.models
}
}

104
GME Remit/Modules/WalletStatement/User Interface/View/Cell/WalletStatementTableViewCell.swift

@ -9,62 +9,62 @@
import UIKit
class WalletStatementTableViewCell: UITableViewCell {
struct StringConstants {
let `in` = "in_text".localized()
let out = "out_text".localized()
let closingBalanceText = "closing_balance_text".localized()
}
enum WalletInOutType: String {
case walletIn = "WalletIn"
case walletOut = "WalletOut"
case closingAmount = "ClosingAmount"
struct StringConstants {
let `in` = "in_text".localized()
let out = "out_text".localized()
let closingBalanceText = "closing_balance_text".localized()
}
enum WalletInOutType: String {
case walletIn = "WalletIn"
case walletOut = "WalletOut"
case closingAmount = "ClosingAmount"
}
@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var particularLabel: UILabel!
@IBOutlet weak var closingAmountLabel: UILabel!
@IBOutlet weak var amtLabelStackView: UIStackView!
@IBOutlet weak var closingBalanceTitleLabel: UILabel!
@IBOutlet weak var walletAmountLabel: UILabel!
var model: WalletStatement?
func getType() -> WalletInOutType {
if (model?.particular ?? "").lowercased() == "Balance Brought Forward".lowercased() {
return .closingAmount
}
return (model?.walletOut ?? "") == "₩0" ? .walletIn : .walletOut
}
func setup() {
configureText()
self.dateLabel.text = model?.transactionDate
self.particularLabel.text = model?.particular
self.closingAmountLabel.text = model?.closingAmount
@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var particularLabel: UILabel!
@IBOutlet weak var closingAmountLabel: UILabel!
@IBOutlet weak var amtLabelStackView: UIStackView!
@IBOutlet weak var closingBalanceTitleLabel: UILabel!
@IBOutlet weak var walletAmountLabel: UILabel!
let type: WalletInOutType = getType()
var model: WalletStatement?
self.walletAmountLabel.layer.cornerRadius = 4
self.walletAmountLabel.clipsToBounds = true
walletAmountLabel.textColor = .white
func getType() -> WalletInOutType {
if (model?.particular ?? "").lowercased() == "Balance Brought Forward".lowercased() {
return .closingAmount
}
return (model?.walletOut ?? "") == "₩0" ? .walletIn : .walletOut
}
func setup() {
configureText()
self.dateLabel.text = model?.transactionDate
self.particularLabel.text = model?.particular
self.closingAmountLabel.text = model?.closingAmount
let type: WalletInOutType = getType()
self.walletAmountLabel.layer.cornerRadius = 4
self.walletAmountLabel.clipsToBounds = true
walletAmountLabel.textColor = .white
switch type {
case .walletIn:
self.walletAmountLabel.backgroundColor = AppConstants.themeBlueColor
self.walletAmountLabel.text = "\(StringConstants().in): \(self.model?.walletIn ?? "")"
case .walletOut:
self.walletAmountLabel.backgroundColor = AppConstants.themeRedColor
self.walletAmountLabel.text = "\(StringConstants().out): \(model?.walletOut ?? "")"
case .closingAmount:
self.walletAmountLabel.text = ""
self.walletAmountLabel.backgroundColor = AppConstants.themWhiteColor
}
}
func configureText() {
self.closingBalanceTitleLabel.text = StringConstants().closingBalanceText
switch type {
case .walletIn:
self.walletAmountLabel.backgroundColor = AppConstants.themeBlueColor
self.walletAmountLabel.text = "\(StringConstants().in): \(self.model?.walletIn ?? "")"
case .walletOut:
self.walletAmountLabel.backgroundColor = AppConstants.themeRedColor
self.walletAmountLabel.text = "\(StringConstants().out): \(model?.walletOut ?? "")"
case .closingAmount:
self.walletAmountLabel.text = ""
self.walletAmountLabel.backgroundColor = AppConstants.themWhiteColor
}
}
func configureText() {
self.closingBalanceTitleLabel.text = StringConstants().closingBalanceText
}
}

306
GME Remit/Modules/WalletStatement/User Interface/View/WalletStatementViewController.swift

@ -10,169 +10,177 @@ import UIKit
enum WalletStatementType {
}
class WalletStatementViewController: UIViewController {
struct StringConstants {
let navigationTitle = "wallet_statement_title_text".localized()
let emptyMessage = "no_statement_found_text".localized()
}
// MARK: IBOutlets
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var dateRangeLabelHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var fromDateLabel: UILabel!
@IBOutlet weak var toDateLabel: UILabel!
@IBOutlet weak var emptyLabel: UILabel!
// MARK: Properties
var presenter: WalletStatementModuleInterface?
var from: String?
var to: String?
var statements: [WalletStatement] = [] {
didSet {
self.emptyLabel.isHidden = !statements.isEmpty
self.tableView.reloadData()
guard let fromDate = from, let toDate = to else {
self.dateRangeLabelHeightConstraint.constant = 0
return
}
self.fromDateLabel.text = self.getHUmanReadableDate(date: fromDate)
self.toDateLabel.text = self.getHUmanReadableDate(date: toDate)
UIView.animate(withDuration: 0.33, animations: {
self.dateRangeLabelHeightConstraint.constant = Constant.heightOfDateRangeLabel
})
}
}
struct Constant {
static let heightOfDateRangeLabel: CGFloat = 35
}
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
self.setupNormalNavigation()
self.setupDateFilterButton()
self.setup()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = StringConstants().navigationTitle
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = ""
}
// MARK: IBActions
@objc func openSearchFilter() {
// open search filter
let viewController = UIStoryboard.init(name: "TransactionHistoryDatePicker", bundle: nil).instantiateViewController(withIdentifier: "DatePickerViewController") as! DatePickerViewController
viewController.completion = self.selectedDate
self.present(viewController, animated: true, completion: nil)
}
private func selectedDate(from: String?, to: String?) {
self.from = from
self.to = to
guard let fromDate = from, let toDate = to else {return}
self.presenter?.fetchWalletSatement(fromDate: fromDate, toDate: toDate)
}
// MARK: Other Functions
private func setup() {
// all setup should be done here
setupDelegates()
setupDateFilterButton()
configureViews()
configureText()
self.presenter?.viewIsReady()
}
private func configureText() {
self.emptyLabel.text = StringConstants().emptyMessage
}
private func configureViews() {
struct StringConstants {
let navigationTitle = "wallet_statement_title_text".localized()
let emptyMessage = "no_statement_found_text".localized()
}
// MARK: IBOutlets
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var dateRangeLabelHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var fromDateLabel: UILabel!
@IBOutlet weak var toDateLabel: UILabel!
@IBOutlet weak var emptyLabel: UILabel!
// MARK: Properties
var presenter: WalletStatementModuleInterface?
var from: String?
var to: String?
var statements: [WalletStatement] = [] {
didSet {
self.emptyLabel.isHidden = !statements.isEmpty
self.tableView.reloadData()
guard let fromDate = from, let toDate = to else {
self.dateRangeLabelHeightConstraint.constant = 0
// self.emptyLabel.textColor = AppConstants.themeBlueColor
}
private func setupDateFilterButton() {
let filterItem = UIBarButtonItem.init(image: #imageLiteral(resourceName: "ic_calender"), style: UIBarButtonItem.Style.plain, target: self, action: #selector(self.openSearchFilter))
self.navigationItem.rightBarButtonItem = filterItem
}
private func getHUmanReadableDate(date: String?) -> String? {
if let date = DateFormatter.toDate(dateString: date ?? "", format: AppConstants.dateFormat) {
let dateString = DateFormatter.toString(date: date, format: AppConstants.humanReadableDateFormat)
return dateString
}
return nil
}
private func setupDelegates() {
self.tableView.delegate = self
self.tableView.dataSource = self
}
return
}
self.fromDateLabel.text = self.getHUmanReadableDate(date: fromDate)
self.toDateLabel.text = self.getHUmanReadableDate(date: toDate)
UIView.animate(withDuration: 0.33, animations: {
self.dateRangeLabelHeightConstraint.constant = Constant.heightOfDateRangeLabel
})
}
}
struct Constant {
static let heightOfDateRangeLabel: CGFloat = 35
}
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
self.setupNormalNavigation()
self.setupDateFilterButton()
self.setup()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = StringConstants().navigationTitle
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = ""
}
// MARK: IBActions
@objc func openSearchFilter() {
// open search filter
guard let viewController = UIStoryboard(name: "TransactionHistoryDatePicker", bundle: nil)
.instantiateViewController(
withIdentifier: "DatePickerViewController"
) as? DatePickerViewController else {
return
}
viewController.completion = self.selectedDate
self.present(viewController, animated: true, completion: nil)
}
private func selectedDate(from: String?, to: String?) {
self.from = from
self.to = to
guard let fromDate = from, let toDate = to else {return}
self.presenter?.fetchWalletSatement(fromDate: fromDate, toDate: toDate)
}
// MARK: Other Functions
private func setup() {
// all setup should be done here
setupDelegates()
setupDateFilterButton()
configureViews()
configureText()
self.presenter?.viewIsReady()
}
private func configureText() {
self.emptyLabel.text = StringConstants().emptyMessage
}
private func configureViews() {
self.dateRangeLabelHeightConstraint.constant = 0
// self.emptyLabel.textColor = AppConstants.themeBlueColor
}
private func setupDateFilterButton() {
let filterItem = UIBarButtonItem(
image: #imageLiteral(resourceName: "ic_calender"),
style: UIBarButtonItem.Style.plain,
target: self,
action: #selector(self.openSearchFilter)
)
self.navigationItem.rightBarButtonItem = filterItem
}
private func getHUmanReadableDate(date: String?) -> String? {
if let date = DateFormatter.toDate(dateString: date ?? "", format: AppConstants.dateFormat) {
let dateString = DateFormatter.toString(date: date, format: AppConstants.humanReadableDateFormat)
return dateString
}
return nil
}
private func setupDelegates() {
self.tableView.delegate = self
self.tableView.dataSource = self
}
}
// MARK: WalletStatementViewInterface
extension WalletStatementViewController: WalletStatementViewInterface {
func showLoading() {
self.showProgressHud()
}
func hideLoading() {
self.hideProgressHud()
}
func show(error: String) {
self.alert(type: .error, message: error)
}
func show(models: [WalletStatement]) {
self.statements = models
}
func showLoading() {
self.showProgressHud()
}
func hideLoading() {
self.hideProgressHud()
}
func show(error: String) {
self.alert(type: .error, message: error)
}
func show(models: [WalletStatement]) {
self.statements = models
}
}
// MARK: TableViewDelegate
extension WalletStatementViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// self.presenter?.showDetailOf(index: indexPath.row)
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// self.presenter?.showDetailOf(index: indexPath.row)
}
}
// MARK: TableViewDatasource
extension WalletStatementViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return statements.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "WalletStatementTableViewCell") as! WalletStatementTableViewCell
cell.model = self.statements.elementAt(index: indexPath.row)
cell.setup()
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return statements.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(
withIdentifier: "WalletStatementTableViewCell"
) as? WalletStatementTableViewCell else {
return UITableViewCell()
}
cell.model = self.statements.elementAt(index: indexPath.row)
cell.setup()
return cell
}
}

8
GME Remit/Modules/WalletStatement/User Interface/View/WalletStatementViewInterface.swift

@ -7,8 +7,8 @@
//
protocol WalletStatementViewInterface: class {
func showLoading()
func hideLoading()
func show(error: String)
func show(models: [WalletStatement])
func showLoading()
func hideLoading()
func show(error: String)
func show(models: [WalletStatement])
}

42
GME Remit/Modules/WalletStatement/User Interface/Wireframe/WalletStatementWireframe.swift

@ -9,30 +9,30 @@
import UIKit
class WalletStatementWireframe {
weak var view: UIViewController!
weak var view: UIViewController!
}
extension WalletStatementWireframe: WalletStatementWireframeInput {
var storyboardName: String {return "WalletStatement"}
func getMainView() -> UIViewController {
let service = WalletStatementService()
let interactor = WalletStatementInteractor(service: service)
let presenter = WalletStatementPresenter()
let viewController = viewControllerFromStoryboard(of: WalletStatementViewController.self)
var storyboardName: String {return "WalletStatement"}
viewController.presenter = presenter
interactor.output = presenter
presenter.interactor = interactor
presenter.wireframe = self
presenter.view = viewController
func getMainView() -> UIViewController {
let service = WalletStatementService()
let interactor = WalletStatementInteractor(service: service)
let presenter = WalletStatementPresenter()
let viewController = viewControllerFromStoryboard(of: WalletStatementViewController.self)
viewController.presenter = presenter
interactor.output = presenter
presenter.interactor = interactor
presenter.wireframe = self
presenter.view = viewController
self.view = viewController
return viewController
}
func openWalletStatement(source: UINavigationController) {
self.pushMainView(in: source)
}
self.view = viewController
return viewController
}
func openWalletStatement(source: UINavigationController) {
self.pushMainView(in: source)
}
}
Loading…
Cancel
Save