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.
 
 
 
 

238 lines
8.3 KiB

//
// 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<String?>(value: nil)
private let frontImageBase64 = BehaviorSubject<String?>(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)
}
}