From 7a84da9af67659311cc71f7499f2eff64a578b7b Mon Sep 17 00:00:00 2001 From: AdamGrzybkowski Date: Fri, 14 Nov 2025 14:55:28 +0100 Subject: [PATCH 1/5] Update copy for booking list empty states --- .../android/ui/bookings/list/BookingListScreen.kt | 12 ++++++++---- WooCommerce/src/main/res/values/strings.xml | 7 ++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/list/BookingListScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/list/BookingListScreen.kt index b1e5275b2a1..c064f770ebe 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/list/BookingListScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/list/BookingListScreen.kt @@ -398,7 +398,11 @@ private fun EmptyListView( text = when (selectedTab) { BookingListTab.Today -> stringResource(R.string.bookings_empty_state_title_today) BookingListTab.Upcoming -> stringResource(R.string.bookings_empty_state_title_upcoming) - BookingListTab.All -> stringResource(R.string.bookings_empty_state_title_default) + BookingListTab.All -> if (areFiltersActive) { + stringResource(R.string.bookings_empty_state_title_default) + } else { + stringResource(R.string.bookings_empty_state_title_all) + } }, style = MaterialTheme.typography.titleLarge, textAlign = TextAlign.Center @@ -408,13 +412,13 @@ private fun EmptyListView( Text( text = when (selectedTab) { - BookingListTab.Today -> stringResource(R.string.bookings_empty_state_description_today) - BookingListTab.Upcoming -> stringResource(R.string.bookings_empty_state_description_upcoming) + BookingListTab.Today -> stringResource(R.string.bookings_empty_state_description_today_v2) + BookingListTab.Upcoming -> stringResource(R.string.bookings_empty_state_description_upcoming_v2) else -> { if (areFiltersActive) { stringResource(R.string.bookings_empty_state_description_with_filters) } else { - stringResource(R.string.bookings_empty_state_description_default) + stringResource(R.string.bookings_empty_state_description_all) } } }, diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index b8ec6c74fe0..88d37cb1024 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -4205,9 +4205,10 @@ No bookings found No bookings today No upcoming bookings - Incoming bookings will appear here, where you can view and manage them. - You don’t have any appointments or events scheduled for today. - You don’t have any future appointments or events scheduled yet. + No bookings yet + Bookings will appear here once customers start scheduling your services or registering for events. + Any bookings scheduled for today will appear here. + New bookings will appear here as customers schedule your services or register for events. We couldn’t find any bookings with that name — try adjusting your search term to see more results. We couldn’t find any bookings with that name — try adjusting your search term or your filters to see more results. No bookings match your filters. Try adjusting them to see more results. From dd92f1dfb50cc3b5cb52bcc22607f49f188c948c Mon Sep 17 00:00:00 2001 From: AdamGrzybkowski Date: Fri, 14 Nov 2025 15:13:44 +0100 Subject: [PATCH 2/5] Update Booking appointment details section - Staff -> Team member - APPOINTMENT DETAILS - BOOKING DETAILS - Remove `price` row --- .../android/ui/bookings/BookingMapper.kt | 1 - .../bookings/compose/BookingAppointmentDetails.kt | 13 +++---------- .../ui/bookings/details/BookingDetailsScreen.kt | 1 - WooCommerce/src/main/res/values/strings.xml | 5 ++--- 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt index 2b27ea2c341..e4e5d023aab 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt @@ -78,7 +78,6 @@ class BookingMapper @Inject constructor( staff = staffMemberStatus, // TODO replace mocked values when available from API location = "238 Willow Creek Drive, Montgomery AL 36109", - price = currencyFormatter.formatCurrency(cost, currency), cancelStatus = cancelStatus, cancelButtonVisible = isCancellable, duration = duration, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingAppointmentDetails.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingAppointmentDetails.kt index d754455071b..0fd9478c170 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingAppointmentDetails.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingAppointmentDetails.kt @@ -33,7 +33,7 @@ fun BookingAppointmentDetails( modifier: Modifier = Modifier, ) { Column(modifier = modifier) { - BookingSectionHeader(R.string.booking_appointment_details_header) + BookingSectionHeader(R.string.booking_details_section_header) Column(modifier = Modifier.background(color = MaterialTheme.colorScheme.surfaceContainer)) { HorizontalDivider(thickness = 0.5.dp) AppointmentDetailsRow( @@ -46,7 +46,7 @@ fun BookingAppointmentDetails( ) model.staff?.let { AppointmentDetailsRow( - label = R.string.booking_appointment_label_staff + label = R.string.booking_appointment_label_team_member ) { when (it) { is BookingStaffMemberStatus.Loaded, is BookingStaffMemberStatus.Unavailable -> { @@ -76,11 +76,7 @@ fun BookingAppointmentDetails( ) AppointmentDetailsRow( label = R.string.booking_appointment_label_duration, - value = model.duration - ) - AppointmentDetailsRow( - label = R.string.booking_appointment_label_price, - value = model.price, + value = model.duration, withDivider = model.cancelButtonVisible, ) AnimatedVisibility(model.cancelButtonVisible) { @@ -152,7 +148,6 @@ data class BookingAppointmentDetailsModel( val staff: BookingStaffMemberStatus?, val location: String, val duration: String, - val price: String, val cancelButtonVisible: Boolean, val cancelStatus: CancelStatus, ) { @@ -177,7 +172,6 @@ private fun BookingAppointmentDetailsPreview() { staff = BookingStaffMemberStatus.Loading, location = "238 Willow Creek Drive, Montgomery AL 36109", duration = "60 min", - price = "$55.00", cancelButtonVisible = true, cancelStatus = CancelStatus.Idle, ), @@ -198,7 +192,6 @@ private fun BookingAppointmentDetailsCancelHiddenPreview() { staff = BookingStaffMemberStatus.Loading, location = "238 Willow Creek Drive, Montgomery AL 36109", duration = "60 min", - price = "$55.00", cancelButtonVisible = false, cancelStatus = CancelStatus.Idle, ), diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsScreen.kt index 8e92a730f23..3ae2cd267a2 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsScreen.kt @@ -282,7 +282,6 @@ private fun BookingDetailsPreview() { staff = BookingStaffMemberStatus.Loaded("Marianne Renoir"), location = "238 Willow Creek Drive, Montgomery AL 36109", duration = "60 min", - price = "$55.00", cancelButtonVisible = true, cancelStatus = CancelStatus.Idle, ), diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index 88d37cb1024..a905b4a5a2d 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -4239,13 +4239,12 @@ Booking #%s - APPOINTMENT DETAILS + BOOKING DETAILS Date Time - Assigned staff + Team member Location Duration - Price Unpaid Paid Pending Confirmation From 5357ff105cd3d2bc0e7979842c54192ecbf18bff Mon Sep 17 00:00:00 2001 From: AdamGrzybkowski Date: Fri, 14 Nov 2025 15:22:30 +0100 Subject: [PATCH 3/5] Update Cancel booking dialog --- .../com/woocommerce/android/ui/bookings/BookingMapper.kt | 2 +- .../android/ui/bookings/details/BookingDetailsViewModel.kt | 2 +- WooCommerce/src/main/res/values/strings.xml | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt index e4e5d023aab..c1760b20b1b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingMapper.kt @@ -148,7 +148,7 @@ class BookingMapper @Inject constructor( val date = detailsDateFormatter.format(booking.start) val time = timeRangeFormatter.format(booking.start) return UiString.UiStringRes( - R.string.booking_cancel_dialog_message, + R.string.booking_cancel_dialog_message_v2, listOf( customerName, UiString.UiStringText(serviceName), diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsViewModel.kt index 5b2dfbd675b..8d5e49dccb4 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsViewModel.kt @@ -87,7 +87,7 @@ class BookingDetailsViewModel @Inject constructor( if (showCancelBooking && booking != null) { val message = bookingMapper.buildCancelDialogMessage(booking) DialogState( - title = UiString.UiStringRes(R.string.booking_cancel_dialog_title), + title = UiString.UiStringRes(R.string.booking_cancel_dialog_title_v2), message = message, positiveButton = DialogState.DialogButton( text = UiString.UiStringRes(R.string.booking_cancel_dialog_confirm), diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index a905b4a5a2d..4993670b1f7 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -4287,8 +4287,9 @@ BOOKING NOTE Add note This is a private note. It’ll not be shared with the customer. - Cancel booking + Cancel booking? %1$s will no longer be able to attend “%2$s” on %3$s at %4$s. + %1$s can no longer attend “%2$s” on %3$s at %4$s. No, keep it Yes, cancel it Booking note From 4c2dd5e9f0100b228379bf82b30be9aa8bab35aa Mon Sep 17 00:00:00 2001 From: AdamGrzybkowski Date: Mon, 17 Nov 2025 09:36:39 +0100 Subject: [PATCH 4/5] Fix BookingMapperTest --- .../android/ui/bookings/BookingMapperTest.kt | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/BookingMapperTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/BookingMapperTest.kt index 914f91eebc1..ef40c6aa9b5 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/BookingMapperTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/BookingMapperTest.kt @@ -20,7 +20,6 @@ import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.doAnswer import org.mockito.kotlin.eq import org.mockito.kotlin.mock -import org.mockito.kotlin.whenever import org.wordpress.android.fluxc.model.LocalOrRemoteId import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingCustomerInfo import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingOrderInfo @@ -119,8 +118,6 @@ class BookingMapperTest : BaseUnitTest() { ) val staffMemberStatus = BookingStaffMemberStatus.Loaded("Marianne Renoir") - whenever(currencyFormatter.formatCurrency(eq("55.00"), eq("USD"), eq(true))).thenReturn("$55.00") - val expectedDate = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL) .withZone(ZoneOffset.UTC) .format(start) @@ -136,7 +133,6 @@ class BookingMapperTest : BaseUnitTest() { assertThat(model.staff).isEqualTo(staffMemberStatus) assertThat(model.location).isEqualTo("238 Willow Creek Drive, Montgomery AL 36109") assertThat(model.duration).isEqualTo("1 hour 30 minutes") - assertThat(model.price).isEqualTo("$55.00") assertThat(model.cancelStatus).isEqualTo(CancelStatus.Idle) } @@ -217,7 +213,7 @@ class BookingMapperTest : BaseUnitTest() { assertThat(message) .isEqualTo( UiString.UiStringRes( - R.string.booking_cancel_dialog_message, + R.string.booking_cancel_dialog_message_v2, listOf( UiString.UiStringText(customerName), UiString.UiStringText("${booking.order.productInfo?.name}"), @@ -243,7 +239,7 @@ class BookingMapperTest : BaseUnitTest() { assertThat(message) .isEqualTo( UiString.UiStringRes( - R.string.booking_cancel_dialog_message, + R.string.booking_cancel_dialog_message_v2, listOf( UiString.UiStringRes(R.string.customer_detail_guest_customer), UiString.UiStringText("${booking.order.productInfo?.name}"), @@ -279,11 +275,6 @@ class BookingMapperTest : BaseUnitTest() { @Test fun `given cancellable statuses, when mapped to appointment details, then cancel button visible`() { - whenever(currencyFormatter.formatCurrency(any(), any(), eq(true))).thenAnswer { - val amount = it.getArgument(0) - val currency = it.getArgument(1) - "$currency$amount" - } val statuses = listOf( BookingEntity.Status.Confirmed, BookingEntity.Status.Paid, @@ -301,11 +292,6 @@ class BookingMapperTest : BaseUnitTest() { @Test fun `given non-cancellable statuses, when mapped to appointment details, then cancel button hidden`() { - whenever(currencyFormatter.formatCurrency(any(), any(), eq(true))).thenAnswer { - val amount = it.getArgument(0) - val currency = it.getArgument(1) - "$currency$amount" - } val statuses = listOf( BookingEntity.Status.Cancelled, BookingEntity.Status.InCart, From 778e77df2c8fd27da1d91a9a5154d8d035c90efa Mon Sep 17 00:00:00 2001 From: AdamGrzybkowski Date: Mon, 17 Nov 2025 10:27:51 +0100 Subject: [PATCH 5/5] Fix BookingDetailsViewModelTest --- .../android/ui/bookings/details/BookingDetailsViewModelTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsViewModelTest.kt index 5500731e0bb..1a408fdb5b2 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsViewModelTest.kt @@ -58,7 +58,6 @@ class BookingDetailsViewModelTest : BaseUnitTest() { @Before fun setup() { - whenever(currencyFormatter.formatCurrency(any(), any(), any())).thenReturn("$0.00") whenever( resourceProvider.getString( eq(R.string.booking_details_title),