You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

697 lines
27 KiB

//
// HomeViewController.swift
// GMERemittance
//
// Created by gme_2 on 21/09/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
import Crashlytics
import Localize_Swift
class HomeViewController: UIViewController, UICollectionViewDelegateFlowLayout {
enum Sections: Int {
case balance = 0
case collection
}
struct Constants {
static let verificationNoticeHeight: CGFloat = 100
}
struct StringConstants {
let homeText = "home_text".localized()
let registerProcessText = "complete_your_registration_text".localized()
let registrationApprovalText = "verification_in_aproval_process_text".localized()
let pennyTestPrimaryBankText = "complete_penny_test".localized()
let verifyTitleText = "kyc_fill_text".localized()
let continueRegistrationTitleText = "penny_test_pending_text".localized()
let verificationInProcessTitleText = "kyc_verify_pending_text".localized()
let soonToUseGmeServicesTitle = "verification_in_aproval_process_text".localized()
}
// MARK: IBOutlets
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var verificationNoticeHeightConstraint: NSLayoutConstraint!
@IBOutlet var verificationNoticeView: UIView!
@IBOutlet weak var verificationCloseButton: UIButton!
@IBOutlet weak var verificationText: UILabel!
@IBOutlet var tapGuesture: UITapGestureRecognizer!
@IBOutlet weak var verificationTitleLabel: UILabel!
@IBOutlet weak var verificationHeaderLeftImageview: UIImageView!
@IBOutlet weak var verificationHeaderRightButton: UIButton!
@IBOutlet weak var seperatorView: UIView!
// title labels
@IBOutlet weak var thankyouTitleLabel: UILabel!
// MARK: Properties
var refreshControl: UIRefreshControl?
var presenter: HomeModuleInterface?
var user: User? {
didSet {
// update
self.save(user: user)
self.showUnverifiedNotice()
self.tableView.reloadData()
updateBalance()
self.update()
}
}
var sections: [Sections] = [.balance, .collection]
var menuHeight: CGFloat? {
didSet {
self.tableView.reloadData()
}
}
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
// test()
setupNavigationNotifications()
self.setup()
}
func test() {
let web = WkWebViewController()
web.url = "http://gmeuat.gmeremit.com:5013/kftcCallback?code=b894944b-c500-4627-9cf9-9fc5fd3f2822&scope=login+inquiry+transfer&client_info=f6Qv6Xd44Q5hmkcYLNVH8w%3D%3D"
// web.url = "http://gmeuat.gmeremit.com:5013/test.html"
// self.present(web, animated: true, completion: nil)
self.navigationController?.pushViewController(web, animated: true)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
configureViews()
self.setActionBarIcons(showNotificationParameter: false) // set true if there is unread
self.tableView.reloadData()
self.setupTabItem()
NotificationCenter.default.addObserver(self, selector: #selector(setupTabItem), name: NSNotification.Name(LCLLanguageChangeNotification), object: nil)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationItem.title = ""
}
// MARK: IBActions
@IBAction func closeVerificationNotice(_ sender: UIButton) {
return
if #available(iOS 10.0, *) {
let animator = UIViewPropertyAnimator(duration: 0.4, curve: .easeOut )
animator.addAnimations {
self.verificationNoticeView.alpha = 0
}
animator.addAnimations({
self.verificationNoticeHeightConstraint.constant = 0
self.view.layoutIfNeeded()
}, delayFactor: 0.5)
animator.startAnimation()
}
}
// MARK: Other Functions
private func setup() {
// all setup should be done here
setupDelegates()
setupNotifications()
configureLanguage()
self.addRefreshControlTableView()
self.presenter?.refreshData()
NotificationCenter.default.addObserver(self, selector: #selector(self.showPennyTestFirstTime), name: NSNotification.Name.init("showPennyTestFirstTime"), object: nil)
}
@objc private func configureLanguage() {
// self.barButtonItem.title = StringConstants().homeText
}
@objc private func showPennyTestFirstTime() {
presenter?.showPennyTest()
}
private func update() {
let platform = self.user?.platforms ?? []
guard let ios = platform.filter({
$0.os ?? "" == "IOS"
}).first else {return}
let critical = ios.critical ?? "N"
UserDefaults.standard.set(critical, forKey: AppConstants.criticalUpdate)
let version = Utility.getAppVersion() ?? ""
let val = version.components(separatedBy: ".")
let latestVersion = ios.version ?? "0"
let latestVal = latestVersion.components(separatedBy: ".").last ?? "0"
if val.count == 3 {
if let build = val.last {
if (Int(latestVal) ?? 0) > (Int(build) ?? 0) {
self.presenter?.showAppUpdate()
}
}
}
}
private func updateBalance() {
let balance = user?.availableBalance ?? ""
UserDefaults.standard.set(balance, forKey: UserKeys.availableBalance)
let userInfo = [SideMenuNavigationNotifications.availableBalance : balance]
NotificationCenter.default.post(name: self.getAvailableBalanceNotificationName(), object: nil, userInfo: userInfo)
self.tableView.reloadData()
}
private func setupNavigationNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(self.showAutoDebit), name: self.getKftcAccountListNotificationName(), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.showWithdraw), name: self.getWithdrawNotificationName(), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.showSideMenuAboutGme), name: self.getAboutMeNotificationName(), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.showSideMenuSupport), name: self.getSupportNotificationName(), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.showSideMenuSetting), name: self.getSettingNotificationName(), object: nil)
}
private func getAboutMeNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.aboutGme)
}
private func getSupportNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.support)
}
private func getSettingNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.setting)
}
@objc private func showSideMenuAboutGme() {
let vc = UIStoryboard.init(name: "_Home", bundle: nil).instantiateViewController(withIdentifier: "AboutGMEViewController") as! AboutGMEViewController
self.navigationController?.pushViewController(vc, animated: true)
}
@objc private func showSideMenuSetting() {
let vc = UIStoryboard.init(name: "Setting", bundle: nil).instantiateViewController(withIdentifier: "SettingViewController") as! SettingViewController
self.navigationController?.pushViewController(vc, animated: true)
}
@objc private func showSideMenuSupport() {
let vc = UIStoryboard.init(name: "_Home", bundle: nil).instantiateViewController(withIdentifier: "SupportViewController") as! SupportViewController
self.navigationController?.pushViewController(vc, animated: true)
}
@objc private func showAutoDebit() {
let wireframe = AutoDebitWireframe()
if let navigation = self.navigationController {
wireframe.pushMainView(in: navigation)
}
}
@objc private func showWithdraw() {
let vc = UIStoryboard.init(name: "autoRefund", bundle: nil).instantiateViewController(withIdentifier: "AutoRefundsViewController") as! AutoRefundsViewController
self.navigationController?.pushViewController(vc, animated: true)
}
private func setupDelegates() {
tableView.delegate = self
tableView.dataSource = self
self.tapGuesture.delegate = self
}
private func addRefreshControlTableView() {
let colorOption = [NSAttributedStringKey.foregroundColor : AppConstants.themWhiteColor];
let title = NSAttributedString(string: "pull to refresh", attributes: colorOption)
let refreshControl = UIRefreshControl()
refreshControl.attributedTitle = title
refreshControl.backgroundColor = AppConstants.themeBlueColor
refreshControl.tintColor = AppConstants.themWhiteColor
refreshControl.addTarget(self, action: #selector(self.refresh), for: .valueChanged)
self.refreshControl = refreshControl
if #available(iOS 10.0, *) {
tableView.refreshControl = self.refreshControl
} else {
if let control = self.refreshControl {
tableView.addSubview(control)
}
}
}
@objc private func refresh() {
presenter?.refreshData()
}
@objc func showNotification(){
performSegue(withIdentifier: "notification", sender: nil)
}
@objc func showSupport() {
let alert = UIAlertController(title:nil, message:"help_you_text".localized(), preferredStyle: .actionSheet)
// alert.view.subviews.last?.subviews.last?.backgroundColor = UIColor.darkGray
let liveChat = UIAlertAction(title: "Live Chat", style: .default) {
UIAlertAction in
}
let contactNumber = UIAlertAction(title: "1588 6864", style: .default) {
UIAlertAction in
self.startCall(contactNumber: "1588 6864")
}
let supportEmail = UIAlertAction(title: "support@gmeremit.com", style: .default) {
UIAlertAction in
let storyboard = UIStoryboard.init(name: "MessageCompose", bundle: Bundle.main)
if let messageViewController = storyboard.instantiateViewController(withIdentifier: "message") as? MessageComposeViewController {
self.navigationController!.pushViewController(messageViewController, animated: true)
}
}
liveChat.setValue(UIImage(named:"ic_live_chat")?.withRenderingMode(.alwaysOriginal),forKey:"image")
contactNumber.setValue(UIImage(named:"ic_call")?.withRenderingMode(.alwaysOriginal),forKey:"image")
supportEmail.setValue(UIImage(named:"ic_email")?.withRenderingMode(.alwaysOriginal),forKey:"image")
// TODO: have to enable when zendesk is provided
// alert.addAction(liveChat)
alert.addAction(contactNumber)
// alert.addAction(supportEmail)
alert.view.tintColor = UIColor.darkGray
// alert.view.subviews.last?.subviews.last?.layer.cornerRadius = 10
alert.addAction(UIAlertAction(title: "cancel_text".localized(), style: UIAlertActionStyle.cancel, handler: nil))
present(alert, animated: true, completion: nil)
}
func startCall(contactNumber: String){
if let url = URL(string: "tel://\(contactNumber.removeWhitespacesInBetween())"), UIApplication.shared.canOpenURL(url) {
if #available(iOS 10, *) {
UIApplication.shared.open(url)
} else {
UIApplication.shared.openURL(url)
}
}
}
private func setupNotifications() {
let center = NotificationCenter.default
center.addObserver(self, selector: #selector(self.showSendMoney), name: self.getSendMoneyNotificationName(), object: nil)
center.addObserver(self, selector: #selector(self.showMobileRecharge), name: self.getMobileRechargeNotificationName(), object: nil)
center.addObserver(self, selector: #selector(self.showTodaysRate), name: self.getTodaysRateNotificationName(), object: nil)
center.addObserver(self, selector: #selector(self.showTrackYourTransfer), name: self.getTrackYourTransferNotificationName(), object: nil)
center.addObserver(self, selector: #selector(self.showTransactionStatement), name: self.getTransactionStatementNotificationName(), object: nil)
center.addObserver(self, selector: #selector(self.showWalletToWallet), name: self.getWalletToWalletNotificationName(), object: nil)
center.addObserver(self, selector: #selector(self.setupHeight(sender:)), name: self.getCollectionHeightNotificationName(), object: nil)
center.addObserver(self, selector: #selector(self.showUnVerifiedMessage), name: self.getMainControllerNotificationName(), object: nil)
}
func setActionBarIcons(showNotificationParameter: Bool){
let supportImage = UIImage(named: "ic_support")?.withRenderingMode(.alwaysOriginal)
let supportButton = UIBarButtonItem(image:supportImage, style: .plain, target: self, action: #selector(showSupport))
let notificationImage: UIImage!
if showNotificationParameter {
notificationImage = UIImage(named: "ic_notificationDot")?.withRenderingMode(.alwaysOriginal)
} else {
notificationImage = UIImage(named: "ic_notification")?.withRenderingMode(.alwaysOriginal)
}
let notificationButton = UIBarButtonItem(image: notificationImage, style: .plain, target: self, action: #selector(showNotification))
// self.navigationItem.rightBarButtonItems=[notificationButton,supportButton]
self.navigationItem.rightBarButtonItems = [supportButton]
}
private func showUnverifiedNotice() {
setVerificationText()
if shouldShowUnverifiedNotice() {
UIView.animate(withDuration: 0.33) {
self.verificationNoticeHeightConstraint.constant = Constants.verificationNoticeHeight
self.verificationNoticeView.alpha = 1
self.view.layoutIfNeeded()
}
}else {
self.verificationNoticeHeightConstraint.constant = 0
self.verificationNoticeView.alpha = 0
self.view.layoutIfNeeded()
}
}
private func setVerificationText() {
// && Utility.didPennyTestNotInitiated()
if didNotSubmitKycAndNotVerified() {
verificationTitleLabel.text = StringConstants().verifyTitleText
self.verificationText.text = StringConstants().registerProcessText
self.verificationHeaderLeftImageview.image = UIImage.init(named: "ic_home_verified")
let image = UIImage.init(named: "ic_home_payoutLocation")
self.verificationHeaderRightButton.setImage(image, for: UIControlState.normal)
}else if didSubmitKycAndNotVerified() && shouldShowPennyTestError() {
verificationTitleLabel.text = StringConstants().continueRegistrationTitleText
self.verificationText.text = StringConstants().pennyTestPrimaryBankText
self.verificationHeaderLeftImageview.image = #imageLiteral(resourceName: "shield.png")
self.verificationNoticeHeightConstraint.constant = Constants.verificationNoticeHeight
self.verificationNoticeView.alpha = 1
self.verificationHeaderRightButton.isHidden = true
}
else if didSubmitKycAndNotVerified() {
verificationTitleLabel.text = StringConstants().verificationInProcessTitleText
self.verificationText.text = StringConstants().soonToUseGmeServicesTitle
self.verificationHeaderLeftImageview.image = #imageLiteral(resourceName: "ic_home_verified")
self.verificationHeaderRightButton.setImage(#imageLiteral(resourceName: "ic_home_payoutLocation"), for: UIControlState.normal)
}
if didSubmitKycAndVerified() && !Utility.pennyTestVerified() {
verificationTitleLabel.text = StringConstants().continueRegistrationTitleText
self.verificationText.text = StringConstants().pennyTestPrimaryBankText
self.verificationHeaderLeftImageview.image = #imageLiteral(resourceName: "shield.png")
self.verificationNoticeHeightConstraint.constant = Constants.verificationNoticeHeight
self.verificationNoticeView.alpha = 1
self.verificationHeaderRightButton.isHidden = true
}
if didSubmitKycAndVerified() && Utility.pennyTestVerified() {
self.verificationNoticeHeightConstraint.constant = 0
self.verificationNoticeView.alpha = 0
}
}
private func didSubmitKycAndNotVerified() -> Bool {
return Utility.didSubmitKyc() && !Utility.isVerifiedUser()
}
private func didSubmitKycAndVerified() -> Bool {
return Utility.didSubmitKyc() && Utility.isVerifiedUser()
}
private func didNotSubmitKycAndNotVerified() -> Bool {
return !Utility.didSubmitKyc() && !Utility.isVerifiedUser()
}
private func shouldShowPennyTestError() -> Bool {
return Utility.shouldShowPennyTestError()
}
@IBAction func showKyc(_ sender: UITapGestureRecognizer) {
if self.didNotSubmitKycAndNotVerified() {
self.presenter?.showKyc()
}else if shouldShowPennyTestError() {
if Utility.didPennyTestRequested() {
presenter?.showPennyTestSubmit()
}else {
presenter?.showPennyTest()
}
}
}
private func shouldShowUnverifiedNotice() -> Bool {
return !self.isUserVerified() || Utility.shouldShowPennyTestError()
}
private func configureViews() {
self.verificationNoticeHeightConstraint.constant = 0
showUnverifiedNotice()
setNavBar()
}
func setNavBar() {
let selector = #selector(self.showSideMenu)
self.setupPicturedNavBar(sideMenuAction: selector)
}
@objc func showSideMenu() {
sideMenuController?.showLeftViewAnimated()
}
private func isUserVerified() -> Bool {
return Utility.isVerifiedUser()
}
@objc private func showSendMoney() {
let kycSubmited = user?.kyc ?? false
let pennyTestComplete = Utility.pennyTestVerified()
if kycSubmited == true && pennyTestComplete == false {
self.show(error: StringConstants().pennyTestPrimaryBankText)
return
}
if isUserVerified() {
// remaining of previous developer. I dont have much time. Later. TODO: refracor
let viewcontroller = UIStoryboard.init(name:
"RecipientListViewController", bundle: nil).instantiateViewController(withIdentifier: "RecipientListViewController") as! RecipientListViewController
self.navigationController?.pushViewController(viewcontroller, animated: true)
} else {
self.showUnVerifiedMessage()
}
}
@objc private func showMobileRecharge() {
let kycSubmited = user?.kyc ?? false
let pennyTestComplete = Utility.pennyTestVerified()
if kycSubmited == true && pennyTestComplete == false {
self.show(error: StringConstants().pennyTestPrimaryBankText)
return
}
self.alert(message: "This feature is coming soon")
return
if isUserVerified() {
return
self.performSegue(withIdentifier: "mobileRecharge", sender: nil)
}else {
self.showUnVerifiedMessage()
}
}
@objc private func showTodaysRate() {
presenter?.openTodaysRate()
}
// Transaction Report
@objc private func showTrackYourTransfer() {
let kycSubmited = user?.kyc ?? false
let pennyTestComplete = Utility.pennyTestVerified()
if kycSubmited == true && pennyTestComplete == false {
self.show(error: StringConstants().pennyTestPrimaryBankText)
return
}
isUserVerified() ? (presenter?.openTrackYourTransfer()) : (self.showUnVerifiedMessage())
}
@objc private func showTransactionStatement() {
let kycSubmited = user?.kyc ?? false
let pennyTestComplete = Utility.pennyTestVerified()
if kycSubmited == true && pennyTestComplete == false {
self.show(error: StringConstants().pennyTestPrimaryBankText)
return
}
isUserVerified() ? (presenter?.openTransactionHistory()) : (self.showUnVerifiedMessage())
}
@objc private func showUnVerifiedMessage() {
if didNotSubmitKycAndNotVerified() {
self.alert(message: StringConstants().registerProcessText)
} else if Utility.didSubmitKyc() && !Utility.pennyTestVerified() {
self.alert(message: StringConstants().pennyTestPrimaryBankText)
}
else
if didSubmitKycAndNotVerified() {
// verification_in_aproval_process_text
// Your registration request is in approval process. You will soon be able to use GME services.
self.alert(message: "verification_in_aproval_process_text".localized())
}
}
// TODO:-
@objc private func showUnVerifiedPennyTestMessage() {
// complete_penny_test
self.alert(message: "complete_penny_test".localized())
}
@objc private func showWalletToWallet() {
self.alert(message: "This feature is coming soon")
}
@objc private func setupHeight(sender: Notification) {
if let height = sender.userInfo?[MenuNotificationName.collectionHeight] as? CGFloat {
self.menuHeight = height
}
}
}
// MARK: HomeViewInterface
extension HomeViewController: HomeViewInterface {
func show(model: User) {
self.user = model
}
func show(error: String) {
self.alert(message: error)
}
func show(panicError: String) {
self.alert(message: panicError, title: "Warning") {
self.presenter?.logout()
}
}
func showLoading() {
self.showProgressHud()
}
func hideLoading() {
self.hideProgressHud()
}
func endRefreshing() {
guard let control = self.tableView.refreshControl else {return}
if control.isRefreshing == true {
DispatchQueue.main.async {
control.perform(#selector(control.endRefreshing), with: nil, afterDelay: 0.5)
}
}
}
}
extension HomeViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
guard let _section = Sections.init(rawValue: indexPath.section) else {return 0}
switch _section {
case .balance:
return UITableViewAutomaticDimension
case .collection:
let totalHeight = view.frame.height
let ramainingBalanceCellHeight: CGFloat = 100
let finalHeight = totalHeight - ramainingBalanceCellHeight
return finalHeight
}
}
}
extension HomeViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func numberOfSections(in tableView: UITableView) -> Int {
return self.sections.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let _section = Sections.init(rawValue: indexPath.section) else {return UITableViewCell()}
switch _section {
case .balance:
return configureRemainingLimitCell(tableView: tableView, indexPath: indexPath)
case .collection:
return configureCollectionCell(tableView: tableView, indexPath: indexPath)
}
}
func configureRemainingLimitCell(tableView: UITableView, indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "HomeRemainingLimitTableViewCell") as! HomeRemainingLimitTableViewCell
cell.user = self.user
cell.setup()
return cell
}
func configureCollectionCell(tableView: UITableView, indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "HomeCollectionTableViewCell") as! HomeCollectionTableViewCell
cell.setup()
return cell
}
override func setupTabItem() {
let image = UIImage.init(named: "ic-home")
self.tabBarItem = UITabBarItem(title: "home_text".localized(), image: image, selectedImage: nil)
self.tabBarItem.titlePositionAdjustment = UIOffset(horizontal: 0, vertical: UI_USER_INTERFACE_IDIOM() == .pad ? 2 : -6)
}
}
// notification Name
extension HomeViewController {
func getSendMoneyNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.sendMoney)
}
func getMobileRechargeNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.mobileRecharge)
}
func getTodaysRateNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.todaysRate)
}
func getTrackYourTransferNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.trackYourTransfer)
}
func getTransactionStatementNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.transactionStatement)
}
func getWalletToWalletNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.walletToWallet)
}
func getCollectionHeightNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.collectionHeight)
}
func getAvailableBalanceNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: SideMenuNavigationNotifications.availableBalance)
}
func getMainControllerNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: AppConstants.MainWireFrameNotificationName)
}
func getWithdrawNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.withdraw)
}
func getKftcAccountListNotificationName() -> Notification.Name {
return Notification.Name.init(SideMenuNavigationNotifications.KftcAccountList)
}
}
extension HomeViewController: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return !Utility.didSubmitKyc() || Utility.shouldShowPennyTestError() || Utility.didPennyTestCancelled() || Utility.didPennyTestRequested() || Utility.didPennyTestNotInitiated()
}
}
extension HomeViewController {
private func save(value: Any?, forKey: String) {
let defaults = UserDefaults.standard
defaults.set(value, forKey: forKey)
}
func save(user: User?) {
Utility.save(user: user)
}
}