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.

302 lines
8.8 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. //
  2. // KycForm3ViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by gme_2 on 12/09/2018.
  6. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import XLPagerTabStrip
  10. import PMAlertController
  11. enum PictureType: Int {
  12. case selfie
  13. case front
  14. case back
  15. case passbook
  16. case passport
  17. }
  18. struct KycForm3FieldKeys {
  19. static let selfieImage = "bank"
  20. static let frontImage = "accountNumber"
  21. static let backImage = "verificationId"
  22. static let passbookImage = "verificationIdNumber"
  23. static let passportImage = "expiryDate"
  24. }
  25. class KycForm3Model {
  26. var selfieImage: UIImage?
  27. var frontImage: UIImage?
  28. var backImage: UIImage?
  29. var passbookImage: UIImage?
  30. var passportImage: UIImage?
  31. }
  32. class KycForm3ViewController: UIViewController {
  33. struct Constants {
  34. static let stateRedColor = UIColor.init(hex: "#EC1C24")
  35. static let clearColor = UIColor.clear
  36. static let errorBorderSize = AppConstants.errorBorderWidth
  37. }
  38. // MARK: IBOutlets
  39. @IBOutlet weak var selfieButton: UIButton!
  40. @IBOutlet weak var frontButton: UIButton!
  41. @IBOutlet weak var backButton: UIButton!
  42. @IBOutlet weak var passbook: UIButton!
  43. @IBOutlet weak var passport: UIButton!
  44. // views
  45. @IBOutlet weak var selfieView: UIView!
  46. @IBOutlet weak var frontImageView: UIView!
  47. @IBOutlet weak var backImageView: UIView!
  48. @IBOutlet weak var passBookView: UIView!
  49. @IBOutlet weak var passportView: UIView!
  50. // MARK: Properties
  51. let kycForm3Model = KycForm3Model()
  52. var presenter: KycForm3ModuleInterface?
  53. var delegate: KYCForm3Delegate?
  54. var multiMediaManager: MultiMediaManager?
  55. var imageCropper: ImageCroper?
  56. var currentPictureType: PictureType?
  57. var selectedSelfieImage = false
  58. var selectedFrontImage = false
  59. var selectedBackImage = false
  60. var selectedPassbookImage = false
  61. var selectedPassPortImage = false
  62. var errorViewsDict: [String: UIView] = [:]
  63. // MARK: VC's Life cycle
  64. override func viewDidLoad() {
  65. super.viewDidLoad()
  66. self.setup()
  67. }
  68. // MARK: IBActions
  69. // sample actions
  70. @IBAction func selfie(_ sender: UIButton) {
  71. showSample(type: .selfie, titleString: "Picture with National/Alien Reg ID Front")
  72. }
  73. @IBAction func front(_ sender: UIButton) {
  74. showSample(type: .front, titleString: "National/ Alien Reg ID Front")
  75. }
  76. @IBAction func back(_ sender: UIButton) {
  77. showSample(type: .back, titleString: "National/ Alien Reg ID Back")
  78. }
  79. @IBAction func passbook(_ sender: UIButton) {
  80. showSample(type: .passbook, titleString: "Passbook")
  81. }
  82. @IBAction func passport(_ sender: UIButton) {
  83. showSample(type: .passport, titleString: "Passport")
  84. }
  85. // camera actions
  86. @IBAction func selfieCamera(_ sender: UIButton) {
  87. self.currentPictureType = .selfie
  88. self.showPicker()
  89. }
  90. @IBAction func frontCamera(_ sender: UIButton) {
  91. self.currentPictureType = .front
  92. print("front")
  93. self.showPicker()
  94. }
  95. @IBAction func backCamera(_ sender: UIButton) {
  96. self.currentPictureType = .back
  97. print("back")
  98. self.showPicker()
  99. }
  100. @IBAction func passbookCamera(_ sender: UIButton) {
  101. self.currentPictureType = .passbook
  102. print("passbook")
  103. self.showPicker()
  104. }
  105. @IBAction func passportCamera(_ sender: UIButton) {
  106. self.currentPictureType = .passport
  107. print("passport")
  108. self.showPicker()
  109. }
  110. // submit action
  111. @IBAction func submit(_ sender: UIButton) {
  112. self.delegate?.submit(model: self.kycForm3Model)
  113. }
  114. // MARK: Other Functions
  115. private func setup() {
  116. // all setup should be done here
  117. self.multiMediaManager = MultiMediaManager(presenter: self)
  118. multiMediaManager?.delegate = self
  119. self.imageCropper = ImageCroper(presentingViewController: self)
  120. imageCropper?.delegate = self
  121. setupErrorViews()
  122. }
  123. private func setupErrorViews() {
  124. self.errorViewsDict =
  125. [
  126. KycForm3FieldKeys.selfieImage: self.selfieView,
  127. KycForm3FieldKeys.frontImage: self.frontImageView,
  128. KycForm3FieldKeys.backImage: self.backImageView,
  129. KycForm3FieldKeys.passbookImage: self.passBookView,
  130. KycForm3FieldKeys.passportImage: self.passportView,
  131. ]
  132. }
  133. private func showPicker() {
  134. multiMediaManager?.openPicker(mode: UIImagePickerControllerCameraCaptureMode.photo)
  135. }
  136. func showSample(type: PictureType, titleString: String) {
  137. let image: UIImage?
  138. switch type {
  139. case .selfie:
  140. image = #imageLiteral(resourceName: "sampleSelfie")
  141. case .front:
  142. image = #imageLiteral(resourceName: "sampleFront")
  143. case .back:
  144. image = #imageLiteral(resourceName: "sampleBack")
  145. case .passbook:
  146. image = #imageLiteral(resourceName: "sampleBack")
  147. case .passport:
  148. image = #imageLiteral(resourceName: "sampleBack")
  149. }
  150. // show alert
  151. let alertVC = PMAlertController(title: "", description: "", image: image, style: .alert)
  152. alertVC.alertView.layer.cornerRadius = 10
  153. let action = PMAlertAction(title: "OK", style: .cancel)
  154. alertVC.addAction(action)
  155. self.present(alertVC, animated: true, completion: nil)
  156. }
  157. }
  158. // MARK: KycForm3ViewInterface
  159. extension KycForm3ViewController: KycForm3ViewInterface {
  160. }
  161. extension KycForm3ViewController: IndicatorInfoProvider {
  162. func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo {
  163. return IndicatorInfo.init(title: "Upload")
  164. }
  165. }
  166. extension KycForm3ViewController: MultimediaPresenterProtocol {
  167. func presenting() -> UIViewController {
  168. return self
  169. }
  170. }
  171. extension KycForm3ViewController: MultiMediaManagerDelegate {
  172. func didFinishPickingWithImage(image: UIImage) {
  173. self.imageCropper?.cropImage(image: image)
  174. }
  175. func didFinishPickingWithError(error: String) {
  176. self.alert(message: error)
  177. }
  178. func hideBorder(view: UIView) {
  179. view.layer.borderWidth = 0
  180. view.layer.addShadow(with: Constants.clearColor)
  181. }
  182. }
  183. extension KycForm3ViewController: ImageCropperDelegate {
  184. func didCropWith(image: UIImage) {
  185. guard let type = self.currentPictureType else {return; print("returning")}
  186. switch type {
  187. case .selfie:
  188. self.selfieButton.setImage(image, for: .normal)
  189. self.selectedSelfieImage = true
  190. self.kycForm3Model.selfieImage = image
  191. hideBorder(view: selfieView)
  192. case .front:
  193. self.frontButton.setImage(image, for: .normal)
  194. self.selectedFrontImage = true
  195. self.kycForm3Model.frontImage = image
  196. hideBorder(view: frontImageView)
  197. case .back:
  198. self.backButton.setImage(image, for: .normal)
  199. self.selectedBackImage = true
  200. self.kycForm3Model.backImage = image
  201. hideBorder(view: backImageView)
  202. case .passbook:
  203. self.passbook.setImage(image, for: .normal)
  204. self.selectedPassbookImage = true
  205. self.kycForm3Model.passbookImage = image
  206. hideBorder(view: passBookView)
  207. case .passport:
  208. self.passport.setImage(image, for: .normal)
  209. self.selectedPassPortImage = true
  210. self.kycForm3Model.passportImage = image
  211. hideBorder(view: passportView)
  212. }
  213. }
  214. func didFailedCropWith(error: Error) {
  215. self.alert(message: error.localizedDescription)
  216. }
  217. }
  218. extension KycForm3ViewController {
  219. private func showBorder(view : UIView?) {
  220. guard let _view = view else {return}
  221. _view.layer.borderColor = Constants.stateRedColor.cgColor
  222. _view.layer.borderWidth = Constants.errorBorderSize
  223. _view.layer.addShadow(with: Constants.stateRedColor)
  224. }
  225. func show(result: (doesNotSucks: Bool, errorsDick: [String : String])) {
  226. var position = 11
  227. if result.doesNotSucks { // if isValid
  228. }else {
  229. result.errorsDick.forEach({
  230. // self.show(error: $0.value, label: label)
  231. let view = errorViewsDict[$0.key]
  232. self.showBorder(view: view)
  233. let tag = (view?.tag ?? position)
  234. position = tag < position ? tag : position
  235. // if let topMostView = self.views.filter({
  236. // $0.tag == tag
  237. // }).first {
  238. // // Todo
  239. // // scroll to view here
  240. // }
  241. })
  242. }
  243. }
  244. }