From 96f45aef6a47e766f3db43ffe9afa8a444a7139d Mon Sep 17 00:00:00 2001 From: Codex Date: Thu, 14 May 2026 18:21:03 +0300 Subject: [PATCH] refactor: extract pinned message handling --- .../messageshistory/MessagesHistoryLoaders.kt | 1 - .../MessagesHistoryPinnedMessageHandler.kt | 51 +++++++++++++++++++ .../MessagesHistoryViewModelImpl.kt | 50 +++--------------- 3 files changed, 58 insertions(+), 44 deletions(-) create mode 100644 feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryPinnedMessageHandler.kt diff --git a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryLoaders.kt b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryLoaders.kt index caba7999..7f2da1c7 100644 --- a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryLoaders.kt +++ b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryLoaders.kt @@ -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 diff --git a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryPinnedMessageHandler.kt b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryPinnedMessageHandler.kt new file mode 100644 index 00000000..b5a2254c --- /dev/null +++ b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryPinnedMessageHandler.kt @@ -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 +) { + 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() + ) + } + } +} diff --git a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModelImpl.kt b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModelImpl.kt index 3ff39b8b..561ed12d 100644 --- a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModelImpl.kt +++ b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModelImpl.kt @@ -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>(emptyList()) override val uiMessages = MutableStateFlow>(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 { val newUiMessages = buildMessagesHistoryUiMessages( messages = messages.value,