// // 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, requestType: fetchType, page: page) APIManager.fetchTrendingGifs(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() } }