Talaria/app/src/main/java/dev/lonami/talaria/ui/screens/ChatScreen.kt

120 lines
3.6 KiB
Kotlin
Raw Normal View History

package dev.lonami.talaria.ui.screens
2022-10-11 19:26:11 +00:00
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.rememberLazyListState
2022-10-11 19:26:11 +00:00
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
2022-10-11 19:26:11 +00:00
import androidx.compose.material.TextField
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
2022-10-11 19:26:11 +00:00
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
2022-10-11 19:26:11 +00:00
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
2022-10-11 19:26:11 +00:00
import dev.lonami.talaria.R
2022-10-29 11:06:38 +00:00
import dev.lonami.talaria.data.MockMessageRepository
import dev.lonami.talaria.ui.state.ChatViewModel
import dev.lonami.talaria.ui.theme.TalariaTheme
import kotlinx.coroutines.launch
2022-10-29 11:06:38 +00:00
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<Message>, listState: LazyListState, modifier: Modifier = Modifier) {
LazyColumn(modifier = modifier, state = listState) {
items(messages.size) { MessageCard(messages[it]) }
}
}
2022-10-11 19:26:11 +00:00
@Composable
fun MessageInputField(
messageText: String,
onMessageChanged: (String) -> Unit,
onSendMessage: () -> Unit,
modifier: Modifier = Modifier,
2022-10-11 19:26:11 +00:00
) {
Row(modifier = modifier) {
2022-10-11 19:26:11 +00:00
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()
2022-10-11 19:26:11 +00:00
var messageText by remember { mutableStateOf("") }
val messageListState = rememberLazyListState()
val coroutineScope = rememberCoroutineScope()
2022-10-11 19:26:11 +00:00
Column(modifier = modifier.fillMaxSize()) {
MessageList(
chatUiState.messages,
modifier = Modifier.weight(1.0f),
listState = messageListState
)
2022-10-11 19:26:11 +00:00
MessageInputField(messageText, onMessageChanged = {
messageText = it
}, onSendMessage = {
2022-10-12 19:26:51 +00:00
chatViewModel.sendMessage(selectedDialog, messageText)
2022-10-11 19:26:11 +00:00
messageText = ""
coroutineScope.launch {
messageListState.animateScrollToItem(chatUiState.messages.size - 1)
}
2022-10-11 19:26:11 +00:00
})
}
}
@Preview
@Composable
fun ChatPreview() {
2022-10-29 11:06:38 +00:00
val viewModel = remember { ChatViewModel(MockMessageRepository()).apply { loadMessages("") } }
TalariaTheme {
2022-10-29 11:06:38 +00:00
ChatScreen("", chatViewModel = viewModel)
}
}