package dev.lonami.talaria.ui.screens import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.Button import androidx.compose.material.Card import androidx.compose.material.Text import androidx.compose.material.TextField import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import dev.lonami.talaria.R import dev.lonami.talaria.data.MockMessageRepository import dev.lonami.talaria.ui.state.ChatViewModel import dev.lonami.talaria.ui.theme.TalariaTheme import kotlinx.coroutines.launch import uniffi.talaria.Message @Composable fun MessageCard(message: Message, modifier: Modifier = Modifier) { Card( elevation = 4.dp, modifier = modifier .fillMaxWidth() .padding(8.dp) ) { Column( modifier = Modifier .fillMaxWidth() .padding(8.dp) ) { Text(message.sender, fontWeight = FontWeight.Bold) Text(message.text) } } } @Composable fun MessageList(messages: List, listState: LazyListState, modifier: Modifier = Modifier) { LazyColumn(modifier = modifier, state = listState) { items(messages.size) { MessageCard(messages[it]) } } } @Composable fun MessageInputField( messageText: String, onMessageChanged: (String) -> Unit, onSendMessage: () -> Unit, modifier: Modifier = Modifier, ) { Row(modifier = modifier) { TextField( messageText, placeholder = { Text(stringResource(R.string.write_message)) }, keyboardOptions = KeyboardOptions( imeAction = ImeAction.Send ), keyboardActions = KeyboardActions( onDone = { onSendMessage() } ), modifier = Modifier.weight(1.0f), onValueChange = onMessageChanged ) Button( onClick = onSendMessage ) { Text(stringResource(R.string.send_message)) } } } @Composable fun ChatScreen( selectedDialog: String, modifier: Modifier = Modifier, chatViewModel: ChatViewModel = viewModel(), ) { val chatUiState by chatViewModel.uiState.collectAsState() var messageText by remember { mutableStateOf("") } val messageListState = rememberLazyListState() val coroutineScope = rememberCoroutineScope() Column(modifier = modifier.fillMaxSize()) { MessageList( chatUiState.messages, modifier = Modifier.weight(1.0f), listState = messageListState ) MessageInputField(messageText, onMessageChanged = { messageText = it }, onSendMessage = { chatViewModel.sendMessage(selectedDialog, messageText) messageText = "" coroutineScope.launch { messageListState.animateScrollToItem(chatUiState.messages.size - 1) } }) } } @Preview @Composable fun ChatPreview() { val viewModel = remember { ChatViewModel(MockMessageRepository()).apply { loadMessages("") } } TalariaTheme { ChatScreen("", chatViewModel = viewModel) } }