in frontend/src/main/kotlin/org/jetbrains/plugins/template/chatApp/ChatAppSample.kt [30:92]
fun ChatAppSample(viewModel: ChatViewModel) {
val chatMessages by viewModel.chatMessagesFlow.collectAsState(emptyList())
val searchState by viewModel.searchChatMessagesHandler().searchStateFlow.collectAsState(SearchState.Idle)
val messageInputState by viewModel.promptInputState.collectAsState(MessageInputState.Disabled)
val listState = rememberLazyListState()
val textFieldState = rememberTextFieldState()
// Auto-scroll to the bottom when new messages arrive (only when not searching)
LaunchedEffect(chatMessages.lastOrNull()?.id) {
if (chatMessages.isNotEmpty() && !searchState.isSearching) {
listState.animateScrollToItem(chatMessages.lastIndex)
}
}
// Auto-scroll to the current search result
LaunchedEffect(searchState.currentSelectedSearchResultId) {
val currentResultId = searchState.currentSelectedSearchResultId
if (currentResultId != null) {
val messageIndexInList = chatMessages.indexOfFirst { it.id == currentResultId }
if (messageIndexInList >= 0) {
listState.animateScrollToItem(messageIndexInList)
}
}
}
Column(
modifier = Modifier
.fillMaxSize()
.background(ChatAppColors.Panel.background)
) {
// Chat header with search button
ChatHeaderWithSearchBar(
searchState,
onStartSearch = { viewModel.searchChatMessagesHandler().onStartSearch() },
onStopSearch = { viewModel.searchChatMessagesHandler().onStopSearch() },
onSearchQueryChange = { query -> viewModel.searchChatMessagesHandler().onSearchQuery(query) },
onNextResult = { viewModel.searchChatMessagesHandler().onNavigateToNextSearchResult() },
onPreviousResult = { viewModel.searchChatMessagesHandler().onNavigateToPreviousSearchResult() }
)
// Message area
ChatList(
modifier = Modifier
.fillMaxWidth()
.weight(1f),
chatMessages = chatMessages,
listState = listState,
searchState = searchState
)
PromptInput(
modifier = Modifier
.fillMaxWidth()
.heightIn(max = 120.dp),
textFieldState = textFieldState,
promptInputState = messageInputState,
onInputChanged = { viewModel.onPromptInputChanged(it) },
onSend = { viewModel.onSendMessage() },
onStop = { viewModel.onAbortSendingMessage() }
)
}
}