diff --git a/app/src/main/kotlin/com/meloda/app/fast/navigation/MainGraph.kt b/app/src/main/kotlin/com/meloda/app/fast/navigation/MainGraph.kt
index 6584dcc5..d908d466 100644
--- a/app/src/main/kotlin/com/meloda/app/fast/navigation/MainGraph.kt
+++ b/app/src/main/kotlin/com/meloda/app/fast/navigation/MainGraph.kt
@@ -9,7 +9,7 @@ import com.meloda.app.fast.model.BottomNavigationItem
import com.meloda.app.fast.presentation.MainScreen
import com.meloda.app.fast.profile.navigation.Profile
import kotlinx.serialization.Serializable
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
@Serializable
object MainGraph
diff --git a/app/src/main/kotlin/com/meloda/app/fast/presentation/MainActivity.kt b/app/src/main/kotlin/com/meloda/app/fast/presentation/MainActivity.kt
index e1f28a38..9015eb2b 100644
--- a/app/src/main/kotlin/com/meloda/app/fast/presentation/MainActivity.kt
+++ b/app/src/main/kotlin/com/meloda/app/fast/presentation/MainActivity.kt
@@ -37,15 +37,15 @@ import com.meloda.app.fast.common.extensions.isSdkAtLeast
import com.meloda.app.fast.datastore.SettingsController
import com.meloda.app.fast.datastore.UserSettings
import com.meloda.app.fast.datastore.model.LongPollState
-import com.meloda.app.fast.datastore.model.ThemeConfig
-import com.meloda.app.fast.designsystem.AppTheme
-import com.meloda.app.fast.designsystem.LocalTheme
import com.meloda.app.fast.service.OnlineService
import com.meloda.app.fast.service.longpolling.LongPollingService
+import com.meloda.app.fast.ui.model.ThemeConfig
+import com.meloda.app.fast.ui.theme.AppTheme
+import com.meloda.app.fast.ui.theme.LocalTheme
import org.koin.androidx.compose.koinViewModel
import org.koin.compose.KoinContext
import org.koin.compose.koinInject
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
class MainActivity : AppCompatActivity() {
diff --git a/app/src/main/kotlin/com/meloda/app/fast/presentation/MainScreen.kt b/app/src/main/kotlin/com/meloda/app/fast/presentation/MainScreen.kt
index 3d8943a6..32d3611a 100644
--- a/app/src/main/kotlin/com/meloda/app/fast/presentation/MainScreen.kt
+++ b/app/src/main/kotlin/com/meloda/app/fast/presentation/MainScreen.kt
@@ -26,9 +26,9 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.navigation
import androidx.navigation.compose.rememberNavController
import com.meloda.app.fast.conversations.navigation.conversationsScreen
-import com.meloda.app.fast.designsystem.LocalBottomPadding
-import com.meloda.app.fast.designsystem.LocalHazeState
-import com.meloda.app.fast.designsystem.LocalTheme
+import com.meloda.app.fast.ui.theme.LocalBottomPadding
+import com.meloda.app.fast.ui.theme.LocalHazeState
+import com.meloda.app.fast.ui.theme.LocalTheme
import com.meloda.app.fast.friends.navigation.friendsScreen
import com.meloda.app.fast.model.BaseError
import com.meloda.app.fast.model.BottomNavigationItem
diff --git a/app/src/main/kotlin/com/meloda/app/fast/presentation/RootScreen.kt b/app/src/main/kotlin/com/meloda/app/fast/presentation/RootScreen.kt
index 5b854090..85d87716 100644
--- a/app/src/main/kotlin/com/meloda/app/fast/presentation/RootScreen.kt
+++ b/app/src/main/kotlin/com/meloda/app/fast/presentation/RootScreen.kt
@@ -26,7 +26,7 @@ import com.meloda.app.fast.auth.authNavGraph
import com.meloda.app.fast.auth.navigateToAuth
import com.meloda.app.fast.chatmaterials.navigation.chatMaterialsScreen
import com.meloda.app.fast.chatmaterials.navigation.navigateToChatMaterials
-import com.meloda.app.fast.designsystem.R
+import com.meloda.app.fast.ui.R
import com.meloda.app.fast.languagepicker.navigation.languagePickerScreen
import com.meloda.app.fast.languagepicker.navigation.navigateToLanguagePicker
import com.meloda.app.fast.messageshistory.navigation.messagesHistoryScreen
diff --git a/app/src/main/kotlin/com/meloda/app/fast/service/longpolling/LongPollingService.kt b/app/src/main/kotlin/com/meloda/app/fast/service/longpolling/LongPollingService.kt
index 4b1a4db7..936f86e7 100644
--- a/app/src/main/kotlin/com/meloda/app/fast/service/longpolling/LongPollingService.kt
+++ b/app/src/main/kotlin/com/meloda/app/fast/service/longpolling/LongPollingService.kt
@@ -23,7 +23,7 @@ import com.meloda.app.fast.datastore.SettingsController
import com.meloda.app.fast.datastore.SettingsKeys
import com.meloda.app.fast.datastore.UserSettings
import com.meloda.app.fast.datastore.model.LongPollState
-import com.meloda.app.fast.designsystem.R
+import com.meloda.app.fast.ui.R
import com.meloda.app.fast.model.api.data.LongPollUpdates
import com.meloda.app.fast.model.api.data.VkLongPollData
import com.meloda.app.fast.util.NotificationsUtils
diff --git a/app/src/main/kotlin/com/meloda/app/fast/util/NotificationsUtils.kt b/app/src/main/kotlin/com/meloda/app/fast/util/NotificationsUtils.kt
index fefd6214..cdc89e33 100644
--- a/app/src/main/kotlin/com/meloda/app/fast/util/NotificationsUtils.kt
+++ b/app/src/main/kotlin/com/meloda/app/fast/util/NotificationsUtils.kt
@@ -6,7 +6,7 @@ import android.content.Context
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.meloda.app.fast.common.AppConstants
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
object NotificationsUtils {
diff --git a/core/common/src/main/kotlin/com/meloda/app/fast/common/util/VkUtils.kt b/core/common/src/main/kotlin/com/meloda/app/fast/common/util/VkUtils.kt
deleted file mode 100644
index 7389532f..00000000
--- a/core/common/src/main/kotlin/com/meloda/app/fast/common/util/VkUtils.kt
+++ /dev/null
@@ -1,721 +0,0 @@
-package com.meloda.app.fast.common.util
-
-//import android.content.Context
-//import androidx.compose.ui.graphics.Color
-//import androidx.compose.ui.text.AnnotatedString
-//import androidx.compose.ui.text.SpanStyle
-//import androidx.compose.ui.text.buildAnnotatedString
-//import androidx.compose.ui.text.font.FontWeight
-//import androidx.compose.ui.text.withStyle
-//import com.meloda.app.fast.common.UiImage
-//import com.meloda.app.fast.common.UiText
-//import com.meloda.app.fast.common.extensions.orDots
-//import com.meloda.app.fast.common.parseString
-//
-//
-//@Suppress("MemberVisibilityCanBePrivate")
-//object VkUtils {
-//
-// fun prepareMessageText(text: String, forConversations: Boolean = false): String {
-// return text.apply {
-// if (forConversations) {
-// replace("\n", " ")
-// }
-//
-// replace("&", "&")
-// replace(""", "\"")
-// replace("
", "\n")
-// replace(">", ">")
-// replace("<", "<")
-// replace("
", "\n")
-// replace("–", "-")
-// trim()
-// }
-// }
-//
-// fun parseAttachments(baseAttachments: List?): List? {
-// if (baseAttachments.isNullOrEmpty()) return null
-//
-// val attachments = mutableListOf()
-//
-// for (baseAttachment in baseAttachments) {
-// when (baseAttachment.getPreparedType()) {
-// AttachmentType.UNKNOWN -> continue
-//
-// AttachmentType.PHOTO -> {
-// val photo = baseAttachment.photo ?: continue
-// attachments += photo.toDomain()
-// }
-//
-// AttachmentType.VIDEO -> {
-// val video = baseAttachment.video ?: continue
-// attachments += video.toDomain()
-// }
-//
-// AttachmentType.AUDIO -> {
-// val audio = baseAttachment.audio ?: continue
-// attachments += audio.toDomain()
-// }
-//
-// AttachmentType.FILE -> {
-// val file = baseAttachment.file ?: continue
-// attachments += file.toDomain()
-// }
-//
-// AttachmentType.LINK -> {
-// val link = baseAttachment.link ?: continue
-// attachments += link.toDomain()
-// }
-//
-// AttachmentType.MINI_APP -> {
-// val miniApp = baseAttachment.miniApp ?: continue
-// attachments += miniApp.toDomain()
-// }
-//
-// AttachmentType.AUDIO_MESSAGE -> {
-// val voiceMessage = baseAttachment.voiceMessage ?: continue
-// attachments += voiceMessage.toDomain()
-// }
-//
-// AttachmentType.STICKER -> {
-// val sticker = baseAttachment.sticker ?: continue
-// attachments += sticker.toDomain()
-// }
-//
-// AttachmentType.GIFT -> {
-// val gift = baseAttachment.gift ?: continue
-// attachments += gift.toDomain()
-// }
-//
-// AttachmentType.WALL -> {
-// val wall = baseAttachment.wall ?: continue
-// attachments += wall.toDomain()
-// }
-//
-// AttachmentType.GRAFFITI -> {
-// val graffiti = baseAttachment.graffiti ?: continue
-// attachments += graffiti.toDomain()
-// }
-//
-// AttachmentType.POLL -> {
-// val poll = baseAttachment.poll ?: continue
-// attachments += poll.toDomain()
-// }
-//
-// AttachmentType.WALL_REPLY -> {
-// val wallReply = baseAttachment.wallReply ?: continue
-// attachments += wallReply.toDomain()
-// }
-//
-// AttachmentType.CALL -> {
-// val call = baseAttachment.call ?: continue
-// attachments += call.toDomain()
-// }
-//
-// AttachmentType.GROUP_CALL_IN_PROGRESS -> {
-// val groupCall = baseAttachment.groupCall ?: continue
-// attachments += groupCall.toDomain()
-// }
-//
-// AttachmentType.CURATOR -> {
-// val curator = baseAttachment.curator ?: continue
-// attachments += curator.toDomain()
-// }
-//
-// AttachmentType.EVENT -> {
-// val event = baseAttachment.event ?: continue
-// attachments += event.toDomain()
-// }
-//
-// AttachmentType.STORY -> {
-// val story = baseAttachment.story ?: continue
-// attachments += story.toDomain()
-// }
-//
-// AttachmentType.WIDGET -> {
-// val widget = baseAttachment.widget ?: continue
-// attachments += widget.toDomain()
-// }
-//
-// AttachmentType.ARTIST -> {
-// val artist = baseAttachment.artist ?: continue
-// attachments += artist.toDomain()
-//
-// val audios = baseAttachment.audios ?: continue
-// audios.map(VkAudioData::toDomain).let(attachments::addAll)
-// }
-//
-// AttachmentType.AUDIO_PLAYLIST -> {
-// val audioPlaylist = baseAttachment.audioPlaylist ?: continue
-// attachments += audioPlaylist.toDomain()
-// }
-//
-// AttachmentType.PODCAST -> {
-// val podcast = baseAttachment.podcast ?: continue
-// attachments += podcast.toDomain()
-// }
-// }
-// }
-//
-// return attachments
-// }
-//
-// fun getActionMessageText(
-// context: Context,
-// message: VkMessage?,
-// youPrefix: String,
-// messageUser: VkUserDomain?,
-// messageGroup: VkGroupDomain?,
-// action: VkMessage.Action?,
-// actionUser: VkUserDomain?,
-// actionGroup: VkGroupDomain?,
-// ): AnnotatedString? {
-// return when {
-// message == null -> null
-// action == null -> null
-//
-// else -> buildAnnotatedString {
-// when (action) {
-// VkMessage.Action.CHAT_CREATE -> {
-// val text = message.actionText ?: return null
-//
-// val prefix = when {
-// message.fromId == UserConfig.userId -> youPrefix
-// message.isGroup() -> messageGroup?.name
-// message.isUser() -> messageUser?.toString()
-// else -> return null
-// } ?: return null
-//
-// val string = UiText.ResourceParams(
-// UiR.string.message_action_chat_created,
-// listOf(prefix, text)
-// ).parseString(context).orEmpty()
-//
-// append(string)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-//
-// val textStartIndex = string.indexOf(text)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = textStartIndex,
-// end = textStartIndex + text.length
-// )
-// }
-//
-// VkMessage.Action.CHAT_TITLE_UPDATE -> {
-// val text = message.actionText ?: return null
-//
-// val prefix = when {
-// message.fromId == UserConfig.userId -> youPrefix
-// message.isGroup() -> messageGroup?.name
-// message.isUser() -> messageUser?.toString()
-// else -> return null
-// } ?: return null
-//
-// val string = UiText.ResourceParams(
-// UiR.string.message_action_chat_renamed,
-// listOf(prefix, text)
-// ).parseString(context).orEmpty()
-//
-// append(string)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-//
-// val textStartIndex = string.indexOf(text)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = textStartIndex,
-// end = textStartIndex + text.length
-// )
-// }
-//
-// VkMessage.Action.CHAT_PHOTO_UPDATE -> {
-// val prefix = when {
-// message.fromId == UserConfig.userId -> youPrefix
-// message.isGroup() -> messageGroup?.name
-// message.isUser() -> messageUser?.toString()
-// else -> return null
-// } ?: return null
-//
-// UiText.ResourceParams(
-// UiR.string.message_action_chat_photo_update,
-// listOf(prefix)
-// ).parseString(context).orEmpty().let(::append)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-// }
-//
-// VkMessage.Action.CHAT_PHOTO_REMOVE -> {
-// val prefix = when {
-// message.fromId == UserConfig.userId -> youPrefix
-// message.isGroup() -> messageGroup?.name
-// message.isUser() -> messageUser?.toString()
-// else -> return null
-// } ?: return null
-//
-// UiText.ResourceParams(
-// UiR.string.message_action_chat_photo_remove,
-// listOf(prefix)
-// ).parseString(context).orEmpty().let(::append)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-// }
-//
-// VkMessage.Action.CHAT_KICK_USER -> {
-// val memberId = message.actionMemberId ?: return null
-// val isUser = memberId > 0
-// val isGroup = memberId < 0
-//
-// if (isUser && actionUser == null) return null
-// if (isGroup && actionGroup == null) return null
-//
-// if (memberId == message.fromId) {
-// val prefix =
-// if (memberId == UserConfig.userId) youPrefix
-// else actionUser.toString()
-//
-// UiText.ResourceParams(
-// UiR.string.message_action_chat_user_left,
-// listOf(prefix)
-// ).parseString(context).orEmpty().let(::append)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-// } else {
-// val prefix =
-// if (message.fromId == UserConfig.userId) youPrefix
-// else messageUser?.toString() ?: messageGroup?.toString().orDots()
-//
-// val postfix =
-// if (memberId == UserConfig.userId) youPrefix.lowercase()
-// else actionUser.toString()
-//
-// val string = UiText.ResourceParams(
-// UiR.string.message_action_chat_user_kicked,
-// listOf(prefix, postfix)
-// ).parseString(context).orEmpty()
-//
-// append(string)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-//
-// val postfixStartIndex = string.indexOf(postfix)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = postfixStartIndex,
-// end = postfixStartIndex + postfix.length
-// )
-// }
-// }
-//
-// VkMessage.Action.CHAT_INVITE_USER -> {
-// val memberId = message.actionMemberId ?: 0
-// val isUser = memberId > 0
-// val isGroup = memberId < 0
-//
-// if (isUser && actionUser == null) return null
-// if (isGroup && actionGroup == null) return null
-//
-// if (memberId == message.fromId) {
-// val prefix =
-// if (memberId == UserConfig.userId) youPrefix
-// else actionUser.toString()
-//
-// UiText.ResourceParams(
-// UiR.string.message_action_chat_user_returned,
-// listOf(prefix)
-// ).parseString(context).orEmpty().let(::append)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-// } else {
-// val prefix =
-// if (message.fromId == UserConfig.userId) youPrefix
-// else messageUser?.toString() ?: messageGroup?.toString().orDots()
-//
-// val postfix =
-// if (memberId == UserConfig.userId) youPrefix.lowercase()
-// else actionUser.toString()
-//
-// val string = UiText.ResourceParams(
-// UiR.string.message_action_chat_user_invited,
-// listOf(prefix, postfix)
-// ).parseString(context).orEmpty()
-//
-// append(string)
-//
-// val postfixStartIndex = string.indexOf(postfix)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = postfixStartIndex,
-// end = postfixStartIndex + postfix.length
-// )
-// }
-// }
-//
-// VkMessage.Action.CHAT_INVITE_USER_BY_LINK -> {
-// val prefix = when {
-// message.fromId == UserConfig.userId -> youPrefix
-// message.isUser() -> messageUser?.toString()
-// else -> return null
-// } ?: return null
-//
-// UiText.ResourceParams(
-// UiR.string.message_action_chat_user_joined_by_link,
-// listOf(prefix)
-// ).parseString(context).orEmpty().let(::append)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-// }
-//
-// VkMessage.Action.CHAT_INVITE_USER_BY_CALL -> {
-// val prefix = when {
-// message.fromId == UserConfig.userId -> youPrefix
-// message.isUser() -> messageUser?.toString()
-// else -> return null
-// } ?: return null
-//
-// UiText.ResourceParams(
-// UiR.string.message_action_chat_user_joined_by_call,
-// listOf(prefix)
-// ).parseString(context).orEmpty().let(::append)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-// }
-//
-// VkMessage.Action.CHAT_INVITE_USER_BY_CALL_LINK -> {
-// val prefix = when {
-// message.fromId == UserConfig.userId -> youPrefix
-// message.isUser() -> messageUser?.toString()
-// else -> return null
-// } ?: return null
-//
-// UiText.ResourceParams(
-// UiR.string.message_action_chat_user_joined_by_call_link,
-// listOf(prefix)
-// ).parseString(context).orEmpty().let(::append)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-// }
-//
-// VkMessage.Action.CHAT_PIN_MESSAGE -> {
-// val prefix = when {
-// message.fromId == UserConfig.userId -> youPrefix
-// message.isGroup() -> messageGroup?.name
-// message.isUser() -> messageUser?.toString()
-// else -> return null
-// } ?: return null
-//
-// UiText.ResourceParams(
-// UiR.string.message_action_chat_pin_message,
-// listOf(prefix)
-// ).parseString(context).orEmpty().let(::append)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-// }
-//
-// VkMessage.Action.CHAT_UNPIN_MESSAGE -> {
-// val prefix = when {
-// message.fromId == UserConfig.userId -> youPrefix
-// message.isGroup() -> messageGroup?.name
-// message.isUser() -> messageUser?.toString()
-// else -> return null
-// } ?: return null
-//
-// UiText.ResourceParams(
-// UiR.string.message_action_chat_unpin_message,
-// listOf(prefix)
-// ).parseString(context).orEmpty().let(::append)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-// }
-//
-// VkMessage.Action.CHAT_SCREENSHOT -> {
-// val prefix = when {
-// message.fromId == UserConfig.userId -> youPrefix
-// message.isGroup() -> messageGroup?.name
-// message.isUser() -> messageUser?.toString()
-// else -> return null
-// } ?: return null
-//
-// UiText.ResourceParams(
-// UiR.string.message_action_chat_screenshot,
-// listOf(prefix)
-// ).parseString(context).orEmpty().let(::append)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-// }
-//
-// VkMessage.Action.CHAT_STYLE_UPDATE -> {
-// val prefix = when {
-// message.fromId == UserConfig.userId -> youPrefix
-// message.isUser() -> messageUser?.toString()
-// else -> return null
-// } ?: return null
-//
-// UiText.ResourceParams(
-// UiR.string.message_action_chat_style_update,
-// listOf(prefix)
-// ).parseString(context).orEmpty().let(::append)
-//
-// addStyle(
-// style = SpanStyle(fontWeight = FontWeight.SemiBold),
-// start = 0,
-// end = prefix.length
-// )
-// }
-// }
-// }
-// }
-// }
-//
-// fun getForwardsText(context: Context, message: VkMessage?): AnnotatedString? {
-// return when {
-// message == null -> null
-//
-// message.hasForwards() -> buildAnnotatedString {
-// val forwards = message.forwards.orEmpty()
-//
-// withStyle(style = SpanStyle(fontWeight = FontWeight.SemiBold)) {
-// append(
-// UiText.Resource(
-// if (forwards.size == 1) UiR.string.forwarded_message
-// else UiR.string.forwarded_messages
-// ).parseString(context)
-// )
-// }
-// }
-//
-// else -> null
-// }
-// }
-//
-// fun getAttachmentText(
-// getText: (UiText) -> String,
-// message: VkMessage?
-// ): AnnotatedString? {
-// return when {
-// message == null -> null
-//
-// message.geoType != null -> buildAnnotatedString {
-// withStyle(style = SpanStyle(fontWeight = FontWeight.SemiBold)) {
-// when (message.geoType) {
-// "point" -> getText(UiText.Resource(UiR.string.message_geo_point))
-// .let(::append)
-//
-// else -> getText(UiText.Resource(UiR.string.message_geo))
-// .let(::append)
-// }
-// }
-// }
-//
-// message.hasAttachments() -> buildAnnotatedString {
-// val attachments = message.attachments.orEmpty()
-//
-// withStyle(style = SpanStyle(fontWeight = FontWeight.SemiBold)) {
-// if (attachments.size == 1) {
-// getText(getAttachmentUiText(attachments.first())).let(::append)
-// } else {
-// when {
-// isAttachmentsHaveOneType(attachments) -> {
-// getText(getAttachmentUiText(attachments.first(), attachments.size))
-// .let(::append)
-// }
-//
-// attachments.any { it.type == AttachmentType.ARTIST } -> {
-// getText(
-// getAttachmentUiText(attachments.first { it.type == AttachmentType.ARTIST })
-// ).let(::append)
-// }
-//
-// else -> {
-// getText(UiText.Resource(UiR.string.message_attachments_many))
-// .let(::append)
-// }
-// }
-// }
-// }
-// }
-//
-// else -> null
-// }
-// }
-//
-// fun getAttachmentConversationIcon(message: VkMessage?): UiImage? {
-// return message?.attachments?.let { attachments ->
-// if (attachments.isEmpty()) return null
-// if (attachments.size == 1 || isAttachmentsHaveOneType(attachments)) {
-// message.geoType?.let {
-// return UiImage.Resource(UiR.drawable.ic_map_marker)
-// }
-//
-// getAttachmentIconByType(attachments.first().type)
-// } else {
-// UiImage.Resource(UiR.drawable.ic_baseline_attach_file_24)
-// }
-// }
-// }
-//
-//
-//
-// fun getAttachmentUiText(
-// attachment: VkAttachment,
-// size: Int = 1,
-// ): UiText {
-// if (attachment.type.isMultiple()) {
-// return when (attachment.type) {
-// AttachmentType.PHOTO -> UiR.plurals.attachment_photos
-// AttachmentType.VIDEO -> UiR.plurals.attachment_videos
-// AttachmentType.AUDIO -> UiR.plurals.attachment_audios
-// AttachmentType.FILE -> UiR.plurals.attachment_files
-// else -> throw IllegalArgumentException("Unknown multiple type: ${attachment.type}")
-// }.let { resId -> UiText.QuantityResource(resId, size) }
-// }
-//
-// return when (attachment.type) {
-// AttachmentType.UNKNOWN,
-// AttachmentType.PHOTO,
-// AttachmentType.VIDEO,
-// AttachmentType.AUDIO,
-// AttachmentType.FILE -> {
-// throw IllegalArgumentException("Unknown multiple type: ${attachment.type}")
-// }
-//
-// AttachmentType.LINK -> UiR.string.message_attachments_link
-// AttachmentType.AUDIO_MESSAGE -> UiR.string.message_attachments_audio_message
-// AttachmentType.MINI_APP -> UiR.string.message_attachments_mini_app
-// AttachmentType.STICKER -> UiR.string.message_attachments_sticker
-// AttachmentType.GIFT -> UiR.string.message_attachments_gift
-// AttachmentType.WALL -> UiR.string.message_attachments_wall
-// AttachmentType.GRAFFITI -> UiR.string.message_attachments_graffiti
-// AttachmentType.POLL -> UiR.string.message_attachments_poll
-// AttachmentType.WALL_REPLY -> UiR.string.message_attachments_wall_reply
-// AttachmentType.CALL -> UiR.string.message_attachments_call
-// AttachmentType.GROUP_CALL_IN_PROGRESS -> UiR.string.message_attachments_call_in_progress
-// AttachmentType.CURATOR -> UiR.string.message_attachments_curator
-// AttachmentType.EVENT -> UiR.string.message_attachments_event
-// AttachmentType.STORY -> UiR.string.message_attachments_story
-// AttachmentType.WIDGET -> UiR.string.message_attachments_widget
-// AttachmentType.ARTIST -> UiR.string.message_attachments_artist
-// AttachmentType.AUDIO_PLAYLIST -> UiR.string.message_attachments_audio_playlist
-// AttachmentType.PODCAST -> UiR.string.message_attachments_podcast
-// }.let(UiText::Resource)
-// }
-//
-// fun getTextWithVisualizedMentions(
-// originalText: String,
-// mentionColor: Color,
-// ): AnnotatedString = buildAnnotatedString {
-// val regex = """\[(id|club)(\d+)\|([^]]+)]""".toRegex()
-//
-// val mentions = mutableListOf()
-//
-// var currentIndex = 0
-// val replacements = mutableListOf>()
-//
-// // TODO: 25/04/2024, Danil Nikolaev: check why not working ([id279494346|@iworld2rist] да убери ты Елену Шлипс от меня)
-// val result = regex.replace(originalText) { matchResult ->
-// val idPrefix = matchResult.groups[1]?.value.orEmpty()
-// val startIndex = matchResult.range.first
-// val endIndex = matchResult.range.last
-//
-// val id = matchResult.groups[2]?.value ?: ""
-// val text = matchResult.groups[3]?.value ?: ""
-//
-// val replaced =
-// text.substring(startIndex, endIndex + 1)
-// .replace("[$idPrefix$id|$text]", text)
-//
-// val indexRange =
-// (startIndex + currentIndex)..startIndex + currentIndex + replaced.length
-//
-// replacements.add(indexRange to replaced)
-//
-// mentions += MentionIndex(
-// id = id.toIntOrNull() ?: -1,
-// idPrefix = idPrefix,
-// indexRange = indexRange
-// )
-//
-// currentIndex += replaced.length - (endIndex - startIndex + 1)
-//
-// replaced
-// }
-//
-// append(result)
-//
-// mentions.forEach { mention ->
-// val startIndex = mention.indexRange.first
-// val endIndex = mention.indexRange.last
-//
-// addStyle(
-// style = SpanStyle(color = mentionColor),
-// start = startIndex,
-// end = endIndex
-// )
-// addStringAnnotation(
-// tag = mention.idPrefix,
-// annotation = mention.id.toString(),
-// start = startIndex,
-// end = endIndex
-// )
-// }
-// }
-//
-//
-//}
diff --git a/core/data/src/main/kotlin/com/meloda/app/fast/data/State.kt b/core/data/src/main/kotlin/com/meloda/app/fast/data/State.kt
index 18c726d9..64ced55a 100644
--- a/core/data/src/main/kotlin/com/meloda/app/fast/data/State.kt
+++ b/core/data/src/main/kotlin/com/meloda/app/fast/data/State.kt
@@ -2,10 +2,8 @@ package com.meloda.app.fast.data
import com.meloda.app.fast.network.OAuthErrorDomain
import com.meloda.app.fast.network.RestApiErrorDomain
+import com.meloda.app.fast.network.VkErrorCode
import com.slack.eithernet.ApiResult
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.filterIsInstance
-import kotlinx.coroutines.flow.map
sealed class State {
@@ -16,7 +14,7 @@ sealed class State {
sealed class Error : State() {
data class ApiError(
- val errorCode: Int,
+ val errorCode: VkErrorCode,
val errorMessage: String,
) : Error()
@@ -61,19 +59,9 @@ inline fun State.processState(
}
}
-inline fun Flow>.mapSuccess(
- crossinline transform: suspend (value: T) -> R
-): Flow = filterIsInstance>()
- .map { state -> transform.invoke(state.data) }
-
fun RestApiErrorDomain?.toStateApiError(): State.Error = when (this) {
null -> State.Error.ConnectionError
- else -> State.Error.ApiError(code, message)
-}
-
-fun OAuthErrorDomain?.toStateApiError(): State.Error = when (this) {
- null -> State.Error.ConnectionError
- else -> State.Error.OAuthError(this)
+ else -> State.Error.ApiError(VkErrorCode.parse(code), message)
}
fun ApiResult.mapToState() = when (this) {
diff --git a/core/data/src/main/kotlin/com/meloda/app/fast/data/api/auth/AuthRepository.kt b/core/data/src/main/kotlin/com/meloda/app/fast/data/api/auth/AuthRepository.kt
index 6ebfc4fa..0bf11055 100644
--- a/core/data/src/main/kotlin/com/meloda/app/fast/data/api/auth/AuthRepository.kt
+++ b/core/data/src/main/kotlin/com/meloda/app/fast/data/api/auth/AuthRepository.kt
@@ -1,18 +1,12 @@
package com.meloda.app.fast.data.api.auth
-import com.meloda.app.fast.model.api.requests.AuthDirectRequest
-import com.meloda.app.fast.model.api.responses.AuthDirectResponse
-import com.meloda.app.fast.model.api.responses.SendSmsResponse
-import com.meloda.app.fast.network.OAuthErrorDomain
+import com.meloda.app.fast.model.api.responses.ValidatePhoneResponse
+import com.meloda.app.fast.network.RestApiErrorDomain
import com.slack.eithernet.ApiResult
interface AuthRepository {
-// suspend fun auth(
-// params: AuthDirectRequest
-// ): ApiResult
-
- suspend fun sendSms(
+ suspend fun validatePhone(
validationSid: String
- ): SendSmsResponse
+ ): ApiResult
}
diff --git a/core/data/src/main/kotlin/com/meloda/app/fast/data/api/auth/AuthRepositoryImpl.kt b/core/data/src/main/kotlin/com/meloda/app/fast/data/api/auth/AuthRepositoryImpl.kt
index f6489814..fd32eab9 100644
--- a/core/data/src/main/kotlin/com/meloda/app/fast/data/api/auth/AuthRepositoryImpl.kt
+++ b/core/data/src/main/kotlin/com/meloda/app/fast/data/api/auth/AuthRepositoryImpl.kt
@@ -1,35 +1,20 @@
package com.meloda.app.fast.data.api.auth
-import com.meloda.app.fast.model.api.requests.AuthDirectRequest
-import com.meloda.app.fast.model.api.responses.AuthDirectResponse
-import com.meloda.app.fast.model.api.responses.SendSmsResponse
-import com.meloda.app.fast.network.OAuthErrorDomain
+import com.meloda.app.fast.model.api.responses.ValidatePhoneResponse
+import com.meloda.app.fast.network.RestApiErrorDomain
+import com.meloda.app.fast.network.mapApiDefault
import com.meloda.app.fast.network.service.auth.AuthService
import com.slack.eithernet.ApiResult
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
class AuthRepositoryImpl(
- private val authService: AuthService
+ private val service: AuthService
) : AuthRepository {
-// override suspend fun auth(
-// params: AuthDirectRequest
-// ): ApiResult {
-//
-// }
-
- // TODO: 05/05/2024, Danil Nikolaev: implement
- override suspend fun sendSms(
+ override suspend fun validatePhone(
validationSid: String
- ): SendSmsResponse = withContext(Dispatchers.IO) {
- SendSmsResponse(
- validationSid = null, delay = null, validationType = null, validationResend = null
-
- )
-// authService.sendSms(validationSid).mapResult(
-// successMapper = { response -> response.requireResponse() },
-// errorMapper = { error -> error?.toDomain() }
-// )
+ ): ApiResult = withContext(Dispatchers.IO) {
+ service.validatePhone(validationSid).mapApiDefault()
}
}
diff --git a/core/data/src/main/kotlin/com/meloda/app/fast/data/api/longpoll/LongPollRepositoryImpl.kt b/core/data/src/main/kotlin/com/meloda/app/fast/data/api/longpoll/LongPollRepositoryImpl.kt
index ff054f75..cf5d201b 100644
--- a/core/data/src/main/kotlin/com/meloda/app/fast/data/api/longpoll/LongPollRepositoryImpl.kt
+++ b/core/data/src/main/kotlin/com/meloda/app/fast/data/api/longpoll/LongPollRepositoryImpl.kt
@@ -6,7 +6,7 @@ import com.meloda.app.fast.model.api.requests.LongPollGetUpdatesRequest
import com.meloda.app.fast.model.api.requests.MessagesGetLongPollServerRequest
import com.meloda.app.fast.network.RestApiErrorDomain
import com.meloda.app.fast.network.mapApiResult
-import com.meloda.app.fast.network.mapResult
+import com.meloda.app.fast.network.mapDefault
import com.meloda.app.fast.network.service.longpoll.LongPollService
import com.meloda.app.fast.network.service.messages.MessagesService
import com.slack.eithernet.ApiResult
@@ -49,9 +49,7 @@ class LongPollRepositoryImpl(
mode = mode,
version = version
)
- longPollService.getResponse(serverUrl, requestModel.map).mapResult(
- successMapper = { response -> response },
- errorMapper = { error -> error?.toDomain() }
- )
+
+ longPollService.getResponse(serverUrl, requestModel.map).mapDefault()
}
}
diff --git a/core/datastore/build.gradle.kts b/core/datastore/build.gradle.kts
index d85cce98..136839e6 100644
--- a/core/datastore/build.gradle.kts
+++ b/core/datastore/build.gradle.kts
@@ -29,6 +29,7 @@ android {
dependencies {
api(projects.core.common)
+ api(projects.core.ui)
implementation(libs.koin.android)
}
diff --git a/core/datastore/src/main/kotlin/com/meloda/app/fast/datastore/UserSettings.kt b/core/datastore/src/main/kotlin/com/meloda/app/fast/datastore/UserSettings.kt
index 7257aa07..f19b4432 100644
--- a/core/datastore/src/main/kotlin/com/meloda/app/fast/datastore/UserSettings.kt
+++ b/core/datastore/src/main/kotlin/com/meloda/app/fast/datastore/UserSettings.kt
@@ -4,7 +4,7 @@ import android.content.res.Resources
import android.os.PowerManager
import android.util.Log
import com.meloda.app.fast.datastore.model.LongPollState
-import com.meloda.app.fast.datastore.model.ThemeConfig
+import com.meloda.app.fast.ui.model.ThemeConfig
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
diff --git a/core/designsystem/build.gradle.kts b/core/designsystem/build.gradle.kts
index dc6d4af4..81874cf7 100644
--- a/core/designsystem/build.gradle.kts
+++ b/core/designsystem/build.gradle.kts
@@ -36,16 +36,17 @@ android {
}
dependencies {
- // TODO: 05/05/2024, Danil Nikolaev: maybe remove
implementation(projects.core.common)
implementation(projects.core.datastore)
+ implementation(projects.core.ui)
implementation(libs.appcompat)
- implementation(libs.accompanist.permissions)
implementation(platform(libs.compose.bom))
implementation(libs.bundles.compose)
implementation(libs.haze)
implementation(libs.haze.materials)
+
+ debugImplementation(libs.compose.ui.tooling)
}
diff --git a/core/model/src/main/kotlin/com/meloda/app/fast/model/api/responses/AuthResponse.kt b/core/model/src/main/kotlin/com/meloda/app/fast/model/api/responses/AuthResponse.kt
index 3e0c0437..ff5ecca4 100644
--- a/core/model/src/main/kotlin/com/meloda/app/fast/model/api/responses/AuthResponse.kt
+++ b/core/model/src/main/kotlin/com/meloda/app/fast/model/api/responses/AuthResponse.kt
@@ -4,9 +4,18 @@ import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
-data class SendSmsResponse(
+data class ValidatePhoneResponse(
@Json(name = "sid") val validationSid: String?,
@Json(name = "delay") val delay: Int?,
@Json(name = "validation_type") val validationType: String?,
@Json(name = "validation_resend") val validationResend: String?
)
+
+@JsonClass(generateAdapter = true)
+data class ValidateLoginResponse(
+ @Json(name = "result") val result: String,
+ @Json(name = "sid") val sid: String,
+ @Json(name = "phone") val phone: String?,
+ @Json(name = "is_email") val isEmail: Boolean?,
+ @Json(name = "email_reg_allowed") val emailRegAllowed: Boolean?
+)
diff --git a/core/model/src/main/kotlin/com/meloda/app/fast/model/api/responses/OAuthResponse.kt b/core/model/src/main/kotlin/com/meloda/app/fast/model/api/responses/OAuthResponse.kt
index 04f53e1c..7514b416 100644
--- a/core/model/src/main/kotlin/com/meloda/app/fast/model/api/responses/OAuthResponse.kt
+++ b/core/model/src/main/kotlin/com/meloda/app/fast/model/api/responses/OAuthResponse.kt
@@ -3,6 +3,13 @@ package com.meloda.app.fast.model.api.responses
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
+@JsonClass(generateAdapter = true)
+data class AuthDirectErrorOnlyResponse(
+ @Json(name = "error") val error: String,
+ @Json(name = "error_description") val errorDescription: String?,
+ @Json(name = "error_type") val errorType: String?
+)
+
@JsonClass(generateAdapter = true)
data class AuthDirectResponse(
@Json(name = "access_token") val accessToken: String?,
@@ -35,3 +42,9 @@ data class AuthDirectResponse(
@Json(name = "restore_url") val restoreUrl: String
)
}
+
+@JsonClass(generateAdapter = true)
+data class GetAnonymousTokenResponse(
+ @Json(name = "token") val token: String,
+ @Json(name = "expired_at") val expiredAt: Int
+)
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/Extensions.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/Extensions.kt
index 2bca044d..98d386f5 100644
--- a/core/network/src/main/kotlin/com/meloda/app/fast/network/Extensions.kt
+++ b/core/network/src/main/kotlin/com/meloda/app/fast/network/Extensions.kt
@@ -32,37 +32,6 @@ fun
}
}
-fun
- ApiResult.mapOAuthResult(
- successMapper: (Success) -> SuccessDomain,
- errorMapper: (Error?) -> ErrorDomain?
-): ApiResult {
- if (BuildConfig.DEBUG) printStackTraceIfAny()
-
- return when (this) {
- is ApiResult.Success -> {
- ApiResult.success(successMapper(value))
- }
-
- is ApiResult.Failure.NetworkFailure -> {
- ApiResult.networkFailure(error)
- }
-
- is ApiResult.Failure.UnknownFailure -> {
- ApiResult.unknownFailure(error)
- }
-
- is ApiResult.Failure.HttpFailure -> {
-
- ApiResult.httpFailure(code, errorMapper(error))
- }
-
- is ApiResult.Failure.ApiFailure -> {
- ApiResult.apiFailure(errorMapper(error))
- }
- }
-}
-
fun , SuccessDomain : Any, ErrorDomain : Any>
ApiResult.mapApiResult(
successMapper: (Success) -> SuccessDomain,
@@ -86,30 +55,18 @@ fun , SuccessDomain : Any, ErrorDomain : Any>
}
}
+fun ApiResult.mapDefault(): ApiResult =
+ mapResult(
+ successMapper = { response -> response },
+ errorMapper = { error -> error?.toDomain() }
+ )
+
fun > ApiResult.mapApiDefault(): ApiResult =
mapResult(
successMapper = { response -> response.requireResponse() },
errorMapper = { error -> error?.toDomain() }
)
-//@OptIn(ExperimentalContracts::class)
-//inline fun OAuthResponse.fold(
-// onSuccess: (value: R) -> C,
-// onFailure: (failure: E) -> C,
-//): C {
-// contract {
-// callsInPlace(onSuccess, InvocationKind.AT_MOST_ONCE)
-// callsInPlace(onFailure, InvocationKind.AT_MOST_ONCE)
-// }
-// return when (this) {
-// is OAuthResponse.Success -> onSuccess(response)
-// is OAuthResponse.Error -> onFailure(error)
-// }
-//}
-
-fun ApiResult.isSuccess(): Boolean =
- this is ApiResult.Success
-
fun ApiResult.printStackTraceIfAny() {
val throwable = when (this) {
is ApiResult.Failure.NetworkFailure -> error
@@ -118,9 +75,3 @@ fun ApiResult.printStackTraceIfAny(
}
throwable?.printStackTrace()
}
-
-fun ApiResult.Failure.HttpFailure<*>?.tryCastToRestErrorDomain() =
- this?.error as? RestApiErrorDomain
-
-fun ApiResult.Failure.ApiFailure<*>?.tryCastToRestErrorDomain() =
- this?.error as? RestApiErrorDomain
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthError.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthError.kt
deleted file mode 100644
index ec3ea073..00000000
--- a/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthError.kt
+++ /dev/null
@@ -1,156 +0,0 @@
-package com.meloda.app.fast.network
-
-import com.squareup.moshi.Json
-import com.squareup.moshi.JsonClass
-
-// TODO: 09/05/2024, Danil Nikolaev: reimplement as sealed class
-@JsonClass(generateAdapter = true)
-open class OAuthError(
- @Json(name = "error") open val error: String,
- @Json(name = "error_description") open val errorDescription: String?,
- @Json(name = "error_type") open val errorType: String?
-)
-
-@JsonClass(generateAdapter = true)
-data class ValidationRequiredError(
- @Json(name = "error") override val error: String, // "need_validation"
- @Json(name = "error_description") override val errorDescription: String, // "sms sent, use code param" if sms method; "use app code" if 2fa app
- @Json(name = "validation_type") val validationType: String, // 2fa_app, 2sa_sms
- @Json(name = "validation_sid") val validationSid: String,
- @Json(name = "phone_mask") val phoneMask: String, // "+7 *** *** ** 50"
- @Json(name = "redirect_uri") val redirectUri: String,
- @Json(name = "validation_resend") val validationResend: String?, // Приходит, если для отправки кода нужно вызвать метод auth.validatePhone
- @Json(name = "cant_get_code_open_restore") val restoreIfCannotGetCode: Boolean?
-) : OAuthError(
- error = error,
- errorDescription = errorDescription,
- errorType = null
-)
-
-@JsonClass(generateAdapter = true)
-data class CaptchaRequiredError(
- @Json(name = "error") override val error: String, // "need_captcha"
- @Json(name = "captcha_sid") val captchaSid: String,
- @Json(name = "captcha_img") val captchaImage: String,
- @Json(name = "captcha_ts") val captchaTs: Double?,
- @Json(name = "captcha_ratio") val captchaRatio: Double?,
- @Json(name = "captcha_track") val captchaTrack: String?,
- @Json(name = "is_refresh_enabled") val isRefreshEnabled: Boolean?,
- @Json(name = "is_sound_captcha_available") val isSoundCaptchaAvailable: Boolean?
-) : OAuthError(
- error = error,
- errorDescription = null,
- errorType = null
-)
-
-@JsonClass(generateAdapter = true)
-data class UserBannedError(
- @Json(name = "error") override val error: String, // need_validation
- @Json(name = "error_description") override val errorDescription: String, // user has been banned
- @Json(name = "ban_info") val banInfo: BanInfo
-) : OAuthError(
- error = error,
- errorDescription = errorDescription,
- errorType = null
-) {
-
- @JsonClass(generateAdapter = true)
- data class BanInfo(
- @Json(name = "member_name") val memberName: String,
- @Json(name = "message") val message: String,
- @Json(name = "access_token") val accessToken: String,
- @Json(name = "restore_url") val restoreUrl: String
- )
-}
-
-@JsonClass(generateAdapter = true)
-data class InvalidCredentialsError(
- @Json(name = "error") override val error: String, // "invalid_client"
- @Json(name = "error_description") override val errorDescription: String,
- @Json(name = "error_type") override val errorType: String // "username_or_password_is_incorrect"
-) : OAuthError(
- error = error,
- errorDescription = errorDescription,
- errorType = errorType
-)
-
-@JsonClass(generateAdapter = true)
-data class WrongValidationCodeError(
- @Json(name = "error") override val error: String, // "invalid_request"
- @Json(name = "error_description") override val errorDescription: String,
- @Json(name = "error_type") override val errorType: String // "wrong_otp"
-) : OAuthError(
- error = error,
- errorDescription = errorDescription,
- errorType = errorType
-)
-
-@JsonClass(generateAdapter = true)
-data class WrongValidationCodeFormatError(
- @Json(name = "error") override val error: String, // "invalid_request"
- @Json(name = "error_description") override val errorDescription: String,
- @Json(name = "error_type") override val errorType: String // "otp_format_is_incorrect"
-) : OAuthError(
- error = error,
- errorDescription = errorDescription,
- errorType = errorType
-)
-
-@JsonClass(generateAdapter = true)
-data class TooManyTriesError(
- @Json(name = "error") override val error: String, // "9;Flood control"
- @Json(name = "error_description") override val errorDescription: String,
- @Json(name = "error_type") override val errorType: String // "password_bruteforce_attempt"
-) : OAuthError(
- error = error,
- errorDescription = errorDescription,
- errorType = errorType
-)
-
-fun OAuthError.toDomain(): OAuthErrorDomain? = when (this) {
- is ValidationRequiredError -> {
- OAuthErrorDomain.ValidationRequiredError(
- description = errorDescription,
- validationType = ValidationType.parse(validationType),
- validationSid = validationSid,
- phoneMask = phoneMask,
- redirectUri = redirectUri,
- validationResend = validationResend,
- restoreIfCannotGetCode = restoreIfCannotGetCode
- )
- }
-
- is CaptchaRequiredError -> {
- OAuthErrorDomain.CaptchaRequiredError(
- captchaSid = captchaSid,
- captchaImageUrl = captchaImage
- )
- }
-
- is UserBannedError -> {
- OAuthErrorDomain.UserBannedError(
- memberName = banInfo.memberName,
- message = banInfo.message,
- accessToken = banInfo.accessToken,
- restoreUrl = banInfo.restoreUrl
- )
- }
-
- is InvalidCredentialsError -> {
- OAuthErrorDomain.InvalidCredentialsError
- }
-
- is WrongValidationCodeError -> {
- OAuthErrorDomain.WrongValidationCode
- }
-
- is WrongValidationCodeFormatError -> {
- OAuthErrorDomain.WrongValidationCodeFormat
- }
-
- is TooManyTriesError -> {
- OAuthErrorDomain.TooManyTriesError
- }
-
- else -> null
-}
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthErrorDomain.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthErrorDomain.kt
index f1c526f0..8b3bfb8d 100644
--- a/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthErrorDomain.kt
+++ b/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthErrorDomain.kt
@@ -2,6 +2,8 @@ package com.meloda.app.fast.network
sealed class OAuthErrorDomain {
+ data object UnknownError : OAuthErrorDomain()
+
data class ValidationRequiredError(
val description: String,
val validationType: ValidationType,
@@ -28,6 +30,4 @@ sealed class OAuthErrorDomain {
data object WrongValidationCode : OAuthErrorDomain()
data object WrongValidationCodeFormat : OAuthErrorDomain()
data object TooManyTriesError: OAuthErrorDomain()
-
- data object UnknownError : OAuthErrorDomain()
}
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthResponse.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthResponse.kt
index 4446e0ed..7e0325ab 100644
--- a/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthResponse.kt
+++ b/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthResponse.kt
@@ -1,8 +1,6 @@
package com.meloda.app.fast.network
sealed interface OAuthResponse {
-
data class Success(val response: R) : OAuthResponse
-
data class Error(val error: E?) : OAuthResponse
}
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthResultCallFactory.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthResultCallFactory.kt
index 91f6b2a8..ea32438c 100644
--- a/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthResultCallFactory.kt
+++ b/core/network/src/main/kotlin/com/meloda/app/fast/network/OAuthResultCallFactory.kt
@@ -1,6 +1,6 @@
package com.meloda.app.fast.network
-import android.util.Log
+import com.meloda.app.fast.model.api.responses.AuthDirectErrorOnlyResponse
import com.squareup.moshi.Moshi
import okhttp3.Request
import okio.Timeout
@@ -28,10 +28,10 @@ class OAuthResultCallFactory(private val moshi: Moshi) : CallAdapter.Factory() {
if (getRawType(callInnerType) == OAuthResponse::class.java) {
if (callInnerType is ParameterizedType) {
val resultInnerType = getParameterUpperBound(0, callInnerType)
- return ResultCallAdapter(resultInnerType, moshi)
+ return ResultCallAdapter(resultInnerType, moshi)
}
- return ResultCallAdapter(Nothing::class.java, moshi)
+ return ResultCallAdapter(Nothing::class.java, moshi)
}
}
}
@@ -60,36 +60,36 @@ internal abstract class CallDelegate(protected val proxy: Call) : C
abstract fun cloneImpl(): Call
}
-private class ResultCallAdapter(
+private class ResultCallAdapter(
private val type: Type,
private val moshi: Moshi
-) : CallAdapter>> {
+) : CallAdapter>> {
override fun responseType() = type
- override fun adapt(call: Call): Call> = ResultCall(call, moshi)
+ override fun adapt(call: Call): Call> =
+ ResultCall(call, moshi)
}
-internal class ResultCall(
+internal class ResultCall(
proxy: Call,
private val moshi: Moshi
-) : CallDelegate>(proxy) {
+) : CallDelegate>(proxy) {
- override fun enqueueImpl(callback: Callback>) {
+ override fun enqueueImpl(callback: Callback>) {
proxy.enqueue(ResultCallback(this, callback, moshi))
}
- override fun cloneImpl(): ResultCall {
+ override fun cloneImpl(): ResultCall {
return ResultCall(proxy.clone(), moshi)
}
- private class ResultCallback(
- private val proxy: ResultCall,
- private val callback: Callback>,
+ private class ResultCallback(
+ private val proxy: ResultCall,
+ private val callback: Callback>,
private val moshi: Moshi
) : Callback {
- @Suppress("UNCHECKED_CAST")
override fun onResponse(call: Call, response: Response) {
when {
response.isSuccessful -> {
@@ -106,92 +106,19 @@ internal class ResultCall(
else -> {
val errorBodyString = response.errorBody()?.string()
- val baseError: OAuthError = moshi.adapter(OAuthError::class.java)
+ val baseError = moshi.adapter(AuthDirectErrorOnlyResponse::class.java)
.fromJson(errorBodyString.orEmpty()) ?: return
- val error: OAuthError? = when (baseError.error) {
- "9;Flood control" -> {
- moshi.adapter(TooManyTriesError::class.java)
- .fromJson(errorBodyString.orEmpty())
- }
-
- "invalid_client" -> {
- moshi.adapter(InvalidCredentialsError::class.java)
- .fromJson(errorBodyString.orEmpty())
- }
-
- "need_captcha" -> {
- moshi.adapter(CaptchaRequiredError::class.java)
- .fromJson(errorBodyString.orEmpty())
- }
-
- "invalid_request" -> {
- when (val type = baseError.errorType) {
- "wrong_otp" -> {
- moshi.adapter(WrongValidationCodeError::class.java)
- .fromJson(errorBodyString.orEmpty())
- }
-
- "otp_format_is_incorrect" -> {
- moshi.adapter(WrongValidationCodeFormatError::class.java)
- .fromJson(errorBodyString.orEmpty())
- }
-
- else -> {
- Log.d(
- "ResultCallback",
- "onResponse: invalid_request; error_type: $type"
- )
-
- error("Unknown type: $type")
- }
- }
- }
-
- "need_validation" -> {
- when (val description = baseError.errorDescription) {
- "user has been banned" -> {
- moshi.adapter(UserBannedError::class.java)
- .fromJson(errorBodyString.orEmpty())
- }
-
- "sms sent, use code param",
- "use app code" -> {
- moshi.adapter(ValidationRequiredError::class.java)
- .fromJson(errorBodyString.orEmpty())
- }
-
- else -> {
- Log.d(
- "ResultCallback",
- "onResponse: need_validation; description: $description"
- )
-
- error("Unknown description: $description")
- }
- }
- }
-
- else -> null
- }
-
- error?.let {
- callback.onResponse(
- proxy,
- Response.success(OAuthResponse.Error(error) as OAuthResponse)
- )
- }
+ callback.onResponse(
+ proxy,
+ Response.success(OAuthResponse.Error(baseError) as OAuthResponse)
+ )
}
}
}
override fun onFailure(call: Call, error: Throwable) {
- val b = error
- // TODO: 12/04/2024, Danil Nikolaev: handle
-// callback.onResponse(
-// proxy,
-// Response.success(OAuthAnswer.Error((throwable = error)))
-// )
+ throw error
}
}
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/ValidationType.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/ValidationType.kt
index ec23e4a4..75115751 100644
--- a/core/network/src/main/kotlin/com/meloda/app/fast/network/ValidationType.kt
+++ b/core/network/src/main/kotlin/com/meloda/app/fast/network/ValidationType.kt
@@ -1,9 +1,10 @@
package com.meloda.app.fast.network;
enum class ValidationType(val value: String) {
- APP("2fa_app"), SMS("2fa_sms");
+ APP("2fa_app"),
+ SMS("2fa_sms");
- companion object {
- fun parse(value: String): ValidationType = entries.first { it.value == value }
- }
- }
+ companion object {
+ fun parse(value: String): ValidationType = entries.first { it.value == value }
+ }
+}
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/VkErrorCode.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/VkErrorCode.kt
new file mode 100644
index 00000000..f861d807
--- /dev/null
+++ b/core/network/src/main/kotlin/com/meloda/app/fast/network/VkErrorCode.kt
@@ -0,0 +1,52 @@
+package com.meloda.app.fast.network
+
+enum class VkErrorCode(val code: Int) {
+ UNKNOWN_ERROR(1),
+ APP_DISABLED(2),
+ UNKNOWN_METHOD(3),
+ INVALID_SIGNATURE(4),
+ USER_AUTHORIZATION_FAILED(5),
+ TOO_MANY_REQUESTS(6),
+ NO_RIGHTS(7),
+ BAD_REQUEST(8),
+ TOO_MANY_SIMILAR_ACTIONS(9),
+ INTERNAL_SERVER_ERROR(10),
+ IN_TEST_MODE(11),
+ EXECUTE_CODE_COMPILE_ERROR(12),
+ EXECUTE_CODE_RUNTIME_ERROR(13),
+ CAPTCHA_NEEDED(14),
+ ACCESS_DENIED(15),
+ REQUIRES_REQUESTS_OVER_HTTPS(16),
+ VALIDATION_REQUIRED(17),
+ USER_BANNED_OR_DELETED(18),
+ ACTION_PROHIBITED(20),
+ ACTION_ALLOWED_ONLY_FOR_STANDALONE(21),
+ METHOD_OFF(23),
+ CONFIRMATION_REQUIRED(24),
+ PARAMETER_IS_NOT_SPECIFIED(100),
+ INCORRECT_APP_ID(101),
+ OUT_OF_LIMITS(103),
+ INCORRECT_USER_ID(113),
+ INCORRECT_TIMESTAMP(150),
+ ACCESS_TO_ALBUM_DENIED(200),
+ ACCESS_TO_AUDIO_DENIED(201),
+ ACCESS_TO_GROUP_DENIED(203),
+ ALBUM_IS_FULL(300),
+ ACTION_DENIED(500),
+ PERMISSION_DENIED(600),
+ CANNOT_SEND_MESSAGE_BLACK_LIST(900),
+ CANNOT_SEND_MESSAGE_GROUP(901),
+ INVALID_DOC_ID(1150),
+ INVALID_DOC_TITLE(1152),
+ ACCESS_TO_DOC_DENIED(1153),
+
+ SOME_AUTH_ERROR(104),
+ ACCESS_TOKEN_EXPIRED(1117);
+
+ companion object {
+ fun parse(code: Int): VkErrorCode = entries.firstOrNull { it.code == code }
+ ?: throw IllegalArgumentException("Unknown error with value: $code")
+ }
+}
+
+
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/VkErrorCodes.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/VkErrorCodes.kt
deleted file mode 100644
index c4faa244..00000000
--- a/core/network/src/main/kotlin/com/meloda/app/fast/network/VkErrorCodes.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.meloda.app.fast.network
-
-@Suppress("unused")
-object VkErrorCodes {
- const val UnknownError = 1
- const val AppDisabled = 2
- const val UnknownMethod = 3
- const val InvalidSignature = 4
- const val UserAuthorizationFailed = 5
- const val TooManyRequests = 6
- const val NoRights = 7
- const val BadRequest = 8
- const val TooManySimilarActions = 9
- const val InternalServerError = 10
- const val InTestMode = 11
- const val ExecuteCodeCompileError = 12
- const val ExecuteCodeRuntimeError = 13
- const val CaptchaNeeded = 14
- const val AccessDenied = 15
- const val RequiresRequestsOverHttps = 16
- const val ValidationRequired = 17
- const val UserBannedOrDeleted = 18
- const val ActionProhibited = 20
- const val ActionAllowedOnlyForStandalone = 21
- const val MethodOff = 23
- const val ConfirmationRequired = 24
- const val ParameterIsNotSpecified = 100
- const val IncorrectAppId = 101
- const val OutOfLimits = 103
- const val IncorrectUserId = 113
- const val IncorrectTimestamp = 150
- const val AccessToAlbumDenied = 200
- const val AccessToAudioDenied = 201
- const val AccessToGroupDenied = 203
- const val AlbumIsFull = 300
- const val ActionDenied = 500
- const val PermissionDenied = 600
- const val CannotSendMessageBlackList = 900
- const val CannotSendMessageGroup = 901
- const val InvalidDocId = 1150
- const val InvalidDocTitle = 1152
- const val AccessToDocDenied = 1153
-
- const val AccessTokenExpired = 1117
-}
-
-object VkOAuthErrors {
- const val UNKNOWN = "unknown_error"
-
- const val NEED_VALIDATION = "need_validation"
- const val NEED_CAPTCHA = "need_captcha"
- const val INVALID_CLIENT = "invalid_client"
- const val INVALID_REQUEST = "invalid_request"
- const val FLOOD_CONTROL = "9;Flood control"
-
-}
-
-object VkErrorTypes {
- const val WRONG_OTP_FORMAT = "otp_format_is_incorrect"
- const val WRONG_OTP = "wrong_otp"
- const val PASSWORD_BRUTEFORCE_ATTEMPT = "password_bruteforce_attempt"
-}
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/VkOAuthError.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/VkOAuthError.kt
new file mode 100644
index 00000000..f21984d2
--- /dev/null
+++ b/core/network/src/main/kotlin/com/meloda/app/fast/network/VkOAuthError.kt
@@ -0,0 +1,16 @@
+package com.meloda.app.fast.network
+
+enum class VkOAuthError(val value: String) {
+ UNKNOWN("unknown_error"),
+
+ NEED_VALIDATION("need_validation"),
+ NEED_CAPTCHA("need_captcha"),
+ INVALID_CLIENT("invalid_client"),
+ INVALID_REQUEST("invalid_request"),
+ FLOOD_CONTROL("9;Flood control");
+
+ companion object {
+ fun parse(value: String): VkOAuthError = entries.firstOrNull { it.value == value }
+ ?: throw IllegalArgumentException("Unknown error with value: $value")
+ }
+}
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/VkOAuthErrorType.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/VkOAuthErrorType.kt
new file mode 100644
index 00000000..54093971
--- /dev/null
+++ b/core/network/src/main/kotlin/com/meloda/app/fast/network/VkOAuthErrorType.kt
@@ -0,0 +1,12 @@
+package com.meloda.app.fast.network;
+
+enum class VkOAuthErrorType(val value: String) {
+ WRONG_OTP_FORMAT("otp_format_is_incorrect"),
+ WRONG_OTP("wrong_otp"),
+ PASSWORD_BRUTEFORCE_ATTEMPT("password_bruteforce_attempt");
+
+ companion object {
+ fun parse(value: String): VkOAuthErrorType = entries.firstOrNull { it.value == value }
+ ?: throw IllegalArgumentException("Unknown error type with value: $value")
+ }
+}
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/service/auth/AuthService.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/service/auth/AuthService.kt
index 64ce4558..6d017f1f 100644
--- a/core/network/src/main/kotlin/com/meloda/app/fast/network/service/auth/AuthService.kt
+++ b/core/network/src/main/kotlin/com/meloda/app/fast/network/service/auth/AuthService.kt
@@ -1,14 +1,23 @@
package com.meloda.app.fast.network.service.auth
-import com.meloda.app.fast.model.api.responses.SendSmsResponse
+import com.meloda.app.fast.model.api.responses.ValidateLoginResponse
+import com.meloda.app.fast.model.api.responses.ValidatePhoneResponse
import com.meloda.app.fast.network.ApiResponse
import com.meloda.app.fast.network.RestApiError
import com.slack.eithernet.ApiResult
import retrofit2.http.GET
import retrofit2.http.Query
+import retrofit2.http.QueryMap
interface AuthService {
- @GET(AuthUrls.SEND_SMS)
- suspend fun sendSms(@Query("sid") validationSid: String): ApiResult, RestApiError>
+ @GET(AuthUrls.VALIDATE_PHONE)
+ suspend fun validatePhone(
+ @Query("sid") validationSid: String
+ ): ApiResult, RestApiError>
+
+ @GET(AuthUrls.VALIDATE_LOGIN)
+ suspend fun validateLogin(
+ @QueryMap param: Map
+ ): ApiResult, RestApiError>
}
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/service/auth/AuthUrls.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/service/auth/AuthUrls.kt
index fe89b800..bfce1fe4 100644
--- a/core/network/src/main/kotlin/com/meloda/app/fast/network/service/auth/AuthUrls.kt
+++ b/core/network/src/main/kotlin/com/meloda/app/fast/network/service/auth/AuthUrls.kt
@@ -3,6 +3,8 @@ package com.meloda.app.fast.network.service.auth
import com.meloda.app.fast.common.AppConstants
object AuthUrls {
+ private const val URL = AppConstants.URL_API
- const val SEND_SMS = "${AppConstants.URL_API}/auth.validatePhone"
+ const val VALIDATE_PHONE = "$URL/auth.validatePhone"
+ const val VALIDATE_LOGIN = "$URL/auth.validateLogin"
}
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/service/oauth/OAuthService.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/service/oauth/OAuthService.kt
index ed395982..c716b90e 100644
--- a/core/network/src/main/kotlin/com/meloda/app/fast/network/service/oauth/OAuthService.kt
+++ b/core/network/src/main/kotlin/com/meloda/app/fast/network/service/oauth/OAuthService.kt
@@ -1,6 +1,7 @@
package com.meloda.app.fast.network.service.oauth
import com.meloda.app.fast.model.api.responses.AuthDirectResponse
+import com.meloda.app.fast.model.api.responses.GetAnonymousTokenResponse
import com.slack.eithernet.ApiResult
import com.slack.eithernet.DecodeErrorBody
import retrofit2.http.GET
@@ -11,6 +12,12 @@ interface OAuthService {
@DecodeErrorBody
@GET(OAuthUrls.DIRECT_AUTH)
suspend fun auth(
- @QueryMap param: Map
+ @QueryMap param: Map
): ApiResult
+
+ @DecodeErrorBody
+ @GET(OAuthUrls.GET_ANONYMOUS_TOKEN)
+ suspend fun getAnonymousToken(
+ @QueryMap param: Map
+ ): ApiResult
}
diff --git a/core/network/src/main/kotlin/com/meloda/app/fast/network/service/oauth/OAuthUrls.kt b/core/network/src/main/kotlin/com/meloda/app/fast/network/service/oauth/OAuthUrls.kt
index b348f189..87562ea6 100644
--- a/core/network/src/main/kotlin/com/meloda/app/fast/network/service/oauth/OAuthUrls.kt
+++ b/core/network/src/main/kotlin/com/meloda/app/fast/network/service/oauth/OAuthUrls.kt
@@ -3,6 +3,8 @@ package com.meloda.app.fast.network.service.oauth
import com.meloda.app.fast.common.AppConstants
object OAuthUrls {
+ private const val URL = AppConstants.URL_OAUTH
- const val DIRECT_AUTH = "${AppConstants.URL_OAUTH}/token"
+ const val DIRECT_AUTH = "$URL/token"
+ const val GET_ANONYMOUS_TOKEN = "$URL/get_anonym_token"
}
diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts
index 42ee01b4..660b6919 100644
--- a/core/ui/build.gradle.kts
+++ b/core/ui/build.gradle.kts
@@ -32,9 +32,14 @@ android {
}
dependencies {
- api(projects.core.designsystem)
+ implementation(projects.core.common)
api(projects.core.model)
+ implementation(libs.haze)
+ implementation(libs.haze.materials)
+
implementation(platform(libs.compose.bom))
implementation(libs.bundles.compose)
+
+ debugImplementation(libs.compose.ui.tooling)
}
diff --git a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/AutoFill.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/basic/AutoFill.kt
similarity index 99%
rename from core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/AutoFill.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/basic/AutoFill.kt
index 9298dea5..0244eb51 100644
--- a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/AutoFill.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/basic/AutoFill.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.designsystem
+package com.meloda.app.fast.ui.basic
import android.os.Build
import android.view.autofill.AutofillManager
diff --git a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/ContentAlpha.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/basic/ContentAlpha.kt
similarity index 98%
rename from core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/ContentAlpha.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/basic/ContentAlpha.kt
index ef32e974..044cff4b 100644
--- a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/ContentAlpha.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/basic/ContentAlpha.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.designsystem
+package com.meloda.app.fast.ui.basic
/*
* Copyright 2020 The Android Open Source Project
@@ -22,6 +22,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.compositionLocalOf
import androidx.compose.ui.graphics.luminance
+import com.meloda.app.fast.ui.util.isUsingDarkTheme
/**
* Default alpha levels used by Material components.
diff --git a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/LocalContentAlpha.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/basic/LocalContentAlpha.kt
similarity index 92%
rename from core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/LocalContentAlpha.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/basic/LocalContentAlpha.kt
index 45671625..8e95e9a5 100644
--- a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/LocalContentAlpha.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/basic/LocalContentAlpha.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.designsystem
+package com.meloda.app.fast.ui.basic
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
diff --git a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/Dots.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/AnimatedDots.kt
similarity index 98%
rename from feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/Dots.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/AnimatedDots.kt
index 195ad5bc..32a09a64 100644
--- a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/Dots.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/AnimatedDots.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.conversations
+package com.meloda.app.fast.ui.components
// TODO: 26.08.2023, Danil Nikolaev: rewrite
@@ -264,7 +264,7 @@ fun DotsCollision() {
animationSpec = infiniteRepeatable(animation = keyframes {
durationMillis = delayUnit * 3
0f at 0 using LinearEasing
- -maxOffset at delayUnit / 2 using LinearEasing
+ maxOffset at delayUnit / 2 using LinearEasing
0f at delayUnit
}), label = ""
)
diff --git a/core/ui/src/main/kotlin/com/meloda/app/fast/ui/ErrorView.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/ErrorView.kt
similarity index 83%
rename from core/ui/src/main/kotlin/com/meloda/app/fast/ui/ErrorView.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/ErrorView.kt
index f69491a4..fc59558e 100644
--- a/core/ui/src/main/kotlin/com/meloda/app/fast/ui/ErrorView.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/ErrorView.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.ui
+package com.meloda.app.fast.ui.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@@ -11,6 +11,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
@Composable
@@ -40,3 +41,12 @@ fun ErrorView(
}
}
}
+
+@Preview
+@Composable
+private fun ErrorViewPreview() {
+ ErrorView(
+ text = "Some error occurred",
+ buttonText = "Restart"
+ )
+}
diff --git a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/components/FullScreenLoader.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/FullScreenLoader.kt
similarity index 77%
rename from core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/components/FullScreenLoader.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/FullScreenLoader.kt
index 9c487b95..7a08d294 100644
--- a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/components/FullScreenLoader.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/FullScreenLoader.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.designsystem.components
+package com.meloda.app.fast.ui.components
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
@@ -7,6 +7,7 @@ import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.tooling.preview.Preview
@Composable
fun FullScreenLoader(modifier: Modifier = Modifier) {
@@ -19,3 +20,9 @@ fun FullScreenLoader(modifier: Modifier = Modifier) {
CircularProgressIndicator()
}
}
+
+@Preview
+@Composable
+private fun FullScreenLoaderPreview() {
+ FullScreenLoader()
+}
diff --git a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/MaterialDialog.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/MaterialDialog.kt
similarity index 98%
rename from core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/MaterialDialog.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/MaterialDialog.kt
index 4111591c..bb9101b2 100644
--- a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/MaterialDialog.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/MaterialDialog.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.designsystem
+package com.meloda.app.fast.ui.components
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
@@ -35,7 +35,9 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
import com.meloda.app.fast.common.UiText
import com.meloda.app.fast.common.parseString
-import com.meloda.app.fast.designsystem.ImmutableList.Companion.toImmutableList
+import com.meloda.app.fast.ui.util.ImmutableList
+import com.meloda.app.fast.ui.util.ImmutableList.Companion.toImmutableList
+import com.meloda.app.fast.ui.util.getString
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -239,7 +241,7 @@ fun MaterialDialog(
}
}
-// TODO: 08.04.2023, Danil Nikolaev: refactor this
+// TODO: 08.04.2023, Danil Nikolaev: remove this
@Deprecated("need refactoring")
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -452,8 +454,9 @@ fun MaterialDialog(
}
}
+
@Composable
-private fun AlertItems(
+fun AlertItems(
selectionType: ItemsSelectionType,
items: ImmutableList,
onItemClick: ((index: Int) -> Unit)? = null,
diff --git a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/components/NoItemsView.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/NoItemsView.kt
similarity index 74%
rename from core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/components/NoItemsView.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/NoItemsView.kt
index d60de134..f790d984 100644
--- a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/components/NoItemsView.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/NoItemsView.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.designsystem.components
+package com.meloda.app.fast.ui.components
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
@@ -8,7 +8,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
-import com.meloda.app.fast.designsystem.R
+import androidx.compose.ui.tooling.preview.Preview
+import com.meloda.app.fast.ui.R
@Composable
fun NoItemsView(
@@ -25,3 +26,11 @@ fun NoItemsView(
)
}
}
+
+@Preview
+@Composable
+private fun NoItemsViewPreview() {
+ NoItemsView(
+ customText = "Nothing here..."
+ )
+}
diff --git a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/TextFieldErrorText.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/TextFieldError.kt
similarity index 84%
rename from core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/TextFieldErrorText.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/TextFieldError.kt
index 212d8a13..3cb8f9ab 100644
--- a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/TextFieldErrorText.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/components/TextFieldError.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.designsystem
+package com.meloda.app.fast.ui.components
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
@@ -10,8 +10,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
+import com.meloda.app.fast.ui.R
-@Preview
@Composable
fun TextFieldErrorText(
modifier: Modifier = Modifier,
@@ -30,3 +30,9 @@ fun TextFieldErrorText(
)
}
}
+
+@Preview
+@Composable
+private fun TextFieldErrorPreview() {
+ TextFieldErrorText(text = "Error")
+}
diff --git a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/TabItem.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/model/TabItem.kt
similarity index 73%
rename from core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/TabItem.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/model/TabItem.kt
index 5d32f63c..b13f1d6b 100644
--- a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/TabItem.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/model/TabItem.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.designsystem
+package com.meloda.app.fast.ui.model
data class TabItem(
val titleResId: Int?,
diff --git a/core/datastore/src/main/kotlin/com/meloda/app/fast/datastore/model/ThemeConfig.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/model/ThemeConfig.kt
similarity index 85%
rename from core/datastore/src/main/kotlin/com/meloda/app/fast/datastore/model/ThemeConfig.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/model/ThemeConfig.kt
index a63bbb5c..41cebc4d 100644
--- a/core/datastore/src/main/kotlin/com/meloda/app/fast/datastore/model/ThemeConfig.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/model/ThemeConfig.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.datastore.model
+package com.meloda.app.fast.ui.model
data class ThemeConfig(
val usingDarkStyle: Boolean,
diff --git a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/AppTheme.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/theme/AppTheme.kt
similarity index 97%
rename from core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/AppTheme.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/theme/AppTheme.kt
index 30f9f8d9..8841b650 100644
--- a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/AppTheme.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/theme/AppTheme.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.designsystem
+package com.meloda.app.fast.ui.theme
import android.app.Activity
import android.os.Build
@@ -20,8 +20,8 @@ import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.core.view.WindowCompat
-import com.meloda.app.fast.datastore.model.ThemeConfig
-import com.meloda.app.fast.designsystem.colorschemes.ClassicColorScheme
+import com.meloda.app.fast.ui.R
+import com.meloda.app.fast.ui.model.ThemeConfig
import dev.chrisbanes.haze.HazeState
private val googleSansFonts = FontFamily(
diff --git a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/colorschemes/ClassicColorScheme.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/theme/ClassicColorScheme.kt
similarity index 99%
rename from core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/colorschemes/ClassicColorScheme.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/theme/ClassicColorScheme.kt
index 0c26289c..7227e685 100644
--- a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/colorschemes/ClassicColorScheme.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/theme/ClassicColorScheme.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.designsystem.colorschemes
+package com.meloda.app.fast.ui.theme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.lightColorScheme
diff --git a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/Extensions.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/util/Extensions.kt
similarity index 80%
rename from core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/Extensions.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/util/Extensions.kt
index a8313c81..1aa83481 100644
--- a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/Extensions.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/util/Extensions.kt
@@ -1,8 +1,7 @@
-package com.meloda.app.fast.designsystem
+package com.meloda.app.fast.ui.util
import android.content.res.Configuration
import android.view.KeyEvent
-import androidx.appcompat.app.AppCompatDelegate
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
@@ -17,17 +16,17 @@ import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import com.meloda.app.fast.common.UiText
import com.meloda.app.fast.common.util.AndroidUtils
-import com.meloda.app.fast.datastore.SettingsController
-import com.meloda.app.fast.datastore.SettingsKeys
@Composable
fun isUsingDarkTheme(): Boolean {
- val nightThemeMode = SettingsController.getInt(
- SettingsKeys.KEY_APPEARANCE_DARK_THEME,
- SettingsKeys.DEFAULT_VALUE_APPEARANCE_DARK_THEME
- )
- val appForceDarkMode = nightThemeMode == AppCompatDelegate.MODE_NIGHT_YES
- val appBatterySaver = nightThemeMode == AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY
+// val nightThemeMode = AppCompatDelegate.MODE_NIGHT_YES
+
+// SettingsController.getInt(
+// SettingsKeys.KEY_APPEARANCE_DARK_THEME,
+// SettingsKeys.DEFAULT_VALUE_APPEARANCE_DARK_THEME
+// )
+// val appForceDarkMode = nightThemeMode == AppCompatDelegate.MODE_NIGHT_YES
+// val appBatterySaver = nightThemeMode == AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY
val context = LocalContext.current
@@ -37,7 +36,8 @@ fun isUsingDarkTheme(): Boolean {
val isSystemUsingDarkTheme =
systemUiNightMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
- return appForceDarkMode || (appBatterySaver && isSystemBatterySaver) || (!appBatterySaver && isSystemUsingDarkTheme && nightThemeMode == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
+ return true
+// return appForceDarkMode || (appBatterySaver && isSystemBatterySaver) || (!appBatterySaver && isSystemUsingDarkTheme && nightThemeMode == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
}
@Composable
diff --git a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/ImmutableList.kt b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/util/ImmutableList.kt
similarity index 97%
rename from core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/ImmutableList.kt
rename to core/ui/src/main/kotlin/com/meloda/app/fast/ui/util/ImmutableList.kt
index 765a88fc..356964be 100644
--- a/core/designsystem/src/main/kotlin/com/meloda/app/fast/designsystem/ImmutableList.kt
+++ b/core/ui/src/main/kotlin/com/meloda/app/fast/ui/util/ImmutableList.kt
@@ -1,4 +1,4 @@
-package com.meloda.app.fast.designsystem
+package com.meloda.app.fast.ui.util
import androidx.compose.runtime.Immutable
diff --git a/core/designsystem/src/main/res/drawable/baseline_account_circle_24.xml b/core/ui/src/main/res/drawable/baseline_account_circle_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/baseline_account_circle_24.xml
rename to core/ui/src/main/res/drawable/baseline_account_circle_24.xml
diff --git a/core/designsystem/src/main/res/drawable/baseline_chat_24.xml b/core/ui/src/main/res/drawable/baseline_chat_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/baseline_chat_24.xml
rename to core/ui/src/main/res/drawable/baseline_chat_24.xml
diff --git a/core/designsystem/src/main/res/drawable/baseline_people_alt_24.xml b/core/ui/src/main/res/drawable/baseline_people_alt_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/baseline_people_alt_24.xml
rename to core/ui/src/main/res/drawable/baseline_people_alt_24.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_account_circle_cut.xml b/core/ui/src/main/res/drawable/ic_account_circle_cut.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_account_circle_cut.xml
rename to core/ui/src/main/res/drawable/ic_account_circle_cut.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_arrow_end.xml b/core/ui/src/main/res/drawable/ic_arrow_end.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_arrow_end.xml
rename to core/ui/src/main/res/drawable/ic_arrow_end.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_audio.xml b/core/ui/src/main/res/drawable/ic_attachment_audio.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_audio.xml
rename to core/ui/src/main/res/drawable/ic_attachment_audio.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_call.xml b/core/ui/src/main/res/drawable/ic_attachment_call.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_call.xml
rename to core/ui/src/main/res/drawable/ic_attachment_call.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_file.xml b/core/ui/src/main/res/drawable/ic_attachment_file.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_file.xml
rename to core/ui/src/main/res/drawable/ic_attachment_file.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_forwarded_message.xml b/core/ui/src/main/res/drawable/ic_attachment_forwarded_message.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_forwarded_message.xml
rename to core/ui/src/main/res/drawable/ic_attachment_forwarded_message.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_forwarded_messages.xml b/core/ui/src/main/res/drawable/ic_attachment_forwarded_messages.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_forwarded_messages.xml
rename to core/ui/src/main/res/drawable/ic_attachment_forwarded_messages.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_gift.xml b/core/ui/src/main/res/drawable/ic_attachment_gift.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_gift.xml
rename to core/ui/src/main/res/drawable/ic_attachment_gift.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_graffiti.xml b/core/ui/src/main/res/drawable/ic_attachment_graffiti.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_graffiti.xml
rename to core/ui/src/main/res/drawable/ic_attachment_graffiti.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_group_call.xml b/core/ui/src/main/res/drawable/ic_attachment_group_call.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_group_call.xml
rename to core/ui/src/main/res/drawable/ic_attachment_group_call.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_link.xml b/core/ui/src/main/res/drawable/ic_attachment_link.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_link.xml
rename to core/ui/src/main/res/drawable/ic_attachment_link.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_mini_app.xml b/core/ui/src/main/res/drawable/ic_attachment_mini_app.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_mini_app.xml
rename to core/ui/src/main/res/drawable/ic_attachment_mini_app.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_photo.xml b/core/ui/src/main/res/drawable/ic_attachment_photo.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_photo.xml
rename to core/ui/src/main/res/drawable/ic_attachment_photo.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_poll.xml b/core/ui/src/main/res/drawable/ic_attachment_poll.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_poll.xml
rename to core/ui/src/main/res/drawable/ic_attachment_poll.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_sticker.xml b/core/ui/src/main/res/drawable/ic_attachment_sticker.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_sticker.xml
rename to core/ui/src/main/res/drawable/ic_attachment_sticker.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_story.xml b/core/ui/src/main/res/drawable/ic_attachment_story.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_story.xml
rename to core/ui/src/main/res/drawable/ic_attachment_story.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_video.xml b/core/ui/src/main/res/drawable/ic_attachment_video.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_video.xml
rename to core/ui/src/main/res/drawable/ic_attachment_video.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_voice.xml b/core/ui/src/main/res/drawable/ic_attachment_voice.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_voice.xml
rename to core/ui/src/main/res/drawable/ic_attachment_voice.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_wall.xml b/core/ui/src/main/res/drawable/ic_attachment_wall.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_wall.xml
rename to core/ui/src/main/res/drawable/ic_attachment_wall.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_attachment_wall_reply.xml b/core/ui/src/main/res/drawable/ic_attachment_wall_reply.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_attachment_wall_reply.xml
rename to core/ui/src/main/res/drawable/ic_attachment_wall_reply.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_baseline_attach_file_24.xml b/core/ui/src/main/res/drawable/ic_baseline_attach_file_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_baseline_attach_file_24.xml
rename to core/ui/src/main/res/drawable/ic_baseline_attach_file_24.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_baseline_create_24.xml b/core/ui/src/main/res/drawable/ic_baseline_create_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_baseline_create_24.xml
rename to core/ui/src/main/res/drawable/ic_baseline_create_24.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_fast_logo.xml b/core/ui/src/main/res/drawable/ic_fast_logo.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_fast_logo.xml
rename to core/ui/src/main/res/drawable/ic_fast_logo.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_launcher_foreground.xml b/core/ui/src/main/res/drawable/ic_launcher_foreground.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_launcher_foreground.xml
rename to core/ui/src/main/res/drawable/ic_launcher_foreground.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_logo_big.xml b/core/ui/src/main/res/drawable/ic_logo_big.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_logo_big.xml
rename to core/ui/src/main/res/drawable/ic_logo_big.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_map_marker.xml b/core/ui/src/main/res/drawable/ic_map_marker.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_map_marker.xml
rename to core/ui/src/main/res/drawable/ic_map_marker.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_outline_emoji_emotions_24.xml b/core/ui/src/main/res/drawable/ic_outline_emoji_emotions_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_outline_emoji_emotions_24.xml
rename to core/ui/src/main/res/drawable/ic_outline_emoji_emotions_24.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_round_add_circle_outline_24.xml b/core/ui/src/main/res/drawable/ic_round_add_circle_outline_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_round_add_circle_outline_24.xml
rename to core/ui/src/main/res/drawable/ic_round_add_circle_outline_24.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_round_arrow_back_24.xml b/core/ui/src/main/res/drawable/ic_round_arrow_back_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_round_arrow_back_24.xml
rename to core/ui/src/main/res/drawable/ic_round_arrow_back_24.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_round_bookmark_border_24.xml b/core/ui/src/main/res/drawable/ic_round_bookmark_border_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_round_bookmark_border_24.xml
rename to core/ui/src/main/res/drawable/ic_round_bookmark_border_24.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_round_close_24.xml b/core/ui/src/main/res/drawable/ic_round_close_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_round_close_24.xml
rename to core/ui/src/main/res/drawable/ic_round_close_24.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_round_done_24.xml b/core/ui/src/main/res/drawable/ic_round_done_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_round_done_24.xml
rename to core/ui/src/main/res/drawable/ic_round_done_24.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_round_mic_none_24.xml b/core/ui/src/main/res/drawable/ic_round_mic_none_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_round_mic_none_24.xml
rename to core/ui/src/main/res/drawable/ic_round_mic_none_24.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_round_person_24.xml b/core/ui/src/main/res/drawable/ic_round_person_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_round_person_24.xml
rename to core/ui/src/main/res/drawable/ic_round_person_24.xml
diff --git a/core/designsystem/src/main/res/drawable/ic_round_push_pin_24.xml b/core/ui/src/main/res/drawable/ic_round_push_pin_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/ic_round_push_pin_24.xml
rename to core/ui/src/main/res/drawable/ic_round_push_pin_24.xml
diff --git a/core/designsystem/src/main/res/drawable/outline_account_circle_24.xml b/core/ui/src/main/res/drawable/outline_account_circle_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/outline_account_circle_24.xml
rename to core/ui/src/main/res/drawable/outline_account_circle_24.xml
diff --git a/core/designsystem/src/main/res/drawable/outline_chat_24.xml b/core/ui/src/main/res/drawable/outline_chat_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/outline_chat_24.xml
rename to core/ui/src/main/res/drawable/outline_chat_24.xml
diff --git a/core/designsystem/src/main/res/drawable/outline_people_alt_24.xml b/core/ui/src/main/res/drawable/outline_people_alt_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/outline_people_alt_24.xml
rename to core/ui/src/main/res/drawable/outline_people_alt_24.xml
diff --git a/core/designsystem/src/main/res/drawable/pin_off_outline_24.xml b/core/ui/src/main/res/drawable/pin_off_outline_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/pin_off_outline_24.xml
rename to core/ui/src/main/res/drawable/pin_off_outline_24.xml
diff --git a/core/designsystem/src/main/res/drawable/pin_outline_24.xml b/core/ui/src/main/res/drawable/pin_outline_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/pin_outline_24.xml
rename to core/ui/src/main/res/drawable/pin_outline_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_attach_file_24.xml b/core/ui/src/main/res/drawable/round_attach_file_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_attach_file_24.xml
rename to core/ui/src/main/res/drawable/round_attach_file_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_cake_24.xml b/core/ui/src/main/res/drawable/round_cake_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_cake_24.xml
rename to core/ui/src/main/res/drawable/round_cake_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_delete_outline_24.xml b/core/ui/src/main/res/drawable/round_delete_outline_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_delete_outline_24.xml
rename to core/ui/src/main/res/drawable/round_delete_outline_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_done_all_24.xml b/core/ui/src/main/res/drawable/round_done_all_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_done_all_24.xml
rename to core/ui/src/main/res/drawable/round_done_all_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_file_download_24.xml b/core/ui/src/main/res/drawable/round_file_download_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_file_download_24.xml
rename to core/ui/src/main/res/drawable/round_file_download_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_install_mobile_24.xml b/core/ui/src/main/res/drawable/round_install_mobile_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_install_mobile_24.xml
rename to core/ui/src/main/res/drawable/round_install_mobile_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_qr_code_24.xml b/core/ui/src/main/res/drawable/round_qr_code_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_qr_code_24.xml
rename to core/ui/src/main/res/drawable/round_qr_code_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_restart_alt_24.xml b/core/ui/src/main/res/drawable/round_restart_alt_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_restart_alt_24.xml
rename to core/ui/src/main/res/drawable/round_restart_alt_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_send_24.xml b/core/ui/src/main/res/drawable/round_send_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_send_24.xml
rename to core/ui/src/main/res/drawable/round_send_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_sms_24.xml b/core/ui/src/main/res/drawable/round_sms_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_sms_24.xml
rename to core/ui/src/main/res/drawable/round_sms_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_visibility_24.xml b/core/ui/src/main/res/drawable/round_visibility_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_visibility_24.xml
rename to core/ui/src/main/res/drawable/round_visibility_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_visibility_off_24.xml b/core/ui/src/main/res/drawable/round_visibility_off_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_visibility_off_24.xml
rename to core/ui/src/main/res/drawable/round_visibility_off_24.xml
diff --git a/core/designsystem/src/main/res/drawable/round_vpn_key_24.xml b/core/ui/src/main/res/drawable/round_vpn_key_24.xml
similarity index 100%
rename from core/designsystem/src/main/res/drawable/round_vpn_key_24.xml
rename to core/ui/src/main/res/drawable/round_vpn_key_24.xml
diff --git a/core/designsystem/src/main/res/drawable/test_captcha.webp b/core/ui/src/main/res/drawable/test_captcha.webp
similarity index 100%
rename from core/designsystem/src/main/res/drawable/test_captcha.webp
rename to core/ui/src/main/res/drawable/test_captcha.webp
diff --git a/core/designsystem/src/main/res/font/google_sans_bold.ttf b/core/ui/src/main/res/font/google_sans_bold.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/google_sans_bold.ttf
rename to core/ui/src/main/res/font/google_sans_bold.ttf
diff --git a/core/designsystem/src/main/res/font/google_sans_bold_italic.ttf b/core/ui/src/main/res/font/google_sans_bold_italic.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/google_sans_bold_italic.ttf
rename to core/ui/src/main/res/font/google_sans_bold_italic.ttf
diff --git a/core/designsystem/src/main/res/font/google_sans_italic.ttf b/core/ui/src/main/res/font/google_sans_italic.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/google_sans_italic.ttf
rename to core/ui/src/main/res/font/google_sans_italic.ttf
diff --git a/core/designsystem/src/main/res/font/google_sans_medium.ttf b/core/ui/src/main/res/font/google_sans_medium.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/google_sans_medium.ttf
rename to core/ui/src/main/res/font/google_sans_medium.ttf
diff --git a/core/designsystem/src/main/res/font/google_sans_medium_italic.ttf b/core/ui/src/main/res/font/google_sans_medium_italic.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/google_sans_medium_italic.ttf
rename to core/ui/src/main/res/font/google_sans_medium_italic.ttf
diff --git a/core/designsystem/src/main/res/font/google_sans_regular.ttf b/core/ui/src/main/res/font/google_sans_regular.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/google_sans_regular.ttf
rename to core/ui/src/main/res/font/google_sans_regular.ttf
diff --git a/core/designsystem/src/main/res/font/roboto_black.ttf b/core/ui/src/main/res/font/roboto_black.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/roboto_black.ttf
rename to core/ui/src/main/res/font/roboto_black.ttf
diff --git a/core/designsystem/src/main/res/font/roboto_black_italic.ttf b/core/ui/src/main/res/font/roboto_black_italic.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/roboto_black_italic.ttf
rename to core/ui/src/main/res/font/roboto_black_italic.ttf
diff --git a/core/designsystem/src/main/res/font/roboto_bold.ttf b/core/ui/src/main/res/font/roboto_bold.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/roboto_bold.ttf
rename to core/ui/src/main/res/font/roboto_bold.ttf
diff --git a/core/designsystem/src/main/res/font/roboto_bold_italic.ttf b/core/ui/src/main/res/font/roboto_bold_italic.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/roboto_bold_italic.ttf
rename to core/ui/src/main/res/font/roboto_bold_italic.ttf
diff --git a/core/designsystem/src/main/res/font/roboto_italic.ttf b/core/ui/src/main/res/font/roboto_italic.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/roboto_italic.ttf
rename to core/ui/src/main/res/font/roboto_italic.ttf
diff --git a/core/designsystem/src/main/res/font/roboto_light.ttf b/core/ui/src/main/res/font/roboto_light.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/roboto_light.ttf
rename to core/ui/src/main/res/font/roboto_light.ttf
diff --git a/core/designsystem/src/main/res/font/roboto_light_italic.ttf b/core/ui/src/main/res/font/roboto_light_italic.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/roboto_light_italic.ttf
rename to core/ui/src/main/res/font/roboto_light_italic.ttf
diff --git a/core/designsystem/src/main/res/font/roboto_medium.ttf b/core/ui/src/main/res/font/roboto_medium.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/roboto_medium.ttf
rename to core/ui/src/main/res/font/roboto_medium.ttf
diff --git a/core/designsystem/src/main/res/font/roboto_medium_italic.ttf b/core/ui/src/main/res/font/roboto_medium_italic.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/roboto_medium_italic.ttf
rename to core/ui/src/main/res/font/roboto_medium_italic.ttf
diff --git a/core/designsystem/src/main/res/font/roboto_regular.ttf b/core/ui/src/main/res/font/roboto_regular.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/roboto_regular.ttf
rename to core/ui/src/main/res/font/roboto_regular.ttf
diff --git a/core/designsystem/src/main/res/font/roboto_thin.ttf b/core/ui/src/main/res/font/roboto_thin.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/roboto_thin.ttf
rename to core/ui/src/main/res/font/roboto_thin.ttf
diff --git a/core/designsystem/src/main/res/font/roboto_thin_italic.ttf b/core/ui/src/main/res/font/roboto_thin_italic.ttf
similarity index 100%
rename from core/designsystem/src/main/res/font/roboto_thin_italic.ttf
rename to core/ui/src/main/res/font/roboto_thin_italic.ttf
diff --git a/core/designsystem/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/core/ui/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
similarity index 100%
rename from core/designsystem/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
rename to core/ui/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
diff --git a/core/designsystem/src/main/res/mipmap-hdpi/ic_launcher.png b/core/ui/src/main/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from core/designsystem/src/main/res/mipmap-hdpi/ic_launcher.png
rename to core/ui/src/main/res/mipmap-hdpi/ic_launcher.png
diff --git a/core/designsystem/src/main/res/mipmap-mdpi/ic_launcher.png b/core/ui/src/main/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from core/designsystem/src/main/res/mipmap-mdpi/ic_launcher.png
rename to core/ui/src/main/res/mipmap-mdpi/ic_launcher.png
diff --git a/core/designsystem/src/main/res/mipmap-xhdpi/ic_launcher.png b/core/ui/src/main/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from core/designsystem/src/main/res/mipmap-xhdpi/ic_launcher.png
rename to core/ui/src/main/res/mipmap-xhdpi/ic_launcher.png
diff --git a/core/designsystem/src/main/res/mipmap-xxhdpi/ic_launcher.png b/core/ui/src/main/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from core/designsystem/src/main/res/mipmap-xxhdpi/ic_launcher.png
rename to core/ui/src/main/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/core/designsystem/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/core/ui/src/main/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from core/designsystem/src/main/res/mipmap-xxxhdpi/ic_launcher.png
rename to core/ui/src/main/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/core/designsystem/src/main/res/values-ru/strings.xml b/core/ui/src/main/res/values-ru/strings.xml
similarity index 100%
rename from core/designsystem/src/main/res/values-ru/strings.xml
rename to core/ui/src/main/res/values-ru/strings.xml
diff --git a/core/designsystem/src/main/res/values-uk/strings.xml b/core/ui/src/main/res/values-uk/strings.xml
similarity index 100%
rename from core/designsystem/src/main/res/values-uk/strings.xml
rename to core/ui/src/main/res/values-uk/strings.xml
diff --git a/core/designsystem/src/main/res/values/ic_launcher_background.xml b/core/ui/src/main/res/values/ic_launcher_background.xml
similarity index 100%
rename from core/designsystem/src/main/res/values/ic_launcher_background.xml
rename to core/ui/src/main/res/values/ic_launcher_background.xml
diff --git a/core/designsystem/src/main/res/values/plurals.xml b/core/ui/src/main/res/values/plurals.xml
similarity index 100%
rename from core/designsystem/src/main/res/values/plurals.xml
rename to core/ui/src/main/res/values/plurals.xml
diff --git a/core/designsystem/src/main/res/values/strings.xml b/core/ui/src/main/res/values/strings.xml
similarity index 100%
rename from core/designsystem/src/main/res/values/strings.xml
rename to core/ui/src/main/res/values/strings.xml
diff --git a/core/designsystem/src/main/res/values/themes.xml b/core/ui/src/main/res/values/themes.xml
similarity index 100%
rename from core/designsystem/src/main/res/values/themes.xml
rename to core/ui/src/main/res/values/themes.xml
diff --git a/feature/auth/captcha/src/main/kotlin/com/meloda/app/fast/auth/captcha/presentation/CaptchaScreen.kt b/feature/auth/captcha/src/main/kotlin/com/meloda/app/fast/auth/captcha/presentation/CaptchaScreen.kt
index b1483f0b..3f633acc 100644
--- a/feature/auth/captcha/src/main/kotlin/com/meloda/app/fast/auth/captcha/presentation/CaptchaScreen.kt
+++ b/feature/auth/captcha/src/main/kotlin/com/meloda/app/fast/auth/captcha/presentation/CaptchaScreen.kt
@@ -49,11 +49,11 @@ import coil.compose.AsyncImage
import com.meloda.app.fast.auth.captcha.CaptchaViewModel
import com.meloda.app.fast.auth.captcha.CaptchaViewModelImpl
import com.meloda.app.fast.auth.captcha.model.CaptchaScreenState
-import com.meloda.app.fast.designsystem.ActionInvokeDismiss
-import com.meloda.app.fast.designsystem.MaterialDialog
-import com.meloda.app.fast.designsystem.TextFieldErrorText
+import com.meloda.app.fast.ui.components.ActionInvokeDismiss
+import com.meloda.app.fast.ui.components.MaterialDialog
+import com.meloda.app.fast.ui.components.TextFieldErrorText
import org.koin.androidx.compose.koinViewModel
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
@Composable
fun CaptchaRoute(
diff --git a/feature/auth/login/src/main/kotlin/com/meloda/fast/auth/login/OAuthUseCaseImpl.kt b/feature/auth/login/src/main/kotlin/com/meloda/fast/auth/login/OAuthUseCaseImpl.kt
index 6a465525..6486d9d8 100644
--- a/feature/auth/login/src/main/kotlin/com/meloda/fast/auth/login/OAuthUseCaseImpl.kt
+++ b/feature/auth/login/src/main/kotlin/com/meloda/fast/auth/login/OAuthUseCaseImpl.kt
@@ -4,8 +4,8 @@ import com.meloda.app.fast.data.State
import com.meloda.app.fast.data.api.oauth.OAuthRepository
import com.meloda.app.fast.network.OAuthErrorDomain
import com.meloda.app.fast.network.ValidationType
-import com.meloda.app.fast.network.VkErrorTypes
-import com.meloda.app.fast.network.VkOAuthErrors
+import com.meloda.app.fast.network.VkOAuthError
+import com.meloda.app.fast.network.VkOAuthErrorType
import com.meloda.fast.auth.login.model.AuthInfo
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
@@ -33,7 +33,10 @@ class OAuthUseCaseImpl(
forceSms = forceSms
)
- val newState = when (response.error) {
+ val error = response.error?.let(VkOAuthError::parse)
+ val errorType = response.errorType?.let(VkOAuthErrorType::parse)
+
+ val newState = when (error) {
null -> {
State.Success(
AuthInfo(
@@ -44,11 +47,11 @@ class OAuthUseCaseImpl(
)
}
- VkOAuthErrors.FLOOD_CONTROL -> {
+ VkOAuthError.FLOOD_CONTROL -> {
State.Error.OAuthError(OAuthErrorDomain.TooManyTriesError)
}
- VkOAuthErrors.NEED_VALIDATION -> {
+ VkOAuthError.NEED_VALIDATION -> {
if (response.banInfo != null) {
val info = requireNotNull(response.banInfo)
@@ -76,7 +79,7 @@ class OAuthUseCaseImpl(
}
}
- VkOAuthErrors.NEED_CAPTCHA -> {
+ VkOAuthError.NEED_CAPTCHA -> {
State.Error.OAuthError(
OAuthErrorDomain.CaptchaRequiredError(
captchaSid = response.captchaSid.orEmpty(),
@@ -85,27 +88,29 @@ class OAuthUseCaseImpl(
)
}
- VkOAuthErrors.INVALID_CLIENT -> {
+ VkOAuthError.INVALID_CLIENT -> {
State.Error.OAuthError(OAuthErrorDomain.InvalidCredentialsError)
}
- VkOAuthErrors.INVALID_REQUEST -> {
- when (response.errorType) {
- VkErrorTypes.WRONG_OTP -> {
+ VkOAuthError.INVALID_REQUEST -> {
+ when (errorType) {
+ VkOAuthErrorType.WRONG_OTP -> {
State.Error.OAuthError(OAuthErrorDomain.WrongValidationCode)
}
- VkErrorTypes.WRONG_OTP_FORMAT -> {
+ VkOAuthErrorType.WRONG_OTP_FORMAT -> {
State.Error.OAuthError(OAuthErrorDomain.WrongValidationCodeFormat)
}
- else -> {
- State.Error.OAuthError(OAuthErrorDomain.UnknownError)
+ VkOAuthErrorType.PASSWORD_BRUTEFORCE_ATTEMPT -> {
+ State.Error.OAuthError(OAuthErrorDomain.TooManyTriesError)
}
+
+ null -> State.Error.OAuthError(OAuthErrorDomain.UnknownError)
}
}
- else -> {
+ VkOAuthError.UNKNOWN -> {
State.Error.OAuthError(OAuthErrorDomain.UnknownError)
}
}
diff --git a/feature/auth/login/src/main/kotlin/com/meloda/fast/auth/login/presentation/LoginScreen.kt b/feature/auth/login/src/main/kotlin/com/meloda/fast/auth/login/presentation/LoginScreen.kt
index 3d8311cd..2b77f047 100644
--- a/feature/auth/login/src/main/kotlin/com/meloda/fast/auth/login/presentation/LoginScreen.kt
+++ b/feature/auth/login/src/main/kotlin/com/meloda/fast/auth/login/presentation/LoginScreen.kt
@@ -51,14 +51,14 @@ import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.meloda.app.fast.common.UiText
-import com.meloda.app.fast.designsystem.LocalTheme
-import com.meloda.app.fast.designsystem.MaterialDialog
-import com.meloda.app.fast.designsystem.TextFieldErrorText
-import com.meloda.app.fast.designsystem.autoFillRequestHandler
-import com.meloda.app.fast.designsystem.connectNode
-import com.meloda.app.fast.designsystem.defaultFocusChangeAutoFill
-import com.meloda.app.fast.designsystem.handleEnterKey
-import com.meloda.app.fast.designsystem.handleTabKey
+import com.meloda.app.fast.ui.basic.autoFillRequestHandler
+import com.meloda.app.fast.ui.basic.connectNode
+import com.meloda.app.fast.ui.basic.defaultFocusChangeAutoFill
+import com.meloda.app.fast.ui.components.MaterialDialog
+import com.meloda.app.fast.ui.components.TextFieldErrorText
+import com.meloda.app.fast.ui.theme.LocalTheme
+import com.meloda.app.fast.ui.util.handleEnterKey
+import com.meloda.app.fast.ui.util.handleTabKey
import com.meloda.fast.auth.login.LoginViewModel
import com.meloda.fast.auth.login.LoginViewModelImpl
import com.meloda.fast.auth.login.model.CaptchaArguments
@@ -67,7 +67,7 @@ import com.meloda.fast.auth.login.model.LoginScreenState
import com.meloda.fast.auth.login.model.LoginUserBannedArguments
import com.meloda.fast.auth.login.model.LoginValidationArguments
import org.koin.androidx.compose.koinViewModel
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
@Composable
fun LoginRoute(
diff --git a/feature/auth/login/src/main/kotlin/com/meloda/fast/auth/login/presentation/LogoScreen.kt b/feature/auth/login/src/main/kotlin/com/meloda/fast/auth/login/presentation/LogoScreen.kt
index eb2297f2..6279a4ac 100644
--- a/feature/auth/login/src/main/kotlin/com/meloda/fast/auth/login/presentation/LogoScreen.kt
+++ b/feature/auth/login/src/main/kotlin/com/meloda/fast/auth/login/presentation/LogoScreen.kt
@@ -31,11 +31,11 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import com.meloda.app.fast.designsystem.LocalTheme
+import com.meloda.app.fast.ui.theme.LocalTheme
import com.meloda.fast.auth.login.LoginViewModel
import com.meloda.fast.auth.login.LoginViewModelImpl
import org.koin.androidx.compose.koinViewModel
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
@Composable
fun LogoRoute(
@@ -58,8 +58,6 @@ fun LogoRoute(
)
}
-
-// TODO: 13/07/2024, Danil Nikolaev: replace with scaffold?
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun LogoScreen(
diff --git a/feature/auth/userbanned/src/main/kotlin/com/meloda/app/fast/userbanned/presentation/UserBannedScreen.kt b/feature/auth/userbanned/src/main/kotlin/com/meloda/app/fast/userbanned/presentation/UserBannedScreen.kt
index 714a08c2..9e3d4e72 100644
--- a/feature/auth/userbanned/src/main/kotlin/com/meloda/app/fast/userbanned/presentation/UserBannedScreen.kt
+++ b/feature/auth/userbanned/src/main/kotlin/com/meloda/app/fast/userbanned/presentation/UserBannedScreen.kt
@@ -24,7 +24,7 @@ import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.meloda.app.fast.userbanned.model.UserBannedScreenState
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
@Preview
@Composable
diff --git a/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/AuthUseCase.kt b/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/AuthUseCase.kt
index 92d6f605..b9311f85 100644
--- a/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/AuthUseCase.kt
+++ b/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/AuthUseCase.kt
@@ -1,12 +1,12 @@
package com.meloda.app.fast.auth.validation
import com.meloda.app.fast.data.State
-import com.meloda.app.fast.model.api.responses.SendSmsResponse
+import com.meloda.app.fast.model.api.responses.ValidatePhoneResponse
import kotlinx.coroutines.flow.Flow
interface AuthUseCase {
- fun sendSms(
+ fun validatePhone(
validationSid: String
- ): Flow>
+ ): Flow>
}
diff --git a/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/AuthUseCaseImpl.kt b/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/AuthUseCaseImpl.kt
index 942b84a6..022d919b 100644
--- a/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/AuthUseCaseImpl.kt
+++ b/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/AuthUseCaseImpl.kt
@@ -2,26 +2,17 @@ package com.meloda.app.fast.auth.validation
import com.meloda.app.fast.data.State
import com.meloda.app.fast.data.api.auth.AuthRepository
-import com.meloda.app.fast.model.api.responses.SendSmsResponse
+import com.meloda.app.fast.data.mapToState
+import com.meloda.app.fast.model.api.responses.ValidatePhoneResponse
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
-class AuthUseCaseImpl(
- private val authRepository: AuthRepository
-) : AuthUseCase {
+class AuthUseCaseImpl(private val repository: AuthRepository) : AuthUseCase {
- // TODO: 05/05/2024, Danil Nikolaev: implement
- override fun sendSms(validationSid: String): Flow> = flow {
-// emit(State.Loading)
-//
-// val newState = authRepository.sendSms(validationSid)
-// .fold(
-// onSuccess = { response -> State.Success(response) },
-// onNetworkFailure = { State.Error.ConnectionError },
-// onUnknownFailure = { State.UNKNOWN_ERROR },
-// onHttpFailure = { result -> result.error.toStateApiError() },
-// onApiFailure = { result -> result.error.toStateApiError() }
-// )
-// emit(newState)
+ override fun validatePhone(validationSid: String): Flow> = flow {
+ emit(State.Loading)
+
+ val newState = repository.validatePhone(validationSid).mapToState()
+ emit(newState)
}
}
diff --git a/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/ValidationViewModel.kt b/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/ValidationViewModel.kt
index edf21b20..5ed99c28 100644
--- a/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/ValidationViewModel.kt
+++ b/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/ValidationViewModel.kt
@@ -129,7 +129,7 @@ class ValidationViewModelImpl(
}
private fun sendValidationCode() {
- authUseCase.sendSms(validationSid.orEmpty())
+ authUseCase.validatePhone(validationSid.orEmpty())
.listenValue { state ->
state.processState(
error = { error ->
diff --git a/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/presentation/ValidationScreen.kt b/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/presentation/ValidationScreen.kt
index 55a6a6c3..56bcdef8 100644
--- a/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/presentation/ValidationScreen.kt
+++ b/feature/auth/validation/src/main/kotlin/com/meloda/app/fast/auth/validation/presentation/ValidationScreen.kt
@@ -47,12 +47,12 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.meloda.app.fast.auth.validation.ValidationViewModel
import com.meloda.app.fast.auth.validation.ValidationViewModelImpl
import com.meloda.app.fast.auth.validation.model.ValidationScreenState
-import com.meloda.app.fast.designsystem.ActionInvokeDismiss
-import com.meloda.app.fast.designsystem.MaterialDialog
-import com.meloda.app.fast.designsystem.TextFieldErrorText
-import com.meloda.app.fast.designsystem.getString
+import com.meloda.app.fast.ui.components.ActionInvokeDismiss
+import com.meloda.app.fast.ui.components.MaterialDialog
+import com.meloda.app.fast.ui.components.TextFieldErrorText
+import com.meloda.app.fast.ui.util.getString
import org.koin.androidx.compose.koinViewModel
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
@Composable
fun ValidationRoute(
diff --git a/feature/chatmaterials/src/main/kotlin/com/meloda/app/fast/chatmaterials/presentation/ChatMaterialsScreen.kt b/feature/chatmaterials/src/main/kotlin/com/meloda/app/fast/chatmaterials/presentation/ChatMaterialsScreen.kt
index 883b452c..aec6d710 100644
--- a/feature/chatmaterials/src/main/kotlin/com/meloda/app/fast/chatmaterials/presentation/ChatMaterialsScreen.kt
+++ b/feature/chatmaterials/src/main/kotlin/com/meloda/app/fast/chatmaterials/presentation/ChatMaterialsScreen.kt
@@ -65,8 +65,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.meloda.app.fast.chatmaterials.ChatMaterialsViewModel
import com.meloda.app.fast.chatmaterials.ChatMaterialsViewModelImpl
import com.meloda.app.fast.chatmaterials.model.ChatMaterialsScreenState
-import com.meloda.app.fast.designsystem.LocalTheme
-import com.meloda.app.fast.designsystem.R
+import com.meloda.app.fast.ui.R
+import com.meloda.app.fast.ui.theme.LocalTheme
import dev.chrisbanes.haze.HazeState
import dev.chrisbanes.haze.haze
import dev.chrisbanes.haze.hazeChild
diff --git a/feature/conversations/build.gradle.kts b/feature/conversations/build.gradle.kts
index b115f365..2c4c5f0e 100644
--- a/feature/conversations/build.gradle.kts
+++ b/feature/conversations/build.gradle.kts
@@ -58,7 +58,7 @@ dependencies {
implementation(libs.haze)
implementation(libs.haze.materials)
- // TODO: 03/07/2024, Danil Nikolaev: remove when stable release
+ // TODO: 03/07/2024, Danil Nikolaev: remove when stable release (lazy column fixes)
implementation("androidx.compose.foundation:foundation:1.7.0-beta04")
implementation(libs.eithernet)
diff --git a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/ConversationsViewModel.kt b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/ConversationsViewModel.kt
index a06533b5..9532f2ac 100644
--- a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/ConversationsViewModel.kt
+++ b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/ConversationsViewModel.kt
@@ -20,12 +20,12 @@ import com.meloda.app.fast.data.api.conversations.ConversationsUseCase
import com.meloda.app.fast.data.api.messages.MessagesUseCase
import com.meloda.app.fast.data.processState
import com.meloda.app.fast.datastore.UserSettings
-import com.meloda.app.fast.designsystem.ImmutableList
import com.meloda.app.fast.model.BaseError
import com.meloda.app.fast.model.InteractionType
import com.meloda.app.fast.model.LongPollEvent
import com.meloda.app.fast.model.api.domain.VkConversation
-import com.meloda.app.fast.network.VkErrorCodes
+import com.meloda.app.fast.network.VkErrorCode
+import com.meloda.app.fast.ui.util.ImmutableList
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
@@ -232,7 +232,7 @@ class ConversationsViewModelImpl(
error = { error ->
if (error is State.Error.ApiError) {
when (error.errorCode) {
- VkErrorCodes.UserAuthorizationFailed -> {
+ VkErrorCode.USER_AUTHORIZATION_FAILED -> {
baseError.setValue { BaseError.SessionExpired }
}
diff --git a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/model/ConversationOption.kt b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/model/ConversationOption.kt
index 7f25d920..016e4526 100644
--- a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/model/ConversationOption.kt
+++ b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/model/ConversationOption.kt
@@ -2,7 +2,7 @@ package com.meloda.app.fast.conversations.model
import com.meloda.app.fast.common.UiImage
import com.meloda.app.fast.common.UiText
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
sealed class ConversationOption(
val title: UiText,
diff --git a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/model/UiConversation.kt b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/model/UiConversation.kt
index 8179e685..bb81b498 100644
--- a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/model/UiConversation.kt
+++ b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/model/UiConversation.kt
@@ -3,9 +3,9 @@ package com.meloda.app.fast.conversations.model
import androidx.compose.runtime.Immutable
import androidx.compose.ui.text.AnnotatedString
import com.meloda.app.fast.common.UiImage
-import com.meloda.app.fast.designsystem.ImmutableList
import com.meloda.app.fast.model.api.PeerType
import com.meloda.app.fast.model.api.domain.VkMessage
+import com.meloda.app.fast.ui.util.ImmutableList
@Immutable
data class UiConversation(
diff --git a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/presentation/ConversationItem.kt b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/presentation/ConversationItem.kt
index e8146466..d3058d88 100644
--- a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/presentation/ConversationItem.kt
+++ b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/presentation/ConversationItem.kt
@@ -53,13 +53,13 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage
import com.meloda.app.fast.common.UiImage
-import com.meloda.app.fast.conversations.DotsFlashing
import com.meloda.app.fast.conversations.model.ConversationOption
import com.meloda.app.fast.conversations.model.UiConversation
-import com.meloda.app.fast.designsystem.ContentAlpha
-import com.meloda.app.fast.designsystem.LocalContentAlpha
-import com.meloda.app.fast.designsystem.getString
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.basic.ContentAlpha
+import com.meloda.app.fast.ui.basic.LocalContentAlpha
+import com.meloda.app.fast.ui.components.DotsFlashing
+import com.meloda.app.fast.ui.util.getString
+import com.meloda.app.fast.ui.R as UiR
val BirthdayColor = Color(0xffb00b69)
diff --git a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/presentation/ConversationsList.kt b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/presentation/ConversationsList.kt
index 006c4648..31b7afb9 100644
--- a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/presentation/ConversationsList.kt
+++ b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/presentation/ConversationsList.kt
@@ -27,7 +27,7 @@ import com.meloda.app.fast.common.UserConfig
import com.meloda.app.fast.conversations.model.ConversationOption
import com.meloda.app.fast.conversations.model.ConversationsScreenState
import com.meloda.app.fast.conversations.model.UiConversation
-import com.meloda.app.fast.designsystem.LocalBottomPadding
+import com.meloda.app.fast.ui.theme.LocalBottomPadding
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
diff --git a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/presentation/ConversationsScreen.kt b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/presentation/ConversationsScreen.kt
index f0a41a2d..5186cbb8 100644
--- a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/presentation/ConversationsScreen.kt
+++ b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/presentation/ConversationsScreen.kt
@@ -72,21 +72,21 @@ import com.meloda.app.fast.conversations.ConversationsViewModelImpl
import com.meloda.app.fast.conversations.model.ConversationOption
import com.meloda.app.fast.conversations.model.ConversationsScreenState
import com.meloda.app.fast.conversations.model.UiConversation
-import com.meloda.app.fast.designsystem.LocalBottomPadding
-import com.meloda.app.fast.designsystem.LocalHazeState
-import com.meloda.app.fast.designsystem.LocalTheme
-import com.meloda.app.fast.designsystem.MaterialDialog
-import com.meloda.app.fast.designsystem.components.FullScreenLoader
-import com.meloda.app.fast.designsystem.isScrollingUp
import com.meloda.app.fast.model.BaseError
-import com.meloda.app.fast.ui.ErrorView
+import com.meloda.app.fast.ui.components.ErrorView
+import com.meloda.app.fast.ui.components.FullScreenLoader
+import com.meloda.app.fast.ui.components.MaterialDialog
+import com.meloda.app.fast.ui.theme.LocalBottomPadding
+import com.meloda.app.fast.ui.theme.LocalHazeState
+import com.meloda.app.fast.ui.theme.LocalTheme
+import com.meloda.app.fast.ui.util.isScrollingUp
import dev.chrisbanes.haze.haze
import dev.chrisbanes.haze.hazeChild
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
import dev.chrisbanes.haze.materials.HazeMaterials
import kotlinx.coroutines.launch
import org.koin.androidx.compose.koinViewModel
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
@Composable
fun ConversationsRoute(
diff --git a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/util/ConversationDomainMapper.kt b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/util/ConversationDomainMapper.kt
index a6d9d8f6..11971e46 100644
--- a/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/util/ConversationDomainMapper.kt
+++ b/feature/conversations/src/main/kotlin/com/meloda/app/fast/conversations/util/ConversationDomainMapper.kt
@@ -18,18 +18,18 @@ import com.meloda.app.fast.common.util.TimeUtils
import com.meloda.app.fast.conversations.model.ActionState
import com.meloda.app.fast.conversations.model.UiConversation
import com.meloda.app.fast.data.VkMemoryCache
-import com.meloda.app.fast.designsystem.ImmutableList
import com.meloda.app.fast.model.InteractionType
import com.meloda.app.fast.model.api.PeerType
import com.meloda.app.fast.model.api.data.AttachmentType
import com.meloda.app.fast.model.api.domain.VkAttachment
import com.meloda.app.fast.model.api.domain.VkConversation
import com.meloda.app.fast.model.api.domain.VkMessage
+import com.meloda.app.fast.ui.util.ImmutableList
import java.util.Calendar
import java.util.Locale
import kotlin.math.ln
import kotlin.math.pow
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
fun VkConversation.asPresentation(
resources: Resources,
diff --git a/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/FriendsViewModel.kt b/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/FriendsViewModel.kt
index d9631215..299f7b90 100644
--- a/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/FriendsViewModel.kt
+++ b/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/FriendsViewModel.kt
@@ -11,7 +11,7 @@ import com.meloda.app.fast.friends.model.FriendsScreenState
import com.meloda.app.fast.friends.util.asPresentation
import com.meloda.app.fast.model.BaseError
import com.meloda.app.fast.model.api.domain.VkUser
-import com.meloda.app.fast.network.VkErrorCodes
+import com.meloda.app.fast.network.VkErrorCode
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
@@ -71,7 +71,7 @@ class FriendsViewModelImpl(
error = { error ->
if (error is State.Error.ApiError) {
when (error.errorCode) {
- VkErrorCodes.UserAuthorizationFailed -> {
+ VkErrorCode.USER_AUTHORIZATION_FAILED -> {
baseError.setValue { BaseError.SessionExpired }
}
diff --git a/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/presentation/FriendItem.kt b/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/presentation/FriendItem.kt
index 4f0f07c6..c6a1fc93 100644
--- a/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/presentation/FriendItem.kt
+++ b/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/presentation/FriendItem.kt
@@ -23,7 +23,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage
-import com.meloda.app.fast.designsystem.R
+import com.meloda.app.fast.ui.R
import com.meloda.app.fast.friends.model.UiFriend
@Composable
diff --git a/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/presentation/FriendsList.kt b/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/presentation/FriendsList.kt
index af5482bf..8a0deadd 100644
--- a/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/presentation/FriendsList.kt
+++ b/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/presentation/FriendsList.kt
@@ -20,10 +20,10 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
-import com.meloda.app.fast.designsystem.ImmutableList
-import com.meloda.app.fast.designsystem.LocalBottomPadding
import com.meloda.app.fast.friends.model.FriendsScreenState
import com.meloda.app.fast.friends.model.UiFriend
+import com.meloda.app.fast.ui.theme.LocalBottomPadding
+import com.meloda.app.fast.ui.util.ImmutableList
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
diff --git a/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/presentation/FriendsScreen.kt b/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/presentation/FriendsScreen.kt
index 6c5aa8b2..7858da61 100644
--- a/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/presentation/FriendsScreen.kt
+++ b/feature/friends/src/main/kotlin/com/meloda/app/fast/friends/presentation/FriendsScreen.kt
@@ -50,23 +50,23 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import coil.imageLoader
import coil.request.ImageRequest
-import com.meloda.app.fast.designsystem.ImmutableList
-import com.meloda.app.fast.designsystem.LocalHazeState
-import com.meloda.app.fast.designsystem.LocalTheme
-import com.meloda.app.fast.designsystem.TabItem
-import com.meloda.app.fast.designsystem.components.FullScreenLoader
-import com.meloda.app.fast.designsystem.components.NoItemsView
import com.meloda.app.fast.friends.FriendsViewModel
import com.meloda.app.fast.friends.FriendsViewModelImpl
import com.meloda.app.fast.friends.model.FriendsScreenState
import com.meloda.app.fast.model.BaseError
-import com.meloda.app.fast.ui.ErrorView
+import com.meloda.app.fast.ui.components.ErrorView
+import com.meloda.app.fast.ui.components.FullScreenLoader
+import com.meloda.app.fast.ui.components.NoItemsView
+import com.meloda.app.fast.ui.model.TabItem
+import com.meloda.app.fast.ui.theme.LocalHazeState
+import com.meloda.app.fast.ui.theme.LocalTheme
+import com.meloda.app.fast.ui.util.ImmutableList
import dev.chrisbanes.haze.haze
import dev.chrisbanes.haze.hazeChild
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
import dev.chrisbanes.haze.materials.HazeMaterials
import org.koin.androidx.compose.koinViewModel
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
@Composable
fun FriendsRoute(
diff --git a/feature/languagepicker/src/main/kotlin/com/meloda/app/fast/languagepicker/LanguagePickerViewModel.kt b/feature/languagepicker/src/main/kotlin/com/meloda/app/fast/languagepicker/LanguagePickerViewModel.kt
index cae6a7f7..87266a6d 100644
--- a/feature/languagepicker/src/main/kotlin/com/meloda/app/fast/languagepicker/LanguagePickerViewModel.kt
+++ b/feature/languagepicker/src/main/kotlin/com/meloda/app/fast/languagepicker/LanguagePickerViewModel.kt
@@ -7,12 +7,13 @@ import androidx.lifecycle.ViewModel
import com.meloda.app.fast.common.UiText
import com.meloda.app.fast.common.extensions.setValue
import com.meloda.app.fast.common.parseString
-import com.meloda.app.fast.designsystem.R
import com.meloda.app.fast.languagepicker.model.LanguagePickerScreenState
import com.meloda.app.fast.languagepicker.model.SelectableLanguage
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
+import com.meloda.app.fast.ui.R as UiR
+
interface LanguagePickerViewModel {
val screenState: StateFlow
@@ -31,23 +32,23 @@ class LanguagePickerViewModelImpl(
val languages = listOf(
Triple(
"",
- UiText.Resource(R.string.language_key_system),
- UiText.Resource(R.string.language_system)
+ UiText.Resource(UiR.string.language_key_system),
+ UiText.Resource(UiR.string.language_system)
),
Triple(
"en-US",
- UiText.Resource(R.string.language_key_english),
- UiText.Resource(R.string.language_english),
+ UiText.Resource(UiR.string.language_key_english),
+ UiText.Resource(UiR.string.language_english),
),
Triple(
"ru-RU",
- UiText.Resource(R.string.language_key_russian),
- UiText.Resource(R.string.language_russian)
+ UiText.Resource(UiR.string.language_key_russian),
+ UiText.Resource(UiR.string.language_russian)
),
Triple(
"uk-UA",
- UiText.Resource(R.string.language_key_ukrainian),
- UiText.Resource(R.string.language_ukrainian)
+ UiText.Resource(UiR.string.language_key_ukrainian),
+ UiText.Resource(UiR.string.language_ukrainian)
)
).map { (key, language, local) ->
Triple(
diff --git a/feature/languagepicker/src/main/kotlin/com/meloda/app/fast/languagepicker/presentation/LanguagePickerScreen.kt b/feature/languagepicker/src/main/kotlin/com/meloda/app/fast/languagepicker/presentation/LanguagePickerScreen.kt
index a9899c2d..f85d0956 100644
--- a/feature/languagepicker/src/main/kotlin/com/meloda/app/fast/languagepicker/presentation/LanguagePickerScreen.kt
+++ b/feature/languagepicker/src/main/kotlin/com/meloda/app/fast/languagepicker/presentation/LanguagePickerScreen.kt
@@ -59,7 +59,7 @@ import com.meloda.app.fast.languagepicker.LanguagePickerViewModelImpl
import com.meloda.app.fast.languagepicker.model.LanguagePickerScreenState
import com.meloda.app.fast.languagepicker.model.SelectableLanguage
import org.koin.androidx.compose.koinViewModel
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
@Composable
fun LanguagePickerRoute(
diff --git a/feature/messageshistory/src/main/kotlin/com/meloda/app/fast/messageshistory/presentation/MessagesHistoryScreen.kt b/feature/messageshistory/src/main/kotlin/com/meloda/app/fast/messageshistory/presentation/MessagesHistoryScreen.kt
index b2a6153f..ade30f59 100644
--- a/feature/messageshistory/src/main/kotlin/com/meloda/app/fast/messageshistory/presentation/MessagesHistoryScreen.kt
+++ b/feature/messageshistory/src/main/kotlin/com/meloda/app/fast/messageshistory/presentation/MessagesHistoryScreen.kt
@@ -67,13 +67,13 @@ import androidx.compose.ui.unit.dp
import androidx.core.view.HapticFeedbackConstantsCompat
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.meloda.app.fast.datastore.SettingsKeys
-import com.meloda.app.fast.designsystem.ImmutableList
-import com.meloda.app.fast.designsystem.LocalTheme
import com.meloda.app.fast.messageshistory.MessagesHistoryViewModel
import com.meloda.app.fast.messageshistory.MessagesHistoryViewModelImpl
import com.meloda.app.fast.messageshistory.model.ActionMode
import com.meloda.app.fast.messageshistory.model.MessagesHistoryScreenState
import com.meloda.app.fast.model.BaseError
+import com.meloda.app.fast.ui.theme.LocalTheme
+import com.meloda.app.fast.ui.util.ImmutableList
import dev.chrisbanes.haze.HazeState
import dev.chrisbanes.haze.hazeChild
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
@@ -81,7 +81,7 @@ import dev.chrisbanes.haze.materials.HazeMaterials
import kotlinx.coroutines.launch
import org.koin.androidx.compose.koinViewModel
import org.koin.compose.koinInject
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
@Composable
fun MessagesHistoryRoute(
diff --git a/feature/messageshistory/src/main/kotlin/com/meloda/app/fast/messageshistory/presentation/MessagesList.kt b/feature/messageshistory/src/main/kotlin/com/meloda/app/fast/messageshistory/presentation/MessagesList.kt
index 8e0e4f08..4b4fcd1b 100644
--- a/feature/messageshistory/src/main/kotlin/com/meloda/app/fast/messageshistory/presentation/MessagesList.kt
+++ b/feature/messageshistory/src/main/kotlin/com/meloda/app/fast/messageshistory/presentation/MessagesList.kt
@@ -16,9 +16,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
-import com.meloda.app.fast.designsystem.ImmutableList
-import com.meloda.app.fast.designsystem.LocalTheme
import com.meloda.app.fast.messageshistory.model.UiMessage
+import com.meloda.app.fast.ui.theme.LocalTheme
+import com.meloda.app.fast.ui.util.ImmutableList
import dev.chrisbanes.haze.HazeState
import dev.chrisbanes.haze.haze
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
diff --git a/feature/messageshistory/src/main/kotlin/com/meloda/app/fast/messageshistory/util/MessageMapper.kt b/feature/messageshistory/src/main/kotlin/com/meloda/app/fast/messageshistory/util/MessageMapper.kt
index a4c3b44e..db1b94ef 100644
--- a/feature/messageshistory/src/main/kotlin/com/meloda/app/fast/messageshistory/util/MessageMapper.kt
+++ b/feature/messageshistory/src/main/kotlin/com/meloda/app/fast/messageshistory/util/MessageMapper.kt
@@ -7,14 +7,14 @@ import com.meloda.app.fast.common.UserConfig
import com.meloda.app.fast.common.extensions.orDots
import com.meloda.app.fast.common.parseString
import com.meloda.app.fast.data.VkMemoryCache
-import com.meloda.app.fast.designsystem.R
+import com.meloda.app.fast.ui.R
import com.meloda.app.fast.messageshistory.model.UiMessage
import com.meloda.app.fast.model.api.PeerType
import com.meloda.app.fast.model.api.domain.VkConversation
import com.meloda.app.fast.model.api.domain.VkMessage
import java.text.SimpleDateFormat
import java.util.Locale
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
private fun isAccount(fromId: Int) = fromId == UserConfig.userId
diff --git a/feature/profile/build.gradle.kts b/feature/profile/build.gradle.kts
index c7300beb..ed3b4f6e 100644
--- a/feature/profile/build.gradle.kts
+++ b/feature/profile/build.gradle.kts
@@ -60,9 +60,6 @@ dependencies {
implementation(libs.haze)
implementation(libs.haze.materials)
- // TODO: 03/07/2024, Danil Nikolaev: remove when stable release
- implementation("androidx.compose.foundation:foundation:1.7.0-beta04")
-
implementation(libs.eithernet)
implementation(libs.androidx.navigation.compose)
diff --git a/feature/profile/src/main/kotlin/com/meloda/app/fast/profile/ProfileViewModel.kt b/feature/profile/src/main/kotlin/com/meloda/app/fast/profile/ProfileViewModel.kt
index 3ccf0e93..4140c960 100644
--- a/feature/profile/src/main/kotlin/com/meloda/app/fast/profile/ProfileViewModel.kt
+++ b/feature/profile/src/main/kotlin/com/meloda/app/fast/profile/ProfileViewModel.kt
@@ -9,7 +9,7 @@ import com.meloda.app.fast.data.State
import com.meloda.app.fast.data.api.users.UsersUseCase
import com.meloda.app.fast.data.processState
import com.meloda.app.fast.model.BaseError
-import com.meloda.app.fast.network.VkErrorCodes
+import com.meloda.app.fast.network.VkErrorCode
import com.meloda.app.fast.profile.model.ProfileScreenState
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -37,7 +37,7 @@ class ProfileViewModelImpl(
error = { error ->
if (error is State.Error.ApiError) {
when (error.errorCode) {
- VkErrorCodes.UserAuthorizationFailed -> {
+ VkErrorCode.USER_AUTHORIZATION_FAILED -> {
baseError.setValue { BaseError.SessionExpired }
}
diff --git a/feature/profile/src/main/kotlin/com/meloda/app/fast/profile/presentation/ProfileScreen.kt b/feature/profile/src/main/kotlin/com/meloda/app/fast/profile/presentation/ProfileScreen.kt
index 045bbe69..58580fca 100644
--- a/feature/profile/src/main/kotlin/com/meloda/app/fast/profile/presentation/ProfileScreen.kt
+++ b/feature/profile/src/main/kotlin/com/meloda/app/fast/profile/presentation/ProfileScreen.kt
@@ -40,7 +40,7 @@ import com.meloda.app.fast.profile.ProfileViewModelImpl
import com.meloda.app.fast.profile.model.ProfileScreenState
import org.koin.androidx.compose.koinViewModel
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
@Composable
fun ProfileRoute(
diff --git a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/SettingsViewModel.kt b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/SettingsViewModel.kt
index 5e43b6ea..d2cce83f 100644
--- a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/SettingsViewModel.kt
+++ b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/SettingsViewModel.kt
@@ -23,7 +23,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
interface SettingsViewModel {
diff --git a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/SettingsScreen.kt b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/SettingsScreen.kt
index d78f4c0a..f087cba5 100644
--- a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/SettingsScreen.kt
+++ b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/SettingsScreen.kt
@@ -38,9 +38,6 @@ import com.meloda.app.fast.common.UserConfig
import com.meloda.app.fast.datastore.SettingsKeys
import com.meloda.app.fast.datastore.UserSettings
import com.meloda.app.fast.datastore.isUsingDarkMode
-import com.meloda.app.fast.designsystem.ActionInvokeDismiss
-import com.meloda.app.fast.designsystem.LocalTheme
-import com.meloda.app.fast.designsystem.MaterialDialog
import com.meloda.app.fast.settings.HapticType
import com.meloda.app.fast.settings.SettingsViewModel
import com.meloda.app.fast.settings.SettingsViewModelImpl
@@ -51,6 +48,9 @@ import com.meloda.app.fast.settings.presentation.items.ListSettingsItem
import com.meloda.app.fast.settings.presentation.items.SwitchSettingsItem
import com.meloda.app.fast.settings.presentation.items.TitleSettingsItem
import com.meloda.app.fast.settings.presentation.items.TitleSummarySettingsItem
+import com.meloda.app.fast.ui.components.ActionInvokeDismiss
+import com.meloda.app.fast.ui.components.MaterialDialog
+import com.meloda.app.fast.ui.theme.LocalTheme
import dev.chrisbanes.haze.HazeState
import dev.chrisbanes.haze.haze
import dev.chrisbanes.haze.hazeChild
@@ -58,7 +58,7 @@ import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
import dev.chrisbanes.haze.materials.HazeMaterials
import org.koin.androidx.compose.koinViewModel
import org.koin.compose.koinInject
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.R as UiR
@Composable
fun SettingsRoute(
diff --git a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/ListSettingsItem.kt b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/ListSettingsItem.kt
index 44231fa3..b3f98d42 100644
--- a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/ListSettingsItem.kt
+++ b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/ListSettingsItem.kt
@@ -23,17 +23,17 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.meloda.app.fast.common.UiText
-import com.meloda.app.fast.designsystem.ContentAlpha
-import com.meloda.app.fast.designsystem.ImmutableList.Companion.toImmutableList
-import com.meloda.app.fast.designsystem.ItemsSelectionType
-import com.meloda.app.fast.designsystem.LocalContentAlpha
-import com.meloda.app.fast.designsystem.MaterialDialog
-import com.meloda.app.fast.designsystem.getString
import com.meloda.app.fast.settings.model.OnSettingsChangeListener
import com.meloda.app.fast.settings.model.OnSettingsClickListener
import com.meloda.app.fast.settings.model.OnSettingsLongClickListener
import com.meloda.app.fast.settings.model.SettingsItem
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.basic.ContentAlpha
+import com.meloda.app.fast.ui.basic.LocalContentAlpha
+import com.meloda.app.fast.ui.components.ItemsSelectionType
+import com.meloda.app.fast.ui.components.MaterialDialog
+import com.meloda.app.fast.ui.util.ImmutableList.Companion.toImmutableList
+import com.meloda.app.fast.ui.util.getString
+import com.meloda.app.fast.ui.R as UiR
@OptIn(ExperimentalFoundationApi::class)
@Composable
diff --git a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/SwitchSettingsItem.kt b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/SwitchSettingsItem.kt
index ad2502c9..0ed66692 100644
--- a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/SwitchSettingsItem.kt
+++ b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/SwitchSettingsItem.kt
@@ -23,13 +23,13 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
-import com.meloda.app.fast.designsystem.ContentAlpha
-import com.meloda.app.fast.designsystem.LocalContentAlpha
-import com.meloda.app.fast.designsystem.getString
import com.meloda.app.fast.settings.model.OnSettingsChangeListener
import com.meloda.app.fast.settings.model.OnSettingsClickListener
import com.meloda.app.fast.settings.model.OnSettingsLongClickListener
import com.meloda.app.fast.settings.model.SettingsItem
+import com.meloda.app.fast.ui.basic.ContentAlpha
+import com.meloda.app.fast.ui.basic.LocalContentAlpha
+import com.meloda.app.fast.ui.util.getString
@OptIn(ExperimentalFoundationApi::class)
@Composable
diff --git a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/TextFieldSettingsItem.kt b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/TextFieldSettingsItem.kt
index 396a42e3..89285817 100644
--- a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/TextFieldSettingsItem.kt
+++ b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/TextFieldSettingsItem.kt
@@ -32,15 +32,15 @@ import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.meloda.app.fast.common.UiText
-import com.meloda.app.fast.designsystem.ContentAlpha
-import com.meloda.app.fast.designsystem.LocalContentAlpha
-import com.meloda.app.fast.designsystem.MaterialDialog
-import com.meloda.app.fast.designsystem.getString
import com.meloda.app.fast.settings.model.OnSettingsChangeListener
import com.meloda.app.fast.settings.model.OnSettingsClickListener
import com.meloda.app.fast.settings.model.OnSettingsLongClickListener
import com.meloda.app.fast.settings.model.SettingsItem
-import com.meloda.app.fast.designsystem.R as UiR
+import com.meloda.app.fast.ui.basic.ContentAlpha
+import com.meloda.app.fast.ui.basic.LocalContentAlpha
+import com.meloda.app.fast.ui.components.MaterialDialog
+import com.meloda.app.fast.ui.util.getString
+import com.meloda.app.fast.ui.R as UiR
@OptIn(ExperimentalFoundationApi::class)
@Composable
diff --git a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/TitleSettingsItem.kt b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/TitleSettingsItem.kt
index 4911e762..09adf3a7 100644
--- a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/TitleSettingsItem.kt
+++ b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/TitleSettingsItem.kt
@@ -12,8 +12,8 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
-import com.meloda.app.fast.designsystem.getString
import com.meloda.app.fast.settings.model.SettingsItem
+import com.meloda.app.fast.ui.util.getString
@Composable
fun TitleSettingsItem(
diff --git a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/TitleSummarySettingsItem.kt b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/TitleSummarySettingsItem.kt
index 43f2d2d1..3e22762f 100644
--- a/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/TitleSummarySettingsItem.kt
+++ b/feature/settings/src/main/kotlin/com/meloda/app/fast/settings/presentation/items/TitleSummarySettingsItem.kt
@@ -22,12 +22,12 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
-import com.meloda.app.fast.designsystem.ContentAlpha
-import com.meloda.app.fast.designsystem.LocalContentAlpha
-import com.meloda.app.fast.designsystem.getString
import com.meloda.app.fast.settings.model.OnSettingsClickListener
import com.meloda.app.fast.settings.model.OnSettingsLongClickListener
import com.meloda.app.fast.settings.model.SettingsItem
+import com.meloda.app.fast.ui.basic.ContentAlpha
+import com.meloda.app.fast.ui.basic.LocalContentAlpha
+import com.meloda.app.fast.ui.util.getString
@OptIn(ExperimentalFoundationApi::class)
@Composable
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 28ddb18c..4be2a383 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -82,8 +82,6 @@ compose-runtime-saveable = { module = "androidx.compose.runtime:runtime-saveable
compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" }
compose-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest" }
-# TODO: remove version from non-bom dependencies
-koin-bom = { module = "io.insert-koin:koin-bom", version.ref = "koin" }
koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
koin-core-coroutines = { module = "io.insert-koin:koin-core-coroutines", version.ref = "koin" }
koin-test = { module = "io.insert-koin:koin-test", version.ref = "koin" }
@@ -103,13 +101,6 @@ compose = [
"compose-lifecycle-runtime",
"compose-runtime-saveable"
]
-koin = [
- "koin-core",
- "koin-core-coroutines",
- "koin-android",
- "koin-androidx-compose",
- "koin-androidx-compose-navigation"
-]
compose-ui-test = ["compose-ui-test-junit4", "compose-ui-test-manifest"]
[plugins]