@@ -5,28 +5,14 @@ import android.content.res.Resources
55import androidx.compose.foundation.clickable
66import androidx.compose.foundation.layout.Column
77import androidx.compose.foundation.layout.Row
8- import androidx.compose.foundation.layout.fillMaxSize
98import androidx.compose.foundation.layout.fillMaxWidth
109import androidx.compose.foundation.layout.padding
11- import androidx.compose.foundation.lazy.LazyColumn
12- import androidx.compose.foundation.lazy.items
13- import androidx.compose.material.icons.Icons
14- import androidx.compose.material.icons.automirrored.filled.ArrowBack
15- import androidx.compose.material.icons.filled.Edit
1610import androidx.compose.material3.ExperimentalMaterial3Api
17- import androidx.compose.material3.HorizontalDivider
1811import androidx.compose.material3.Icon
19- import androidx.compose.material3.IconButton
2012import androidx.compose.material3.MaterialTheme
21- import androidx.compose.material3.Scaffold
22- import androidx.compose.material3.SnackbarHost
2313import androidx.compose.material3.SnackbarHostState
2414import androidx.compose.material3.Text
25- import androidx.compose.material3.TopAppBar
26- import androidx.compose.material3.pulltorefresh.PullToRefreshBox
2715import androidx.compose.runtime.Composable
28- import androidx.compose.runtime.collectAsState
29- import androidx.compose.runtime.getValue
3016import androidx.compose.runtime.remember
3117import androidx.compose.ui.Alignment
3218import androidx.compose.ui.Modifier
@@ -37,109 +23,47 @@ import androidx.compose.ui.text.font.FontWeight
3723import androidx.compose.ui.text.style.TextOverflow
3824import androidx.compose.ui.tooling.preview.Preview
3925import androidx.compose.ui.unit.dp
40- import kotlinx.coroutines.flow.MutableStateFlow
41- import kotlinx.coroutines.flow.StateFlow
42- import kotlinx.coroutines.flow.asStateFlow
4326import org.wordpress.android.R
4427import org.wordpress.android.support.aibot.model.BotConversation
4528import org.wordpress.android.support.aibot.util.formatRelativeTime
4629import org.wordpress.android.support.aibot.util.generateSampleBotConversations
47- import org.wordpress.android.support.common.ui.EmptyConversationsView
30+ import org.wordpress.android.support.common.ui.ConversationsListScreen
31+ import org.wordpress.android.support.common.ui.ConversationsSupportViewModel
4832import org.wordpress.android.ui.compose.theme.AppThemeM3
4933
5034@OptIn(ExperimentalMaterial3Api ::class )
5135@Composable
5236fun AIBotConversationsListScreen (
5337 snackbarHostState : SnackbarHostState ,
54- conversations : StateFlow < List <BotConversation > >,
55- isLoading : Boolean ,
38+ conversations : List <BotConversation >,
39+ conversationsState : ConversationsSupportViewModel . ConversationsState ,
5640 onConversationClick : (BotConversation ) -> Unit ,
5741 onBackClick : () -> Unit ,
5842 onCreateNewConversationClick : () -> Unit ,
5943 onRefresh : () -> Unit ,
6044) {
61- Scaffold (
62- snackbarHost = { SnackbarHost (snackbarHostState) },
63- topBar = {
64- TopAppBar (
65- title = { Text (stringResource(R .string.ai_bot_conversations_title)) },
66- navigationIcon = {
67- IconButton (onClick = onBackClick) {
68- Icon (
69- Icons .AutoMirrored .Filled .ArrowBack ,
70- stringResource(R .string.ai_bot_back_button_content_description)
71- )
72- }
73- },
74- actions = {
75- IconButton (onClick = { onCreateNewConversationClick() }) {
76- Icon (
77- imageVector = Icons .Default .Edit ,
78- contentDescription = stringResource(R .string.ai_bot_new_conversation_content_description)
79- )
80- }
81- }
82- )
83- },
84- ) { contentPadding ->
85- val conversationsList by conversations.collectAsState()
86-
87- PullToRefreshBox (
88- isRefreshing = isLoading,
89- onRefresh = onRefresh,
90- modifier = Modifier
91- .fillMaxSize()
92- .padding(contentPadding)
93- ) {
94- when {
95- conversationsList.isEmpty() && ! isLoading -> {
96- EmptyConversationsView (
97- modifier = Modifier .fillMaxSize(),
98- onCreateNewConversationClick = onCreateNewConversationClick
99- )
100- }
101- else -> {
102- ShowConversationsList (
103- modifier = Modifier .fillMaxSize(),
104- conversations = conversations,
105- onConversationClick = onConversationClick
106- )
107- }
108- }
109- }
110- }
111- }
112-
113- @Composable
114- private fun ShowConversationsList (
115- modifier : Modifier ,
116- conversations : StateFlow <List <BotConversation >>,
117- onConversationClick : (BotConversation ) -> Unit
118- ) {
119- val conversations by conversations.collectAsState()
12045 val resources = LocalResources .current
121-
122- LazyColumn (
123- modifier = modifier.fillMaxSize()
124- ) {
125- items(
126- items = conversations,
127- key = { it.id }
128- ) { conversation ->
129- ConversationListItem (
46+ ConversationsListScreen (
47+ title = stringResource(R .string.ai_bot_conversations_title),
48+ addConversationContentDescription = stringResource(R .string.ai_bot_new_conversation_content_description),
49+ snackbarHostState = snackbarHostState,
50+ conversations = conversations,
51+ conversationsState = conversationsState,
52+ onBackClick = onBackClick,
53+ onCreateNewConversationClick = onCreateNewConversationClick,
54+ onRefresh = onRefresh,
55+ conversationListItem = { conversation ->
56+ BotConversationListItem (
13057 conversation = conversation,
13158 resources = resources,
13259 onClick = { onConversationClick(conversation) }
13360 )
134- HorizontalDivider (
135- color = MaterialTheme .colorScheme.outlineVariant.copy(alpha = 0.5f )
136- )
13761 }
138- }
62+ )
13963}
14064
14165@Composable
142- private fun ConversationListItem (
66+ private fun BotConversationListItem (
14367 conversation : BotConversation ,
14468 resources : Resources ,
14569 onClick : () -> Unit
@@ -183,14 +107,13 @@ private fun ConversationListItem(
183107@Preview(showBackground = true , name = " Conversations List" )
184108@Composable
185109private fun ConversationsScreenPreview () {
186- val sampleConversations = MutableStateFlow (generateSampleBotConversations())
187110 val snackbarHostState = remember { SnackbarHostState () }
188111
189112 AppThemeM3 (isDarkTheme = false ) {
190113 AIBotConversationsListScreen (
191114 snackbarHostState = snackbarHostState,
192- conversations = sampleConversations.asStateFlow (),
193- isLoading = false ,
115+ conversations = generateSampleBotConversations (),
116+ conversationsState = ConversationsSupportViewModel . ConversationsState . Loaded ,
194117 onConversationClick = { },
195118 onBackClick = { },
196119 onCreateNewConversationClick = { },
@@ -202,14 +125,13 @@ private fun ConversationsScreenPreview() {
202125@Preview(showBackground = true , name = " Conversations List - Dark" , uiMode = UI_MODE_NIGHT_YES )
203126@Composable
204127private fun ConversationsScreenPreviewDark () {
205- val sampleConversations = MutableStateFlow (generateSampleBotConversations())
206128 val snackbarHostState = remember { SnackbarHostState () }
207129
208130 AppThemeM3 (isDarkTheme = true ) {
209131 AIBotConversationsListScreen (
210132 snackbarHostState = snackbarHostState,
211- conversations = sampleConversations.asStateFlow (),
212- isLoading = false ,
133+ conversations = generateSampleBotConversations (),
134+ conversationsState = ConversationsSupportViewModel . ConversationsState . Loaded ,
213135 onConversationClick = { },
214136 onBackClick = { },
215137 onCreateNewConversationClick = { },
@@ -221,14 +143,13 @@ private fun ConversationsScreenPreviewDark() {
221143@Preview(showBackground = true , name = " Conversations List" )
222144@Composable
223145private fun ConversationsScreenWordPressPreview () {
224- val sampleConversations = MutableStateFlow (generateSampleBotConversations())
225146 val snackbarHostState = remember { SnackbarHostState () }
226147
227148 AppThemeM3 (isDarkTheme = false , isJetpackApp = false ) {
228149 AIBotConversationsListScreen (
229150 snackbarHostState = snackbarHostState,
230- conversations = sampleConversations.asStateFlow (),
231- isLoading = true ,
151+ conversations = generateSampleBotConversations (),
152+ conversationsState = ConversationsSupportViewModel . ConversationsState . Loaded ,
232153 onConversationClick = { },
233154 onBackClick = { },
234155 onCreateNewConversationClick = { },
@@ -240,14 +161,13 @@ private fun ConversationsScreenWordPressPreview() {
240161@Preview(showBackground = true , name = " Conversations List - Dark" , uiMode = UI_MODE_NIGHT_YES )
241162@Composable
242163private fun ConversationsScreenPreviewWordPressDark () {
243- val sampleConversations = MutableStateFlow (generateSampleBotConversations())
244164 val snackbarHostState = remember { SnackbarHostState () }
245165
246166 AppThemeM3 (isDarkTheme = true , isJetpackApp = false ) {
247167 AIBotConversationsListScreen (
248168 snackbarHostState = snackbarHostState,
249- conversations = sampleConversations.asStateFlow (),
250- isLoading = true ,
169+ conversations = generateSampleBotConversations (),
170+ conversationsState = ConversationsSupportViewModel . ConversationsState . Loaded ,
251171 onConversationClick = { },
252172 onBackClick = { },
253173 onCreateNewConversationClick = { },
@@ -259,14 +179,13 @@ private fun ConversationsScreenPreviewWordPressDark() {
259179@Preview(showBackground = true , name = " Empty Conversations List" )
260180@Composable
261181private fun EmptyConversationsScreenPreview () {
262- val emptyConversations = MutableStateFlow (emptyList<BotConversation >())
263182 val snackbarHostState = remember { SnackbarHostState () }
264183
265184 AppThemeM3 (isDarkTheme = false ) {
266185 AIBotConversationsListScreen (
267186 snackbarHostState = snackbarHostState,
268- conversations = emptyConversations.asStateFlow (),
269- isLoading = false ,
187+ conversations = emptyList (),
188+ conversationsState = ConversationsSupportViewModel . ConversationsState . Loaded ,
270189 onConversationClick = { },
271190 onBackClick = { },
272191 onCreateNewConversationClick = { },
@@ -278,14 +197,13 @@ private fun EmptyConversationsScreenPreview() {
278197@Preview(showBackground = true , name = " Empty Conversations List - Dark" , uiMode = UI_MODE_NIGHT_YES )
279198@Composable
280199private fun EmptyConversationsScreenPreviewDark () {
281- val emptyConversations = MutableStateFlow (emptyList<BotConversation >())
282200 val snackbarHostState = remember { SnackbarHostState () }
283201
284202 AppThemeM3 (isDarkTheme = true ) {
285203 AIBotConversationsListScreen (
286204 snackbarHostState = snackbarHostState,
287- conversations = emptyConversations.asStateFlow (),
288- isLoading = false ,
205+ conversations = emptyList (),
206+ conversationsState = ConversationsSupportViewModel . ConversationsState . Loaded ,
289207 onConversationClick = { },
290208 onBackClick = { },
291209 onCreateNewConversationClick = { },
0 commit comments