From 3a8b2b4e328f9d5285dea653bc164fff9bad9532 Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Tue, 11 Oct 2022 20:58:40 +0200 Subject: [PATCH] Create view models for chat and dialog UI --- app/build.gradle | 1 + .../java/dev/lonami/talaria/ui/ChatScreen.kt | 14 +++++++++---- .../java/dev/lonami/talaria/ui/ChatUiState.kt | 5 +++++ .../dev/lonami/talaria/ui/ChatViewModel.kt | 20 +++++++++++++++++++ .../dev/lonami/talaria/ui/DialogScreen.kt | 14 +++++++++---- .../dev/lonami/talaria/ui/DialogUiState.kt | 5 +++++ .../dev/lonami/talaria/ui/DialogViewModel.kt | 20 +++++++++++++++++++ 7 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/dev/lonami/talaria/ui/ChatUiState.kt create mode 100644 app/src/main/java/dev/lonami/talaria/ui/ChatViewModel.kt create mode 100644 app/src/main/java/dev/lonami/talaria/ui/DialogUiState.kt create mode 100644 app/src/main/java/dev/lonami/talaria/ui/DialogViewModel.kt diff --git a/app/build.gradle b/app/build.gradle index 8f3f976..fe04b35 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,6 +49,7 @@ android { dependencies { implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' + implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1" implementation 'androidx.activity:activity-compose:1.6.0' implementation "androidx.compose.ui:ui:$compose_ui_version" implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version" diff --git a/app/src/main/java/dev/lonami/talaria/ui/ChatScreen.kt b/app/src/main/java/dev/lonami/talaria/ui/ChatScreen.kt index ed283eb..ef738d7 100644 --- a/app/src/main/java/dev/lonami/talaria/ui/ChatScreen.kt +++ b/app/src/main/java/dev/lonami/talaria/ui/ChatScreen.kt @@ -7,11 +7,13 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.Card import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import dev.lonami.talaria.data.MessageSource +import androidx.lifecycle.viewmodel.compose.viewModel import dev.lonami.talaria.model.Message import dev.lonami.talaria.ui.theme.TalariaTheme @@ -41,12 +43,16 @@ fun MessageList(messages: List) { } } +@Composable +fun ChatScreen(chatViewModel: ChatViewModel = viewModel()) { + val chatUiState by chatViewModel.uiState.collectAsState() + MessageList(chatUiState.messages) +} + @Preview @Composable fun ChatPreview() { TalariaTheme { - MessageList( - MessageSource.loadMessages() - ) + ChatScreen() } } diff --git a/app/src/main/java/dev/lonami/talaria/ui/ChatUiState.kt b/app/src/main/java/dev/lonami/talaria/ui/ChatUiState.kt new file mode 100644 index 0000000..579b836 --- /dev/null +++ b/app/src/main/java/dev/lonami/talaria/ui/ChatUiState.kt @@ -0,0 +1,5 @@ +package dev.lonami.talaria.ui + +import dev.lonami.talaria.model.Message + +data class ChatUiState(val messages: List = listOf()) diff --git a/app/src/main/java/dev/lonami/talaria/ui/ChatViewModel.kt b/app/src/main/java/dev/lonami/talaria/ui/ChatViewModel.kt new file mode 100644 index 0000000..baeef01 --- /dev/null +++ b/app/src/main/java/dev/lonami/talaria/ui/ChatViewModel.kt @@ -0,0 +1,20 @@ +package dev.lonami.talaria.ui + +import androidx.lifecycle.ViewModel +import dev.lonami.talaria.data.MessageSource +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +class ChatViewModel : ViewModel() { + private val _uiState = MutableStateFlow(ChatUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + private fun loadMessages() { + _uiState.value = ChatUiState(MessageSource.loadMessages()) + } + + init { + loadMessages() + } +} diff --git a/app/src/main/java/dev/lonami/talaria/ui/DialogScreen.kt b/app/src/main/java/dev/lonami/talaria/ui/DialogScreen.kt index 8cb298b..8437c0b 100644 --- a/app/src/main/java/dev/lonami/talaria/ui/DialogScreen.kt +++ b/app/src/main/java/dev/lonami/talaria/ui/DialogScreen.kt @@ -10,14 +10,16 @@ import androidx.compose.material.Card import androidx.compose.material.Switch import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight 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.DialogSource import dev.lonami.talaria.model.Dialog import dev.lonami.talaria.ui.theme.TalariaTheme @@ -49,12 +51,16 @@ fun DialogList(dialogs: List) { } } +@Composable +fun DialogScreen(dialogViewModel: DialogViewModel = viewModel()) { + val dialogUiState by dialogViewModel.uiState.collectAsState() + DialogList(dialogUiState.dialogs) +} + @Preview @Composable fun DialogPreview() { TalariaTheme { - DialogList( - DialogSource.loadDialogs() - ) + DialogScreen() } } diff --git a/app/src/main/java/dev/lonami/talaria/ui/DialogUiState.kt b/app/src/main/java/dev/lonami/talaria/ui/DialogUiState.kt new file mode 100644 index 0000000..7c3dcb6 --- /dev/null +++ b/app/src/main/java/dev/lonami/talaria/ui/DialogUiState.kt @@ -0,0 +1,5 @@ +package dev.lonami.talaria.ui + +import dev.lonami.talaria.model.Dialog + +data class DialogUiState(val dialogs: List = listOf()) diff --git a/app/src/main/java/dev/lonami/talaria/ui/DialogViewModel.kt b/app/src/main/java/dev/lonami/talaria/ui/DialogViewModel.kt new file mode 100644 index 0000000..8b0ee1f --- /dev/null +++ b/app/src/main/java/dev/lonami/talaria/ui/DialogViewModel.kt @@ -0,0 +1,20 @@ +package dev.lonami.talaria.ui + +import androidx.lifecycle.ViewModel +import dev.lonami.talaria.data.DialogSource +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +class DialogViewModel : ViewModel() { + private val _uiState = MutableStateFlow(DialogUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + private fun loadDialogs() { + _uiState.value = DialogUiState(DialogSource.loadDialogs()) + } + + init { + loadDialogs() + } +}