RxPager icon indicating copy to clipboard operation
RxPager copied to clipboard

Refresh And Paginated Search Examples

Open kemalturk opened this issue 4 years ago • 0 comments

We need refresh and paginated search examples. I made a solution like this. But if there is more compact and convenient solution please share with us.

` typealias Page = PaginatedResponseData<UpSocialExplorePeopleSearchItem>

let steps = PublishRelay<Step>()

private let disposeBag = DisposeBag()
private var disposable: Disposable?

private let service = UpSocialExplorePeopleSearchService()

let data = BehaviorRelay<[UpSocialExplorePeopleSearchItem]>(value: [])
var items: [UpSocialExplorePeopleSearchItem] {
    data.value
}

private(set) var pager: Pager<Page>?

private func createPager(_ searchText: String) -> Pager<Page> {
    let pager = Pager<Page>(make: {[weak self] previousPage in
        guard let self = self else {
            return Observable.just(Page(currentPage: 0, lastPage: 1, nextPageUrl: nil, data: []))
        }

        return self.service.browse(searchText: searchText, page: (previousPage?.currentPage ?? 0) + 1).asObservable()
        .catch { error in
            print(error)
            return Observable.just(Page(currentPage: 0, lastPage: 1, nextPageUrl: nil, data: []))
        }
    }, while: { page in
        page.currentPage < page.lastPage
    })
    return pager
}

func browse(searchText: String) {

    data.accept([])

    disposable?.dispose()

    pager = createPager(searchText)

    disposable = pager?.page
    .withUnretained(self)
    .debug("Page")
    .bind { vm, page in
        vm.data.accept(vm.data.value + page.data)
    }

    disposable?.disposed(by: disposeBag)

}

`

kemalturk avatar Feb 13 '21 18:02 kemalturk