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

2 years ago
2 years ago
  1. //
  2. // SlipUploadViewController.swift
  3. // GME Remit
  4. //
  5. // Created by Yajan on 07/05/2022.
  6. // Copyright © 2022 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import IQKeyboardManagerSwift
  10. import PMAlertController
  11. import RxSwift
  12. import RxCocoa
  13. class SlipUploadViewController: UIViewController {
  14. @IBOutlet weak var viewSampleBtn: UIButton!
  15. @IBOutlet weak var uploadText: UILabel!
  16. private let frontIDImageTrigger = BehaviorSubject<String?>(value: nil)
  17. private let frontImageBase64 = BehaviorSubject<String?>(value: nil)
  18. private var multiMediaManager: MultiMediaManager?
  19. private let disposeBag = DisposeBag()
  20. private var imageCropper: ImageCroper?
  21. @IBOutlet weak var saveBtn: UIButton!
  22. @IBOutlet weak var frontIdImageButton: UIButton!
  23. @IBOutlet weak var textField: IQTextView!
  24. @IBOutlet weak var amountField: ValidationTextField!
  25. @IBOutlet weak var frontIdView: UIView!
  26. var imgData: String?
  27. override func viewDidLoad() {
  28. super.viewDidLoad()
  29. setupUI()
  30. setup()
  31. self.setupUIBinding()
  32. saveBtn.setTitle("save_text".localized(), for: .normal)
  33. viewSampleBtn.setTitle("view_sample_text".localized(), for: .normal)
  34. // Do any additional setup after loading the view.
  35. }
  36. func setupUI() {
  37. self.validate()
  38. saveBtn.layer.cornerRadius = 6
  39. textField.layer.cornerRadius = 6
  40. textField.layer.borderWidth = 1
  41. textField.layer.borderColor = UIColor.themeSeparate.cgColor
  42. self.title = "deposit_slip_text".localized()
  43. textField.placeholder = "deposit_slip_remarks_text".localized()
  44. uploadText.text = "upload_deposit_slip_text".localized()
  45. amountField.placeholder = "amount_text".localized()
  46. frontIdView.layer.cornerRadius = 12
  47. frontIdView.layer.borderWidth = 1
  48. frontIdView.layer.borderColor = UIColor.themeSeparate.cgColor
  49. }
  50. func setup() {
  51. amountField.addTarget(self, action: #selector(textChange(_:)), for: .editingChanged)
  52. multiMediaManager = MultiMediaManager(presenter: self)
  53. multiMediaManager?.delegate = self
  54. imageCropper = ImageCroper(presentingViewController: self)
  55. imageCropper?.delegate = self
  56. }
  57. @objc func textChange(_ sender: ValidationTextField) {
  58. self.validate()
  59. }
  60. func validate() {
  61. if let img = self.imgData {
  62. self.saveBtn.isEnabled = self.amountField.text != ""
  63. } else {
  64. self.saveBtn.isEnabled = false
  65. }
  66. }
  67. @IBAction func saveAction(_ sender: Any) {
  68. self.showProgressHud()
  69. self.saveKycInfo(image: self.imgData,amount: self.amountField.text, success: { msg in
  70. self.hideProgressHud()
  71. self.alertWithOk(type: .normal, message: msg, title: nil, okTitle: "OK", okAction: {
  72. self.navigationController?.popViewController(animated: true)
  73. })
  74. }, failure: { error in
  75. self.hideProgressHud()
  76. self.alert(message: error.localizedDescription)
  77. })
  78. }
  79. func setupUIBinding() {
  80. frontIdImageButton.rx.tap.bind {[weak self] in
  81. self?.multiMediaManager?.openPicker(mode: UIImagePickerController.CameraCaptureMode.photo)
  82. // self?.multiMediaManager?.openCameraPicker()
  83. }.disposed(by: disposeBag)
  84. frontIDImageTrigger
  85. .asDriverOnErrorJustComplete()
  86. .drive(onNext: {[weak self] in
  87. if let imageData = $0 {
  88. if let dataDecoded = Data(base64Encoded: imageData, options: .ignoreUnknownCharacters) {
  89. DispatchQueue.main.async {
  90. self?.imgData = imageData
  91. self?.frontIdImageButton.setImage(UIImage(data: dataDecoded), for: .normal)
  92. // self?.frontIdImageButton.addBlur()
  93. self?.hideBorder(view: self?.frontIdView)
  94. self?.validate()
  95. }
  96. } else if let url = URL(string: imageData) {
  97. DispatchQueue.main.async {
  98. self?.showProgressHud()
  99. self?.frontIdImageButton.kf.setImage(with: url, for: .normal) { result in
  100. self?.hideProgressHud()
  101. switch result {
  102. case .success(let value):
  103. self?.frontImageBase64.onNext(value.image.toBase64())
  104. case .failure(let error):
  105. print("Job failed: \(error.localizedDescription)")
  106. }
  107. }
  108. // self?.frontIdImageButton.addBlur()
  109. self?.hideBorder(view: self?.frontIdView)
  110. }
  111. }
  112. } else {
  113. self?.frontImageBase64.onNext(nil)
  114. self?.frontIdImageButton.setImage(UIImage(named: "passport_new"), for: .normal)
  115. }
  116. }).disposed(by: disposeBag)
  117. }
  118. private func showSample() {
  119. let image = UIImage(named: "deposit_slip")
  120. let alertVC = PMAlertController(title: nil, description: nil, image: image, style: .walkthrough)
  121. alertVC.alertView.layer.cornerRadius = 5
  122. let action = PMAlertAction(title: "ok_text".localized(), style: .cancel)
  123. alertVC.addAction(action)
  124. alertVC.modalPresentationStyle = .overFullScreen
  125. self.present(alertVC, animated: true, completion: nil)
  126. }
  127. @IBAction func viewSampleAction(_ sender: Any) {
  128. self.showSample()
  129. }
  130. func saveKycInfo(image: String?, amount: String?,
  131. success: @escaping (String) -> Void,
  132. failure: @escaping (Error) -> Void
  133. ) {
  134. APIRouter.slipUpload(amount: amount ?? "", remarks: self.textField.text ?? "")
  135. .requestMultipart(
  136. images: getImageParams(model: image),
  137. needsAuthorization: true,
  138. success: { (response: KYCResponseContainer) in
  139. if (response.errorCode ?? "") == "1" {
  140. let error = NSError(
  141. domain: "Network",
  142. code: 0,
  143. userInfo: [NSLocalizedDescriptionKey : response.message ?? ""]
  144. )
  145. failure(error)
  146. } else {
  147. guard let message = response.message else {
  148. return
  149. }
  150. success(message)
  151. }
  152. },
  153. failure: failure)
  154. }
  155. private func getCompressedImage(base64: String) -> Data? {
  156. guard let imageData = Data(base64Encoded: base64) else { return nil }
  157. return UIImage(data: imageData)?.jpegData(compressionQuality: 0.6)
  158. }
  159. private func getImageParams(model: String?) -> [String: Data] {
  160. var images: [String: Data] = [:]
  161. // frontIDPicture
  162. if let image = model {
  163. if let data = getCompressedImage(base64: image) {
  164. print("frontIdPic:\(data)")
  165. images["DepositSlip"] = data
  166. }
  167. }
  168. return images
  169. }
  170. }
  171. extension SlipUploadViewController: MultimediaPresenterProtocol {
  172. func presenting() -> UIViewController {
  173. return self
  174. }
  175. }
  176. // MARK: MultiMediaManagerDelegate
  177. extension SlipUploadViewController: MultiMediaManagerDelegate {
  178. func didFinishPickingWithImage(image: UIImage) {
  179. frontIDImageTrigger.onNext(image.toBase64())
  180. //remove cropper as people are confused tkt #1040
  181. // self.imageCropper?.cropImage(image: image)
  182. }
  183. func didFinishPickingWithError(error: String) {
  184. self.alert(type: .error, message: error)
  185. }
  186. func hideBorder(view: UIView?) {
  187. view?.layer.borderWidth = 0
  188. view?.layer.addShadow(with: .clear)
  189. }
  190. }
  191. // MARK: ImageCropperDelegate
  192. extension SlipUploadViewController: ImageCropperDelegate {
  193. func didCropWith(image: UIImage) {
  194. frontIDImageTrigger.onNext(image.toBase64())
  195. }
  196. func didFailedCropWith(error: Error) {
  197. self.alert(type: .error, message: error.localizedDescription)
  198. }
  199. }