refactor default alerts
This commit is contained in:
+58
-53
@@ -47,8 +47,7 @@ interface ConversationsViewModel {
|
||||
fun onPaginationConditionsMet()
|
||||
|
||||
fun onDeleteDialogDismissed()
|
||||
|
||||
fun onDeleteDialogPositiveClick(conversationId: Int)
|
||||
fun onDeleteDialogPositiveClick()
|
||||
|
||||
fun onRefresh()
|
||||
|
||||
@@ -56,7 +55,8 @@ interface ConversationsViewModel {
|
||||
fun onConversationItemLongClick(conversation: UiConversation)
|
||||
|
||||
fun onPinDialogDismissed()
|
||||
fun onPinDialogPositiveClick(conversation: UiConversation)
|
||||
fun onPinDialogPositiveClick()
|
||||
|
||||
fun onOptionClicked(conversation: UiConversation, option: ConversationOption)
|
||||
|
||||
fun onErrorConsumed()
|
||||
@@ -104,9 +104,11 @@ class ConversationsViewModelImpl(
|
||||
emitShowOptions { old -> old.copy(showDeleteDialog = null) }
|
||||
}
|
||||
|
||||
override fun onDeleteDialogPositiveClick(conversationId: Int) {
|
||||
override fun onDeleteDialogPositiveClick() {
|
||||
val conversationId = screenState.value.showOptions.showDeleteDialog ?: return
|
||||
deleteConversation(conversationId)
|
||||
hideOptions(conversationId)
|
||||
onDeleteDialogDismissed()
|
||||
}
|
||||
|
||||
override fun onRefresh() {
|
||||
@@ -168,9 +170,11 @@ class ConversationsViewModelImpl(
|
||||
emitShowOptions { old -> old.copy(showPinDialog = null) }
|
||||
}
|
||||
|
||||
override fun onPinDialogPositiveClick(conversation: UiConversation) {
|
||||
override fun onPinDialogPositiveClick() {
|
||||
val conversation = screenState.value.showOptions.showPinDialog ?: return
|
||||
pinConversation(conversation.id, !conversation.isPinned)
|
||||
hideOptions(conversation.id)
|
||||
onPinDialogDismissed()
|
||||
}
|
||||
|
||||
override fun onOptionClicked(conversation: UiConversation, option: ConversationOption) {
|
||||
@@ -222,64 +226,65 @@ class ConversationsViewModelImpl(
|
||||
private fun loadConversations(
|
||||
offset: Int = currentOffset.value
|
||||
) {
|
||||
conversationsUseCase.getConversations(count = LOAD_COUNT, offset = offset).listenValue { state ->
|
||||
state.processState(
|
||||
error = { error ->
|
||||
if (error is State.Error.ApiError) {
|
||||
when (error.errorCode) {
|
||||
VkErrorCodes.UserAuthorizationFailed -> {
|
||||
baseError.setValue { BaseError.SessionExpired }
|
||||
conversationsUseCase.getConversations(count = LOAD_COUNT, offset = offset)
|
||||
.listenValue { state ->
|
||||
state.processState(
|
||||
error = { error ->
|
||||
if (error is State.Error.ApiError) {
|
||||
when (error.errorCode) {
|
||||
VkErrorCodes.UserAuthorizationFailed -> {
|
||||
baseError.setValue { BaseError.SessionExpired }
|
||||
}
|
||||
|
||||
else -> Unit
|
||||
}
|
||||
|
||||
else -> Unit
|
||||
}
|
||||
}
|
||||
},
|
||||
success = { response ->
|
||||
val itemsCountSufficient = response.size == LOAD_COUNT
|
||||
canPaginate.setValue { itemsCountSufficient }
|
||||
},
|
||||
success = { response ->
|
||||
val itemsCountSufficient = response.size == LOAD_COUNT
|
||||
canPaginate.setValue { itemsCountSufficient }
|
||||
|
||||
val paginationExhausted = !itemsCountSufficient &&
|
||||
screenState.value.conversations.isNotEmpty()
|
||||
val paginationExhausted = !itemsCountSufficient &&
|
||||
screenState.value.conversations.isNotEmpty()
|
||||
|
||||
imagesToPreload.setValue {
|
||||
response.mapNotNull { it.extractAvatar().extractUrl() }
|
||||
}
|
||||
conversationsUseCase.storeConversations(response)
|
||||
|
||||
val loadedConversations = response.map {
|
||||
it.asPresentation(
|
||||
resources,
|
||||
userSettings.useContactNames.value
|
||||
)
|
||||
}
|
||||
|
||||
val newState = screenState.value.copy(
|
||||
isPaginationExhausted = paginationExhausted
|
||||
)
|
||||
if (offset == 0) {
|
||||
conversations.emit(response)
|
||||
screenState.setValue {
|
||||
newState.copy(conversations = loadedConversations)
|
||||
imagesToPreload.setValue {
|
||||
response.mapNotNull { it.extractAvatar().extractUrl() }
|
||||
}
|
||||
} else {
|
||||
conversations.emit(conversations.value.plus(response))
|
||||
screenState.setValue {
|
||||
newState.copy(
|
||||
conversations = newState.conversations.plus(loadedConversations)
|
||||
conversationsUseCase.storeConversations(response)
|
||||
|
||||
val loadedConversations = response.map {
|
||||
it.asPresentation(
|
||||
resources,
|
||||
userSettings.useContactNames.value
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
screenState.setValue { old ->
|
||||
old.copy(
|
||||
isLoading = offset == 0 && state.isLoading(),
|
||||
isPaginating = offset > 0 && state.isLoading()
|
||||
val newState = screenState.value.copy(
|
||||
isPaginationExhausted = paginationExhausted
|
||||
)
|
||||
if (offset == 0) {
|
||||
conversations.emit(response)
|
||||
screenState.setValue {
|
||||
newState.copy(conversations = loadedConversations)
|
||||
}
|
||||
} else {
|
||||
conversations.emit(conversations.value.plus(response))
|
||||
screenState.setValue {
|
||||
newState.copy(
|
||||
conversations = newState.conversations.plus(loadedConversations)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
screenState.setValue { old ->
|
||||
old.copy(
|
||||
isLoading = offset == 0 && state.isLoading(),
|
||||
isPaginating = offset > 0 && state.isLoading()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun deleteConversation(peerId: Int) {
|
||||
|
||||
+22
-65
@@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.statusBars
|
||||
import androidx.compose.foundation.lazy.LazyListState
|
||||
import androidx.compose.foundation.lazy.rememberLazyListState
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.outlined.MoreVert
|
||||
@@ -68,7 +67,6 @@ import androidx.core.view.HapticFeedbackConstantsCompat
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import coil.imageLoader
|
||||
import coil.request.ImageRequest
|
||||
import com.meloda.app.fast.common.UiText
|
||||
import com.meloda.app.fast.conversations.ConversationsViewModel
|
||||
import com.meloda.app.fast.conversations.ConversationsViewModelImpl
|
||||
import com.meloda.app.fast.conversations.model.ConversationOption
|
||||
@@ -79,6 +77,7 @@ import com.meloda.app.fast.designsystem.LocalHazeState
|
||||
import com.meloda.app.fast.designsystem.LocalTheme
|
||||
import com.meloda.app.fast.designsystem.MaterialDialog
|
||||
import com.meloda.app.fast.designsystem.components.FullScreenLoader
|
||||
import com.meloda.app.fast.designsystem.isScrollingUp
|
||||
import com.meloda.app.fast.model.BaseError
|
||||
import com.meloda.app.fast.ui.ErrorView
|
||||
import dev.chrisbanes.haze.haze
|
||||
@@ -398,72 +397,30 @@ fun HandleDialogs(
|
||||
val showOptions = screenState.showOptions
|
||||
|
||||
if (showOptions.showDeleteDialog != null) {
|
||||
val conversationId = showOptions.showDeleteDialog
|
||||
DeleteDialog(
|
||||
conversationId = conversationId,
|
||||
viewModel = viewModel
|
||||
MaterialDialog(
|
||||
onDismissRequest = viewModel::onDeleteDialogDismissed,
|
||||
title = stringResource(id = UiR.string.confirm_delete_conversation),
|
||||
confirmAction = viewModel::onDeleteDialogPositiveClick,
|
||||
confirmText = stringResource(id = UiR.string.action_delete),
|
||||
cancelText = stringResource(id = UiR.string.cancel)
|
||||
)
|
||||
}
|
||||
|
||||
showOptions.showPinDialog?.let { conversation ->
|
||||
PinDialog(
|
||||
conversation = conversation,
|
||||
viewModel = viewModel
|
||||
if (showOptions.showPinDialog != null) {
|
||||
val conversation = showOptions.showPinDialog
|
||||
|
||||
MaterialDialog(
|
||||
onDismissRequest = viewModel::onPinDialogDismissed,
|
||||
title = stringResource(
|
||||
id = if (conversation.isPinned) UiR.string.confirm_unpin_conversation
|
||||
else UiR.string.confirm_pin_conversation
|
||||
),
|
||||
confirmAction = viewModel::onPinDialogPositiveClick,
|
||||
confirmText = stringResource(
|
||||
id = if (conversation.isPinned) UiR.string.action_unpin
|
||||
else UiR.string.action_pin
|
||||
),
|
||||
cancelText = stringResource(id = UiR.string.cancel)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun DeleteDialog(
|
||||
conversationId: Int,
|
||||
viewModel: ConversationsViewModel
|
||||
) {
|
||||
MaterialDialog(
|
||||
title = UiText.Resource(UiR.string.confirm_delete_conversation),
|
||||
confirmText = UiText.Resource(UiR.string.action_delete),
|
||||
confirmAction = { viewModel.onDeleteDialogPositiveClick(conversationId) },
|
||||
cancelText = UiText.Resource(UiR.string.cancel),
|
||||
onDismissAction = viewModel::onDeleteDialogDismissed
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun PinDialog(
|
||||
conversation: UiConversation,
|
||||
viewModel: ConversationsViewModel
|
||||
) {
|
||||
MaterialDialog(
|
||||
title = UiText.Resource(
|
||||
if (conversation.isPinned) UiR.string.confirm_unpin_conversation
|
||||
else UiR.string.confirm_pin_conversation
|
||||
),
|
||||
confirmText = UiText.Resource(
|
||||
if (conversation.isPinned) UiR.string.action_unpin
|
||||
else UiR.string.action_pin
|
||||
),
|
||||
confirmAction = {
|
||||
viewModel.onPinDialogPositiveClick(conversation)
|
||||
},
|
||||
cancelText = UiText.Resource(UiR.string.cancel),
|
||||
onDismissAction = viewModel::onPinDialogDismissed
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@Composable
|
||||
private fun LazyListState.isScrollingUp(): Boolean {
|
||||
var previousIndex by remember(this) { mutableIntStateOf(firstVisibleItemIndex) }
|
||||
var previousScrollOffset by remember(this) { mutableIntStateOf(firstVisibleItemScrollOffset) }
|
||||
return remember(this) {
|
||||
derivedStateOf {
|
||||
if (previousIndex != firstVisibleItemIndex) {
|
||||
previousIndex > firstVisibleItemIndex
|
||||
} else {
|
||||
previousScrollOffset >= firstVisibleItemScrollOffset
|
||||
}.also {
|
||||
previousIndex = firstVisibleItemIndex
|
||||
previousScrollOffset = firstVisibleItemScrollOffset
|
||||
}
|
||||
}
|
||||
}.value
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user