forked from melod1n/fast-messenger
feat: add channel message support and refactor UI components
- Implement `VkChannelMessage` domain and data models for channel message attachments - Add `CHANNEL_MESSAGE` to `AttachmentType` and map it to relevant UI resources and strings - Refactor `Sticker` and `Gift` composables to accept URL strings instead of domain objects for better decoupling - Simplify `AppTheme` by removing redundant color animations and passing the color scheme directly to `MaterialExpressiveTheme` - Update `LoginScreen` to include a theme toggle (classic vs. light) and improve back-button behavior by resetting error states - Bump VK API version from 5.238 to 5.263 - Adjust layout and padding for sticker and gift attachment previews
This commit is contained in:
@@ -4,7 +4,7 @@ object AppConstants {
|
||||
|
||||
const val INSTALL_APP_MIME_TYPE = "application/vnd.android.package-archive"
|
||||
|
||||
const val API_VERSION = "5.238"
|
||||
const val API_VERSION = "5.263"
|
||||
const val URL_OAUTH = "https://oauth.vk.ru"
|
||||
const val URL_API = "https://api.vk.ru/method"
|
||||
|
||||
|
||||
@@ -598,6 +598,7 @@ private fun getAttachmentIconByType(attachmentType: AttachmentType): UiImage? {
|
||||
AttachmentType.VIDEO_MESSAGE -> null
|
||||
AttachmentType.GROUP_CHAT_STICKER -> R.drawable.ic_sticker_fill_round_24
|
||||
AttachmentType.STICKER_PACK_PREVIEW -> null
|
||||
AttachmentType.CHANNEL_MESSAGE -> null
|
||||
}?.let(UiImage::Resource)
|
||||
}
|
||||
|
||||
@@ -687,6 +688,7 @@ fun getAttachmentUiText(
|
||||
AttachmentType.VIDEO_MESSAGE -> R.string.message_attachments_video_message
|
||||
AttachmentType.GROUP_CHAT_STICKER -> R.string.message_attachments_group_sticker
|
||||
AttachmentType.STICKER_PACK_PREVIEW -> R.string.message_attachments_sticker_pack_preview
|
||||
AttachmentType.CHANNEL_MESSAGE -> R.string.message_attachments_channel_message
|
||||
}.let(UiText::Resource)
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,8 @@ enum class AttachmentType(var value: String) {
|
||||
ARTICLE("article"),
|
||||
VIDEO_MESSAGE("video_message"),
|
||||
GROUP_CHAT_STICKER("ugc_sticker"),
|
||||
STICKER_PACK_PREVIEW("sticker_pack_preview")
|
||||
STICKER_PACK_PREVIEW("sticker_pack_preview"),
|
||||
CHANNEL_MESSAGE("channel_message")
|
||||
;
|
||||
|
||||
fun isMultiple(): Boolean = this in listOf(PHOTO, VIDEO, AUDIO, FILE)
|
||||
|
||||
@@ -35,7 +35,8 @@ data class VkAttachmentItemData(
|
||||
@Json(name = "article") val article: VkArticleData?,
|
||||
@Json(name = "video_message") val videoMessage: VkVideoMessageData?,
|
||||
@Json(name = "ugc_sticker") val groupSticker: VkGroupStickerData?,
|
||||
@Json(name = "sticker_pack_preview") val stickerPackPreview: VkStickerPackPreviewData?
|
||||
@Json(name = "sticker_pack_preview") val stickerPackPreview: VkStickerPackPreviewData?,
|
||||
@Json(name = "channel_message") val channelMessageData: VkChannelMessageData?
|
||||
) {
|
||||
fun toDomain(): VkAttachment = when (AttachmentType.parse(type)) {
|
||||
AttachmentType.UNKNOWN -> VkUnknownAttachment
|
||||
@@ -66,5 +67,6 @@ data class VkAttachmentItemData(
|
||||
AttachmentType.VIDEO_MESSAGE -> videoMessage?.toDomain()
|
||||
AttachmentType.GROUP_CHAT_STICKER -> groupSticker?.toDomain()
|
||||
AttachmentType.STICKER_PACK_PREVIEW -> stickerPackPreview?.toDomain()
|
||||
AttachmentType.CHANNEL_MESSAGE -> channelMessageData?.toDomain()
|
||||
} ?: VkUnknownAttachment
|
||||
}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
package dev.meloda.fast.model.api.data
|
||||
|
||||
import com.squareup.moshi.Json
|
||||
import com.squareup.moshi.JsonClass
|
||||
import dev.meloda.fast.model.api.domain.VkChannelMessage
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class VkChannelMessageData(
|
||||
@Json(name = "channel_id") val channelId: Long,
|
||||
@Json(name = "cmid") val cmId: Long,
|
||||
@Json(name = "author_id") val authorId: Long,
|
||||
@Json(name = "channel_info") val channelInfo: ChannelInfo,
|
||||
@Json(name = "channel_type") val channelType: String,
|
||||
@Json(name = "guid") val guid: String,
|
||||
@Json(name = "text") val text: String?,
|
||||
@Json(name = "time") val time: Long,
|
||||
@Json(name = "attachments") val attachments: List<VkAttachmentItemData> = emptyList(),
|
||||
) : VkAttachmentData {
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class ChannelInfo(
|
||||
@Json(name = "photo_base") val photoBase: String?,
|
||||
@Json(name = "title") val title: String
|
||||
)
|
||||
|
||||
fun toDomain(): VkChannelMessage = VkChannelMessage(
|
||||
channelId = channelId,
|
||||
cmId = cmId,
|
||||
authorId = authorId,
|
||||
channelInfo = VkChannelMessage.ChannelInfo(
|
||||
title = channelInfo.title,
|
||||
photoBase = channelInfo.photoBase
|
||||
),
|
||||
channelType = channelType,
|
||||
guid = guid,
|
||||
text = text,
|
||||
time = time,
|
||||
attachments = attachments.map(VkAttachmentItemData::toDomain),
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package dev.meloda.fast.model.api.domain
|
||||
|
||||
import dev.meloda.fast.model.api.data.AttachmentType
|
||||
|
||||
data class VkChannelMessage(
|
||||
val channelId: Long,
|
||||
val cmId: Long,
|
||||
val authorId: Long,
|
||||
val channelInfo: ChannelInfo,
|
||||
val channelType: String,
|
||||
val guid: String,
|
||||
val text: String?,
|
||||
val time: Long,
|
||||
val attachments: List<VkAttachment>?,
|
||||
) : VkAttachment {
|
||||
|
||||
data class ChannelInfo(
|
||||
val title: String,
|
||||
val photoBase: String?
|
||||
)
|
||||
|
||||
override val type: AttachmentType = AttachmentType.CHANNEL_MESSAGE
|
||||
}
|
||||
@@ -58,7 +58,7 @@ fun AppTheme(
|
||||
) {
|
||||
val context = LocalContext.current
|
||||
|
||||
val colorScheme: ColorScheme = when {
|
||||
val colorScheme: ColorScheme = predefinedColorScheme ?: when {
|
||||
useDynamicColors && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
|
||||
if (useDarkTheme) dynamicDarkColorScheme(context)
|
||||
else dynamicLightColorScheme(context)
|
||||
@@ -82,10 +82,6 @@ fun AppTheme(
|
||||
}
|
||||
}
|
||||
|
||||
val colorPrimary by animateColorAsState(colorScheme.primary)
|
||||
val colorSurface by animateColorAsState(colorScheme.surface)
|
||||
val colorBackground by animateColorAsState(colorScheme.background)
|
||||
|
||||
val typography = if (useSystemFont) {
|
||||
MaterialTheme.typography
|
||||
} else {
|
||||
@@ -118,12 +114,7 @@ fun AppTheme(
|
||||
}
|
||||
|
||||
MaterialExpressiveTheme(
|
||||
colorScheme = (predefinedColorScheme ?: colorScheme)
|
||||
.copy(
|
||||
primary = colorPrimary,
|
||||
background = colorBackground,
|
||||
surface = colorSurface
|
||||
),
|
||||
colorScheme = colorScheme,
|
||||
typography = typography,
|
||||
content = content
|
||||
)
|
||||
|
||||
@@ -88,6 +88,7 @@
|
||||
<string name="message_attachments_video_message">Video message</string>
|
||||
<string name="message_attachments_group_sticker">Group sticker</string>
|
||||
<string name="message_attachments_sticker_pack_preview">Sticker pack preview</string>
|
||||
<string name="message_attachments_channel_message">Channel message</string>
|
||||
|
||||
<string name="chat_interaction_uploading_file">Uploading file</string>
|
||||
<string name="chat_interaction_uploading_photo">Uploading photo</string>
|
||||
|
||||
Reference in New Issue
Block a user