更新动态加载逻辑
This commit is contained in:
60
app/src/main/java/com/aiosman/ravenow/entity/Loader.kt
Normal file
60
app/src/main/java/com/aiosman/ravenow/entity/Loader.kt
Normal file
@@ -0,0 +1,60 @@
|
||||
package com.aiosman.ravenow.entity
|
||||
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import com.aiosman.ravenow.data.ListContainer
|
||||
|
||||
abstract class DataLoader<T,ET> {
|
||||
var list: MutableList<T> = mutableListOf()
|
||||
var page by mutableStateOf(1)
|
||||
var total by mutableStateOf(0)
|
||||
var pageSize by mutableStateOf(10)
|
||||
var hasNext by mutableStateOf(true)
|
||||
var onListChanged: ((List<T>) -> Unit)? = null
|
||||
private var firstLoad = true
|
||||
|
||||
|
||||
abstract suspend fun fetchData(
|
||||
page: Int, pageSize: Int, extra: ET
|
||||
): ListContainer<T>
|
||||
|
||||
suspend fun loadData(
|
||||
extra: ET
|
||||
) {
|
||||
if (!firstLoad) {
|
||||
return
|
||||
}
|
||||
firstLoad = false
|
||||
val result = fetchData(page, pageSize, extra)
|
||||
list = result.list.toMutableList()
|
||||
this.page = page
|
||||
this.total = result.total
|
||||
this.pageSize = pageSize
|
||||
this.hasNext = result.list.size == pageSize
|
||||
onListChanged?.invoke(list)
|
||||
}
|
||||
|
||||
suspend fun loadMore(extra: ET) {
|
||||
if (firstLoad) {
|
||||
return
|
||||
}
|
||||
if (!hasNext) {
|
||||
return
|
||||
}
|
||||
val result = fetchData(page + 1, pageSize, extra)
|
||||
list.addAll(result.list)
|
||||
page += 1
|
||||
hasNext = result.list.size == pageSize
|
||||
onListChanged?.invoke(list)
|
||||
}
|
||||
|
||||
fun clear() {
|
||||
list.clear()
|
||||
page = 1
|
||||
total = 0
|
||||
pageSize = 10
|
||||
hasNext = true
|
||||
firstLoad = true
|
||||
}
|
||||
}
|
||||
@@ -284,4 +284,69 @@ data class MomentEntity(
|
||||
var relMoment: MomentEntity? = null,
|
||||
// 是否收藏
|
||||
var isFavorite: Boolean = false
|
||||
)
|
||||
)
|
||||
class MomentLoaderExtraArgs(
|
||||
val explore: Boolean? = false,
|
||||
val timelineId: Int? = null,
|
||||
val authorId : Int? = null
|
||||
)
|
||||
class MomentLoader : DataLoader<MomentEntity,MomentLoaderExtraArgs>() {
|
||||
override suspend fun fetchData(
|
||||
page: Int,
|
||||
pageSize: Int,
|
||||
extra: MomentLoaderExtraArgs
|
||||
): ListContainer<MomentEntity> {
|
||||
val result = ApiClient.api.getPosts(
|
||||
page = page,
|
||||
pageSize = pageSize,
|
||||
explore = if (extra.explore == true) "true" else "",
|
||||
timelineId = extra.timelineId,
|
||||
authorId = extra.authorId
|
||||
)
|
||||
val data = result.body()?.let {
|
||||
ListContainer(
|
||||
list = it.list.map { it.toMomentItem() },
|
||||
total = it.total,
|
||||
page = page,
|
||||
pageSize = pageSize
|
||||
)
|
||||
}
|
||||
if (data == null) {
|
||||
throw ServiceException("Failed to get moments")
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
fun updateMomentLike(id: Int,isLike:Boolean) {
|
||||
this.list = this.list.map { momentItem ->
|
||||
if (momentItem.id == id) {
|
||||
momentItem.copy(likeCount = momentItem.likeCount + if (isLike) 1 else -1, liked = isLike)
|
||||
} else {
|
||||
momentItem
|
||||
}
|
||||
}.toMutableList()
|
||||
onListChanged?.invoke(this.list)
|
||||
}
|
||||
|
||||
fun updateFavoriteCount(id: Int,isFavorite:Boolean) {
|
||||
this.list = this.list.map { momentItem ->
|
||||
if (momentItem.id == id) {
|
||||
momentItem.copy(favoriteCount = momentItem.favoriteCount + if (isFavorite) 1 else -1, isFavorite = isFavorite)
|
||||
} else {
|
||||
momentItem
|
||||
}
|
||||
}.toMutableList()
|
||||
onListChanged?.invoke(this.list)
|
||||
}
|
||||
|
||||
fun removeMoment(id: Int) {
|
||||
this.list = this.list.filter { it.id != id }.toMutableList()
|
||||
onListChanged?.invoke(this.list)
|
||||
}
|
||||
|
||||
fun addMoment(moment: MomentEntity) {
|
||||
this.list.add(0, moment)
|
||||
onListChanged?.invoke(this.list)
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user