refactor: extract pinned message handling
This commit is contained in:
-1
@@ -3,7 +3,6 @@ package dev.meloda.fast.messageshistory
|
||||
import android.util.Log
|
||||
import dev.meloda.fast.common.VkConstants
|
||||
import dev.meloda.fast.common.extensions.listenValue
|
||||
import dev.meloda.fast.common.extensions.orDots
|
||||
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
|
||||
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
package dev.meloda.fast.messageshistory
|
||||
|
||||
import androidx.compose.ui.text.buildAnnotatedString
|
||||
import dev.meloda.fast.common.extensions.orDots
|
||||
import dev.meloda.fast.common.extensions.setValue
|
||||
import dev.meloda.fast.data.VkMemoryCache
|
||||
import dev.meloda.fast.messageshistory.model.MessagesHistoryScreenState
|
||||
import dev.meloda.fast.model.api.domain.VkMessage
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlin.math.abs
|
||||
|
||||
internal class MessagesHistoryPinnedMessageHandler(
|
||||
private val screenState: MutableStateFlow<MessagesHistoryScreenState>
|
||||
) {
|
||||
fun update(pinnedMessage: VkMessage?) {
|
||||
if (pinnedMessage == null) {
|
||||
screenState.setValue { old ->
|
||||
old.copy(
|
||||
pinnedMessage = null,
|
||||
convo = old.convo.copy(
|
||||
pinnedMessage = null,
|
||||
pinnedMessageId = null
|
||||
),
|
||||
pinnedSummary = null,
|
||||
pinnedTitle = null
|
||||
)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
val pinnedUser = VkMemoryCache.getUser(pinnedMessage.fromId)
|
||||
val pinnedGroup = VkMemoryCache.getGroup(abs(pinnedMessage.fromId))
|
||||
val pinnedTitle = pinnedUser?.fullName ?: pinnedGroup?.name
|
||||
|
||||
val pinnedSummary = buildAnnotatedString {
|
||||
pinnedMessage.text?.let(::append) ?: append("...")
|
||||
}
|
||||
|
||||
screenState.setValue { old ->
|
||||
old.copy(
|
||||
pinnedMessage = pinnedMessage,
|
||||
convo = old.convo.copy(
|
||||
pinnedMessage = pinnedMessage,
|
||||
pinnedMessageId = pinnedMessage.id
|
||||
),
|
||||
pinnedSummary = pinnedSummary,
|
||||
pinnedTitle = pinnedTitle.orDots()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
+7
-43
@@ -2,7 +2,6 @@ package dev.meloda.fast.messageshistory
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import androidx.compose.ui.text.buildAnnotatedString
|
||||
import androidx.compose.ui.text.TextRange
|
||||
import androidx.compose.ui.text.input.TextFieldValue
|
||||
import androidx.lifecycle.SavedStateHandle
|
||||
@@ -11,10 +10,9 @@ import androidx.lifecycle.viewModelScope
|
||||
import com.conena.nanokt.collections.indexOfFirstOrNull
|
||||
import dev.meloda.fast.common.extensions.getParcelableCompat
|
||||
import dev.meloda.fast.common.extensions.listenValue
|
||||
import dev.meloda.fast.common.extensions.orDots
|
||||
import dev.meloda.fast.common.extensions.setValue
|
||||
import dev.meloda.fast.common.provider.ResourceProvider
|
||||
import dev.meloda.fast.data.VkMemoryCache
|
||||
import dev.meloda.fast.datastore.AppSettings
|
||||
import dev.meloda.fast.domain.ConvoUseCase
|
||||
import dev.meloda.fast.domain.GetMessageReadPeersUseCase
|
||||
import dev.meloda.fast.domain.LongPollUpdatesParser
|
||||
@@ -33,7 +31,6 @@ import kotlinx.coroutines.flow.update
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||
import kotlin.coroutines.resume
|
||||
import kotlin.math.abs
|
||||
|
||||
class MessagesHistoryViewModelImpl(
|
||||
private val applicationContext: Context,
|
||||
@@ -64,6 +61,10 @@ class MessagesHistoryViewModelImpl(
|
||||
override val messages = MutableStateFlow<List<VkMessage>>(emptyList())
|
||||
override val uiMessages = MutableStateFlow<List<MessageUiItem>>(emptyList())
|
||||
|
||||
private val pinnedMessageHandler = MessagesHistoryPinnedMessageHandler(
|
||||
screenState = screenState
|
||||
)
|
||||
|
||||
private val messageActions = MessagesHistoryMessageActions(
|
||||
applicationContext = applicationContext,
|
||||
viewModelScope = viewModelScope,
|
||||
@@ -75,7 +76,7 @@ class MessagesHistoryViewModelImpl(
|
||||
showKeyboard = showKeyboard,
|
||||
dialog = dialog,
|
||||
syncUiMessages = ::syncUiMessages,
|
||||
onPinnedMessageChanged = ::handlePinnedMessage
|
||||
onPinnedMessageChanged = pinnedMessageHandler::update
|
||||
)
|
||||
|
||||
private val loaders = MessagesHistoryLoaders(
|
||||
@@ -89,7 +90,7 @@ class MessagesHistoryViewModelImpl(
|
||||
baseError = baseError,
|
||||
scope = viewModelScope,
|
||||
syncUiMessages = ::syncUiMessages,
|
||||
onPinnedMessage = ::handlePinnedMessage
|
||||
onPinnedMessage = pinnedMessageHandler::update
|
||||
)
|
||||
|
||||
private val longPollEventHandler = MessagesHistoryLongPollEventHandler(
|
||||
@@ -497,43 +498,6 @@ class MessagesHistoryViewModelImpl(
|
||||
}
|
||||
}
|
||||
|
||||
private fun handlePinnedMessage(pinnedMessage: VkMessage?) {
|
||||
if (pinnedMessage == null) {
|
||||
screenState.setValue { old ->
|
||||
old.copy(
|
||||
pinnedMessage = null,
|
||||
convo = old.convo.copy(
|
||||
pinnedMessage = null,
|
||||
pinnedMessageId = null
|
||||
),
|
||||
pinnedSummary = null,
|
||||
pinnedTitle = null
|
||||
)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
val pinnedUser = VkMemoryCache.getUser(pinnedMessage.fromId)
|
||||
val pinnedGroup = VkMemoryCache.getGroup(abs(pinnedMessage.fromId))
|
||||
val pinnedTitle = pinnedUser?.fullName ?: pinnedGroup?.name
|
||||
|
||||
val pinnedSummary = buildAnnotatedString {
|
||||
pinnedMessage.text?.let(::append) ?: append("...")
|
||||
}
|
||||
|
||||
screenState.setValue { old ->
|
||||
old.copy(
|
||||
pinnedMessage = pinnedMessage,
|
||||
convo = old.convo.copy(
|
||||
pinnedMessage = pinnedMessage,
|
||||
pinnedMessageId = pinnedMessage.id
|
||||
),
|
||||
pinnedSummary = pinnedSummary,
|
||||
pinnedTitle = pinnedTitle.orDots()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun syncUiMessages(): List<MessageUiItem> {
|
||||
val newUiMessages = buildMessagesHistoryUiMessages(
|
||||
messages = messages.value,
|
||||
|
||||
Reference in New Issue
Block a user