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 { var list: MutableList = mutableListOf() var page by mutableStateOf(1) var total by mutableStateOf(0) var pageSize by mutableStateOf(10) var hasNext by mutableStateOf(true) var onListChanged: ((List) -> Unit)? = null private var firstLoad = true abstract suspend fun fetchData( page: Int, pageSize: Int, extra: ET ): ListContainer 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 } }