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.

224 lines
6.9 KiB

6 years ago
  1. //
  2. // RewardViewModel.swift
  3. // GMERemittance
  4. //
  5. // Created by Sujal on 3/14/18.
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import Foundation
  9. class RewardViewModel: ModelExtension {
  10. var rewardsAvailable: Box<Int?> = Box(nil)
  11. private var rewards: [Reward] = [Reward] ()
  12. private var rewardNames: [String] = [String] ()
  13. private var rewardImageNames: [String] = [String] ()
  14. private var rewardRedeemPoints: [Int] = [Int] ()
  15. private var selectedRewardIndex: Int!
  16. private var address: String!
  17. var rewardConnectionTimeOut: Box<Bool?> = Box(nil)
  18. private let user_id = UserDefaults.standard.object(forKey: "com.gmeremit.username") as! String
  19. }
  20. extension RewardViewModel {
  21. /**
  22. - returns: reward list
  23. */
  24. func getRewards() -> [Reward] {
  25. return rewards
  26. }
  27. /**
  28. - returns: rewards count
  29. */
  30. func getRewardCount() -> Int {
  31. return rewards.count
  32. }
  33. /**
  34. To get reward id
  35. - parameter index: position of reward id in an array
  36. - returns: reward id
  37. */
  38. func getRewardId(index: Int) -> String {
  39. return rewards[index].rewardId
  40. }
  41. /**
  42. To get reward name
  43. - parameter index: position of reward name in an array
  44. - returns: name
  45. */
  46. func getRewardName(index: Int) -> String {
  47. return rewards[index].rewardName
  48. }
  49. /**
  50. To get reward image url
  51. - parameter index: position of reward image url in an array
  52. - returns: url
  53. */
  54. func getRewardImage(index: Int) -> String? {
  55. if let rewardUrl = rewards[index].rewardUrl {
  56. return rewardUrl
  57. }
  58. return nil
  59. }
  60. /**
  61. To get redeem point
  62. - parameter index: position of redeem point in an array
  63. - returns: point
  64. */
  65. func getRedeemPoint(index: Int) -> String {
  66. return rewards[index].redeemPoints
  67. }
  68. /**
  69. To get selected reward
  70. - parameter index: position of selected reward
  71. - returns: index
  72. */
  73. func getSelectedRewardIndex() -> Int {
  74. return selectedRewardIndex
  75. }
  76. /**
  77. To set selected reward
  78. - parameter index: position of selected reward
  79. */
  80. func setSelectedRewardIndex(index: Int) {
  81. selectedRewardIndex = index
  82. }
  83. }
  84. extension RewardViewModel {
  85. /**
  86. Validate the empty textfield
  87. */
  88. func validateAddress(address: String) -> isValid {
  89. self.address = address.removeSpacesTrailingPreceding()
  90. if address.isBlank {
  91. return .InValid("Please fill the address")
  92. }
  93. return .Valid
  94. }
  95. func submitRequest() {
  96. }
  97. }
  98. extension RewardViewModel {
  99. /**
  100. Api request for reward
  101. */
  102. func fetchRewards() {
  103. if !Reachability.isConnectedToNetwork() {
  104. self.internetConnection.value = false
  105. } else {
  106. RestApiMananger.sharedInstance.fetchRewards(completion: { (result) in
  107. switch result {
  108. case let .success(rewardsJson):
  109. guard rewardsJson.count > 0 else {
  110. self.setErrorMessage(message: "No rewards obtained")
  111. self.rewardsAvailable.value = 0
  112. return
  113. }
  114. self.rewards.removeAll()
  115. for i in 0 ... (rewardsJson.count-1) {
  116. do {
  117. let reward = try JSONDecoder().decode(Reward.self, from: rewardsJson[i].rawData())
  118. self.rewards.append(reward)
  119. } catch let err {
  120. self.setErrorMessage(message: "Error Decoding: " + String(describing: err))
  121. self.rewardsAvailable.value = 0
  122. }
  123. }
  124. self.rewardsAvailable.value = 1
  125. case .failure(_):
  126. self.setErrorMessage(message: "Error Fetching Rewards")
  127. self.rewardsAvailable.value = 0
  128. case .updateAccessCode():
  129. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  130. result in
  131. if result != "Error"{
  132. let uuid = RestApiMananger.sharedInstance.getUUID()
  133. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  134. self.fetchRewards()
  135. }
  136. }
  137. case .logOutUser():
  138. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  139. self.anotherLogin.value = true
  140. case .timeOut:
  141. self.rewardConnectionTimeOut.value = false
  142. }
  143. })
  144. }
  145. }
  146. /**
  147. Api request for redeem requst
  148. - parameter rewardId: add to reward id
  149. */
  150. func redeemReward(rewardId: String) {
  151. if !Reachability.isConnectedToNetwork() {
  152. self.internetConnection.value = false
  153. } else {
  154. let param: [String: String] = ["userId": user_id, "userAddress": address]
  155. RestApiMananger.sharedInstance.redeemReward(rewardId: rewardId, param: param, completion: { (result) in
  156. switch result {
  157. case let .success(redeemedJson):
  158. UserDefaults.standard.set(redeemedJson["remainingRedeemPoints"].stringValue, forKey: "com.gmeremit.rewardPoint")
  159. self.rewardsAvailable.value = 2
  160. case .failure(_):
  161. self.setErrorMessage(message: "Error Redeeming Rewards")
  162. self.rewardsAvailable.value = 0
  163. case .updateAccessCode():
  164. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  165. result in
  166. if result != "Error"{
  167. let uuid = RestApiMananger.sharedInstance.getUUID()
  168. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  169. self.redeemReward(rewardId: rewardId)
  170. }
  171. }
  172. case .logOutUser():
  173. self.anotherLogin.value = true
  174. case .timeOut:
  175. self.rewardConnectionTimeOut.value = false
  176. }
  177. })
  178. }
  179. }
  180. }