From 7aa84674f55edd9215ddca4fde34deb3a2ec9baf Mon Sep 17 00:00:00 2001 From: Eugene Date: Fri, 7 Aug 2026 21:52:22 +0300 Subject: [PATCH] use reverse layout --- .../shadowsparky/vbox/backend/data/chat/SqlMessageStorage.kt | 2 +- .../vbox/backend/presentation/routing/ChatRouting.kt | 3 ++- .../vbox/shared/data/chat/RemoteChatRepository.kt | 2 +- .../kotlin/ru/shadowsparky/chat/presentation/ChatComponent.kt | 4 ++-- .../kotlin/ru/shadowsparky/chat/presentation/ChatScreen.kt | 3 ++- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/chat/SqlMessageStorage.kt b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/chat/SqlMessageStorage.kt index 45ea49a..e493770 100644 --- a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/chat/SqlMessageStorage.kt +++ b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/chat/SqlMessageStorage.kt @@ -23,7 +23,7 @@ class SqlMessageStorage( queries.getInitialChatContext( chatId = chatId, limit = limit.toLong() - ).executeAsList().reversed().map { it.toMessage() } + ).executeAsList().map { it.toMessage() } } else { queries.getNewMessages( chatId = chatId, diff --git a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/presentation/routing/ChatRouting.kt b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/presentation/routing/ChatRouting.kt index fdae83f..48d3c29 100644 --- a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/presentation/routing/ChatRouting.kt +++ b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/presentation/routing/ChatRouting.kt @@ -25,7 +25,8 @@ fun Route.setupChat( get("$DYNAMIC_PREFIX/chat/query") { val repository = chatRepositoryFactory.create(call.obtainUserId()) val afterId = call.queryParameters[ChatRepository.ARG_AFTER_ID]?.toLong() - call.respond(MessagesResponse(repository.query(afterId))) + val list = repository.query(afterId) + call.respond(MessagesResponse(list)) } post("$DYNAMIC_PREFIX/chat/send") { val userId = call.obtainUserId() diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/data/chat/RemoteChatRepository.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/data/chat/RemoteChatRepository.kt index 84921e3..c98e75e 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/data/chat/RemoteChatRepository.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/data/chat/RemoteChatRepository.kt @@ -30,7 +30,7 @@ class RemoteChatRepository( "${DYNAMIC_PREFIX}/chat/query", args, serverConfigurationRepository.getServerConfiguration() - ).content + ).content.asReversed() } override suspend fun send(message: Message) { diff --git a/feature/chat/chat-client/src/commonMain/kotlin/ru/shadowsparky/chat/presentation/ChatComponent.kt b/feature/chat/chat-client/src/commonMain/kotlin/ru/shadowsparky/chat/presentation/ChatComponent.kt index 9e01e4e..2b77be3 100644 --- a/feature/chat/chat-client/src/commonMain/kotlin/ru/shadowsparky/chat/presentation/ChatComponent.kt +++ b/feature/chat/chat-client/src/commonMain/kotlin/ru/shadowsparky/chat/presentation/ChatComponent.kt @@ -80,10 +80,10 @@ class ChatComponent( val currentState = _state.value as? ChatState.Data ?: return scope.launch { _state.value = currentState.copy(isSending = true) - val latestMessageId = currentState.messages.lastOrNull()?.id + val latestMessageId = currentState.messages.firstOrNull()?.id val freshMessages = repository.query(afterId = latestMessageId) _state.value = currentState.copy( - messages = currentState.messages + freshMessages, + messages = freshMessages + currentState.messages, isSending = false ) } 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 36e9801..efb7ac5 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 @@ -158,7 +158,8 @@ private fun ChatContent( .weight(1f) .fillMaxWidth(), contentPadding = contentPadding, - verticalArrangement = Arrangement.spacedBy(8.dp) + verticalArrangement = Arrangement.spacedBy(8.dp), + reverseLayout = true ) { items(items = state.messages, key = { it.id ?: it.hashCode() }) { message -> MessageBubble(