fun ChatAppSample()

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() }
        )
    }
}