|
|
|
@ -15,13 +15,17 @@ import fr.uca.iut.clfreville2.teaiswarm.R
|
|
|
|
|
import fr.uca.iut.clfreville2.teaiswarm.TeaIsWarm
|
|
|
|
|
import fr.uca.iut.clfreville2.teaiswarm.adapter.RepositoryListAdapter
|
|
|
|
|
import fr.uca.iut.clfreville2.teaiswarm.model.Repository
|
|
|
|
|
import fr.uca.iut.clfreville2.teaiswarm.model.search.SearchSettings
|
|
|
|
|
import fr.uca.iut.clfreville2.teaiswarm.network.RepositoryService
|
|
|
|
|
import kotlinx.coroutines.flow.collectLatest
|
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
|
import retrofit2.HttpException
|
|
|
|
|
import java.io.IOException
|
|
|
|
|
|
|
|
|
|
class RepositoryListFragment(private val username: String, private val onClick: (Repository) -> Unit) : Fragment(R.layout.repository_list) {
|
|
|
|
|
class RepositoryListFragment(
|
|
|
|
|
private val search: SearchSettings,
|
|
|
|
|
private val onClick: (Repository) -> Unit
|
|
|
|
|
) : Fragment(R.layout.repository_list) {
|
|
|
|
|
|
|
|
|
|
private val service = TeaIsWarm.service
|
|
|
|
|
|
|
|
|
@ -35,7 +39,7 @@ class RepositoryListFragment(private val username: String, private val onClick:
|
|
|
|
|
factoryProducer = {
|
|
|
|
|
RepositoryViewModelFactory(
|
|
|
|
|
service,
|
|
|
|
|
username
|
|
|
|
|
search
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
@ -53,13 +57,13 @@ class RepositoryListFragment(private val username: String, private val onClick:
|
|
|
|
|
|
|
|
|
|
class RepositorySource(
|
|
|
|
|
private val service: RepositoryService,
|
|
|
|
|
private val username: String
|
|
|
|
|
private val search: SearchSettings
|
|
|
|
|
) : PagingSource<Int, Repository>() {
|
|
|
|
|
|
|
|
|
|
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Repository> =
|
|
|
|
|
try {
|
|
|
|
|
val nextPageNumber = params.key ?: 1
|
|
|
|
|
val response = service.listActiveRepositories(username, nextPageNumber)
|
|
|
|
|
val response = service.searchRepositories(search.copy(page = nextPageNumber))
|
|
|
|
|
LoadResult.Page(
|
|
|
|
|
data = response,
|
|
|
|
|
prevKey = nextPageNumber - 1,
|
|
|
|
@ -80,23 +84,23 @@ class RepositoryListFragment(private val username: String, private val onClick:
|
|
|
|
|
|
|
|
|
|
class RepositoryViewModel(
|
|
|
|
|
private val service: RepositoryService,
|
|
|
|
|
private val username: String
|
|
|
|
|
private val search: SearchSettings
|
|
|
|
|
) : ViewModel() {
|
|
|
|
|
val flow = Pager(
|
|
|
|
|
PagingConfig(pageSize = 10, enablePlaceholders = true)
|
|
|
|
|
) {
|
|
|
|
|
RepositorySource(service, username)
|
|
|
|
|
RepositorySource(service, search)
|
|
|
|
|
}.flow.cachedIn(viewModelScope)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class RepositoryViewModelFactory(
|
|
|
|
|
private val service: RepositoryService,
|
|
|
|
|
private val username: String
|
|
|
|
|
private val search: SearchSettings
|
|
|
|
|
) : ViewModelProvider.Factory {
|
|
|
|
|
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
|
|
|
|
if (modelClass.isAssignableFrom(RepositoryViewModel::class.java)) {
|
|
|
|
|
@Suppress("UNCHECKED_CAST")
|
|
|
|
|
return RepositoryViewModel(service, username) as T
|
|
|
|
|
return RepositoryViewModel(service, search) as T
|
|
|
|
|
}
|
|
|
|
|
throw IllegalArgumentException("Unknown ViewModel class")
|
|
|
|
|
}
|
|
|
|
|