refactor: extract paging helpers

This commit is contained in:
Codex
2026-05-14 18:01:38 +03:00
parent d91b726b9d
commit 2e472733d9
6 changed files with 114 additions and 75 deletions
@@ -4,6 +4,10 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dev.meloda.fast.common.extensions.listenValue
import dev.meloda.fast.common.extensions.setValue
import dev.meloda.fast.common.paging.canPaginate as canPaginatePage
import dev.meloda.fast.common.paging.isPaginationExhausted as isPaginationExhaustedPage
import dev.meloda.fast.common.paging.loadingFlags
import dev.meloda.fast.common.paging.mergePage
import dev.meloda.fast.data.State
import dev.meloda.fast.data.VkUtils
import dev.meloda.fast.data.processState
@@ -122,11 +126,14 @@ class FriendsViewModelImpl(
state.processState(
error = ::handleError,
success = { response ->
val itemsCountSufficient = response.size == LOAD_COUNT
val itemsCountSufficient = canPaginatePage(LOAD_COUNT, response.size)
canPaginate.setValue { itemsCountSufficient }
val paginationExhausted = !itemsCountSufficient
&& screenState.value.friends.isNotEmpty()
val paginationExhausted = isPaginationExhaustedPage(
pageSize = LOAD_COUNT,
loadedCount = response.size,
hasExistingItems = screenState.value.friends.isNotEmpty()
)
imagesToPreload.setValue {
response.mapNotNull(VkUser::photo100)
@@ -142,24 +149,20 @@ class FriendsViewModelImpl(
isPaginationExhausted = paginationExhausted
)
if (offset == 0) {
friends.emit(response)
screenState.setValue {
newState.copy(friends = loadedFriends)
}
} else {
friends.emit(friends.value.plus(response))
screenState.setValue {
newState.copy(friends = newState.friends.plus(loadedFriends))
}
friends.emit(mergePage(friends.value, response, offset))
screenState.setValue {
newState.copy(
friends = mergePage(newState.friends, loadedFriends, offset)
)
}
}
)
val flags = loadingFlags(offset, state.isLoading())
screenState.setValue { old ->
old.copy(
isLoading = offset == 0 && state.isLoading(),
isPaginating = offset > 0 && state.isLoading()
isLoading = flags.isLoading,
isPaginating = flags.isPaginating
)
}
}
@@ -197,10 +200,14 @@ class OnlineFriendsViewModelImpl(
}
)
val flags = loadingFlags(
offset = offset,
isLoading = onlineState.isLoading() || state.isLoading()
)
screenState.setValue { old ->
old.copy(
isLoading = offset == 0 && (onlineState.isLoading() || state.isLoading()),
isPaginating = offset > 0 && (onlineState.isLoading() || state.isLoading())
isLoading = flags.isLoading,
isPaginating = flags.isPaginating
)
}
}