forked from melod1n/fast-messenger
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 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
|
||||||
|
|||||||
+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.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,
|
||||||
|
|||||||
Reference in New Issue
Block a user