message sending status

This commit is contained in:
2025-03-23 09:08:29 +03:00
parent 79f539a27b
commit a4feb8978f
17 changed files with 172 additions and 47 deletions
@@ -24,6 +24,7 @@ import dev.meloda.fast.domain.LongPollUpdatesParser
import dev.meloda.fast.domain.MessagesUseCase
import dev.meloda.fast.messageshistory.model.ActionMode
import dev.meloda.fast.messageshistory.model.MessagesHistoryScreenState
import dev.meloda.fast.messageshistory.model.SendingStatus
import dev.meloda.fast.messageshistory.model.UiItem
import dev.meloda.fast.messageshistory.navigation.MessagesHistory
import dev.meloda.fast.messageshistory.util.asPresentation
@@ -407,6 +408,16 @@ class MessagesHistoryViewModelImpl(
state.processState(
error = { error ->
sendingMessages -= newMessage
val uiMessages = screenState.value.messages.toMutableList()
uiMessages.indexOfOrNull(newUiMessage)?.let { index ->
(uiMessages[index] as? UiItem.Message)?.let { message ->
uiMessages[index] = message.copy(sendingStatus = SendingStatus.FAILED)
}
}
screenState.setValue { old -> old.copy(messages = uiMessages) }
},
success = { messageId ->
sendingMessages -= newMessage
@@ -419,7 +430,10 @@ class MessagesHistoryViewModelImpl(
uiMessages.indexOfOrNull(newUiMessage)?.let { index ->
(uiMessages[index] as? UiItem.Message)?.let { message ->
uiMessages[index] = message
.copy(id = messageId)
.copy(
id = messageId,
sendingStatus = SendingStatus.SENT
)
.copy(isRead = newMessage.isRead(screenState.value.conversation))
}
}
@@ -0,0 +1,5 @@
package dev.meloda.fast.messageshistory.model
enum class SendingStatus {
SENDING, SENT, FAILED
}
@@ -23,7 +23,8 @@ sealed class UiItem(
val showName: Boolean,
val avatar: UiImage,
val isEdited: Boolean,
val isRead: Boolean
val isRead: Boolean,
val sendingStatus: SendingStatus = SendingStatus.SENT
) : UiItem(id, conversationMessageId)
data class ActionMessage(
@@ -82,7 +82,8 @@ fun IncomingMessageBubble(
date = message.date,
edited = message.isEdited,
animate = animate,
isRead = message.isRead
isRead = message.isRead,
sendingStatus = message.sendingStatus
)
}
}
@@ -15,6 +15,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Create
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.surfaceColorAtElevation
@@ -24,8 +25,10 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import dev.meloda.fast.messageshistory.model.SendingStatus
import dev.meloda.fast.ui.R as UiR
@Composable
@@ -36,7 +39,8 @@ fun MessageBubble(
date: String?,
edited: Boolean,
animate: Boolean,
isRead: Boolean
isRead: Boolean,
sendingStatus: SendingStatus
) {
val backgroundColor = if (!isOut) {
MaterialTheme.colorScheme.surfaceColorAtElevation(2.dp)
@@ -109,9 +113,18 @@ fun MessageBubble(
Icon(
modifier = Modifier.size(14.dp),
painter = painterResource(
if (isRead) UiR.drawable.round_done_all_24
else UiR.drawable.ic_round_done_24
when (sendingStatus) {
SendingStatus.SENDING -> UiR.drawable.round_access_time_24
SendingStatus.SENT -> {
if (isRead) UiR.drawable.round_done_all_24
else UiR.drawable.ic_round_done_24
}
SendingStatus.FAILED -> UiR.drawable.round_error_outline_24
}
),
tint = if (sendingStatus == SendingStatus.FAILED) Color.Red
else LocalContentColor.current,
contentDescription = null
)
}
@@ -37,7 +37,8 @@ fun OutgoingMessageBubble(
date = message.date,
edited = message.isEdited,
animate = animate,
isRead = message.isRead
isRead = message.isRead,
sendingStatus = message.sendingStatus
)
}
}
@@ -12,6 +12,7 @@ import dev.meloda.fast.common.model.parseString
import dev.meloda.fast.common.provider.ResourceProvider
import dev.meloda.fast.data.UserConfig
import dev.meloda.fast.data.VkMemoryCache
import dev.meloda.fast.messageshistory.model.SendingStatus
import dev.meloda.fast.messageshistory.model.UiItem
import dev.meloda.fast.model.api.PeerType
import dev.meloda.fast.model.api.domain.VkConversation
@@ -123,11 +124,14 @@ fun VkMessage.asPresentation(
showName = showName && extractShowName(prevMessage),
avatar = extractAvatar(),
isEdited = updateTime != null,
isRead = isRead(conversation)
isRead = isRead(conversation),
sendingStatus = when {
id <= 0 -> SendingStatus.SENDING
else -> SendingStatus.SENT
}
)
}
fun VkMessage.extractShowAvatar(nextMessage: VkMessage?): Boolean {
if (isOut) return false
return nextMessage == null || nextMessage.fromId != fromId