From d4336929fe1a21534465ad57fcc640fd3d646aa9 Mon Sep 17 00:00:00 2001 From: adalpari Date: Wed, 5 Nov 2025 17:37:20 +0100 Subject: [PATCH 1/9] Adding the field --- .../wordpress/android/support/he/model/SupportConversation.kt | 1 + .../android/support/he/repository/HESupportRepository.kt | 3 +++ .../wordpress/android/support/he/util/HEConversationUtils.kt | 3 +++ 3 files changed, 7 insertions(+) diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/model/SupportConversation.kt b/WordPress/src/main/java/org/wordpress/android/support/he/model/SupportConversation.kt index dd81da57827e..130e241ade19 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/model/SupportConversation.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/model/SupportConversation.kt @@ -8,6 +8,7 @@ data class SupportConversation( val title: String, val description: String, val lastMessageSentAt: Date, + val status: String, val messages: List ): Conversation { override fun getConversationId(): Long = id diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/repository/HESupportRepository.kt b/WordPress/src/main/java/org/wordpress/android/support/he/repository/HESupportRepository.kt index e107d19c4300..0f8fb5fe10bf 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/repository/HESupportRepository.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/repository/HESupportRepository.kt @@ -1,5 +1,6 @@ package org.wordpress.android.support.he.repository +import android.util.Log import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext import org.wordpress.android.fluxc.utils.AppLogWrapper @@ -181,6 +182,7 @@ class HESupportRepository @Inject constructor( title = it.title, description = it.description, lastMessageSentAt = it.updatedAt, + status = it.status, messages = emptyList() ) } @@ -191,6 +193,7 @@ class HESupportRepository @Inject constructor( title = title, description = description, lastMessageSentAt = updatedAt, + status = status, messages = messages.map { it.toSupportMessage() } ) diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/util/HEConversationUtils.kt b/WordPress/src/main/java/org/wordpress/android/support/he/util/HEConversationUtils.kt index f662d8c0bf70..9c1bc83ef5cc 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/util/HEConversationUtils.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/util/HEConversationUtils.kt @@ -21,6 +21,7 @@ fun generateSampleHESupportConversations(): List { description = "I'm having trouble logging into my account. The two-factor authentication code " + "doesn't seem to be working properly when I try to access my site from the mobile app.", lastMessageSentAt = oneHourAgo, + status = "Open", messages = listOf( SupportMessage( id = 1, @@ -73,6 +74,7 @@ fun generateSampleHESupportConversations(): List { "store, I've noticed significant slowdowns and occasional timeout errors affecting customer " + "experience.", lastMessageSentAt = twoDaysAgo, + status = "Open", messages = listOf( SupportMessage( id = 4, @@ -101,6 +103,7 @@ fun generateSampleHESupportConversations(): List { "configuration, SSL certificate setup, and setting up professional email forwarding for my " + "business site.", lastMessageSentAt = oneWeekAgo, + status = "Open", messages = listOf( SupportMessage( id = 6, From e8271145397dfdb51d5c795de01d9f0f6656f6d9 Mon Sep 17 00:00:00 2001 From: adalpari Date: Wed, 5 Nov 2025 17:46:44 +0100 Subject: [PATCH 2/9] Showing closed status in the UI --- .../he/ui/HEConversationDetailScreen.kt | 47 ++++++++++++++++--- .../he/ui/HEConversationsListScreen.kt | 25 +++++++++- WordPress/src/main/res/values/strings.xml | 2 + 3 files changed, 67 insertions(+), 7 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt index 57c241f8c6e2..d68a89334288 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt @@ -111,12 +111,17 @@ fun HEConversationDetailScreen( ) }, bottomBar = { - ReplyButton( - enabled = !isLoading, - onClick = { - showBottomSheet = true - } - ) + val isClosed = conversation.status.equals("closed", ignoreCase = true) + if (isClosed) { + ClosedConversationBanner() + } else { + ReplyButton( + enabled = !isLoading, + onClick = { + showBottomSheet = true + } + ) + } } ) { contentPadding -> Box( @@ -285,6 +290,36 @@ private fun ConversationTitleCard(title: String) { } } +@Composable +private fun ClosedConversationBanner() { + Box( + modifier = Modifier + .fillMaxWidth() + .background( + color = MaterialTheme.colorScheme.errorContainer, + shape = RoundedCornerShape(8.dp) + ) + .padding(16.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + Icon( + painter = painterResource(R.drawable.ic_info_outline_white_24dp), + contentDescription = null, + tint = MaterialTheme.colorScheme.onErrorContainer, + modifier = Modifier.size(24.dp) + ) + Text( + text = stringResource(R.string.he_support_conversation_closed_message), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onErrorContainer + ) + } + } +} + @Composable private fun MessageItem( message: SupportMessage, diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt index 70f106c36bea..d222adb22b05 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt @@ -2,12 +2,16 @@ package org.wordpress.android.support.he.ui import android.content.res.Configuration.UI_MODE_NIGHT_YES import android.content.res.Resources +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -79,6 +83,22 @@ private fun HEConversationListItem( Column( modifier = Modifier.weight(1f) ) { + // Closed badge (if applicable) + if (conversation.status.equals("closed", ignoreCase = true)) { + Text( + text = stringResource(R.string.he_support_status_closed), + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onErrorContainer, + modifier = Modifier + .padding(bottom = 4.dp) + .background( + color = MaterialTheme.colorScheme.errorContainer, + shape = RoundedCornerShape(4.dp) + ) + .padding(horizontal = 6.dp, vertical = 2.dp) + ) + } + Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, @@ -95,7 +115,10 @@ private fun HEConversationListItem( ) Text( - text = formatRelativeTime(conversation.lastMessageSentAt, resources), + text = formatRelativeTime( + conversation.lastMessageSentAt, + resources + ), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.padding(start = 8.dp) diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 957a50397d79..6b8183da8a23 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -5180,6 +5180,8 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> Including logs can help our team investigate issues. Logs may contain recent app activity. Download attachment Select attachments + Closed + This conversation is closed. You can no longer reply to it. Contact Support From 421c803a3eca0d58024344df315c9bc911dbb7d7 Mon Sep 17 00:00:00 2001 From: adalpari Date: Wed, 5 Nov 2025 17:47:38 +0100 Subject: [PATCH 3/9] Extracting string --- .../android/support/he/ui/HEConversationDetailScreen.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt index d68a89334288..d30a4ce6f555 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt @@ -66,6 +66,8 @@ import org.wordpress.android.ui.compose.components.MainTopAppBar import org.wordpress.android.ui.compose.components.NavigationIcons import org.wordpress.android.ui.compose.theme.AppThemeM3 +private const val CLOSED = "closed" + @OptIn(ExperimentalMaterial3Api::class) @Composable fun HEConversationDetailScreen( @@ -111,7 +113,7 @@ fun HEConversationDetailScreen( ) }, bottomBar = { - val isClosed = conversation.status.equals("closed", ignoreCase = true) + val isClosed = conversation.status.equals(CLOSED, ignoreCase = true) if (isClosed) { ClosedConversationBanner() } else { From b4ef17fbc9713fe98e50a764e651440bfe6b74e5 Mon Sep 17 00:00:00 2001 From: adalpari Date: Wed, 5 Nov 2025 17:48:55 +0100 Subject: [PATCH 4/9] Detekt --- .../android/support/he/repository/HESupportRepository.kt | 1 - .../android/support/he/ui/HEConversationsListScreen.kt | 2 -- 2 files changed, 3 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/repository/HESupportRepository.kt b/WordPress/src/main/java/org/wordpress/android/support/he/repository/HESupportRepository.kt index 0f8fb5fe10bf..e1199d998a75 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/repository/HESupportRepository.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/repository/HESupportRepository.kt @@ -1,6 +1,5 @@ package org.wordpress.android.support.he.repository -import android.util.Log import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext import org.wordpress.android.fluxc.utils.AppLogWrapper diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt index d222adb22b05..fdf4f9c31661 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt @@ -7,10 +7,8 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon From c751f3d84ef0f2b0f992ea4b04b61a927d4b75c1 Mon Sep 17 00:00:00 2001 From: adalpari Date: Thu, 6 Nov 2025 10:22:38 +0100 Subject: [PATCH 5/9] Adding all other statuses --- .../he/ui/HEConversationDetailScreen.kt | 4 +- .../he/ui/HEConversationsListScreen.kt | 66 ++++++++++++++----- .../support/he/util/HEConversationUtils.kt | 4 +- WordPress/src/main/res/values/strings.xml | 4 ++ .../he/repository/HESupportRepositoryTest.kt | 2 + .../support/he/ui/HESupportViewModelTest.kt | 4 +- 6 files changed, 64 insertions(+), 20 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt index d30a4ce6f555..e95e5db0eaab 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt @@ -66,7 +66,7 @@ import org.wordpress.android.ui.compose.components.MainTopAppBar import org.wordpress.android.ui.compose.components.NavigationIcons import org.wordpress.android.ui.compose.theme.AppThemeM3 -private const val CLOSED = "closed" +private const val STATUS_CLOSED = "closed" @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -113,7 +113,7 @@ fun HEConversationDetailScreen( ) }, bottomBar = { - val isClosed = conversation.status.equals(CLOSED, ignoreCase = true) + val isClosed = conversation.status.equals(STATUS_CLOSED, ignoreCase = true) if (isClosed) { ClosedConversationBanner() } else { diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt index fdf4f9c31661..12665e0d27cf 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt @@ -81,21 +81,8 @@ private fun HEConversationListItem( Column( modifier = Modifier.weight(1f) ) { - // Closed badge (if applicable) - if (conversation.status.equals("closed", ignoreCase = true)) { - Text( - text = stringResource(R.string.he_support_status_closed), - style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.onErrorContainer, - modifier = Modifier - .padding(bottom = 4.dp) - .background( - color = MaterialTheme.colorScheme.errorContainer, - shape = RoundedCornerShape(4.dp) - ) - .padding(horizontal = 6.dp, vertical = 2.dp) - ) - } + // Status badge + ConversationStatusBadge(status = conversation.status) Row( modifier = Modifier.fillMaxWidth(), @@ -142,6 +129,55 @@ private fun HEConversationListItem( } } +@Composable +private fun ConversationStatusBadge(status: String) { + val (statusText, backgroundColor, textColor) = when (status.lowercase()) { + "open" -> Triple( + stringResource(R.string.he_support_status_open), + MaterialTheme.colorScheme.primaryContainer, + MaterialTheme.colorScheme.onPrimaryContainer + ) + "pending" -> Triple( + stringResource(R.string.he_support_status_pending), + MaterialTheme.colorScheme.secondaryContainer, + MaterialTheme.colorScheme.onSecondaryContainer + ) + "on-hold" -> Triple( + stringResource(R.string.he_support_status_on_hold), + MaterialTheme.colorScheme.surfaceVariant, + MaterialTheme.colorScheme.onSurfaceVariant + ) + "solved" -> Triple( + stringResource(R.string.he_support_status_solved), + MaterialTheme.colorScheme.primary, + MaterialTheme.colorScheme.onPrimary + ) + "closed" -> Triple( + stringResource(R.string.he_support_status_closed), + MaterialTheme.colorScheme.tertiaryContainer, + MaterialTheme.colorScheme.onTertiaryContainer + ) + else -> Triple( + status, + MaterialTheme.colorScheme.surfaceVariant, + MaterialTheme.colorScheme.onSurfaceVariant + ) + } + + Text( + text = statusText, + style = MaterialTheme.typography.labelSmall, + color = textColor, + modifier = Modifier + .padding(bottom = 4.dp) + .background( + color = backgroundColor, + shape = RoundedCornerShape(4.dp) + ) + .padding(horizontal = 6.dp, vertical = 2.dp) + ) +} + @Preview(showBackground = true, name = "HE Support Conversations List") @Composable private fun ConversationsScreenPreview() { diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/util/HEConversationUtils.kt b/WordPress/src/main/java/org/wordpress/android/support/he/util/HEConversationUtils.kt index 9c1bc83ef5cc..88e827c089ff 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/util/HEConversationUtils.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/util/HEConversationUtils.kt @@ -74,7 +74,7 @@ fun generateSampleHESupportConversations(): List { "store, I've noticed significant slowdowns and occasional timeout errors affecting customer " + "experience.", lastMessageSentAt = twoDaysAgo, - status = "Open", + status = "closed", messages = listOf( SupportMessage( id = 4, @@ -103,7 +103,7 @@ fun generateSampleHESupportConversations(): List { "configuration, SSL certificate setup, and setting up professional email forwarding for my " + "business site.", lastMessageSentAt = oneWeekAgo, - status = "Open", + status = "solved", messages = listOf( SupportMessage( id = 6, diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 6b8183da8a23..61f1fc1c929b 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -5180,6 +5180,10 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> Including logs can help our team investigate issues. Logs may contain recent app activity. Download attachment Select attachments + Open + Pending + On-hold + Solved Closed This conversation is closed. You can no longer reply to it. diff --git a/WordPress/src/test/java/org/wordpress/android/support/he/repository/HESupportRepositoryTest.kt b/WordPress/src/test/java/org/wordpress/android/support/he/repository/HESupportRepositoryTest.kt index 3b99568e1d1a..e4508fef6276 100644 --- a/WordPress/src/test/java/org/wordpress/android/support/he/repository/HESupportRepositoryTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/support/he/repository/HESupportRepositoryTest.kt @@ -350,6 +350,7 @@ class HESupportRepositoryTest : BaseUnitTest() { title = title, description = description, lastMessageSentAt = updatedAt, + status = status, messages = emptyList() ) @@ -359,6 +360,7 @@ class HESupportRepositoryTest : BaseUnitTest() { title = this.title, description = this.description, lastMessageSentAt = this.updatedAt, + status = this.status, messages = this.messages.map { it.toSupportMessage() } ) diff --git a/WordPress/src/test/java/org/wordpress/android/support/he/ui/HESupportViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/support/he/ui/HESupportViewModelTest.kt index 01575e0371a0..056bc64763f7 100644 --- a/WordPress/src/test/java/org/wordpress/android/support/he/ui/HESupportViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/support/he/ui/HESupportViewModelTest.kt @@ -672,13 +672,15 @@ class HESupportViewModelTest : BaseUnitTest() { private fun createTestConversation( id: Long, title: String = "Test Conversation", - description: String = "Test Description" + description: String = "Test Description", + status: String = "open" ): SupportConversation { return SupportConversation( id = id, title = title, description = description, lastMessageSentAt = Date(), + status = status, messages = emptyList() ) } From 6fc5d345cabf07ad42582e304952e398f71adccd Mon Sep 17 00:00:00 2001 From: adalpari Date: Thu, 6 Nov 2025 10:46:00 +0100 Subject: [PATCH 6/9] Some PR suggestions and fix --- .../support/he/model/ConversationStatus.kt | 10 ++++++++++ .../support/he/ui/HEConversationDetailScreen.kt | 5 ++--- .../support/he/ui/HEConversationsListScreen.kt | 16 +++++++++++----- WordPress/src/main/res/values/strings.xml | 1 + 4 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/support/he/model/ConversationStatus.kt diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/model/ConversationStatus.kt b/WordPress/src/main/java/org/wordpress/android/support/he/model/ConversationStatus.kt new file mode 100644 index 000000000000..1bfc7fbb4bb1 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/support/he/model/ConversationStatus.kt @@ -0,0 +1,10 @@ +package org.wordpress.android.support.he.model + +object ConversationStatus { + const val NEW = "new" + const val OPEN = "open" + const val PENDING = "pending" + const val ON_HOLD = "hold" + const val SOLVED = "solved" + const val CLOSED = "closed" +} diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt index e95e5db0eaab..e3291039d7b4 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt @@ -57,6 +57,7 @@ import androidx.compose.ui.unit.dp import coil.request.ImageRequest import org.wordpress.android.R import org.wordpress.android.support.aibot.util.formatRelativeTime +import org.wordpress.android.support.he.model.ConversationStatus import org.wordpress.android.support.he.model.SupportAttachment import org.wordpress.android.support.he.model.SupportConversation import org.wordpress.android.support.he.model.SupportMessage @@ -66,8 +67,6 @@ import org.wordpress.android.ui.compose.components.MainTopAppBar import org.wordpress.android.ui.compose.components.NavigationIcons import org.wordpress.android.ui.compose.theme.AppThemeM3 -private const val STATUS_CLOSED = "closed" - @OptIn(ExperimentalMaterial3Api::class) @Composable fun HEConversationDetailScreen( @@ -113,7 +112,7 @@ fun HEConversationDetailScreen( ) }, bottomBar = { - val isClosed = conversation.status.equals(STATUS_CLOSED, ignoreCase = true) + val isClosed = conversation.status.equals(ConversationStatus.CLOSED, ignoreCase = true) if (isClosed) { ClosedConversationBanner() } else { diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt index 12665e0d27cf..52c9fda1eb20 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt @@ -30,6 +30,7 @@ import org.wordpress.android.R import org.wordpress.android.support.aibot.util.formatRelativeTime import org.wordpress.android.support.common.ui.ConversationsListScreen import org.wordpress.android.support.common.ui.ConversationsSupportViewModel +import org.wordpress.android.support.he.model.ConversationStatus import org.wordpress.android.support.he.model.SupportConversation import org.wordpress.android.support.he.util.generateSampleHESupportConversations import org.wordpress.android.ui.compose.theme.AppThemeM3 @@ -132,27 +133,32 @@ private fun HEConversationListItem( @Composable private fun ConversationStatusBadge(status: String) { val (statusText, backgroundColor, textColor) = when (status.lowercase()) { - "open" -> Triple( + ConversationStatus.NEW -> Triple( + stringResource(R.string.he_support_status_new), + MaterialTheme.colorScheme.primaryContainer, + MaterialTheme.colorScheme.onPrimaryContainer + ) + ConversationStatus.OPEN -> Triple( stringResource(R.string.he_support_status_open), MaterialTheme.colorScheme.primaryContainer, MaterialTheme.colorScheme.onPrimaryContainer ) - "pending" -> Triple( + ConversationStatus.PENDING -> Triple( stringResource(R.string.he_support_status_pending), MaterialTheme.colorScheme.secondaryContainer, MaterialTheme.colorScheme.onSecondaryContainer ) - "on-hold" -> Triple( + ConversationStatus.ON_HOLD -> Triple( stringResource(R.string.he_support_status_on_hold), MaterialTheme.colorScheme.surfaceVariant, MaterialTheme.colorScheme.onSurfaceVariant ) - "solved" -> Triple( + ConversationStatus.SOLVED -> Triple( stringResource(R.string.he_support_status_solved), MaterialTheme.colorScheme.primary, MaterialTheme.colorScheme.onPrimary ) - "closed" -> Triple( + ConversationStatus.CLOSED -> Triple( stringResource(R.string.he_support_status_closed), MaterialTheme.colorScheme.tertiaryContainer, MaterialTheme.colorScheme.onTertiaryContainer diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 61f1fc1c929b..1f3a79922d8f 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -5180,6 +5180,7 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> Including logs can help our team investigate issues. Logs may contain recent app activity. Download attachment Select attachments + New Open Pending On-hold From 83481498854fd8df6f47373a60147a154740850e Mon Sep 17 00:00:00 2001 From: adalpari Date: Thu, 6 Nov 2025 14:42:38 +0100 Subject: [PATCH 7/9] Using "waiting for support" string in "New" tickets --- WordPress/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 1f3a79922d8f..9df7d232c679 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -5180,7 +5180,7 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> Including logs can help our team investigate issues. Logs may contain recent app activity. Download attachment Select attachments - New + Waiting for Support Open Pending On-hold From e72e78c073e34e7b0847fc9cc968484429894eff Mon Sep 17 00:00:00 2001 From: adalpari Date: Fri, 7 Nov 2025 19:02:27 +0100 Subject: [PATCH 8/9] Hiding support status and using a more user-friendly ones --- .../support/he/model/ConversationStatus.kt | 27 +++++--- .../support/he/ui/ConversationStatusBadge.kt | 60 ++++++++++++++++++ .../he/ui/HEConversationDetailScreen.kt | 30 +++------ .../he/ui/HEConversationsListScreen.kt | 62 ++----------------- WordPress/src/main/res/values/strings.xml | 7 +-- 5 files changed, 96 insertions(+), 90 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/support/he/ui/ConversationStatusBadge.kt diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/model/ConversationStatus.kt b/WordPress/src/main/java/org/wordpress/android/support/he/model/ConversationStatus.kt index 1bfc7fbb4bb1..a117be28477a 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/model/ConversationStatus.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/model/ConversationStatus.kt @@ -1,10 +1,23 @@ package org.wordpress.android.support.he.model -object ConversationStatus { - const val NEW = "new" - const val OPEN = "open" - const val PENDING = "pending" - const val ON_HOLD = "hold" - const val SOLVED = "solved" - const val CLOSED = "closed" +enum class ConversationStatus { + WAITING_FOR_SUPPORT, + WAITING_FOR_USER, + CLOSED, + SOLVED, + UNKNOWN; + + companion object { + fun fromStatus(status: String): ConversationStatus { + return when (status.lowercase()) { + "open" -> WAITING_FOR_SUPPORT + "closed" -> CLOSED + "pending" -> WAITING_FOR_USER + "solved" -> SOLVED + "new" -> WAITING_FOR_SUPPORT + "hold" -> WAITING_FOR_SUPPORT + else -> UNKNOWN + } + } + } } diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/ui/ConversationStatusBadge.kt b/WordPress/src/main/java/org/wordpress/android/support/he/ui/ConversationStatusBadge.kt new file mode 100644 index 000000000000..11aa691d9e75 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/support/he/ui/ConversationStatusBadge.kt @@ -0,0 +1,60 @@ +package org.wordpress.android.support.he.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import org.wordpress.android.R +import org.wordpress.android.support.he.model.ConversationStatus + +@Composable +fun ConversationStatusBadge( + status: String, + modifier: Modifier = Modifier +) { + val conversationStatus = ConversationStatus.fromStatus(status) + val (statusText, backgroundColor, textColor) = when (conversationStatus) { + ConversationStatus.WAITING_FOR_SUPPORT -> Triple( + stringResource(R.string.he_support_status_waiting_for_support), + MaterialTheme.colorScheme.primaryContainer, + MaterialTheme.colorScheme.onPrimaryContainer + ) + ConversationStatus.WAITING_FOR_USER -> Triple( + stringResource(R.string.he_support_status_waiting_for_user), + MaterialTheme.colorScheme.secondaryContainer, + MaterialTheme.colorScheme.onSecondaryContainer + ) + ConversationStatus.SOLVED -> Triple( + stringResource(R.string.he_support_status_solved), + MaterialTheme.colorScheme.primary, + MaterialTheme.colorScheme.onPrimary + ) + ConversationStatus.CLOSED -> Triple( + stringResource(R.string.he_support_status_closed), + MaterialTheme.colorScheme.tertiaryContainer, + MaterialTheme.colorScheme.onTertiaryContainer + ) + ConversationStatus.UNKNOWN -> Triple( + stringResource(R.string.he_support_status_unknown), + MaterialTheme.colorScheme.surfaceVariant, + MaterialTheme.colorScheme.onSurfaceVariant + ) + } + + Text( + text = statusText, + style = MaterialTheme.typography.labelSmall, + color = textColor, + modifier = modifier + .background( + color = backgroundColor, + shape = RoundedCornerShape(4.dp) + ) + .padding(horizontal = 6.dp, vertical = 2.dp) + ) +} diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt index e3291039d7b4..b8d47d6eabea 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt @@ -112,7 +112,8 @@ fun HEConversationDetailScreen( ) }, bottomBar = { - val isClosed = conversation.status.equals(ConversationStatus.CLOSED, ignoreCase = true) + val status = ConversationStatus.fromStatus(conversation.status) + val isClosed = status == ConversationStatus.CLOSED if (isClosed) { ClosedConversationBanner() } else { @@ -139,7 +140,7 @@ fun HEConversationDetailScreen( ) { item { ConversationHeader( - messageCount = conversation.messages.size, + status = conversation.status, lastUpdated = formatRelativeTime(conversation.lastMessageSentAt, resources), isLoading = isLoading ) @@ -224,13 +225,15 @@ fun HEConversationDetailScreen( @Composable private fun ConversationHeader( - messageCount: Int, + status: String, lastUpdated: String, isLoading: Boolean = false ) { + val statusText = ConversationStatus.fromStatus(status).name.lowercase() + .replace("_", " ") + .replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } val headerDescription = if (!isLoading) { - "${stringResource(R.string.he_support_message_count, messageCount)}. " + - stringResource(R.string.he_support_last_updated, lastUpdated) + "$statusText. ${stringResource(R.string.he_support_last_updated, lastUpdated)}" } else { stringResource(R.string.he_support_last_updated, lastUpdated) } @@ -246,22 +249,7 @@ private fun ConversationHeader( verticalAlignment = Alignment.CenterVertically ) { if (!isLoading) { - Row( - horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Icon( - painter = painterResource(R.drawable.ic_comment_white_24dp), - contentDescription = null, - tint = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.size(20.dp) - ) - Text( - text = stringResource(R.string.he_support_message_count, messageCount), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant - ) - } + ConversationStatusBadge(status = status) } else { Spacer(modifier = Modifier.size(0.dp)) } diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt index 52c9fda1eb20..4944bd98b1d1 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationsListScreen.kt @@ -2,14 +2,12 @@ package org.wordpress.android.support.he.ui import android.content.res.Configuration.UI_MODE_NIGHT_YES import android.content.res.Resources -import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -30,7 +28,6 @@ import org.wordpress.android.R import org.wordpress.android.support.aibot.util.formatRelativeTime import org.wordpress.android.support.common.ui.ConversationsListScreen import org.wordpress.android.support.common.ui.ConversationsSupportViewModel -import org.wordpress.android.support.he.model.ConversationStatus import org.wordpress.android.support.he.model.SupportConversation import org.wordpress.android.support.he.util.generateSampleHESupportConversations import org.wordpress.android.ui.compose.theme.AppThemeM3 @@ -83,7 +80,10 @@ private fun HEConversationListItem( modifier = Modifier.weight(1f) ) { // Status badge - ConversationStatusBadge(status = conversation.status) + ConversationStatusBadge( + status = conversation.status, + modifier = Modifier.padding(bottom = 4.dp) + ) Row( modifier = Modifier.fillMaxWidth(), @@ -130,60 +130,6 @@ private fun HEConversationListItem( } } -@Composable -private fun ConversationStatusBadge(status: String) { - val (statusText, backgroundColor, textColor) = when (status.lowercase()) { - ConversationStatus.NEW -> Triple( - stringResource(R.string.he_support_status_new), - MaterialTheme.colorScheme.primaryContainer, - MaterialTheme.colorScheme.onPrimaryContainer - ) - ConversationStatus.OPEN -> Triple( - stringResource(R.string.he_support_status_open), - MaterialTheme.colorScheme.primaryContainer, - MaterialTheme.colorScheme.onPrimaryContainer - ) - ConversationStatus.PENDING -> Triple( - stringResource(R.string.he_support_status_pending), - MaterialTheme.colorScheme.secondaryContainer, - MaterialTheme.colorScheme.onSecondaryContainer - ) - ConversationStatus.ON_HOLD -> Triple( - stringResource(R.string.he_support_status_on_hold), - MaterialTheme.colorScheme.surfaceVariant, - MaterialTheme.colorScheme.onSurfaceVariant - ) - ConversationStatus.SOLVED -> Triple( - stringResource(R.string.he_support_status_solved), - MaterialTheme.colorScheme.primary, - MaterialTheme.colorScheme.onPrimary - ) - ConversationStatus.CLOSED -> Triple( - stringResource(R.string.he_support_status_closed), - MaterialTheme.colorScheme.tertiaryContainer, - MaterialTheme.colorScheme.onTertiaryContainer - ) - else -> Triple( - status, - MaterialTheme.colorScheme.surfaceVariant, - MaterialTheme.colorScheme.onSurfaceVariant - ) - } - - Text( - text = statusText, - style = MaterialTheme.typography.labelSmall, - color = textColor, - modifier = Modifier - .padding(bottom = 4.dp) - .background( - color = backgroundColor, - shape = RoundedCornerShape(4.dp) - ) - .padding(horizontal = 6.dp, vertical = 2.dp) - ) -} - @Preview(showBackground = true, name = "HE Support Conversations List") @Composable private fun ConversationsScreenPreview() { diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 9df7d232c679..da777a80d303 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -5180,12 +5180,11 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> Including logs can help our team investigate issues. Logs may contain recent app activity. Download attachment Select attachments - Waiting for Support - Open - Pending - On-hold + Waiting for Support + Waiting for user Solved Closed + Unknown This conversation is closed. You can no longer reply to it. From e688272d4def4c1b80a31c00690faabeaf405a74 Mon Sep 17 00:00:00 2001 From: adalpari Date: Fri, 7 Nov 2025 19:15:03 +0100 Subject: [PATCH 9/9] Some refactor --- .../support/he/model/ConversationStatus.kt | 4 +--- .../he/ui/HEConversationDetailScreen.kt | 21 ++++++++++++------- WordPress/src/main/res/values/strings.xml | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/model/ConversationStatus.kt b/WordPress/src/main/java/org/wordpress/android/support/he/model/ConversationStatus.kt index a117be28477a..4839d24ccc07 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/model/ConversationStatus.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/model/ConversationStatus.kt @@ -10,12 +10,10 @@ enum class ConversationStatus { companion object { fun fromStatus(status: String): ConversationStatus { return when (status.lowercase()) { - "open" -> WAITING_FOR_SUPPORT + "open", "new", "hold" -> WAITING_FOR_SUPPORT "closed" -> CLOSED "pending" -> WAITING_FOR_USER "solved" -> SOLVED - "new" -> WAITING_FOR_SUPPORT - "hold" -> WAITING_FOR_SUPPORT else -> UNKNOWN } } diff --git a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt index b8d47d6eabea..9b49976572b2 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/he/ui/HEConversationDetailScreen.kt @@ -229,9 +229,18 @@ private fun ConversationHeader( lastUpdated: String, isLoading: Boolean = false ) { - val statusText = ConversationStatus.fromStatus(status).name.lowercase() - .replace("_", " ") - .replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } + val statusText = when (ConversationStatus.fromStatus(status)) { + ConversationStatus.WAITING_FOR_SUPPORT -> + stringResource(R.string.he_support_status_waiting_for_support) + ConversationStatus.WAITING_FOR_USER -> + stringResource(R.string.he_support_status_waiting_for_user) + ConversationStatus.SOLVED -> + stringResource(R.string.he_support_status_solved) + ConversationStatus.CLOSED -> + stringResource(R.string.he_support_status_closed) + ConversationStatus.UNKNOWN -> + stringResource(R.string.he_support_status_unknown) + } val headerDescription = if (!isLoading) { "$statusText. ${stringResource(R.string.he_support_last_updated, lastUpdated)}" } else { @@ -248,11 +257,7 @@ private fun ConversationHeader( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { - if (!isLoading) { - ConversationStatusBadge(status = status) - } else { - Spacer(modifier = Modifier.size(0.dp)) - } + ConversationStatusBadge(status = status) Text( text = stringResource(R.string.he_support_last_updated, lastUpdated), diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index da777a80d303..2e3f34ab2ecb 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -5181,7 +5181,7 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> Download attachment Select attachments Waiting for Support - Waiting for user + Waiting for User Solved Closed Unknown