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.

1218 lines
45 KiB

6 years ago
  1. //
  2. // SocialFeedsViewModel.swift
  3. // GMERemittance
  4. //
  5. // Created by Sujal Manandhar
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import Foundation
  9. class SocialFeedViewModel : ModelExtension {
  10. var particularFeed: SocialFeed!
  11. var socialFeedsRxValue:Box<Int?> = Box(nil)
  12. var imageUploaded:Box<Bool?> = Box(nil)
  13. var socialFeedConnectionTimeOut: Box<Bool?> = Box(nil)
  14. private var param = [String: String]()
  15. private var publicSocialFeedsArray = [SocialFeed]()
  16. private var privateSocialFeedsArray = [SocialFeed]()
  17. private var likedBy = [Like] ()
  18. private var commentedBy = [Comment] ()
  19. private let user_id = UserDefaults.standard.object(forKey: "com.gmeremit.username") as! String
  20. private let num_feeds = 10
  21. private let num_comments = 10
  22. private let size_comments = 10
  23. private var page_comments: Int!
  24. private var feedBeforeId: String!
  25. private var feedAfterId: String!
  26. private var remainingFeeds: Int!
  27. private var commentBeforeId: String!
  28. private var commentAfterId: String!
  29. private var remainingComments: Int!
  30. private var feedImageId: String!
  31. private var feedText: String!
  32. private var accessType: String = "public"
  33. private var personal: Bool = false
  34. private var commentText: String!
  35. private var currentlyFetchedPublicFeedCount: Int = 0
  36. private var currentlyFetchedPrivateFeedCount: Int = 0
  37. private var currentlyFetchedCommentCount: Int = 0
  38. }
  39. extension SocialFeedViewModel {
  40. func resetBeforeId() {
  41. self.feedBeforeId = nil
  42. }
  43. //Set or Update the status post to share
  44. func updateFeedText(text: String) {
  45. self.feedText = text
  46. }
  47. //Set or Update the comment
  48. func updateCommentText(text: String) {
  49. self.commentText = text
  50. }
  51. //func setFeedImageId
  52. func setFeedImageId(imageId: String) {
  53. self.feedImageId = imageId
  54. }
  55. //Set accessType
  56. func setAccessType(accessType: String) {
  57. self.accessType = accessType
  58. switch accessType {
  59. case "private":
  60. personal = true
  61. case "public":
  62. personal = false
  63. default:
  64. return
  65. }
  66. }
  67. //Reset feed id
  68. func resetBeforeAfterFeedId() {
  69. feedBeforeId = nil
  70. feedAfterId = nil
  71. }
  72. /**
  73. For toggle action
  74. - parameter accesType: private or public
  75. */
  76. func getToggledAccessType(accessType: String) -> String {
  77. switch accessType {
  78. case "private":
  79. return "public"
  80. case "public":
  81. return "private"
  82. default:
  83. return ""
  84. }
  85. }
  86. /// - returns: count of array
  87. func getPublicSocialFeedsCount() -> Int {
  88. return publicSocialFeedsArray.count
  89. }
  90. /// - returns: count of array
  91. func getPrivateSocialFeedsCount() -> Int {
  92. return privateSocialFeedsArray.count
  93. }
  94. /**
  95. Get social feeds
  96. - returns: array of socail feed
  97. */
  98. func getSocialFeeds() -> [SocialFeed] {
  99. if personal {
  100. return privateSocialFeedsArray
  101. }
  102. return publicSocialFeedsArray
  103. }
  104. /**
  105. Get a social feed from array
  106. - parameter index: position of social feed in an array
  107. - returns: social feed
  108. */
  109. func getSocialFeedAt(index: Int) -> SocialFeed {
  110. if personal {
  111. return privateSocialFeedsArray[index]
  112. }
  113. return publicSocialFeedsArray[index]
  114. }
  115. /**
  116. Get a private social feed from array
  117. - parameter index: position of social feed in an array
  118. - returns: social feed
  119. */
  120. func getPrivateSocialFeedAt(index: Int) -> SocialFeed {
  121. return privateSocialFeedsArray[index]
  122. }
  123. /**
  124. Get a public social feed from array
  125. - parameter index: position of social feed in an array
  126. - returns: social feed
  127. */
  128. func getPublicSocialFeedAt(index: Int) -> SocialFeed {
  129. return publicSocialFeedsArray[index]
  130. }
  131. /**
  132. check image upload
  133. - returns: Bool
  134. */
  135. func imageFinishedUpload() -> Bool {
  136. if feedImageId == nil {
  137. return false
  138. }
  139. return true
  140. }
  141. /**
  142. Check user post
  143. - parameter PostIndex: position of a post in an array
  144. - returns: Bool
  145. */
  146. func postBelongsToMe(postIndex: Int) -> Bool {
  147. if personal {
  148. if privateSocialFeedsArray[postIndex].userId == user_id {
  149. return true
  150. }
  151. return false
  152. } else {
  153. if publicSocialFeedsArray[postIndex].userId == user_id {
  154. return true
  155. }
  156. return false
  157. }
  158. }
  159. /**
  160. Check private post
  161. - parameter postIndex: position of a post in an array
  162. - returns: Bool
  163. */
  164. func isPostPrivate(postIndex: Int) -> Bool {
  165. if privateSocialFeedsArray[postIndex].accessType == "private" {
  166. return true
  167. }
  168. return false
  169. }
  170. /**
  171. Check user comment
  172. - parameter commentIndex: position of a comment in an array
  173. - returns: Bool
  174. */
  175. func commentBelongsToMe(commentIndex: Int) -> Bool {
  176. if commentedBy[commentIndex].userId == user_id {
  177. return true
  178. }
  179. return false
  180. }
  181. /**
  182. - returns: array
  183. */
  184. func getAllLikes() -> [Like] {
  185. return likedBy
  186. }
  187. /**
  188. - returns: array
  189. */
  190. func getAllComments() -> [Comment] {
  191. return commentedBy
  192. }
  193. /**
  194. To get a comment
  195. - parameter index: position of a comment in an array
  196. - returns: Bool
  197. */
  198. func getCommentAt(index: Int) -> Comment {
  199. return commentedBy[index]
  200. }
  201. /**
  202. - returns: array count
  203. */
  204. func getCommentsCount() -> Int {
  205. return commentedBy.count
  206. }
  207. /**
  208. To update like count
  209. - parameter atIndex: position of a like in an array
  210. */
  211. func updateSocialFeedArrayLikeNumber(atIndex: Int) {
  212. var feedToUpdate = getSocialFeedAt(index: atIndex)
  213. if feedToUpdate.liked {
  214. feedToUpdate.totalLike = feedToUpdate.totalLike - 1
  215. } else {
  216. feedToUpdate.totalLike = feedToUpdate.totalLike + 1
  217. }
  218. feedToUpdate.liked = !feedToUpdate.liked
  219. updateFeedArray(atIndex: atIndex, withFeed: feedToUpdate)
  220. }
  221. /**
  222. To update comment count
  223. - parameter atIndex: position of a comment in an array
  224. - parameter increase: Bool
  225. */
  226. func updateSocialFeedArrayCommentNumber(atIndex: Int, increase: Bool) {
  227. var feedToUpdate = getSocialFeedAt(index: atIndex)
  228. if increase {
  229. feedToUpdate.totalComment = feedToUpdate.totalComment + 1
  230. } else {
  231. feedToUpdate.totalComment = feedToUpdate.totalComment - 1
  232. }
  233. updateFeedArray(atIndex: atIndex, withFeed: feedToUpdate)
  234. }
  235. /**
  236. To update feed
  237. - parameter atIndex: position of a feed in an array
  238. - parameter withFeed: feed
  239. */
  240. func updateFeedArray(atIndex: Int, withFeed: SocialFeed) {
  241. if personal {
  242. privateSocialFeedsArray[atIndex] = withFeed
  243. } else {
  244. publicSocialFeedsArray[atIndex] = withFeed
  245. }
  246. }
  247. /**
  248. To get determine type of feed i.e private or public
  249. - parameter withFeed: feed
  250. */
  251. func toggleArrays(withFeed: SocialFeed) {
  252. let feedAccessType = withFeed.accessType
  253. if feedAccessType == "private" {
  254. //find the index of the feed in private array and update it with the updated feed
  255. if let index = privateSocialFeedsArray.index(where: {$0.id == withFeed.id}) {
  256. privateSocialFeedsArray.insert(withFeed, at: index)
  257. } else {
  258. privateSocialFeedsArray.insert(withFeed, at: 0)
  259. }
  260. //find the index of the feed in public array and remove it
  261. if let index2 = publicSocialFeedsArray.index(where: {$0.id == withFeed.id}) {
  262. publicSocialFeedsArray.remove(at: index2)
  263. }
  264. } else {
  265. //find the index of the feed in private array and update it with the updated feed
  266. let index = privateSocialFeedsArray.index(where: {$0.id == withFeed.id})
  267. privateSocialFeedsArray.insert(withFeed, at: index!)
  268. privateSocialFeedsArray.remove(at: index!+1)
  269. //insert the feed in public array
  270. publicSocialFeedsArray.insert(withFeed, at: 0)
  271. }
  272. }
  273. /**
  274. To update comment Array
  275. - parameter atIndex: position of a comment in an array
  276. - parameter increase: Comment
  277. */
  278. func updateCommentArray(atIndex: Int, withComment: Comment) {
  279. commentedBy[atIndex] = withComment
  280. }
  281. /**
  282. To remove social feed
  283. - parameter atIndex: position of a feed in an array
  284. */
  285. func removeSocialFeed(atIndex: Int) {
  286. if personal {
  287. privateSocialFeedsArray.remove(at: atIndex)
  288. } else {
  289. publicSocialFeedsArray.remove(at: atIndex)
  290. }
  291. }
  292. /**
  293. Remove all feeds
  294. */
  295. func clearFeedsArray() {
  296. if personal {
  297. privateSocialFeedsArray.removeAll()
  298. } else {
  299. publicSocialFeedsArray.removeAll()
  300. }
  301. }
  302. /**
  303. To remove a comment in an array
  304. - parameter atIndex: position of a feed in an array
  305. */
  306. func removeComment(atIndex: Int) {
  307. commentedBy.remove(at: atIndex)
  308. }
  309. /**
  310. Reset comment Aray
  311. */
  312. func resetCommentsArray() {
  313. commentedBy.removeAll()
  314. commentAfterId = nil
  315. commentBeforeId = nil
  316. remainingComments = 0
  317. }
  318. /**
  319. To get full name of a person who post in social feed
  320. - parameter feed: feed
  321. */
  322. func getFullName(feed: SocialFeed) -> String {
  323. if feed.middleName != nil {
  324. return feed.firstName + " " + feed.middleName! + " " + feed.lastName
  325. } else {
  326. return feed.firstName + " " + feed.lastName
  327. }
  328. }
  329. /**
  330. To load more the social feed list
  331. - returns: Bool
  332. */
  333. func loadMore() -> Bool {
  334. if remainingFeeds == nil || remainingFeeds == 0 {
  335. return false
  336. }
  337. return true
  338. }
  339. /// Reset feed count
  340. func resetFeedCount() {
  341. remainingFeeds = 0
  342. }
  343. /**
  344. To check comment status(remaining)
  345. - returns: Bool
  346. */
  347. func commentsRemaining() -> Bool {
  348. if remainingComments == nil || remainingComments == 0 {
  349. return false
  350. }
  351. return true
  352. }
  353. /**
  354. To get feed count
  355. - returns: count
  356. */
  357. func getCurrentlyFetchedFeedCount() -> Int {
  358. if personal {
  359. return currentlyFetchedPrivateFeedCount
  360. }
  361. return currentlyFetchedPublicFeedCount
  362. }
  363. /**
  364. To get comment count
  365. - returns count
  366. */
  367. func getCurrentlyFetchedCommentCount() -> Int {
  368. return currentlyFetchedCommentCount
  369. }
  370. }
  371. extension SocialFeedViewModel {
  372. //Upload User Image, successful upload gives image id
  373. func uploadImage(image: Any, isGif: Bool) {
  374. if !Reachability.isConnectedToNetwork() {
  375. self.internetConnection.value = false
  376. } else {
  377. self.imageUploaded.value = nil
  378. param = ["userId": user_id]
  379. feedImageId = nil
  380. RestApiMananger.sharedInstance.uploadImage(imageData: image, isGif: isGif, param: param, completion: { (result) in
  381. switch result {
  382. case let .success(imageUploadJson):
  383. self.feedImageId = imageUploadJson["id"].stringValue
  384. self.imageUploaded.value = true
  385. case let .failure(errorJson):
  386. self.setErrorMessage(message: errorJson["message"].stringValue)
  387. self.imageUploaded.value = false
  388. case .updateAccessCode():
  389. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  390. result in
  391. if result != "Error"{
  392. let uuid = RestApiMananger.sharedInstance.getUUID()
  393. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  394. self.uploadImage(image: image, isGif: isGif)
  395. }
  396. }
  397. case .logOutUser():
  398. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  399. self.anotherLogin.value = true
  400. case .timeOut:
  401. self.socialFeedConnectionTimeOut.value = false
  402. }
  403. })
  404. }
  405. }
  406. //CREATE Social Feeds
  407. func createSocialFeed() {
  408. if !Reachability.isConnectedToNetwork() {
  409. self.internetConnection.value = false
  410. } else {
  411. let areParamsAvailable = feedText != nil || feedImageId != nil
  412. guard areParamsAvailable else {
  413. self.setErrorMessage(message: "No content available")
  414. self.socialFeedsRxValue.value = 0
  415. return
  416. }
  417. param.removeAll()
  418. param = ["userId": user_id, "accessType": accessType]
  419. if feedText != nil {
  420. if !feedText.isBlank {
  421. param["feedText"] = feedText
  422. }
  423. }
  424. if feedImageId != nil {
  425. param["feedImageId"] = feedImageId
  426. }
  427. RestApiMananger.sharedInstance.createSocialFeed(param: param, completion: { (result) in
  428. switch result {
  429. case let .success(createdFeedJSON):
  430. do {
  431. let createdFeed = try JSONDecoder().decode(SocialFeed.self, from: createdFeedJSON.rawData())
  432. if self.personal {
  433. self.privateSocialFeedsArray.insert(createdFeed, at: 0)
  434. } else {
  435. self.publicSocialFeedsArray.insert(createdFeed, at: 0)
  436. self.privateSocialFeedsArray.insert(createdFeed, at: 0)
  437. }
  438. self.feedText = nil
  439. self.feedImageId = nil
  440. self.socialFeedsRxValue.value = 3
  441. } catch {
  442. self.socialFeedsRxValue.value = 0
  443. }
  444. case let .failure(errorJson):
  445. self.setErrorMessage(message: errorJson["message"].stringValue)
  446. self.socialFeedsRxValue.value = 0
  447. case .updateAccessCode():
  448. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  449. result in
  450. if result != "Error"{
  451. let uuid = RestApiMananger.sharedInstance.getUUID()
  452. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  453. self.createSocialFeed()
  454. }
  455. }
  456. case .logOutUser():
  457. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  458. self.anotherLogin.value = true
  459. case .timeOut:
  460. self.socialFeedConnectionTimeOut.value = false
  461. }
  462. })
  463. }
  464. }
  465. //READ social feeds from server
  466. func fetchSocialFeeds(isPublic: Bool, loadMore: Bool) {
  467. if !Reachability.isConnectedToNetwork() {
  468. self.internetConnection.value = false
  469. } else {
  470. param.removeAll()
  471. if loadMore {
  472. if feedAfterId != nil {
  473. param["after"] = feedAfterId
  474. }
  475. } else {
  476. if feedBeforeId != nil {
  477. param["before"] = feedBeforeId
  478. }
  479. }
  480. param["userId"] = user_id
  481. param["personal"] = String(personal)
  482. param["limit"] = String(num_feeds)
  483. RestApiMananger.sharedInstance.getSocialFeeds(param: param, completion: { (result) in
  484. print("Param = ", self.param)
  485. switch result {
  486. case let .success(feedsResponseJson):
  487. if self.feedBeforeId == nil && self.feedAfterId == nil {
  488. self.clearFeedsArray()
  489. }
  490. if feedsResponseJson.count == 2 {
  491. let feedsJson = feedsResponseJson["objects"]
  492. for feed in feedsJson {
  493. do {
  494. let socialFeed = try JSONDecoder().decode(SocialFeed.self, from: feed.1.rawData())
  495. if isPublic {
  496. self.publicSocialFeedsArray.append(socialFeed)
  497. } else {
  498. self.privateSocialFeedsArray.append(socialFeed)
  499. }
  500. } catch let err {
  501. self.setErrorMessage(message: "Error Decoding" + err.localizedDescription)
  502. self.socialFeedsRxValue.value = 0
  503. return
  504. }
  505. }
  506. let paginationJson = feedsResponseJson["pageInformation"]
  507. if let before = paginationJson["before"].rawString() {
  508. //Since backend returns string 'null', so it interferes with future call with beforeId being set as 'null' so added if clause to prevent this case
  509. if before != "null" {
  510. self.feedBeforeId = before
  511. }
  512. }
  513. if let after = paginationJson["after"].rawString() {
  514. self.feedAfterId = after
  515. }
  516. self.remainingFeeds = paginationJson["remaining"].intValue
  517. if isPublic {
  518. self.currentlyFetchedPublicFeedCount = feedsJson.count
  519. self.socialFeedsRxValue.value = 1
  520. } else {
  521. self.currentlyFetchedPrivateFeedCount = feedsJson.count
  522. self.socialFeedsRxValue.value = 11
  523. }
  524. } else {
  525. self.setErrorMessage(message: "Data format not matched!")
  526. self.socialFeedsRxValue.value = 0
  527. }
  528. case let .failure(errorJson):
  529. self.setErrorMessage(message: "Social" + errorJson["message"].stringValue)
  530. self.socialFeedsRxValue.value = 0
  531. case .updateAccessCode():
  532. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  533. result in
  534. if result != "Error"{
  535. let uuid = RestApiMananger.sharedInstance.getUUID()
  536. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  537. self.fetchSocialFeeds(isPublic: isPublic, loadMore: loadMore)
  538. }
  539. }
  540. case .logOutUser():
  541. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  542. self.anotherLogin.value = true
  543. case .timeOut:
  544. self.socialFeedConnectionTimeOut.value = false
  545. }
  546. })
  547. }
  548. }
  549. //UPDATE Social Feeds
  550. func updateSocialFeed(feed: SocialFeed, index: Int, toggle: Bool = false) {
  551. if !Reachability.isConnectedToNetwork() {
  552. self.internetConnection.value = false
  553. } else {
  554. param.removeAll()
  555. if toggle {
  556. param = ["userId": user_id, "accessType": getToggledAccessType(accessType: feed.accessType)]
  557. if feed.feedText != nil {
  558. param["feedText"] = feedText //feed.feedText
  559. }
  560. if feed.feedImageId != nil {
  561. param["feedImageId"] = feedImageId //feed.feedImageId
  562. }
  563. } else {
  564. param = ["userId": user_id, "accessType": feed.accessType]
  565. let areParamsAvailable = (feedText != nil && feedText != "") || feedImageId != nil
  566. guard areParamsAvailable else {
  567. self.setErrorMessage(message: "No update parameters found")
  568. self.socialFeedsRxValue.value = 0
  569. return
  570. }
  571. if feedText != nil {
  572. if !feedText.isBlank {
  573. param["feedText"] = feedText
  574. }
  575. }
  576. if feedImageId != nil {
  577. param["feedImageId"] = feedImageId
  578. }
  579. }
  580. RestApiMananger.sharedInstance.updateSocialFeed(feedId: feed.id, param: param, completion: { (result) in
  581. switch result {
  582. case let .success(updatedFeedJson):
  583. DispatchQueue.main.asyncAfter(deadline: .now() + 7) { // change 2 to desired number of seconds
  584. // Your code with delay
  585. do {
  586. let updatedFeed = try JSONDecoder().decode(SocialFeed.self, from: updatedFeedJson.rawData())
  587. if !toggle {
  588. self.updateFeedArray(atIndex: index, withFeed: updatedFeed)
  589. } else {
  590. self.toggleArrays(withFeed: updatedFeed)
  591. }
  592. self.feedText = nil
  593. self.feedImageId = nil
  594. self.socialFeedsRxValue.value = 3
  595. } catch {
  596. self.setErrorMessage(message: "Unable to parse feed")
  597. self.socialFeedsRxValue.value = 0
  598. }}
  599. case let .failure(errorJson):
  600. self.setErrorMessage(message: errorJson["message"].stringValue)
  601. self.socialFeedsRxValue.value = 0
  602. case .updateAccessCode():
  603. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  604. result in
  605. if result != "Error"{
  606. let uuid = RestApiMananger.sharedInstance.getUUID()
  607. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  608. self.updateSocialFeed(feed: feed, index: index)
  609. }
  610. }
  611. case .logOutUser():
  612. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  613. self.anotherLogin.value = true
  614. case .timeOut:
  615. self.socialFeedConnectionTimeOut.value = false
  616. }
  617. })
  618. }
  619. }
  620. //DELETE Social Feeds
  621. func deleteSocialFeed(feedId: String) {
  622. if !Reachability.isConnectedToNetwork() {
  623. self.internetConnection.value = false
  624. } else {
  625. param = ["userId": user_id]
  626. RestApiMananger.sharedInstance.deleteSocialFeed(feedId: feedId, param: param, completion: { (result) in
  627. switch result {
  628. case .success(_):
  629. self.socialFeedsRxValue.value = 2
  630. case let .failure(errorJson):
  631. self.setErrorMessage(message: errorJson["message"].stringValue)
  632. self.socialFeedsRxValue.value = 0
  633. case .updateAccessCode():
  634. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  635. result in
  636. if result != "Error"{
  637. let uuid = RestApiMananger.sharedInstance.getUUID()
  638. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  639. self.deleteSocialFeed(feedId: feedId)
  640. }
  641. }
  642. case .logOutUser():
  643. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  644. self.anotherLogin.value = true
  645. case .timeOut:
  646. self.socialFeedConnectionTimeOut.value = false
  647. }
  648. })
  649. }
  650. }
  651. //DELETE Social Feeds
  652. func reportSocialFeed(feedId: String, reportMessage: String) {
  653. if !Reachability.isConnectedToNetwork() {
  654. self.internetConnection.value = false
  655. } else {
  656. param = ["userId": user_id, "reportMessage": reportMessage]
  657. RestApiMananger.sharedInstance.reportSocialFeed(feedId: feedId, param: param, completion: { (result) in
  658. switch result {
  659. case .success(_):
  660. self.socialFeedsRxValue.value = socialWallCode.reportPost.rawValue
  661. case let .failure(errorJson):
  662. self.setErrorMessage(message: errorJson["message"].stringValue)
  663. self.socialFeedsRxValue.value = socialWallCode.error.rawValue
  664. case .updateAccessCode():
  665. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  666. result in
  667. if result != "Error"{
  668. let uuid = RestApiMananger.sharedInstance.getUUID()
  669. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  670. self.deleteSocialFeed(feedId: feedId)
  671. }
  672. }
  673. case .logOutUser():
  674. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  675. self.anotherLogin.value = true
  676. case .timeOut:
  677. self.socialFeedConnectionTimeOut.value = false
  678. }
  679. })
  680. }
  681. }
  682. //LIKE UNLIKE Feed
  683. func likeDislikePost(feedId: String, liked: Bool) {
  684. if !Reachability.isConnectedToNetwork() {
  685. self.internetConnection.value = false
  686. } else {
  687. param = ["userId": user_id]
  688. RestApiMananger.sharedInstance.likeDislikeSocialFeed(feedId: feedId, isLiked: liked, param: param, completion: { (result) in
  689. switch result {
  690. case .success(_):
  691. self.socialFeedsRxValue.value = 4
  692. case let .failure(errorJson):
  693. self.setErrorMessage(message: errorJson["message"].stringValue)
  694. self.socialFeedsRxValue.value = 0
  695. case .updateAccessCode():
  696. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  697. result in
  698. if result != "Error"{
  699. let uuid = RestApiMananger.sharedInstance.getUUID()
  700. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  701. self.deleteSocialFeed(feedId: feedId)
  702. }
  703. }
  704. case .logOutUser():
  705. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  706. self.anotherLogin.value = true
  707. case .timeOut:
  708. self.socialFeedConnectionTimeOut.value = false
  709. }
  710. })
  711. }
  712. }
  713. // LIKES for a feed
  714. func fetchAllLikesFor(feedId: String) {
  715. if !Reachability.isConnectedToNetwork() {
  716. self.internetConnection.value = false
  717. } else {
  718. RestApiMananger.sharedInstance.getAllLikesFor(feedId: feedId, completion: { (result) in
  719. switch result {
  720. case let .success(likedJSON):
  721. self.likedBy.removeAll()
  722. guard likedJSON.count > 0 else {
  723. self.setErrorMessage(message: "No likes fetched")
  724. self.socialFeedsRxValue.value = 0
  725. return
  726. }
  727. for i in 0 ... (likedJSON.count-1) {
  728. do {
  729. let like = try JSONDecoder().decode(Like.self, from: likedJSON[i].rawData())
  730. self.likedBy.append(like)
  731. } catch {
  732. }
  733. }
  734. self.socialFeedsRxValue.value = 5
  735. case let .failure(errorJson):
  736. self.setErrorMessage(message: errorJson["message"].stringValue)
  737. self.socialFeedsRxValue.value = 0
  738. case .updateAccessCode():
  739. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  740. result in
  741. if result != "Error"{
  742. let uuid = RestApiMananger.sharedInstance.getUUID()
  743. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  744. self.fetchAllLikesFor(feedId: feedId)
  745. }
  746. }
  747. case .logOutUser():
  748. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  749. self.anotherLogin.value = true
  750. case .timeOut:
  751. self.socialFeedConnectionTimeOut.value = false
  752. }
  753. })
  754. }
  755. }
  756. //GET COMMMENTS FOR A FEED
  757. func fetchAllCommentsFor(feedId: String, loadMore: Bool) {
  758. if !Reachability.isConnectedToNetwork() {
  759. self.internetConnection.value = false
  760. } else {
  761. param.removeAll()
  762. if loadMore {
  763. if commentAfterId != nil {
  764. param["after"] = commentAfterId
  765. }
  766. } else {
  767. if commentBeforeId != nil {
  768. param["before"] = commentBeforeId
  769. }
  770. }
  771. param["limit"] = String(num_comments)
  772. RestApiMananger.sharedInstance.getAllCommentsFor(feedId: feedId, param: param, completion: { (result) in
  773. switch result {
  774. case let .success(commentsResponseJSON):
  775. guard commentsResponseJSON.count > 0 else {
  776. self.socialFeedsRxValue.value = nil
  777. return
  778. }
  779. if commentsResponseJSON.count == 2 {
  780. self.currentlyFetchedCommentCount = 0
  781. let commentsJSON = commentsResponseJSON["objects"]
  782. for comment in commentsJSON {
  783. do {
  784. let comment = try JSONDecoder().decode(Comment.self, from: comment.1.rawData())
  785. self.commentedBy.append(comment)
  786. } catch {
  787. self.setErrorMessage(message: "Error Decoding Comment")
  788. self.socialFeedsRxValue.value = 0
  789. }
  790. }
  791. let paginationJson = commentsResponseJSON["pageInformation"]
  792. if let before = paginationJson["before"].rawString() {
  793. self.commentBeforeId = before
  794. }
  795. if let after = paginationJson["after"].rawString() {
  796. self.commentAfterId = after
  797. }
  798. self.remainingComments = paginationJson["remaining"].intValue
  799. self.currentlyFetchedCommentCount = commentsJSON.count
  800. self.socialFeedsRxValue.value = 6
  801. } else {
  802. self.setErrorMessage(message: "Data format not matched!")
  803. self.socialFeedsRxValue.value = 0
  804. }
  805. case let .failure(errorJson):
  806. self.setErrorMessage(message: errorJson["message"].stringValue)
  807. self.socialFeedsRxValue.value = 0
  808. case .updateAccessCode():
  809. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  810. result in
  811. if result != "Error"{
  812. let uuid = RestApiMananger.sharedInstance.getUUID()
  813. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  814. self.fetchAllCommentsFor(feedId: feedId, loadMore: loadMore)
  815. }
  816. }
  817. case .logOutUser():
  818. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  819. self.anotherLogin.value = true
  820. case .timeOut:
  821. self.socialFeedConnectionTimeOut.value = false
  822. }
  823. })
  824. }
  825. }
  826. //DELETE COMMENT
  827. func removeComment(feedId: String, commentId: String) {
  828. if !Reachability.isConnectedToNetwork() {
  829. self.internetConnection.value = false
  830. } else {
  831. let param = ["userId": user_id]
  832. RestApiMananger.sharedInstance.deleteComment(feedId: feedId, commentId: commentId, param: param, completion: { (result) in
  833. switch result {
  834. case .success(_):
  835. self.socialFeedsRxValue.value = 8
  836. case let .failure(errorJson):
  837. self.setErrorMessage(message: errorJson["message"].stringValue)
  838. self.socialFeedsRxValue.value = 0
  839. case .updateAccessCode():
  840. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  841. result in
  842. if result != "Error"{
  843. let uuid = RestApiMananger.sharedInstance.getUUID()
  844. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  845. self.deleteSocialFeed(feedId: feedId)
  846. }
  847. }
  848. case .logOutUser():
  849. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  850. self.anotherLogin.value = true
  851. case .timeOut:
  852. self.socialFeedConnectionTimeOut.value = false
  853. }
  854. })
  855. }
  856. }
  857. //CREATE comment
  858. func createCommentFor(feedId: String) {
  859. if !Reachability.isConnectedToNetwork() {
  860. self.internetConnection.value = false
  861. } else {
  862. guard commentText != nil, commentText != "", !commentText.isBlank else {
  863. self.setErrorMessage(message: "Empty comment")
  864. self.socialFeedsRxValue.value = 0
  865. return
  866. }
  867. param.removeAll()
  868. param["userId"] = user_id
  869. param["comment"] = commentText
  870. RestApiMananger.sharedInstance.createComment(feedId: feedId, param: param, completion: { (result) in
  871. switch result {
  872. case let .success(createdCommentJSON):
  873. do {
  874. let createdComment = try JSONDecoder().decode(Comment.self, from: createdCommentJSON.rawData())
  875. self.commentedBy.insert(createdComment, at: 0)
  876. self.commentText = nil
  877. self.socialFeedsRxValue.value = 7
  878. } catch {
  879. self.setErrorMessage(message: "Unable to parse feed")
  880. self.socialFeedsRxValue.value = 0
  881. }
  882. case let .failure(errorJson):
  883. self.setErrorMessage(message: errorJson["message"].stringValue)
  884. self.socialFeedsRxValue.value = 0
  885. case .updateAccessCode():
  886. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  887. result in
  888. if result != "Error"{
  889. let uuid = RestApiMananger.sharedInstance.getUUID()
  890. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  891. self.createCommentFor(feedId: feedId)
  892. }
  893. }
  894. case .logOutUser():
  895. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  896. self.anotherLogin.value = true
  897. case .timeOut:
  898. self.socialFeedConnectionTimeOut.value = false
  899. }
  900. })
  901. }
  902. }
  903. //UPDATE comment
  904. func updateCommentFor(feedId: String, commentId: String, commentIndex: Int) {
  905. if !Reachability.isConnectedToNetwork() {
  906. self.internetConnection.value = false
  907. } else {
  908. guard commentText != nil, commentText != "", !commentText.isBlank else {
  909. self.setErrorMessage(message: "Empty comment")
  910. self.socialFeedsRxValue.value = 0
  911. return
  912. }
  913. param.removeAll()
  914. param["userId"] = user_id
  915. param["comment"] = commentText
  916. RestApiMananger.sharedInstance.editComment(feedId: feedId, commentId: commentId, param: param, completion: { (result) in
  917. switch result {
  918. case let .success(editedCommentJSON):
  919. do {
  920. let editedComment = try JSONDecoder().decode(Comment.self, from: editedCommentJSON.rawData())
  921. self.updateCommentArray(atIndex: commentIndex, withComment: editedComment)
  922. self.commentText = nil
  923. self.socialFeedsRxValue.value = 7
  924. } catch {
  925. self.setErrorMessage(message: "Unable to parse feed")
  926. self.socialFeedsRxValue.value = 0
  927. }
  928. case let .failure(errorJson):
  929. self.setErrorMessage(message: errorJson["message"].stringValue)
  930. self.socialFeedsRxValue.value = 0
  931. case .updateAccessCode():
  932. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  933. result in
  934. if result != "Error"{
  935. let uuid = RestApiMananger.sharedInstance.getUUID()
  936. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  937. self.updateCommentFor(feedId: feedId, commentId: commentId, commentIndex: commentIndex)
  938. }
  939. }
  940. case .logOutUser():
  941. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  942. self.anotherLogin.value = true
  943. case .timeOut:
  944. self.socialFeedConnectionTimeOut.value = false
  945. }
  946. })
  947. }
  948. }
  949. /**
  950. To get feed with id
  951. - parameter feedId: feedId
  952. */
  953. func fetchFeedWithId(feedId: String) {
  954. if !Reachability.isConnectedToNetwork() {
  955. self.internetConnection.value = false
  956. } else {
  957. param.removeAll()
  958. param = ["userId": user_id]
  959. RestApiMananger.sharedInstance.getParticularSocialFeed(feedId: feedId, param: param, completion: { (result) in
  960. switch result {
  961. case let .success(feedJSON):
  962. do {
  963. self.particularFeed = try JSONDecoder().decode(SocialFeed.self, from: feedJSON.rawData())
  964. self.socialFeedsRxValue.value = 10
  965. } catch {
  966. self.setErrorMessage(message: "Unable to parse feed")
  967. self.socialFeedsRxValue.value = 0
  968. }
  969. case let .failure(errorJson):
  970. self.setErrorMessage(message: errorJson["message"].stringValue)
  971. self.socialFeedsRxValue.value = 0
  972. case .updateAccessCode():
  973. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  974. result in
  975. if result != "Error"{
  976. let uuid = RestApiMananger.sharedInstance.getUUID()
  977. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  978. self.fetchFeedWithId(feedId: feedId)
  979. }
  980. }
  981. case .logOutUser():
  982. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  983. self.anotherLogin.value = true
  984. case .timeOut:
  985. self.socialFeedConnectionTimeOut.value = false
  986. }
  987. })
  988. }
  989. }
  990. /**
  991. - returns: social feed
  992. */
  993. func getParticularFeed() -> SocialFeed {
  994. return particularFeed
  995. }
  996. /**
  997. To update feed with like number
  998. */
  999. func updateParticularFeedWithUpdatedLikeNumber() {
  1000. if particularFeed.liked {
  1001. particularFeed.totalLike = particularFeed.totalLike - 1
  1002. } else {
  1003. particularFeed.totalLike = particularFeed.totalLike + 1
  1004. }
  1005. particularFeed.liked = !particularFeed.liked
  1006. }
  1007. /**
  1008. To update feed with increase comment number
  1009. */
  1010. func updateParticularFeedWithIncreasedCommentNumber() {
  1011. particularFeed.totalComment = particularFeed.totalComment + 1
  1012. }
  1013. /**
  1014. To update feed with decrease comment number
  1015. */
  1016. func updateParticularFeedWithDecreasedCommentNumber() {
  1017. particularFeed.totalComment = particularFeed.totalComment - 1
  1018. }
  1019. /**
  1020. To get feed belongs to user
  1021. */
  1022. func particularPostBelongsToMe() -> Bool {
  1023. if particularFeed.userId == user_id {
  1024. return true
  1025. }
  1026. return false
  1027. }
  1028. }