refactor: extract pinned message handling

This commit is contained in:
Codex
2026-05-14 18:21:03 +03:00
parent 5dc000341b
commit 96f45aef6a
3 changed files with 58 additions and 44 deletions
@@ -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
@@ -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()
)
}
}
}
@@ -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,