forked from melod1n/fast-messenger
refactor: extract paging helpers
This commit is contained in:
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user