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
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)
|
|
}
|
|
}
|