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 android.util.Log
import dev.meloda.fast.common.VkConstants import dev.meloda.fast.common.VkConstants
import dev.meloda.fast.common.extensions.listenValue 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.extensions.setValue
import dev.meloda.fast.common.paging.canPaginate as canPaginatePage import dev.meloda.fast.common.paging.canPaginate as canPaginatePage
import dev.meloda.fast.common.paging.isPaginationExhausted as isPaginationExhaustedPage 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.content.Context
import android.os.Bundle import android.os.Bundle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.input.TextFieldValue
import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.SavedStateHandle
@@ -11,10 +10,9 @@ import androidx.lifecycle.viewModelScope
import com.conena.nanokt.collections.indexOfFirstOrNull import com.conena.nanokt.collections.indexOfFirstOrNull
import dev.meloda.fast.common.extensions.getParcelableCompat import dev.meloda.fast.common.extensions.getParcelableCompat
import dev.meloda.fast.common.extensions.listenValue 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.extensions.setValue
import dev.meloda.fast.common.provider.ResourceProvider 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.ConvoUseCase
import dev.meloda.fast.domain.GetMessageReadPeersUseCase import dev.meloda.fast.domain.GetMessageReadPeersUseCase
import dev.meloda.fast.domain.LongPollUpdatesParser import dev.meloda.fast.domain.LongPollUpdatesParser
@@ -33,7 +31,6 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume import kotlin.coroutines.resume
import kotlin.math.abs
class MessagesHistoryViewModelImpl( class MessagesHistoryViewModelImpl(
private val applicationContext: Context, private val applicationContext: Context,
@@ -64,6 +61,10 @@ class MessagesHistoryViewModelImpl(
override val messages = MutableStateFlow<List<VkMessage>>(emptyList()) override val messages = MutableStateFlow<List<VkMessage>>(emptyList())
override val uiMessages = MutableStateFlow<List<MessageUiItem>>(emptyList()) override val uiMessages = MutableStateFlow<List<MessageUiItem>>(emptyList())
private val pinnedMessageHandler = MessagesHistoryPinnedMessageHandler(
screenState = screenState
)
private val messageActions = MessagesHistoryMessageActions( private val messageActions = MessagesHistoryMessageActions(
applicationContext = applicationContext, applicationContext = applicationContext,
viewModelScope = viewModelScope, viewModelScope = viewModelScope,
@@ -75,7 +76,7 @@ class MessagesHistoryViewModelImpl(
showKeyboard = showKeyboard, showKeyboard = showKeyboard,
dialog = dialog, dialog = dialog,
syncUiMessages = ::syncUiMessages, syncUiMessages = ::syncUiMessages,
onPinnedMessageChanged = ::handlePinnedMessage onPinnedMessageChanged = pinnedMessageHandler::update
) )
private val loaders = MessagesHistoryLoaders( private val loaders = MessagesHistoryLoaders(
@@ -89,7 +90,7 @@ class MessagesHistoryViewModelImpl(
baseError = baseError, baseError = baseError,
scope = viewModelScope, scope = viewModelScope,
syncUiMessages = ::syncUiMessages, syncUiMessages = ::syncUiMessages,
onPinnedMessage = ::handlePinnedMessage onPinnedMessage = pinnedMessageHandler::update
) )
private val longPollEventHandler = MessagesHistoryLongPollEventHandler( 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> { private fun syncUiMessages(): List<MessageUiItem> {
val newUiMessages = buildMessagesHistoryUiMessages( val newUiMessages = buildMessagesHistoryUiMessages(
messages = messages.value, messages = messages.value,