diff --git a/apps/vbox/backend/src/main/sqldelight/ru/shadowsparky/vbox/server/saved_movie.sq b/apps/vbox/backend/src/main/sqldelight/ru/shadowsparky/vbox/server/saved_movie.sq index 747f8ea..4a021de 100644 --- a/apps/vbox/backend/src/main/sqldelight/ru/shadowsparky/vbox/server/saved_movie.sq +++ b/apps/vbox/backend/src/main/sqldelight/ru/shadowsparky/vbox/server/saved_movie.sq @@ -1,8 +1,5 @@ -- videobox."saved_movie" definition -selectByUserId: - SELECT * FROM "saved_movie" WHERE user_id = ? ORDER BY saved_movie_id; - selectByUserIdAndMovieId: SELECT * FROM "saved_movie" WHERE user_id = ? AND movie_id = ?; @@ -22,4 +19,4 @@ SELECT FROM saved_movie AS sm JOIN movie AS m ON sm.movie_id = m.movie_id WHERE sm.user_id = ? -ORDER BY sm.saved_movie_id DESC; +ORDER BY sm.saved_movie_id ASC; diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/BottomBar.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/BottomBar.kt index d6a4917..317d449 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/BottomBar.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/BottomBar.kt @@ -1,7 +1,7 @@ package ru.shadowsparky.vbox.shared.presentation import androiddev.apps.vbox.client.shared.generated.resources.Res -import androiddev.apps.vbox.client.shared.generated.resources.chat_title +import androiddev.apps.vbox.client.shared.generated.resources.chat_title_app_bar import androiddev.apps.vbox.client.shared.generated.resources.home import androiddev.apps.vbox.client.shared.generated.resources.recommendations import androiddev.apps.vbox.client.shared.generated.resources.saved_movies @@ -35,7 +35,7 @@ fun createNavigationList(): List> { ), NavigationEntry( Route.Chat(), - stringResource(Res.string.chat_title), + stringResource(Res.string.chat_title_app_bar), painterResource(Res.drawable.svingpt) ), NavigationEntry( diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/list/VideoScreen.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/list/VideoScreen.kt index 3e1f72d..97c2228 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/list/VideoScreen.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/list/VideoScreen.kt @@ -77,7 +77,7 @@ fun VideoScreen(component: VideoScreenComponent) { items, onRefresh = { component.load() }, onShowOverview = { component.showOverview(it) }, - emptyResource = Res.string.not_found, + emptyResource = Res.string.not_found ) }, appBar = { @@ -125,7 +125,7 @@ fun VideoScreenContent( AnimatedContent( items, content = { - VideosInfo(items = items, paddingValues, emptyResource) { + VideosInfo(items, paddingValues, emptyResource) { onShowOverview(it.id) } } @@ -136,7 +136,7 @@ fun VideoScreenContent( } @Composable -fun VideosInfo( +private fun VideosInfo( items: List, paddingValues: PaddingValues, emptyResource: StringResource, @@ -180,7 +180,7 @@ fun VideosInfo( } @Composable -fun Poster( +private fun Poster( imageUrl: String, label: String, onClick: () -> Unit, @@ -255,7 +255,7 @@ fun Poster( } @Composable -fun VideosNotFound(emptyResource: StringResource) { +private fun VideosNotFound(emptyResource: StringResource) { Box( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/saved/SavedMovieComponent.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/saved/SavedMovieComponent.kt index 6029caa..d336289 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/saved/SavedMovieComponent.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/saved/SavedMovieComponent.kt @@ -8,7 +8,6 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import org.koin.core.annotation.Factory import org.koin.core.annotation.Named -import ru.shadowsparky.ui.nav.RootComponent import ru.shadowsparky.ui.nav.ComponentFactory import ru.shadowsparky.ui.nav.RouteNavigator import ru.shadowsparky.vbox.shared.domain.SavedMovieRepository @@ -50,7 +49,7 @@ class SavedMovieComponent( } else { movies.filter { it.id in ids } } - } + }.map { it.reversed() } fun filterByTag(tagName: String?) { filterTagFlow.tryEmit(tagName) diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreen.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreen.kt index d24d362..6873c3e 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreen.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreen.kt @@ -33,7 +33,6 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldColors import androidx.compose.material3.TextFieldDefaults -import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberSearchBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreenComponent.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreenComponent.kt index 71e9b28..82fb6d7 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreenComponent.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreenComponent.kt @@ -1,10 +1,10 @@ package ru.shadowsparky.vbox.shared.presentation.search import com.arkivanov.decompose.ComponentContext +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import org.koin.core.annotation.Factory import org.koin.core.annotation.Named -import ru.shadowsparky.ui.nav.RootComponent import ru.shadowsparky.ui.nav.ComponentFactory import ru.shadowsparky.ui.nav.RouteNavigator import ru.shadowsparky.vbox.shared.domain.SearchRepository @@ -19,7 +19,7 @@ class SearchScreenComponent( val doBack: () -> Unit, private val searchRepository: SearchRepository, ) : ComponentContext by context { - val info = searchRepository.search("") + val info = searchRepository.search("").map { it.reversed() } private val componentScope = createComponentScope() fun done(request: String) { diff --git a/feature/chat/chat-client/src/commonMain/kotlin/ru/shadowsparky/chat/presentation/ChatScreen.kt b/feature/chat/chat-client/src/commonMain/kotlin/ru/shadowsparky/chat/presentation/ChatScreen.kt index efb7ac5..75ab03c 100644 --- a/feature/chat/chat-client/src/commonMain/kotlin/ru/shadowsparky/chat/presentation/ChatScreen.kt +++ b/feature/chat/chat-client/src/commonMain/kotlin/ru/shadowsparky/chat/presentation/ChatScreen.kt @@ -18,17 +18,14 @@ import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.selection.SelectionContainer -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults @@ -144,7 +141,7 @@ private fun ChatContent( LaunchedEffect(state.messages.size) { if (state.messages.isNotEmpty()) { - listState.animateScrollToItem(state.messages.lastIndex) + listState.animateScrollToItem(0) } } @@ -218,7 +215,6 @@ private fun MessageBubble( onParseMessage: (String) -> List, onClickLink: (String) -> Unit ) { - val scrollState = rememberScrollState() val isUser = message.role == ChatRoles.USER val alignment = if (isUser) Alignment.CenterEnd else Alignment.CenterStart val containerColor = if (isUser) MaterialTheme.colorScheme.primaryContainer else MaterialTheme.colorScheme.surfaceVariant @@ -254,11 +250,7 @@ private fun MessageBubble( } } Box( - modifier = Modifier.fillMaxWidth() - .heightIn(max = 400.dp) - .focusable() - .verticalScroll(scrollState) - , + modifier = Modifier.fillMaxWidth().focusable(), contentAlignment = alignment ) { Card(