diff --git a/GMERemittance.xcodeproj/project.pbxproj b/GMERemittance.xcodeproj/project.pbxproj index f39086e4..3ac5d824 100644 --- a/GMERemittance.xcodeproj/project.pbxproj +++ b/GMERemittance.xcodeproj/project.pbxproj @@ -467,6 +467,8 @@ D96BD11E216479E200DFE7D8 /* WalletStatementViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = D96BD113216479E200DFE7D8 /* WalletStatementViewInterface.swift */; }; D96BD11F216479E200DFE7D8 /* WalletStatementViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D96BD114216479E200DFE7D8 /* WalletStatementViewController.swift */; }; D96BD1212164828D00DFE7D8 /* WalletStatement.swift in Sources */ = {isa = PBXBuildFile; fileRef = D96BD1202164828D00DFE7D8 /* WalletStatement.swift */; }; + D96BD1232164870C00DFE7D8 /* DateFormatterExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D96BD1222164870C00DFE7D8 /* DateFormatterExtension.swift */; }; + D96BD1262164875800DFE7D8 /* WalletStatementTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D96BD1252164875800DFE7D8 /* WalletStatementTableViewCell.swift */; }; D9768C88213BAE92009E01BC /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9768C87213BAE92009E01BC /* User.swift */; }; D977859D215DC55F00754079 /* TransactionHistoryModuleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = D977858A215DC55E00754079 /* TransactionHistoryModuleInterface.swift */; }; D977859E215DC55F00754079 /* TransactionHistoryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D977858D215DC55E00754079 /* TransactionHistoryService.swift */; }; @@ -1029,6 +1031,8 @@ D96BD113216479E200DFE7D8 /* WalletStatementViewInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletStatementViewInterface.swift; sourceTree = ""; }; D96BD114216479E200DFE7D8 /* WalletStatementViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletStatementViewController.swift; sourceTree = ""; }; D96BD1202164828D00DFE7D8 /* WalletStatement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletStatement.swift; sourceTree = ""; }; + D96BD1222164870C00DFE7D8 /* DateFormatterExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateFormatterExtension.swift; sourceTree = ""; }; + D96BD1252164875800DFE7D8 /* WalletStatementTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletStatementTableViewCell.swift; sourceTree = ""; }; D9768C87213BAE92009E01BC /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = ""; }; D977858A215DC55E00754079 /* TransactionHistoryModuleInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionHistoryModuleInterface.swift; sourceTree = ""; }; D977858D215DC55E00754079 /* TransactionHistoryService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionHistoryService.swift; sourceTree = ""; }; @@ -1232,6 +1236,7 @@ D96848C6212D3A7400EF12B1 /* DataRequestExtension.swift */, D96848C8212D3AEB00EF12B1 /* ExtensionJSON.swift */, D95B7042213F9A2C0053CC3D /* CALayerExtension.swift */, + D96BD1222164870C00DFE7D8 /* DateFormatterExtension.swift */, ); path = Extension; sourceTree = ""; @@ -3476,6 +3481,7 @@ D96BD110216479E200DFE7D8 /* View */ = { isa = PBXGroup; children = ( + D96BD1242164871F00DFE7D8 /* Cell */, D96BD111216479E200DFE7D8 /* ViewModels */, D96BD112216479E200DFE7D8 /* WalletStatement.storyboard */, D96BD113216479E200DFE7D8 /* WalletStatementViewInterface.swift */, @@ -3491,6 +3497,14 @@ path = ViewModels; sourceTree = ""; }; + D96BD1242164871F00DFE7D8 /* Cell */ = { + isa = PBXGroup; + children = ( + D96BD1252164875800DFE7D8 /* WalletStatementTableViewCell.swift */, + ); + path = Cell; + sourceTree = ""; + }; D9778588215DC55E00754079 /* TransactionHistory */ = { isa = PBXGroup; children = ( @@ -4561,6 +4575,7 @@ D92B80252140C3CB00A25B26 /* MainModuleInterface.swift in Sources */, D937037121490C3800D93077 /* KycForm2ModuleInterface.swift in Sources */, D946719521426DFB003924DB /* LoginModuleInterface.swift in Sources */, + D96BD1262164875800DFE7D8 /* WalletStatementTableViewCell.swift in Sources */, D96BD11A216479E200DFE7D8 /* WalletStatementPresenter.swift in Sources */, A255A907206A14220002905D /* SSBadgeButton.swift in Sources */, D922D9232134DCF000D43053 /* EditReciepientWireframe.swift in Sources */, @@ -4633,6 +4648,7 @@ D9B7ADFD2130073A009B0564 /* WireframeInput.swift in Sources */, 044124C61FEBA1BD00FD4240 /* ResetPasswordViewModel.swift in Sources */, 5565FF341FE29791002934E9 /* TableViewCell.swift in Sources */, + D96BD1232164870C00DFE7D8 /* DateFormatterExtension.swift in Sources */, 0477E2A7204941FE00B02377 /* MoneyRequestViewController.swift in Sources */, D96A4FD421460B4A00CFD507 /* SplashScreenModuleInterface.swift in Sources */, D9B7ADF72130048E009B0564 /* ExchangeRatesWireframe.swift in Sources */, diff --git a/GMERemittance/Extension/DateFormatterExtension.swift b/GMERemittance/Extension/DateFormatterExtension.swift new file mode 100644 index 00000000..492a770e --- /dev/null +++ b/GMERemittance/Extension/DateFormatterExtension.swift @@ -0,0 +1,28 @@ +// +// DateFormatterExtension.swift +// GMERemittance +// +// Created by gme_2 on 03/10/2018. +// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. +// + +import Foundation + + +extension DateFormatter { + static func toDate(dateString: String, format: String = AppConstants.dateFormat) -> Date? { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = format + // dateFormatter.locale = Locale(identifier: "en_Us") + return dateFormatter.date(from: dateString) + } + + static func toString(date: Date, format: String = AppConstants.humanReadableDateFormat) -> String { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = format + // dateFormatter.locale = Locale(identifier: "en_US") + return dateFormatter.string(from: date) + } +} + + diff --git a/GMERemittance/Module/TransactionHistory/User Interface/View/TransactionHistoryViewController.swift b/GMERemittance/Module/TransactionHistory/User Interface/View/TransactionHistoryViewController.swift index 61f1994f..939baeac 100644 --- a/GMERemittance/Module/TransactionHistory/User Interface/View/TransactionHistoryViewController.swift +++ b/GMERemittance/Module/TransactionHistory/User Interface/View/TransactionHistoryViewController.swift @@ -73,9 +73,9 @@ class TransactionHistoryViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + self.setupNormalNavigation() self.setup() presenter?.viewIsReady() - setupNavigation() } override func viewWillAppear(_ animated: Bool) { @@ -152,13 +152,7 @@ class TransactionHistoryViewController: UIViewController { self.tableView.dataSource = self } - private func setupNavigation() { - var backBtnImage = #imageLiteral(resourceName: "backIconBlack") - backBtnImage = backBtnImage.withRenderingMode(UIImageRenderingMode.alwaysOriginal) - self.navigationController!.navigationBar.backIndicatorImage = backBtnImage - self.navigationController!.navigationBar.backIndicatorTransitionMaskImage = backBtnImage - self.navigationController?.navigationBar.barTintColor = UIColor.white - } + } // MARK: TransactionHistoryViewInterface @@ -201,20 +195,3 @@ extension TransactionHistoryViewController: UITableViewDataSource { } } -extension DateFormatter { - static func toDate(dateString: String, format: String = AppConstants.dateFormat) -> Date? { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = format -// dateFormatter.locale = Locale(identifier: "en_Us") - return dateFormatter.date(from: dateString) - } - - static func toString(date: Date, format: String = AppConstants.humanReadableDateFormat) -> String { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = format -// dateFormatter.locale = Locale(identifier: "en_US") - return dateFormatter.string(from: date) - } -} - - diff --git a/GMERemittance/Module/WalletStatement/Application Logic/Interactor/WalletStatementInteractor.swift b/GMERemittance/Module/WalletStatement/Application Logic/Interactor/WalletStatementInteractor.swift index 2e643be9..413f81ed 100644 --- a/GMERemittance/Module/WalletStatement/Application Logic/Interactor/WalletStatementInteractor.swift +++ b/GMERemittance/Module/WalletStatement/Application Logic/Interactor/WalletStatementInteractor.swift @@ -27,5 +27,24 @@ class WalletStatementInteractor { // 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 ?? true) ? nil : param + self.service.fetchWalletStatement(user: userName, param: parameters, success: { (model) in + self.output?.show(models: model) + }) { (error) in + self.output?.show(error: error) + } + } } diff --git a/GMERemittance/Module/WalletStatement/Application Logic/Interactor/WalletStatementInteractorIO.swift b/GMERemittance/Module/WalletStatement/Application Logic/Interactor/WalletStatementInteractorIO.swift index cb56a1f6..dc6e1cc3 100644 --- a/GMERemittance/Module/WalletStatement/Application Logic/Interactor/WalletStatementInteractorIO.swift +++ b/GMERemittance/Module/WalletStatement/Application Logic/Interactor/WalletStatementInteractorIO.swift @@ -7,9 +7,10 @@ // protocol WalletStatementInteractorInput: class { - + func fetchWalletSatement(fromDate: String?, toDate: String?) } protocol WalletStatementInteractorOutput: class { - + func show(error: Error) + func show(models: [WalletStatement]) } diff --git a/GMERemittance/Module/WalletStatement/Application Logic/Service/WalletStatementServiceType.swift b/GMERemittance/Module/WalletStatement/Application Logic/Service/WalletStatementServiceType.swift index f353ac2c..9ca96870 100644 --- a/GMERemittance/Module/WalletStatement/Application Logic/Service/WalletStatementServiceType.swift +++ b/GMERemittance/Module/WalletStatement/Application Logic/Service/WalletStatementServiceType.swift @@ -8,6 +8,29 @@ import Foundation -protocol WalletStatementServiceType: class { +protocol WalletStatementServiceType: class, FetchWalletStatementService { } + + +protocol FetchWalletStatementService: ApiServiceType { + func fetchWalletStatement(user: String, param: [String: String]?, success: @escaping (([WalletStatement]) -> ()), failure: @escaping ((Error) -> ())) +} + +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) + } + } +} diff --git a/GMERemittance/Module/WalletStatement/Module Interface/WalletStatementModuleInterface.swift b/GMERemittance/Module/WalletStatement/Module Interface/WalletStatementModuleInterface.swift index 5fa96623..d64d8aa6 100644 --- a/GMERemittance/Module/WalletStatement/Module Interface/WalletStatementModuleInterface.swift +++ b/GMERemittance/Module/WalletStatement/Module Interface/WalletStatementModuleInterface.swift @@ -7,5 +7,7 @@ // protocol WalletStatementModuleInterface: class { - + func viewIsReady() + func filterWalletInStatements() + func fetchWalletSatement(fromDate: String?, toDate: String?) } diff --git a/GMERemittance/Module/WalletStatement/User Interface/Presenter/WalletStatementPresenter.swift b/GMERemittance/Module/WalletStatement/User Interface/Presenter/WalletStatementPresenter.swift index 8d478682..70987bb9 100644 --- a/GMERemittance/Module/WalletStatement/User Interface/Presenter/WalletStatementPresenter.swift +++ b/GMERemittance/Module/WalletStatement/User Interface/Presenter/WalletStatementPresenter.swift @@ -12,6 +12,14 @@ class WalletStatementPresenter { // MARK: Properties + var models: [WalletStatement] = [] + + var filteredModels: [WalletStatement] = [] { + didSet { + self.view?.show(models: filteredModels) + } + } + weak var view: WalletStatementViewInterface? var interactor: WalletStatementInteractorInput? var wireframe: WalletStatementWireframeInput? @@ -22,11 +30,31 @@ class WalletStatementPresenter { // MARK: WalletStatement module interface extension WalletStatementPresenter: WalletStatementModuleInterface { - + func viewIsReady() { + self.fetchWalletSatement(fromDate: nil, toDate: nil) + } + + func filterWalletInStatements() { + + } + + func fetchWalletSatement(fromDate: String?, toDate: String?) { + 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 + } } diff --git a/GMERemittance/Module/WalletStatement/User Interface/View/Cell/WalletStatementTableViewCell.swift b/GMERemittance/Module/WalletStatement/User Interface/View/Cell/WalletStatementTableViewCell.swift new file mode 100644 index 00000000..38dd9797 --- /dev/null +++ b/GMERemittance/Module/WalletStatement/User Interface/View/Cell/WalletStatementTableViewCell.swift @@ -0,0 +1,23 @@ +// +// WalletStatementTableViewCell.swift +// GMERemittance +// +// Created by gme_2 on 03/10/2018. +// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. +// + +import UIKit + +class WalletStatementTableViewCell: UITableViewCell { + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + var model: WalletStatement? + + func setup() { + + } +} diff --git a/GMERemittance/Module/WalletStatement/User Interface/View/WalletStatementViewController.swift b/GMERemittance/Module/WalletStatement/User Interface/View/WalletStatementViewController.swift index 0cfab74a..8b9ac7b3 100644 --- a/GMERemittance/Module/WalletStatement/User Interface/View/WalletStatementViewController.swift +++ b/GMERemittance/Module/WalletStatement/User Interface/View/WalletStatementViewController.swift @@ -8,11 +8,16 @@ import UIKit + +enum WalletStatementType { + +} + class WalletStatementViewController: UIViewController { enum SegmentIndex: Int { - case all = 0 - case sent - case delivered + case walletIn = 0 + case walletOut + case all } @@ -35,39 +40,135 @@ class WalletStatementViewController: UIViewController { var to: String? -// var statements: [TransactionModel] = [] { -// didSet { -// 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 statements: [WalletStatement] = [] { + didSet { + 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.setup() } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationItem.title = "Wallet Statement" + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationItem.title = "" + } + // MARK: IBActions + @IBAction func segmentChanged(_ sender: UISegmentedControl) { + self.searchTextField.text = "" + guard let index = SegmentIndex(rawValue: sender.selectedSegmentIndex) else {return} + switch index { + case .walletIn: + break + case .walletOut: + break + case .all: + break + } + } + + @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) + } + + 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) + } + // MARK: Other Functions private func setup() { // all setup should be done here - + setupDelegates() + self.dateRangeLabelHeightConstraint.constant = 0 + self.presenter?.viewIsReady() + } + + 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(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) + } +} + +// 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 + } +} + + diff --git a/GMERemittance/Module/WalletStatement/User Interface/View/WalletStatementViewInterface.swift b/GMERemittance/Module/WalletStatement/User Interface/View/WalletStatementViewInterface.swift index b5cc9a79..479c9a3f 100644 --- a/GMERemittance/Module/WalletStatement/User Interface/View/WalletStatementViewInterface.swift +++ b/GMERemittance/Module/WalletStatement/User Interface/View/WalletStatementViewInterface.swift @@ -7,4 +7,8 @@ // protocol WalletStatementViewInterface: class { + func showLoading() + func hideLoading() + func show(error: String) + func show(models: [WalletStatement]) }