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.

335 lines
10 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
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. import VisualEffectView
  12. enum PictureType: Int {
  13. case selfie
  14. case front
  15. case back
  16. case passbook
  17. }
  18. struct KycForm3FieldKeys {
  19. static let selfieImage = "selfie"
  20. static let passbookImage = "passbook"
  21. static let frontImage = "frontImage"
  22. static let backImage = "backImage"
  23. }
  24. class KycForm3Model {
  25. var selfieImage: UIImage?
  26. var frontImage: UIImage?
  27. var backImage: UIImage?
  28. var passbookImage: UIImage?
  29. var passportImage: UIImage?
  30. }
  31. class KycForm3ViewController: UIViewController {
  32. struct Constants {
  33. static let stateRedColor = UIColor.init(hex: "#EC1C24")
  34. static let clearColor = UIColor.clear
  35. static let errorBorderSize = AppConstants.errorBorderWidth
  36. }
  37. struct StringConstants {
  38. let verificationIdFrontTitle = "selfie_with_verification_id_front_text".localized()
  39. let verificationIdBackTitle = "verification_id_back_text".localized()
  40. let selfieFrontTitle = "selfie_with_verification_id_front_text".localized()
  41. let passBookTitle = "passbook_text".localized()
  42. let veiwSampleText = "view_sample_text".localized()
  43. let noteText = "kyc_document_note_text".localized()
  44. let headerText = "upload_subtitle_text".localized()
  45. }
  46. // MARK: IBOutlets
  47. @IBOutlet weak var selfieButton: UIButton!
  48. @IBOutlet weak var frontButton: UIButton!
  49. @IBOutlet weak var backButton: UIButton!
  50. @IBOutlet weak var passbook: UIButton!
  51. @IBOutlet weak var passport: UIButton!
  52. // views
  53. @IBOutlet weak var selfieView: UIView!
  54. @IBOutlet weak var frontImageView: UIView!
  55. @IBOutlet weak var backImageView: UIView!
  56. @IBOutlet weak var passBookView: UIView!
  57. @IBOutlet weak var passportView: UIView!
  58. // titles
  59. @IBOutlet weak var verificationIdFrontTitleLabel: UILabel!
  60. @IBOutlet weak var verificationIdBackTitleLabel: UILabel!
  61. @IBOutlet weak var selfieTitleLabel: UILabel!
  62. @IBOutlet weak var passbookTitleLabel: UILabel!
  63. @IBOutlet weak var headerTitle: UILabel!
  64. @IBOutlet weak var sutTitleLabel: UILabel!
  65. // buttons
  66. @IBOutlet weak var verificationFrontSampleButton: UIButton!
  67. @IBOutlet weak var verificationBackSampleButton: UIButton!
  68. @IBOutlet weak var selfieSampleButton: UIButton!
  69. @IBOutlet weak var passbookSampleButotn: UIButton!
  70. @IBOutlet weak var submitButton: UIButton!
  71. // submit_text
  72. private func configureLanguage() {
  73. self.headerTitle.text = StringConstants().headerText
  74. self.sutTitleLabel.text = StringConstants().noteText
  75. self.verificationIdFrontTitleLabel.text = StringConstants().verificationIdFrontTitle
  76. self.verificationIdBackTitleLabel.text = StringConstants().verificationIdBackTitle
  77. self.selfieTitleLabel.text = StringConstants().selfieFrontTitle
  78. self.passbookTitleLabel.text = StringConstants().passBookTitle
  79. [verificationBackSampleButton, selfieSampleButton,verificationFrontSampleButton, passbookSampleButotn].forEach({
  80. $0?.setTitle(StringConstants().veiwSampleText, for: .normal)
  81. })
  82. self.submitButton.setTitle("submit_text".localized(), for: UIControlState.normal)
  83. }
  84. // MARK: Properties
  85. let kycForm3Model = KycForm3Model()
  86. var presenter: KycForm3ModuleInterface?
  87. var delegate: KYCForm3Delegate?
  88. var multiMediaManager: MultiMediaManager?
  89. var imageCropper: ImageCroper?
  90. var currentPictureType: PictureType?
  91. var selectedSelfieImage = false
  92. var selectedFrontImage = false
  93. var selectedBackImage = false
  94. var selectedPassbookImage = false
  95. var selectedPassPortImage = false
  96. var errorViewsDict: [String: UIView] = [:]
  97. // MARK: VC's Life cycle
  98. override func viewDidLoad() {
  99. super.viewDidLoad()
  100. self.setup()
  101. }
  102. // MARK: IBActions
  103. // sample actions
  104. @IBAction func selfie(_ sender: UIButton) {
  105. showSample(type: .selfie, titleString: "Picture with National/Alien Reg ID Front")
  106. }
  107. @IBAction func front(_ sender: UIButton) {
  108. showSample(type: .front, titleString: "National/ Alien Reg ID Front")
  109. }
  110. @IBAction func back(_ sender: UIButton) {
  111. showSample(type: .back, titleString: "National/ Alien Reg ID Back")
  112. }
  113. @IBAction func passbook(_ sender: UIButton) {
  114. showSample(type: .passbook, titleString: "Passbook")
  115. }
  116. // camera actions
  117. @IBAction func selfieCamera(_ sender: UIButton) {
  118. self.currentPictureType = .selfie
  119. self.showPicker()
  120. }
  121. @IBAction func frontCamera(_ sender: UIButton) {
  122. self.currentPictureType = .front
  123. print("front")
  124. self.showPicker()
  125. }
  126. @IBAction func backCamera(_ sender: UIButton) {
  127. self.currentPictureType = .back
  128. print("back")
  129. self.showPicker()
  130. }
  131. @IBAction func passbookCamera(_ sender: UIButton) {
  132. self.currentPictureType = .passbook
  133. print("passbook")
  134. self.showPicker()
  135. }
  136. // submit action
  137. @IBAction func submit(_ sender: UIButton) {
  138. self.delegate?.submit(model: self.kycForm3Model)
  139. }
  140. // MARK: Other Functions
  141. private func setup() {
  142. // all setup should be done here
  143. self.multiMediaManager = MultiMediaManager(presenter: self)
  144. multiMediaManager?.delegate = self
  145. self.imageCropper = ImageCroper(presentingViewController: self)
  146. imageCropper?.delegate = self
  147. setupErrorViews()
  148. configureLanguage()
  149. }
  150. private func setupErrorViews() {
  151. self.errorViewsDict =
  152. [
  153. KycForm3FieldKeys.selfieImage: self.selfieView,
  154. KycForm3FieldKeys.frontImage: self.frontImageView,
  155. KycForm3FieldKeys.backImage: self.backImageView,
  156. KycForm3FieldKeys.passbookImage: self.passBookView
  157. ]
  158. }
  159. private func showPicker() {
  160. multiMediaManager?.openPicker(mode: UIImagePickerControllerCameraCaptureMode.photo)
  161. }
  162. func showSample(type: PictureType, titleString: String) {
  163. let image: UIImage?
  164. switch type {
  165. case .selfie:
  166. image = #imageLiteral(resourceName: "sampleSelfie")
  167. case .front:
  168. image = #imageLiteral(resourceName: "sampleFront")
  169. case .back:
  170. image = #imageLiteral(resourceName: "sampleBack")
  171. case .passbook:
  172. image = #imageLiteral(resourceName: "samplePassbook")
  173. // case .passport:
  174. // image = #imageLiteral(resourceName: "sampleBack")
  175. }
  176. // show alert
  177. let alertVC = PMAlertController(title: "", description: "", image: image, style: .alert)
  178. alertVC.alertView.layer.cornerRadius = 10
  179. let action = PMAlertAction(title: "ok_text".localized(), style: .cancel)
  180. alertVC.addAction(action)
  181. self.present(alertVC, animated: true, completion: nil)
  182. }
  183. }
  184. // MARK: KycForm3ViewInterface
  185. extension KycForm3ViewController: KycForm3ViewInterface {
  186. }
  187. extension KycForm3ViewController: IndicatorInfoProvider {
  188. func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo {
  189. return IndicatorInfo.init(title: "upload_title_text".localized())
  190. }
  191. }
  192. extension KycForm3ViewController: MultimediaPresenterProtocol {
  193. func presenting() -> UIViewController {
  194. return self
  195. }
  196. }
  197. extension KycForm3ViewController: MultiMediaManagerDelegate {
  198. func didFinishPickingWithImage(image: UIImage) {
  199. self.imageCropper?.cropImage(image: image)
  200. }
  201. func didFinishPickingWithError(error: String) {
  202. self.alert(message: error)
  203. }
  204. func hideBorder(view: UIView) {
  205. view.layer.borderWidth = 0
  206. view.layer.addShadow(with: Constants.clearColor)
  207. }
  208. }
  209. extension KycForm3ViewController: ImageCropperDelegate {
  210. func didCropWith(image: UIImage) {
  211. guard let type = self.currentPictureType else {return}
  212. switch type {
  213. case .selfie:
  214. self.selfieButton.setImage(image, for: .normal)
  215. self.selectedSelfieImage = true
  216. self.kycForm3Model.selfieImage = image
  217. selfieButton.addBlur()
  218. hideBorder(view: selfieView)
  219. case .front:
  220. self.frontButton.setImage(image, for: .normal)
  221. self.selectedFrontImage = true
  222. self.kycForm3Model.frontImage = image
  223. frontButton.addBlur()
  224. hideBorder(view: frontImageView)
  225. case .back:
  226. self.backButton.setImage(image, for: .normal)
  227. self.selectedBackImage = true
  228. self.kycForm3Model.backImage = image
  229. backButton.addBlur()
  230. hideBorder(view: backImageView)
  231. case .passbook:
  232. self.passbook.setImage(image, for: .normal)
  233. self.selectedPassbookImage = true
  234. self.kycForm3Model.passbookImage = image
  235. passbook.addBlur()
  236. hideBorder(view: passBookView)
  237. // case .passport:
  238. // self.passport.setImage(image, for: .normal)
  239. // self.selectedPassPortImage = true
  240. // self.kycForm3Model.passportImage = image
  241. // hideBorder(view: passportView)
  242. }
  243. }
  244. func didFailedCropWith(error: Error) {
  245. self.alert(message: error.localizedDescription)
  246. }
  247. }
  248. extension KycForm3ViewController {
  249. private func showBorder(view : UIView?) {
  250. guard let _view = view else {return}
  251. _view.layer.borderColor = Constants.stateRedColor.cgColor
  252. _view.layer.borderWidth = Constants.errorBorderSize
  253. _view.layer.addShadow(with: Constants.stateRedColor)
  254. }
  255. func show(result: (doesNotSucks: Bool, errorsDick: [String : String])) {
  256. var position = 11
  257. if result.doesNotSucks { // if isValid
  258. }else {
  259. result.errorsDick.forEach({
  260. // self.show(error: $0.value, label: label)
  261. let view = errorViewsDict[$0.key]
  262. self.showBorder(view: view)
  263. let tag = (view?.tag ?? position)
  264. position = tag < position ? tag : position
  265. // if let topMostView = self.views.filter({
  266. // $0.tag == tag
  267. // }).first {
  268. // // Todo
  269. // // scroll to view here
  270. // }
  271. })
  272. }
  273. }
  274. }