// // SlipUploadViewController.swift // GME Remit // // Created by Yajan on 07/05/2022. // Copyright © 2022 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import IQKeyboardManagerSwift import PMAlertController import RxSwift import RxCocoa class SlipUploadViewController: UIViewController { @IBOutlet weak var viewSampleBtn: UIButton! @IBOutlet weak var uploadText: UILabel! private let frontIDImageTrigger = BehaviorSubject(value: nil) private let frontImageBase64 = BehaviorSubject(value: nil) private var multiMediaManager: MultiMediaManager? private let disposeBag = DisposeBag() private var imageCropper: ImageCroper? @IBOutlet weak var saveBtn: UIButton! @IBOutlet weak var frontIdImageButton: UIButton! @IBOutlet weak var textField: IQTextView! @IBOutlet weak var amountField: ValidationTextField! @IBOutlet weak var frontIdView: UIView! var imgData: String? override func viewDidLoad() { super.viewDidLoad() setupUI() setup() self.setupUIBinding() saveBtn.setTitle("save_text".localized(), for: .normal) viewSampleBtn.setTitle("view_sample_text".localized(), for: .normal) // Do any additional setup after loading the view. } func setupUI() { self.validate() saveBtn.layer.cornerRadius = 6 textField.layer.cornerRadius = 6 textField.layer.borderWidth = 1 textField.layer.borderColor = UIColor.themeSeparate.cgColor self.title = "deposit_slip_text".localized() textField.placeholder = "deposit_slip_remarks_text".localized() uploadText.text = "upload_deposit_slip_text".localized() amountField.placeholder = "amount_text".localized() frontIdView.layer.cornerRadius = 12 frontIdView.layer.borderWidth = 1 frontIdView.layer.borderColor = UIColor.themeSeparate.cgColor } func setup() { amountField.addTarget(self, action: #selector(textChange(_:)), for: .editingChanged) multiMediaManager = MultiMediaManager(presenter: self) multiMediaManager?.delegate = self imageCropper = ImageCroper(presentingViewController: self) imageCropper?.delegate = self } @objc func textChange(_ sender: ValidationTextField) { self.validate() } func validate() { if let img = self.imgData { self.saveBtn.isEnabled = self.amountField.text != "" } else { self.saveBtn.isEnabled = false } } @IBAction func saveAction(_ sender: Any) { self.showProgressHud() self.saveKycInfo(image: self.imgData,amount: self.amountField.text, success: { msg in self.hideProgressHud() self.alertWithOk(type: .normal, message: msg, title: nil, okTitle: "OK", okAction: { self.navigationController?.popViewController(animated: true) }) }, failure: { error in self.hideProgressHud() self.alert(message: error.localizedDescription) }) } func setupUIBinding() { frontIdImageButton.rx.tap.bind {[weak self] in self?.multiMediaManager?.openPicker(mode: UIImagePickerController.CameraCaptureMode.photo) // self?.multiMediaManager?.openCameraPicker() }.disposed(by: disposeBag) frontIDImageTrigger .asDriverOnErrorJustComplete() .drive(onNext: {[weak self] in if let imageData = $0 { if let dataDecoded = Data(base64Encoded: imageData, options: .ignoreUnknownCharacters) { DispatchQueue.main.async { self?.imgData = imageData self?.frontIdImageButton.setImage(UIImage(data: dataDecoded), for: .normal) // self?.frontIdImageButton.addBlur() self?.hideBorder(view: self?.frontIdView) self?.validate() } } else if let url = URL(string: imageData) { DispatchQueue.main.async { self?.showProgressHud() self?.frontIdImageButton.kf.setImage(with: url, for: .normal) { result in self?.hideProgressHud() switch result { case .success(let value): self?.frontImageBase64.onNext(value.image.toBase64()) case .failure(let error): print("Job failed: \(error.localizedDescription)") } } // self?.frontIdImageButton.addBlur() self?.hideBorder(view: self?.frontIdView) } } } else { self?.frontImageBase64.onNext(nil) self?.frontIdImageButton.setImage(UIImage(named: "passport_new"), for: .normal) } }).disposed(by: disposeBag) } private func showSample() { let image = UIImage(named: "deposit_slip") let alertVC = PMAlertController(title: nil, description: nil, image: image, style: .walkthrough) alertVC.alertView.layer.cornerRadius = 5 let action = PMAlertAction(title: "ok_text".localized(), style: .cancel) alertVC.addAction(action) alertVC.modalPresentationStyle = .overFullScreen self.present(alertVC, animated: true, completion: nil) } @IBAction func viewSampleAction(_ sender: Any) { self.showSample() } func saveKycInfo(image: String?, amount: String?, success: @escaping (String) -> Void, failure: @escaping (Error) -> Void ) { APIRouter.slipUpload(amount: amount ?? "", remarks: self.textField.text ?? "") .requestMultipart( images: getImageParams(model: image), needsAuthorization: true, success: { (response: KYCResponseContainer) in if (response.errorCode ?? "") == "1" { let error = NSError( domain: "Network", code: 0, userInfo: [NSLocalizedDescriptionKey : response.message ?? ""] ) failure(error) } else { guard let message = response.message else { return } success(message) } }, failure: failure) } private func getCompressedImage(base64: String) -> Data? { guard let imageData = Data(base64Encoded: base64) else { return nil } return UIImage(data: imageData)?.jpegData(compressionQuality: 0.6) } private func getImageParams(model: String?) -> [String: Data] { var images: [String: Data] = [:] // frontIDPicture if let image = model { if let data = getCompressedImage(base64: image) { print("frontIdPic:\(data)") images["DepositSlip"] = data } } return images } } extension SlipUploadViewController: MultimediaPresenterProtocol { func presenting() -> UIViewController { return self } } // MARK: MultiMediaManagerDelegate extension SlipUploadViewController: MultiMediaManagerDelegate { func didFinishPickingWithImage(image: UIImage) { frontIDImageTrigger.onNext(image.toBase64()) //remove cropper as people are confused tkt #1040 // self.imageCropper?.cropImage(image: image) } func didFinishPickingWithError(error: String) { self.alert(type: .error, message: error) } func hideBorder(view: UIView?) { view?.layer.borderWidth = 0 view?.layer.addShadow(with: .clear) } } // MARK: ImageCropperDelegate extension SlipUploadViewController: ImageCropperDelegate { func didCropWith(image: UIImage) { frontIDImageTrigger.onNext(image.toBase64()) } func didFailedCropWith(error: Error) { self.alert(type: .error, message: error.localizedDescription) } }