/PageLoader

Primary LanguageSwift

PageLoader

struct OrderPageDataProvider: PageDataProvider {
    typealias Item = Order
    
    let status: OrderStatus
    let pageSize: Int
    
    func fetchPage(_ page: Int, completionHandler: @escaping (Result<PageInfo<Order>, Error>) -> Void) -> PageFetchTaskCancellation? {
        let disposable = OrderAPI.orders(status: status, page: page, pageSize: pageSize)
            .subscribe(onSuccess: { order in
                let checker = PageChecker(pageSize: pageSize, numberOfTotalItems: order.numberOfTotalItems)
                let isLastPage = checker.isLastPage(page)
                let result = PageInfo(items: order.items, isLastPage: isLastPage)
                
                completionHandler(.success(result))
            }, onFailure: { error in
                completionHandler(.failure(error))
            })
        
        return .init(handler: disposable.dispose)
    }
}

let dataProvider = OrderPageDataProvider(status: .shipped, pageSize: 20)
let pageLoader = PageLoader(dataProvider: dataProvider)

pageLoader.pageLoaded = { page, result in
    do {
        let pageInfo = try result.get()
        
        // pageInfo.isLastPage
        // pageInfo.items
    } catch {
        // ...
    }
}

pageLoader.loadNextPage()
pageLoader.cancel()
pageLoader.reset()