message sending status
This commit is contained in:
+15
-1
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package dev.meloda.fast.messageshistory.model
|
||||
|
||||
enum class SendingStatus {
|
||||
SENDING, SENT, FAILED
|
||||
}
|
||||
+2
-1
@@ -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(
|
||||
|
||||
+2
-1
@@ -82,7 +82,8 @@ fun IncomingMessageBubble(
|
||||
date = message.date,
|
||||
edited = message.isEdited,
|
||||
animate = animate,
|
||||
isRead = message.isRead
|
||||
isRead = message.isRead,
|
||||
sendingStatus = message.sendingStatus
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+16
-3
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
+2
-1
@@ -37,7 +37,8 @@ fun OutgoingMessageBubble(
|
||||
date = message.date,
|
||||
edited = message.isEdited,
|
||||
animate = animate,
|
||||
isRead = message.isRead
|
||||
isRead = message.isRead,
|
||||
sendingStatus = message.sendingStatus
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+6
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user