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.
302 lines
8.8 KiB
302 lines
8.8 KiB
//
|
|
// KycForm3ViewController.swift
|
|
// GMERemittance
|
|
//
|
|
// Created by gme_2 on 12/09/2018.
|
|
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import XLPagerTabStrip
|
|
import PMAlertController
|
|
|
|
enum PictureType: Int {
|
|
case selfie
|
|
case front
|
|
case back
|
|
case passbook
|
|
case passport
|
|
}
|
|
|
|
struct KycForm3FieldKeys {
|
|
static let selfieImage = "bank"
|
|
static let frontImage = "accountNumber"
|
|
static let backImage = "verificationId"
|
|
static let passbookImage = "verificationIdNumber"
|
|
static let passportImage = "expiryDate"
|
|
}
|
|
|
|
class KycForm3Model {
|
|
var selfieImage: UIImage?
|
|
var frontImage: UIImage?
|
|
var backImage: UIImage?
|
|
var passbookImage: UIImage?
|
|
var passportImage: UIImage?
|
|
}
|
|
|
|
class KycForm3ViewController: UIViewController {
|
|
|
|
struct Constants {
|
|
static let stateRedColor = UIColor.init(hex: "#EC1C24")
|
|
static let clearColor = UIColor.clear
|
|
static let errorBorderSize = AppConstants.errorBorderWidth
|
|
}
|
|
|
|
// MARK: IBOutlets
|
|
|
|
@IBOutlet weak var selfieButton: UIButton!
|
|
@IBOutlet weak var frontButton: UIButton!
|
|
@IBOutlet weak var backButton: UIButton!
|
|
@IBOutlet weak var passbook: UIButton!
|
|
@IBOutlet weak var passport: UIButton!
|
|
|
|
// views
|
|
|
|
@IBOutlet weak var selfieView: UIView!
|
|
@IBOutlet weak var frontImageView: UIView!
|
|
@IBOutlet weak var backImageView: UIView!
|
|
@IBOutlet weak var passBookView: UIView!
|
|
@IBOutlet weak var passportView: UIView!
|
|
|
|
|
|
// MARK: Properties
|
|
|
|
let kycForm3Model = KycForm3Model()
|
|
var presenter: KycForm3ModuleInterface?
|
|
var delegate: KYCForm3Delegate?
|
|
|
|
var multiMediaManager: MultiMediaManager?
|
|
var imageCropper: ImageCroper?
|
|
var currentPictureType: PictureType?
|
|
|
|
var selectedSelfieImage = false
|
|
var selectedFrontImage = false
|
|
var selectedBackImage = false
|
|
var selectedPassbookImage = false
|
|
var selectedPassPortImage = false
|
|
|
|
var errorViewsDict: [String: UIView] = [:]
|
|
|
|
// MARK: VC's Life cycle
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
self.setup()
|
|
}
|
|
|
|
// MARK: IBActions
|
|
|
|
|
|
// sample actions
|
|
|
|
@IBAction func selfie(_ sender: UIButton) {
|
|
showSample(type: .selfie, titleString: "Picture with National/Alien Reg ID Front")
|
|
}
|
|
|
|
@IBAction func front(_ sender: UIButton) {
|
|
showSample(type: .front, titleString: "National/ Alien Reg ID Front")
|
|
}
|
|
|
|
|
|
@IBAction func back(_ sender: UIButton) {
|
|
showSample(type: .back, titleString: "National/ Alien Reg ID Back")
|
|
}
|
|
|
|
@IBAction func passbook(_ sender: UIButton) {
|
|
|
|
showSample(type: .passbook, titleString: "Passbook")
|
|
}
|
|
|
|
@IBAction func passport(_ sender: UIButton) {
|
|
showSample(type: .passport, titleString: "Passport")
|
|
}
|
|
|
|
|
|
// camera actions
|
|
|
|
@IBAction func selfieCamera(_ sender: UIButton) {
|
|
self.currentPictureType = .selfie
|
|
self.showPicker()
|
|
}
|
|
|
|
@IBAction func frontCamera(_ sender: UIButton) {
|
|
self.currentPictureType = .front
|
|
print("front")
|
|
self.showPicker()
|
|
}
|
|
|
|
@IBAction func backCamera(_ sender: UIButton) {
|
|
self.currentPictureType = .back
|
|
print("back")
|
|
self.showPicker()
|
|
}
|
|
|
|
@IBAction func passbookCamera(_ sender: UIButton) {
|
|
self.currentPictureType = .passbook
|
|
print("passbook")
|
|
self.showPicker()
|
|
}
|
|
|
|
@IBAction func passportCamera(_ sender: UIButton) {
|
|
self.currentPictureType = .passport
|
|
print("passport")
|
|
self.showPicker()
|
|
}
|
|
|
|
|
|
// submit action
|
|
|
|
|
|
@IBAction func submit(_ sender: UIButton) {
|
|
self.delegate?.submit(model: self.kycForm3Model)
|
|
}
|
|
|
|
|
|
|
|
// MARK: Other Functions
|
|
|
|
private func setup() {
|
|
// all setup should be done here
|
|
self.multiMediaManager = MultiMediaManager(presenter: self)
|
|
multiMediaManager?.delegate = self
|
|
self.imageCropper = ImageCroper(presentingViewController: self)
|
|
imageCropper?.delegate = self
|
|
setupErrorViews()
|
|
}
|
|
|
|
private func setupErrorViews() {
|
|
self.errorViewsDict =
|
|
[
|
|
KycForm3FieldKeys.selfieImage: self.selfieView,
|
|
KycForm3FieldKeys.frontImage: self.frontImageView,
|
|
KycForm3FieldKeys.backImage: self.backImageView,
|
|
KycForm3FieldKeys.passbookImage: self.passBookView,
|
|
KycForm3FieldKeys.passportImage: self.passportView,
|
|
]
|
|
}
|
|
|
|
private func showPicker() {
|
|
multiMediaManager?.openPicker(mode: UIImagePickerControllerCameraCaptureMode.photo)
|
|
}
|
|
|
|
func showSample(type: PictureType, titleString: String) {
|
|
let image: UIImage?
|
|
switch type {
|
|
case .selfie:
|
|
image = #imageLiteral(resourceName: "sampleSelfie")
|
|
case .front:
|
|
image = #imageLiteral(resourceName: "sampleFront")
|
|
case .back:
|
|
image = #imageLiteral(resourceName: "sampleBack")
|
|
case .passbook:
|
|
image = #imageLiteral(resourceName: "sampleBack")
|
|
case .passport:
|
|
image = #imageLiteral(resourceName: "sampleBack")
|
|
}
|
|
// show alert
|
|
let alertVC = PMAlertController(title: "", description: "", image: image, style: .alert)
|
|
alertVC.alertView.layer.cornerRadius = 10
|
|
let action = PMAlertAction(title: "OK", style: .cancel)
|
|
alertVC.addAction(action)
|
|
self.present(alertVC, animated: true, completion: nil)
|
|
}
|
|
}
|
|
|
|
// MARK: KycForm3ViewInterface
|
|
extension KycForm3ViewController: KycForm3ViewInterface {
|
|
|
|
}
|
|
|
|
extension KycForm3ViewController: IndicatorInfoProvider {
|
|
func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo {
|
|
return IndicatorInfo.init(title: "Upload")
|
|
}
|
|
}
|
|
|
|
extension KycForm3ViewController: MultimediaPresenterProtocol {
|
|
func presenting() -> UIViewController {
|
|
return self
|
|
}
|
|
}
|
|
|
|
extension KycForm3ViewController: MultiMediaManagerDelegate {
|
|
func didFinishPickingWithImage(image: UIImage) {
|
|
self.imageCropper?.cropImage(image: image)
|
|
}
|
|
|
|
func didFinishPickingWithError(error: String) {
|
|
self.alert(message: error)
|
|
}
|
|
|
|
func hideBorder(view: UIView) {
|
|
view.layer.borderWidth = 0
|
|
view.layer.addShadow(with: Constants.clearColor)
|
|
}
|
|
}
|
|
|
|
extension KycForm3ViewController: ImageCropperDelegate {
|
|
func didCropWith(image: UIImage) {
|
|
guard let type = self.currentPictureType else {return; print("returning")}
|
|
switch type {
|
|
case .selfie:
|
|
self.selfieButton.setImage(image, for: .normal)
|
|
self.selectedSelfieImage = true
|
|
self.kycForm3Model.selfieImage = image
|
|
hideBorder(view: selfieView)
|
|
case .front:
|
|
self.frontButton.setImage(image, for: .normal)
|
|
self.selectedFrontImage = true
|
|
self.kycForm3Model.frontImage = image
|
|
hideBorder(view: frontImageView)
|
|
case .back:
|
|
self.backButton.setImage(image, for: .normal)
|
|
self.selectedBackImage = true
|
|
self.kycForm3Model.backImage = image
|
|
hideBorder(view: backImageView)
|
|
case .passbook:
|
|
self.passbook.setImage(image, for: .normal)
|
|
self.selectedPassbookImage = true
|
|
self.kycForm3Model.passbookImage = image
|
|
hideBorder(view: passBookView)
|
|
case .passport:
|
|
self.passport.setImage(image, for: .normal)
|
|
self.selectedPassPortImage = true
|
|
self.kycForm3Model.passportImage = image
|
|
hideBorder(view: passportView)
|
|
}
|
|
}
|
|
func didFailedCropWith(error: Error) {
|
|
self.alert(message: error.localizedDescription)
|
|
}
|
|
}
|
|
|
|
extension KycForm3ViewController {
|
|
|
|
private func showBorder(view : UIView?) {
|
|
guard let _view = view else {return}
|
|
_view.layer.borderColor = Constants.stateRedColor.cgColor
|
|
_view.layer.borderWidth = Constants.errorBorderSize
|
|
_view.layer.addShadow(with: Constants.stateRedColor)
|
|
}
|
|
|
|
func show(result: (doesNotSucks: Bool, errorsDick: [String : String])) {
|
|
var position = 11
|
|
if result.doesNotSucks { // if isValid
|
|
|
|
}else {
|
|
result.errorsDick.forEach({
|
|
// self.show(error: $0.value, label: label)
|
|
let view = errorViewsDict[$0.key]
|
|
self.showBorder(view: view)
|
|
let tag = (view?.tag ?? position)
|
|
position = tag < position ? tag : position
|
|
// if let topMostView = self.views.filter({
|
|
// $0.tag == tag
|
|
// }).first {
|
|
// // Todo
|
|
// // scroll to view here
|
|
// }
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|