1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- //
- // GiphyViewModel.swift
- // LiveLikeGiphyChallenge
- //
- // Created by Arbnor Tefiki on 6.2.22.
- //
- import Foundation
- class GiphyViewModel {
- typealias FetchCompleted = (_ finish: Bool) -> Void
- var searchTerm: String = "" {
- didSet {
- fetchGiphyImages(resetSearch: true)
- }
- }
- var trendingImages: [String] = []
- var searchedImages: [String] = []
- var items: [String] { return isSearchActive ? searchedImages : trendingImages }
- var canLoadList: Bool = true
- var isLoadingList: Bool = false
- var page = 0
- var didFinishLoadingData: FetchCompleted?
- var isSearchActive: Bool {
- return !searchTerm.isEmpty
- }
- func fetchGiphyImages(resetSearch: Bool = false) {
- isLoadingList = true
- let request = GiphyRequest(searchTerm: searchTerm, fetchType: fetchType, page: page)
- APIManager.fetchGifs(request: request) { response in
- self.isLoadingList = false
- guard let response = response, response.meta?.msg == "OK" else {
- return
- }
- if resetSearch {
- self.resetSearch()
- }
- self.loadData(response: response)
- }
- }
- func loadData(response: GiphyModel) {
- let allGifUrls = response.gifs.map({ $0.getGifURL() })
- if fetchType == .trending {
- trendingImages.append(contentsOf: allGifUrls)
- } else {
- searchedImages.append(contentsOf: allGifUrls)
- }
- canLoadList = response.pagination?.totalCount ?? 0 > items.count
- if canLoadList {
- page += 1
- }
- didFinishLoadingData?(true)
- }
- func tryToLoadMore(row: Int) {
- if items.count - 1 == row && canLoadList && !isLoadingList {
- fetchGiphyImages()
- }
- }
- private var fetchType: GiphyRequest.FetchType {
- return isSearchActive ? .search : .trending
- }
- func resetSearch() {
- page = 0
- canLoadList = false
- trendingImages.removeAll()
- searchedImages.removeAll()
- }
- }
|