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.

309 lines
11 KiB

6 years ago
6 years ago
  1. //
  2. // ProfileViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by Fm-user on 1/9/18.
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import SDWebImage
  10. class ProfileViewController: UIViewController {
  11. @IBOutlet weak var labelUserProfileName: UILabel!
  12. @IBOutlet weak var imageViewUserProfile: UIImageView!
  13. @IBOutlet weak var gmeWalletNumber: UILabel!
  14. @IBOutlet weak var buttonEdit: UIButton!
  15. @IBOutlet weak var labelUserName: UILabel!
  16. @IBOutlet weak var labelEmail: UILabel!
  17. @IBOutlet weak var labelMobileNumber: UILabel!
  18. @IBOutlet weak var labelBalance: UILabel!
  19. let imagePicker = UIImagePickerController()
  20. var profileviewmodel = ProfileViewModel()
  21. var profileImage: UIImage!
  22. public static var profileConnectionTimeOutCheck = 0
  23. private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
  24. /**
  25. Display image selection option from camera and gallery.
  26. */
  27. @objc func selectProfileImage(tapGestureRecognizer: UITapGestureRecognizer) {
  28. profileviewmodel.userDataAvailable.value = nil
  29. let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet)
  30. let cameraAction = UIAlertAction(title: "Camera", style: .default,handler: {
  31. (action : UIAlertAction!) -> Void in
  32. self.openCamera()
  33. })
  34. let galleryAction = UIAlertAction(title: "Gallery", style: .default,handler: {
  35. (action : UIAlertAction!) -> Void in
  36. self.openGallery()
  37. })
  38. let cancelAction = UIAlertAction.init(title: "Cancel", style: .destructive, handler: nil)
  39. cancelAction.setValue(UIColor.black, forKey: "titleTextColor")
  40. cameraAction.setValue(UIColor(hex:0xEC1C24), forKey: "titleTextColor")
  41. galleryAction.setValue(UIColor(hex:0xEC1C24), forKey: "titleTextColor")
  42. alert.addAction(cameraAction)
  43. alert.addAction(galleryAction)
  44. alert.addAction(cancelAction)
  45. self.present(alert, animated: true, completion: nil)
  46. }
  47. /**
  48. Open camera to take picture
  49. */
  50. func openCamera() {
  51. if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.camera)) {
  52. imagePicker.delegate = self
  53. imagePicker.sourceType = UIImagePickerControllerSourceType.camera
  54. imagePicker.allowsEditing = true
  55. present(imagePicker, animated: true, completion: nil)
  56. }
  57. else {
  58. let alert = UIAlertController(title: "Warning", message: "You don't have camera", preferredStyle: .alert)
  59. alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
  60. self.present(alert, animated: true, completion: nil)
  61. }
  62. }
  63. /**
  64. Open camera to take picture
  65. */
  66. func openGallery() {
  67. imagePicker.delegate = self
  68. imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
  69. imagePicker.allowsEditing = true
  70. present(imagePicker, animated: true, completion: nil)
  71. }
  72. override func viewWillAppear(_ animated: Bool) {
  73. self.tabBarController?.navigationController?.navigationBar.barTintColor = UIColor(hex:0xEC1C24)
  74. setUpAnotherLoginListener(genericviewmodel: profileviewmodel)
  75. }
  76. override func viewDidLoad() {
  77. super.viewDidLoad()
  78. setUpNavBar(id: 202,title: "")
  79. listenNetwork()
  80. if isVerified() {
  81. buttonEdit.isHidden = true
  82. } else {
  83. buttonEdit.isHidden = true
  84. }
  85. imageViewUserProfile.isUserInteractionEnabled = true
  86. labelUserProfileName.isUserInteractionEnabled = true
  87. imageViewUserProfile.isHidden = true
  88. labelUserProfileName.isHidden = false
  89. labelUserProfileName.layer.backgroundColor = UIColor(hex: 0x2e3192).cgColor
  90. labelUserProfileName.layer.cornerRadius = labelUserProfileName.frame.height / 2
  91. imageViewUserProfile.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selectProfileImage(tapGestureRecognizer:))))
  92. labelUserProfileName.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selectProfileImage(tapGestureRecognizer:))))
  93. startLoading()
  94. profileviewmodel.profileConnectionTimeOut.value = nil
  95. /**
  96. connection timeout
  97. */
  98. profileviewmodel.profileConnectionTimeOut.bind { [unowned self] in
  99. guard $0 != nil else {
  100. return
  101. }
  102. self.stopLoading()
  103. if ProfileViewController.profileConnectionTimeOutCheck == 0{
  104. ProfileViewController.profileConnectionTimeOutCheck = ProfileViewController.profileConnectionTimeOutCheck+1
  105. self.popUpMessage(value: 41)
  106. }
  107. }
  108. bindUserImageToUI()
  109. bindUserDetailsToUI()
  110. profileviewmodel.fetchUserInfo(userId: nil)
  111. }
  112. func startLoading(){
  113. disableUserInteractions()
  114. showActivityIndicator(activityIndicator: activityIndicator)
  115. }
  116. func stopLoading(){
  117. enableUserInteractions()
  118. dismissActivityIndicator(activityIndicator: self.activityIndicator)
  119. }
  120. /**
  121. Check internet connection
  122. */
  123. func listenNetwork() {
  124. profileviewmodel.internetConnection.value = nil
  125. profileviewmodel.internetConnection.bind { [unowned self] in
  126. guard $0 != nil else {
  127. return
  128. }
  129. self.stopLoading()
  130. self.popUpMessage(value: 15)
  131. }
  132. }
  133. /**
  134. Bind call for user deatails
  135. */
  136. func bindUserDetailsToUI() {
  137. profileviewmodel.userDataAvailable.bind { [unowned self] in
  138. guard $0 != nil else {
  139. return
  140. }
  141. self.stopLoading()
  142. guard $0! else {
  143. if ProfileViewController.profileConnectionTimeOutCheck == 0{
  144. ProfileViewController.profileConnectionTimeOutCheck = ProfileViewController.profileConnectionTimeOutCheck+1
  145. self.popUpMessageError(value: 10, message: self.profileviewmodel.getErrorMessage())
  146. }
  147. return
  148. }
  149. if let userDpString = self.profileviewmodel.getProfileModel().dpUrl {
  150. if let userDpUrl = URL(string: userDpString) {
  151. SDImageCache.shared().clearMemory()
  152. SDImageCache.shared().clearDisk()
  153. self.imageViewUserProfile.sd_setImage(with: userDpUrl, completed: nil)
  154. self.setUpImage()
  155. }
  156. } else {
  157. if let firstName = self.profileviewmodel.getProfileModel().firstName{
  158. self.labelUserProfileName.text = String(firstName.prefix(1).uppercased())
  159. }
  160. }
  161. self.labelUserName.text = self.profileviewmodel.getFullName()
  162. self.labelMobileNumber.text = self.profileviewmodel.getProfileModel().mobileNumber
  163. self.labelEmail.text = self.profileviewmodel.getProfileModel().email
  164. if let availableBalance = self.profileviewmodel.getProfileModel().availableBalance {
  165. self.labelBalance.text = self.getCommaAddedAmountString(amountString: availableBalance)
  166. }
  167. let walletNum = self.profileviewmodel.getProfileModel().walletNumber ?? "null"
  168. let bankName = self.profileviewmodel.getProfileModel().primaryBankName ?? ""
  169. self.setWalletNumber(walletNumber: walletNum, bankName: "(" + bankName + ")")
  170. }
  171. }
  172. /**
  173. Display Wallet number and bank name
  174. */
  175. func setWalletNumber(walletNumber:String, bankName:String){
  176. let recipientColor = UIColor(red: 236/255, green: 28/255.0, blue: 36/255, alpha: 1.0)
  177. let title: String = String("GME Wallet No. ")
  178. let wNumber: String = walletNumber + " "
  179. let bName: String = bankName
  180. let mutableQuestion1 = NSMutableAttributedString(string: title)
  181. let mutableQuestion2 = NSMutableAttributedString(string: wNumber)
  182. let mutableQuestion3 = NSMutableAttributedString(string: bName)
  183. mutableQuestion2.addAttribute(NSAttributedStringKey.foregroundColor, value: recipientColor, range: NSRange(location:0, length: mutableQuestion2.length))
  184. let mutableQuestion = NSMutableAttributedString()
  185. mutableQuestion.append(mutableQuestion1)
  186. mutableQuestion.append(mutableQuestion2)
  187. mutableQuestion.append(mutableQuestion3)
  188. self.gmeWalletNumber.attributedText = mutableQuestion
  189. }
  190. /**
  191. Bind call to display Profile image
  192. */
  193. func bindUserImageToUI() {
  194. profileviewmodel.imageSubmitted.bind{ [unowned self] in
  195. guard $0 != nil else {
  196. return
  197. }
  198. self.stopLoading()
  199. guard $0! else {
  200. if ProfileViewController.profileConnectionTimeOutCheck == 0{
  201. ProfileViewController.profileConnectionTimeOutCheck = ProfileViewController.profileConnectionTimeOutCheck+1
  202. self.popUpMessageError(value: 10, message: self.profileviewmodel.getErrorMessage())
  203. }
  204. return
  205. }
  206. self.imageViewUserProfile.image = self.profileImage
  207. self.setUpImage()
  208. }
  209. }
  210. /**
  211. Profile image view Attributes
  212. */
  213. func setUpImage() {
  214. self.labelUserProfileName.isHidden = true
  215. self.imageViewUserProfile.isHidden = false
  216. self.imageViewUserProfile.layer.cornerRadius = self.imageViewUserProfile.frame.height / 2
  217. self.imageViewUserProfile.contentMode = .scaleAspectFill
  218. }
  219. override func didReceiveMemoryWarning() {
  220. super.didReceiveMemoryWarning()
  221. }
  222. @IBAction func editProfileTap(_ sender: Any) {
  223. self.performSegue(withIdentifier: "editProfile", sender: nil)
  224. }
  225. }
  226. extension ProfileViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate {
  227. func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
  228. if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
  229. profileImage = image
  230. let imageData: NSData = UIImageJPEGRepresentation(image, 0.25)! as NSData
  231. let imageDataBase64: String = imageData.base64EncodedString(options: .lineLength64Characters)
  232. startLoading()
  233. profileviewmodel.provideImageForSubmission(docType: kycCode.UserImage.rawValue, imageBase64: imageDataBase64)
  234. dismiss(animated: true, completion: nil)
  235. } else {
  236. }
  237. }
  238. func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
  239. dismiss(animated: true, completion: nil)
  240. }
  241. }