package com.aiosman.riderpro.data import androidx.paging.PagingSource import androidx.paging.PagingState import com.aiosman.riderpro.R import com.aiosman.riderpro.model.MomentItem import com.aiosman.riderpro.test.TestDatabase import java.io.IOException class MomentPagingSource( private val remoteDataSource: MomentRemoteDataSource, ) : PagingSource() { override suspend fun load(params: LoadParams): LoadResult { return try { val currentPage = params.key ?: 1 val moments = remoteDataSource.getMoments( pageNumber = currentPage ) LoadResult.Page( data = moments.list, prevKey = if (currentPage == 1) null else currentPage - 1, nextKey = if (moments.list.isEmpty()) null else moments.page + 1 ) } catch (exception: IOException) { return LoadResult.Error(exception) } } override fun getRefreshKey(state: PagingState): Int? { return state.anchorPosition } } class MomentRemoteDataSource( private val momentService: MomentService, ) { suspend fun getMoments(pageNumber: Int): ListContainer { return momentService.getMoments(pageNumber) } } interface MomentService { suspend fun getMoments(pageNumber: Int): ListContainer suspend fun getMomentById(id: Int): MomentItem suspend fun likeMoment(id: Int) } class TestMomentServiceImpl() : MomentService { var imageList = listOf( "https://img.freepik.com/free-photo/white-billboard-template_23-2147726635.jpg?t=st=1722150015~exp=1722153615~hmac=5540620196d7898215d822be26353c87a63d51bbfb2b814e032626e1948a1583&w=740", "https://img.freepik.com/free-photo/minimal-clothing-label-fashion-brands_53876-111053.jpg?w=1060&t=st=1722150122~exp=1722150722~hmac=67f8a2b6abfe3d08714cf0cc0085485c3221e1ba00dda14378b03753dce39153", "https://img.freepik.com/free-photo/marketing-strategy-planning-strategy-concept_53876-42950.jpg" ) var mockData = TestDatabase.momentData val testMomentBackend = TestMomentBackend(mockData) override suspend fun getMoments(pageNumber: Int): ListContainer { return testMomentBackend.fetchMomentItems(pageNumber) } override suspend fun getMomentById(id: Int): MomentItem { return mockData[id] } override suspend fun likeMoment(id: Int) { // mockData = mockData.map { // if (it.id == id) { // it.copy(likeCount = it.likeCount + 1) // } else { // it // } // } // mockData } } class TestMomentBackend( private val mockData: List, private val loadDelay: Long = 500, ) { val DataBatchSize = 5 suspend fun fetchMomentItems(pageNumber: Int): ListContainer { val from = pageNumber * DataBatchSize val to = (pageNumber + 1) * DataBatchSize val currentSublist = mockData.subList(from, to) // delay kotlinx.coroutines.delay(loadDelay) return ListContainer( total = mockData.size, page = pageNumber, pageSize = DataBatchSize, list = currentSublist ) } }