* refactor Conversation -> Convo

* extract Message and Convo mappers to core/domain module
* improve reply container text
This commit is contained in:
2025-12-17 17:16:02 +03:00
parent 7b6571f208
commit 45ee0acea5
125 changed files with 2361 additions and 2005 deletions
@@ -1,4 +1,4 @@
package dev.meloda.fast.ui.model.api
package dev.meloda.fast.ui.model.vk
enum class ActionState {
PHANTOM, CALL_IN_PROGRESS, NONE;
@@ -1,41 +1,41 @@
package dev.meloda.fast.ui.model.api
package dev.meloda.fast.ui.model.vk
import dev.meloda.fast.common.model.UiImage
import dev.meloda.fast.common.model.UiText
import dev.meloda.fast.ui.R
sealed class ConversationOption(
sealed class ConvoOption(
val title: UiText,
val icon: UiImage
) {
data object MarkAsRead : ConversationOption(
data object MarkAsRead : ConvoOption(
title = UiText.Resource(R.string.action_mark_as_read),
icon = UiImage.Resource(R.drawable.round_done_all_24)
)
data object Pin : ConversationOption(
data object Pin : ConvoOption(
title = UiText.Resource(R.string.action_pin),
icon = UiImage.Resource(R.drawable.pin_outline_24)
)
data object Unpin : ConversationOption(
data object Unpin : ConvoOption(
title = UiText.Resource(R.string.action_unpin),
icon = UiImage.Resource(R.drawable.pin_off_outline_24)
)
data object Delete : ConversationOption(
data object Delete : ConvoOption(
title = UiText.Resource(R.string.action_delete),
icon = UiImage.Resource(R.drawable.round_delete_outline_24)
)
data object Archive : ConversationOption(
title = UiText.Resource(R.string.conversation_context_action_archive),
data object Archive : ConvoOption(
title = UiText.Resource(R.string.convo_context_action_archive),
icon = UiImage.Resource(R.drawable.outline_archive_24)
)
data object Unarchive : ConversationOption(
title = UiText.Resource(R.string.conversation_context_action_unarchive),
data object Unarchive : ConvoOption(
title = UiText.Resource(R.string.convo_context_action_unarchive),
icon = UiImage.Resource(R.drawable.outline_unarchive_24)
)
}
@@ -0,0 +1,7 @@
package dev.meloda.fast.ui.model.vk
data class MentionIndex(
val id: Long,
val idPrefix: String,
val indexRange: IntRange
)
@@ -0,0 +1,49 @@
package dev.meloda.fast.ui.model.vk
import androidx.compose.runtime.Stable
import androidx.compose.ui.text.AnnotatedString
import dev.meloda.fast.common.model.UiImage
import dev.meloda.fast.model.api.domain.VkAttachment
import dev.meloda.fast.ui.util.ImmutableList
@Stable
sealed class MessageUiItem(
open val id: Long,
open val cmId: Long
) {
@Stable
data class Message(
override val id: Long,
override val cmId: Long,
val text: AnnotatedString?,
val isOut: Boolean,
val fromId: Long,
val date: String,
val randomId: Long,
val isInChat: Boolean,
val name: String,
val showDate: Boolean,
val showAvatar: Boolean,
val showName: Boolean,
val avatar: UiImage,
val isEdited: Boolean,
val isRead: Boolean,
val sendingStatus: SendingStatus,
val isSelected: Boolean,
val isPinned: Boolean,
val isImportant: Boolean,
val attachments: ImmutableList<VkAttachment>?,
val replyCmId: Long?,
val replyTitle: String?,
val replySummary: AnnotatedString?
) : MessageUiItem(id, cmId)
@Stable
data class ActionMessage(
override val id: Long,
override val cmId: Long,
val text: AnnotatedString,
val actionCmId: Long?
) : MessageUiItem(id, cmId)
}
@@ -0,0 +1,5 @@
package dev.meloda.fast.ui.model.vk
enum class SendingStatus {
SENDING, SENT, FAILED
}
@@ -1,4 +1,4 @@
package dev.meloda.fast.ui.model.api
package dev.meloda.fast.ui.model.vk
import androidx.compose.runtime.Immutable
import androidx.compose.ui.text.AnnotatedString
@@ -8,7 +8,7 @@ import dev.meloda.fast.model.api.domain.VkMessage
import dev.meloda.fast.ui.util.ImmutableList
@Immutable
data class UiConversation(
data class UiConvo(
val id: Long,
val lastMessageId: Long?,
val avatar: UiImage?,
@@ -28,5 +28,5 @@ data class UiConversation(
val interactionText: String?,
val isExpanded: Boolean,
val isArchived: Boolean,
val options: ImmutableList<ConversationOption>,
val options: ImmutableList<ConvoOption>,
)
@@ -1,4 +1,4 @@
package dev.meloda.fast.ui.model.api
package dev.meloda.fast.ui.model.vk
import androidx.compose.runtime.Immutable
import dev.meloda.fast.common.model.UiImage
@@ -11,6 +11,10 @@ import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.compositeOver
import androidx.compose.ui.graphics.lerp
import androidx.compose.ui.graphics.luminance
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.input.key.onKeyEvent
@@ -121,3 +125,14 @@ fun isNeedToEnableDarkMode(darkMode: DarkMode): Boolean {
return appForceDarkMode || (appBatterySaver && isSystemBatterySaver) || (!appBatterySaver && isSystemUsingDarkTheme && darkMode == DarkMode.FOLLOW_SYSTEM)
}
fun Color.lighten(amount: Float) = lerp(this, Color.White, amount.coerceIn(0f, 1f))
fun Color.darken(amount: Float) = lerp(this, Color.Black, amount.coerceIn(0f, 1f))
fun Color.isDark(
background: Color = Color.White,
threshold: Float = 0.5f
): Boolean {
val opaque = if (alpha < 1f) this.compositeOver(background) else this
return opaque.luminance() < threshold
}
+11 -11
View File
@@ -24,16 +24,16 @@
<string name="message_mark_as_spam">Пометить как спам</string>
<string name="action_mark_as_read">Прочитать</string>
<string name="action_delete">Удалить</string>
<string name="conversation_context_action_unarchive">Из архива</string>
<string name="conversation_context_action_delete">Удалить</string>
<string name="confirm_delete_conversation">Удалить чат?</string>
<string name="convo_context_action_unarchive">Из архива</string>
<string name="convo_context_action_delete">Удалить</string>
<string name="confirm_delete_convo">Удалить чат?</string>
<string name="action_sign_out">Выйти</string>
<string name="sign_out_confirm_title">Выйти?</string>
<string name="conversation_context_action_unpin">Открепить</string>
<string name="conversation_context_action_pin">Закрепить</string>
<string name="confirm_unpin_conversation">Открепить чат?</string>
<string name="confirm_pin_conversation">Закрепить чат?</string>
<string name="confirm_unarchive_conversation">Разархивировать чат?</string>
<string name="convo_context_action_unpin">Открепить</string>
<string name="convo_context_action_pin">Закрепить</string>
<string name="confirm_unpin_convo">Открепить чат?</string>
<string name="confirm_pin_convo">Закрепить чат?</string>
<string name="confirm_unarchive_convo">Разархивировать чат?</string>
<string name="action_pin">Закрепить</string>
<string name="action_unpin">Открепить</string>
<string name="action_mark">Пометить</string>
@@ -181,7 +181,7 @@
<string name="settings_amoled_dark_theme_description">Использовать AMOLED тему с чистым чёрным фоновым цветом, когда используется тёмная тема</string>
<string name="members_count">Участники: %1$d</string>
<string name="title_loading">Загрузка&#8230;</string>
<string name="title_conversations">Чаты</string>
<string name="title_convos">Чаты</string>
<string name="title_archive">Архив</string>
<string name="title_friends">Друзья</string>
<string name="title_profile">Профиль</string>
@@ -262,8 +262,8 @@
<string name="unspam_message_text">Вы уверены, что хотите убрать пометку спама у этого сообщения?</string>
<string name="pin_message_title">Закрепить сообщение</string>
<string name="copied_to_clipboard">Скопировано в буфер обмена</string>
<string name="conversation_context_action_archive">В архив</string>
<string name="confirm_archive_conversation">Архивировать чат?</string>
<string name="convo_context_action_archive">В архив</string>
<string name="confirm_archive_convo">Архивировать чат?</string>
<string name="action_archive">В архив</string>
<string name="autofill">Автозаполнение</string>
<string name="bold">Жирный</string>
+11 -11
View File
@@ -153,18 +153,18 @@
<string name="action_mark_as_read">Read</string>
<string name="action_delete">Delete</string>
<string name="conversation_context_action_archive">Archive</string>
<string name="conversation_context_action_unarchive">Unarchive</string>
<string name="conversation_context_action_delete">Delete</string>
<string name="confirm_delete_conversation">Delete the conversation?</string>
<string name="convo_context_action_archive">Archive</string>
<string name="convo_context_action_unarchive">Unarchive</string>
<string name="convo_context_action_delete">Delete</string>
<string name="confirm_delete_convo">Delete the conversation?</string>
<string name="action_sign_out">Sign out</string>
<string name="sign_out_confirm_title">Sign out?</string>
<string name="conversation_context_action_unpin">Unpin</string>
<string name="conversation_context_action_pin">Pin</string>
<string name="confirm_unpin_conversation">Unpin the conversation?</string>
<string name="confirm_pin_conversation">Pin the conversation?</string>
<string name="confirm_archive_conversation">Archive the conversation?</string>
<string name="confirm_unarchive_conversation">Unarchive the conversation?</string>
<string name="convo_context_action_unpin">Unpin</string>
<string name="convo_context_action_pin">Pin</string>
<string name="confirm_unpin_convo">Unpin the conversation?</string>
<string name="confirm_pin_convo">Pin the conversation?</string>
<string name="confirm_archive_convo">Archive the conversation?</string>
<string name="confirm_unarchive_convo">Unarchive the conversation?</string>
<string name="action_pin">Pin</string>
<string name="action_unpin">Unpin</string>
<string name="action_mark">Mark</string>
@@ -245,7 +245,7 @@
<string name="action_refresh">Refresh</string>
<string name="members_count">Members: %1$d</string>
<string name="title_loading">Loading&#8230;</string>
<string name="title_conversations">Conversations</string>
<string name="title_convos">Conversations</string>
<string name="title_archive">Archive</string>
<string name="title_friends">Friends</string>
<string name="title_profile">Profile</string>