GiphyViewModel.swift 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //
  2. // GiphyViewModel.swift
  3. // LiveLikeGiphyChallenge
  4. //
  5. // Created by Arbnor Tefiki on 6.2.22.
  6. //
  7. import Foundation
  8. class GiphyViewModel {
  9. typealias FetchCompleted = (_ finish: Bool) -> Void
  10. var searchTerm: String = "" {
  11. didSet {
  12. fetchGiphyImages(resetSearch: true)
  13. }
  14. }
  15. var trendingImages: [String] = []
  16. var searchedImages: [String] = []
  17. var items: [String] { return isSearchActive ? searchedImages : trendingImages }
  18. var canLoadList: Bool = true
  19. var isLoadingList: Bool = false
  20. var page = 0
  21. var didFinishLoadingData: FetchCompleted?
  22. var isSearchActive: Bool {
  23. return !searchTerm.isEmpty
  24. }
  25. func fetchGiphyImages(resetSearch: Bool = false) {
  26. isLoadingList = true
  27. let request = GiphyRequest(searchTerm: searchTerm, fetchType: fetchType, page: page)
  28. APIManager.fetchGifs(request: request) { response in
  29. self.isLoadingList = false
  30. guard let response = response, response.meta?.msg == "OK" else {
  31. return
  32. }
  33. if resetSearch {
  34. self.resetSearch()
  35. }
  36. self.loadData(response: response)
  37. }
  38. }
  39. func loadData(response: GiphyModel) {
  40. let allGifUrls = response.gifs.map({ $0.getGifURL() })
  41. if fetchType == .trending {
  42. trendingImages.append(contentsOf: allGifUrls)
  43. } else {
  44. searchedImages.append(contentsOf: allGifUrls)
  45. }
  46. canLoadList = response.pagination?.totalCount ?? 0 > items.count
  47. if canLoadList {
  48. page += 1
  49. }
  50. didFinishLoadingData?(true)
  51. }
  52. func tryToLoadMore(row: Int) {
  53. if items.count - 1 == row && canLoadList && !isLoadingList {
  54. fetchGiphyImages()
  55. }
  56. }
  57. private var fetchType: GiphyRequest.FetchType {
  58. return isSearchActive ? .search : .trending
  59. }
  60. func resetSearch() {
  61. page = 0
  62. canLoadList = false
  63. trendingImages.removeAll()
  64. searchedImages.removeAll()
  65. }
  66. }