// // KYCDocumentsUploadViewController.swift // GMERemittance // // Created by Fm-user on 12/20/17. // Copyright © 2017 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit class KYCDocumentsUploadViewController: UIViewController { private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() var index: Int? @IBOutlet weak var viewOutlet: UIView! @IBOutlet weak var viewProgressBarOutlet: UIView! var kycviewmodel: KYCViewModel? let imagePicker = UIImagePickerController() static var internetListener = 0 static var timeOutListener = 0 static var apiRequestListener = 0 @IBAction func submitWithDocuments(_ sender: Any) { if imageViewIDFront.tag == 1 || imageViewIDBack.tag == 2 || imageViewPassbook.tag == 3 || imageViewPassport.tag == 4 || imageViewCloseupSelfie.tag == 5 { self.popUpMessageInfo(value: 16,title:"Missing Images", message: "Please select all the images") } else { processImagesAndSubmit() } } @IBOutlet weak var imageViewCloseupSelfie: UIImageView! @IBOutlet weak var imageViewIDFront: UIImageView! @IBOutlet weak var imageViewIDBack: UIImageView! @IBOutlet weak var imageViewPassbook: UIImageView! @IBOutlet weak var imageViewPassport: UIImageView! @IBOutlet weak var kycFirstStep: UIView! @IBOutlet weak var kycProgessOne: UIView! @IBOutlet weak var kycSecondStep: UIView! @IBOutlet weak var kycProgessSecond: UIView! @IBOutlet weak var kycFinalStep: UIView! override func viewDidDisappear(_ animated: Bool) { self.kycviewmodel?.resetImageSubmission() } /** Internet Check */ func setUpNetworkListener() { kycviewmodel?.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) if $0! { self.processImagesAndSubmit() } else { if KYCDocumentsUploadViewController.internetListener == 0{ KYCDocumentsUploadViewController.internetListener = KYCDocumentsUploadViewController.internetListener+1 self.popUpMessage(value: 21) } } self.kycviewmodel?.internetConnection.value = nil } } /** Update the Documents of user */ func setUpSubmissionListener() { kycviewmodel?.isSubmitted.bind { [unowned self] in guard $0 != nil else { return } self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.enableUserInteractions() guard $0! else { if KYCDocumentsUploadViewController.apiRequestListener == 0{ KYCDocumentsUploadViewController.apiRequestListener = KYCDocumentsUploadViewController.apiRequestListener+1 if KYCDocumentsUploadViewController.timeOutListener == 0{ KYCDocumentsUploadViewController.timeOutListener = KYCDocumentsUploadViewController.timeOutListener+1 self.popUpMessageError(value: 23, message: (self.kycviewmodel?.getErrorMessage())!) } } self.kycviewmodel?.isSubmitted.value = nil return } UserDefaults.standard.set(true, forKey: "com.gmeremit.isKYCSubmitted") UserDefaults.standard.set(true, forKey: "com.gmeremit.showImageAlert") let mainWireFram = MainWireframe.shared let window = UIApplication.shared.keyWindow window?.rootViewController = mainWireFram?.getMainView() window?.makeKeyAndVisible() // self.performSegue(withIdentifier: "homeScreen", sender: nil) } } /** Process and compress the image to submit */ func processImagesAndSubmit() { disableUserInteractions() showActivityIndicator(activityIndicator: activityIndicator) let imageDataCloseUpSelfie: NSData = UIImageJPEGRepresentation(imageViewCloseupSelfie.image!, 0.25)! as NSData let imageDataIDFront: NSData = UIImageJPEGRepresentation(imageViewIDFront.image!, 0.25)! as NSData let imageDataIDBack: NSData = UIImageJPEGRepresentation(imageViewIDBack.image!, 0.25)! as NSData let imageDataPassbook: NSData = UIImageJPEGRepresentation(imageViewPassbook.image!, 0.25)! as NSData let imageDataPassport: NSData = UIImageJPEGRepresentation(imageViewPassport.image!, 0.25)! as NSData let imageDataCloseUpSelfieBase64: String = imageDataCloseUpSelfie.base64EncodedString(options: .lineLength64Characters) let imageDataIDFrontBase64: String = imageDataIDFront.base64EncodedString(options: .lineLength64Characters) let imageDataIDBackBase64: String = imageDataIDBack.base64EncodedString(options: .lineLength64Characters) let imageDataPassbookBase64: String = imageDataPassbook.base64EncodedString(options: .lineLength64Characters) let imageDataPassportBase64: String = imageDataPassport.base64EncodedString(options: .lineLength64Characters) kycviewmodel?.provideImageForSubmission(docType: kycCode.Selfie.rawValue, imageBase64: imageDataCloseUpSelfieBase64) kycviewmodel?.provideImageForSubmission(docType: kycCode.IDFront.rawValue, imageBase64: imageDataIDFrontBase64) kycviewmodel?.provideImageForSubmission(docType: kycCode.IDBack.rawValue, imageBase64: imageDataIDBackBase64) kycviewmodel?.provideImageForSubmission(docType: kycCode.Passbook.rawValue, imageBase64: imageDataPassbookBase64) kycviewmodel?.provideImageForSubmission(docType: kycCode.Passport.rawValue, imageBase64: imageDataPassportBase64) } override func viewDidLoad() { super.viewDidLoad() setUpNavBar(id: 104, title: "") viewOutlet.backgroundColor = UIColor(hex:0xec1c24) viewProgressBarOutlet.backgroundColor = UIColor(hex:0xec1c24) // Do any additional setup after loading the view. // Kyc progress View kycFirstStep.layer.cornerRadius = kycFirstStep.frame.size.width/2 kycFirstStep.layer.borderColor = UIColor.white.cgColor kycFirstStep.layer.borderWidth = 1.0 kycSecondStep.layer.cornerRadius = kycSecondStep.frame.size.width/2 kycSecondStep.layer.borderColor = UIColor.white.cgColor kycSecondStep.layer.borderWidth = 1.0 kycFinalStep.layer.cornerRadius = kycFinalStep.frame.size.width/2 kycFinalStep.layer.borderColor = UIColor.white.cgColor kycFinalStep.layer.borderWidth = 1.0 kycviewmodel?.kycViewModelConnectionTimeOut.value = nil /** connection timeout */ kycviewmodel?.kycViewModelConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) if KYCDocumentsUploadViewController.timeOutListener == 0{ KYCDocumentsUploadViewController.timeOutListener = KYCDocumentsUploadViewController.timeOutListener+1 self.popUpMessage(value: 22) } } kycviewmodel?.internetConnection.value = nil setUpNetworkListener() setUpSubmissionListener() guard kycviewmodel != nil else { return } setUpAnotherLoginListener(genericviewmodel: kycviewmodel!) kycviewmodel!.isSubmitted.value = nil imageViewCloseupSelfie.isUserInteractionEnabled = true imageViewIDFront.isUserInteractionEnabled = true imageViewIDBack.isUserInteractionEnabled = true imageViewPassbook.isUserInteractionEnabled = true imageViewPassport.isUserInteractionEnabled = true imageViewCloseupSelfie.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))) imageViewIDFront.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))) imageViewIDBack.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))) imageViewPassbook.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))) imageViewPassport.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))) } /** Display option to select image from camera or gallery */ @objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer) { let tappedImage = tapGestureRecognizer.view as! UIImageView switch tappedImage.tag { case 1, 10: index = 1 case 2, 20: index = 2 case 3, 30: index = 3 case 4, 40: index = 4 case 5, 50: index = 5 default: return } let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet) let cameraAction = UIAlertAction(title: "Camera", style: .default,handler: { (action : UIAlertAction!) -> Void in self.openCamera() }) let galleryAction = UIAlertAction(title: "Gallery", style: .default,handler: { (action : UIAlertAction!) -> Void in self.openGallery() }) let cancelAction = UIAlertAction.init(title: "Cancel", style: .destructive, handler: nil) cancelAction.setValue(UIColor.black, forKey: "titleTextColor") cameraAction.setValue(UIColor(hex:0xEC1C24), forKey: "titleTextColor") galleryAction.setValue(UIColor(hex:0xEC1C24), forKey: "titleTextColor") alert.addAction(cameraAction) alert.addAction(galleryAction) alert.addAction(cancelAction) self.present(alert, animated: true, completion: nil) } /** Open the camera */ func openCamera() { if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.camera)) { imagePicker.delegate = self imagePicker.sourceType = UIImagePickerControllerSourceType.camera if index == 5 { if(UIImagePickerController .isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.front)) { imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.front } else { //showCameraAlert(warningMessage: "You don't have front camera") imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.rear } } else { imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.rear } imagePicker.allowsEditing = true present(imagePicker, animated: true, completion: nil) } else { showCameraAlert(warningMessage: "You don't have camera") } } func showCameraAlert(warningMessage: String) { let alert = UIAlertController(title: "Warning", message: warningMessage, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion: nil) } /** Open Gallery to select he image */ func openGallery() { imagePicker.delegate = self imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary imagePicker.allowsEditing = true present(imagePicker, animated: true, completion: nil) } @IBAction func viewSamplePassport(_ sender: Any) { showSample(id: 4, titleString: "Passport") } @IBAction func viewSamplePassbook(_ sender: Any) { showSample(id: 3, titleString: "Passbook") } @IBAction func viewSampleBack(_ sender: Any) { showSample(id: 2, titleString: "National/ Alien Reg ID Back") } @IBAction func viewSampleFront(_ sender: Any) { showSample(id: 1, titleString: "National/ Alien Reg ID Front") } @IBAction func viewSampleCloseUpSelfie(_ sender: Any) { showSample(id: 0, titleString: "Picture with National/Alien Reg ID Front") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } /** Display Sample image for user */ func showSample(id: Int, titleString: String) { var imageToShow: UIImage! var imageView: UIImageView! var vertical_spacing: String! var imageHeightConstraint: CGFloat! var imageWidthConstraint: CGFloat! switch id { case 0: imageToShow = UIImage(named: "sampleSelfie") imageView = UIImageView(image: imageToShow) vertical_spacing = String(repeating: "\n", count: 15) imageHeightConstraint = imageToShow.size.height * 0.825 imageWidthConstraint = imageToShow.size.width * 0.825 case 1: imageToShow = UIImage(named: "sampleFront") imageView = UIImageView(image: imageToShow) vertical_spacing = String(repeating: "\n", count: 10) imageHeightConstraint = imageToShow.size.height * 0.9 imageWidthConstraint = imageToShow.size.width * 0.9 case 2: imageToShow = UIImage(named: "sampleBack") imageView = UIImageView(image: imageToShow) vertical_spacing = String(repeating: "\n", count: 10) imageHeightConstraint = imageToShow.size.height * 0.9 //initially 150 imageWidthConstraint = imageToShow.size.width * 0.9 //initially 200 case 3: imageToShow = UIImage(named: "samplePassbook") imageView = UIImageView(image: imageToShow) vertical_spacing = String(repeating: "\n", count: 12) imageHeightConstraint = imageToShow.size.height * 1.2 //initially 150 imageWidthConstraint = imageToShow.size.width * 1.2 //initially 200 case 4: imageToShow = UIImage(named: "samplePassport") imageView = UIImageView(image: imageToShow) vertical_spacing = String(repeating: "\n", count: 12) imageHeightConstraint = imageToShow.size.height * 1.2 //initially 150 imageWidthConstraint = imageToShow.size.width * 1.2 //initially 200 default: return } let alert = UIAlertController(title: titleString, message: vertical_spacing, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil)) alert.view.addSubview(imageView) imageView.translatesAutoresizingMaskIntoConstraints = false alert.view.addConstraint(NSLayoutConstraint(item: imageView, attribute: .centerX, relatedBy: .equal, toItem: alert.view, attribute: .centerX, multiplier: 1, constant: 0)) alert.view.addConstraint(NSLayoutConstraint(item: imageView, attribute: .centerY, relatedBy: .equal, toItem: alert.view, attribute: .centerY, multiplier: 1, constant: 0)) alert.view.addConstraint(NSLayoutConstraint(item: imageView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: imageWidthConstraint)) alert.view.addConstraint(NSLayoutConstraint(item: imageView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: imageHeightConstraint)) alert.view.tintColor = UIColor(hex: 0xEC1C24) self.present(alert, animated: true, completion: nil) } } extension KYCDocumentsUploadViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate { func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let image = info[UIImagePickerControllerEditedImage] as? UIImage { switch index! { case 1, 10: self.imageViewIDFront.image = image self.imageViewIDFront.tag = 10 case 2, 20: self.imageViewIDBack.image = image self.imageViewIDBack.tag = 20 case 3, 30: self.imageViewPassbook.image = image self.imageViewPassbook.tag = 30 case 4, 40: self.imageViewPassport.image = image self.imageViewPassport.tag = 40 case 5, 50: self.imageViewCloseupSelfie.image = image self.imageViewCloseupSelfie.tag = 50 default: return } dismiss(animated: true, completion: nil) } else { } } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { dismiss(animated: true, completion: nil) } }