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]