Skip to content

Commit d666a23

Browse files
Merge pull request #14667 from woocommerce/ciab-bookings-payment-status-refactor
[CIAB] A minor refactoring to avoid leaking the booking status to UI layer
2 parents d6fa6f4 + 41ee907 commit d666a23

File tree

17 files changed

+197
-135
lines changed

17 files changed

+197
-135
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingsRepository.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.woocommerce.android.tools.SelectedSite
55
import kotlinx.coroutines.flow.Flow
66
import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingsFilterOption
77
import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingsStore
8+
import org.wordpress.android.fluxc.persistence.entity.BookingEntity
89
import javax.inject.Inject
910

1011
class BookingsRepository @Inject constructor(
@@ -40,4 +41,5 @@ class BookingsRepository @Inject constructor(
4041
)
4142
}
4243

43-
typealias Booking = org.wordpress.android.fluxc.persistence.entity.BookingEntity
44+
typealias Booking = BookingEntity
45+
typealias BookingStatus = BookingEntity.Status

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingAttendanceSection.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground
2525

2626
@Composable
2727
fun BookingAttendanceSection(
28-
status: AttendanceStatus,
28+
status: BookingAttendanceStatus,
2929
onClick: () -> Unit,
3030
modifier: Modifier = Modifier,
3131
) {
@@ -90,7 +90,7 @@ private fun AttendanceRow(
9090
private fun BookingAttendanceSectionPreview() {
9191
WooThemeWithBackground {
9292
BookingAttendanceSection(
93-
status = AttendanceStatus.BOOKED,
93+
status = BookingAttendanceStatus.BOOKED,
9494
onClick = {},
9595
modifier = Modifier.fillMaxWidth()
9696
)

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingAttendanceStatusBottomSheet.kt

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import kotlinx.coroutines.launch
3131
@OptIn(ExperimentalMaterial3Api::class)
3232
@Composable
3333
fun BookingAttendanceStatusBottomSheet(
34-
onSelect: (AttendanceStatus) -> Unit,
34+
onSelect: (BookingAttendanceStatus) -> Unit,
3535
onDismiss: () -> Unit,
3636
modifier: Modifier = Modifier,
3737
) {
@@ -55,7 +55,7 @@ fun BookingAttendanceStatusBottomSheet(
5555

5656
@Composable
5757
private fun BookingAttendanceStatusSelection(
58-
onSelect: (AttendanceStatus) -> Unit,
58+
onSelect: (BookingAttendanceStatus) -> Unit,
5959
modifier: Modifier = Modifier,
6060
) {
6161
Column(
@@ -70,7 +70,7 @@ private fun BookingAttendanceStatusSelection(
7070
color = MaterialTheme.colorScheme.onSurfaceVariant,
7171
modifier = Modifier.padding(bottom = 22.dp)
7272
)
73-
AttendanceStatus.entries.forEachIndexed { index, status ->
73+
BookingAttendanceStatus.entries.forEachIndexed { index, status ->
7474
AttendanceStatusRow(
7575
status = status,
7676
onClick = { onSelect(status) }
@@ -81,7 +81,7 @@ private fun BookingAttendanceStatusSelection(
8181

8282
@Composable
8383
private fun AttendanceStatusRow(
84-
status: AttendanceStatus,
84+
status: BookingAttendanceStatus,
8585
onClick: () -> Unit,
8686
) {
8787
Row(
@@ -115,19 +115,19 @@ private fun AttendanceStatusRow(
115115
}
116116

117117
@Composable
118-
private fun AttendanceStatus.description(): String = when (this) {
119-
AttendanceStatus.BOOKED -> R.string.booking_attendance_status_booked_desc
120-
AttendanceStatus.CHECKED_IN -> R.string.booking_attendance_status_checked_in_desc
121-
AttendanceStatus.CANCELLED -> R.string.booking_attendance_status_cancelled_desc
122-
AttendanceStatus.NO_SHOW -> R.string.booking_attendance_status_no_show_desc
118+
private fun BookingAttendanceStatus.description(): String = when (this) {
119+
BookingAttendanceStatus.BOOKED -> R.string.booking_attendance_status_booked_desc
120+
BookingAttendanceStatus.CHECKED_IN -> R.string.booking_attendance_status_checked_in_desc
121+
BookingAttendanceStatus.CANCELLED -> R.string.booking_attendance_status_cancelled_desc
122+
BookingAttendanceStatus.NO_SHOW -> R.string.booking_attendance_status_no_show_desc
123123
}.let { stringResource(it) }
124124

125-
private val AttendanceStatus.iconRes: Int
125+
private val BookingAttendanceStatus.iconRes: Int
126126
get() = when (this) {
127-
AttendanceStatus.BOOKED -> R.drawable.ic_attendance_booked
128-
AttendanceStatus.CHECKED_IN -> R.drawable.ic_attendance_checked_in
129-
AttendanceStatus.CANCELLED -> R.drawable.ic_attendance_cancelled
130-
AttendanceStatus.NO_SHOW -> R.drawable.ic_attendance_no_show
127+
BookingAttendanceStatus.BOOKED -> R.drawable.ic_attendance_booked
128+
BookingAttendanceStatus.CHECKED_IN -> R.drawable.ic_attendance_checked_in
129+
BookingAttendanceStatus.CANCELLED -> R.drawable.ic_attendance_cancelled
130+
BookingAttendanceStatus.NO_SHOW -> R.drawable.ic_attendance_no_show
131131
}
132132

133133
@LightDarkThemePreviews
@@ -145,7 +145,7 @@ private fun BookingAttendanceStatusBottomSheetPreview() {
145145
private fun AttendanceStatusRowPreview() {
146146
WooThemeWithBackground {
147147
AttendanceStatusRow(
148-
status = AttendanceStatus.CHECKED_IN,
148+
status = BookingAttendanceStatus.CHECKED_IN,
149149
onClick = {}
150150
)
151151
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/AttendanceStatusTag.kt renamed to WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingAttendanceStatusTag.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import com.woocommerce.android.ui.compose.component.WCTag
1111
import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground
1212

1313
@Composable
14-
fun AttendanceStatusTag(
15-
state: AttendanceStatus,
14+
fun BookingAttendanceStatusTag(
15+
state: BookingAttendanceStatus,
1616
modifier: Modifier = Modifier,
1717
) {
1818
WCTag(
@@ -24,26 +24,26 @@ fun AttendanceStatusTag(
2424
)
2525
}
2626

27-
enum class AttendanceStatus {
27+
enum class BookingAttendanceStatus {
2828
BOOKED, CHECKED_IN, NO_SHOW, CANCELLED
2929
}
3030

3131
@Composable
32-
fun AttendanceStatus.text(): String {
32+
fun BookingAttendanceStatus.text(): String {
3333
return when (this) {
34-
AttendanceStatus.BOOKED -> R.string.booking_attendance_status_booked
35-
AttendanceStatus.CHECKED_IN -> R.string.booking_attendance_status_checked_in
36-
AttendanceStatus.CANCELLED -> R.string.booking_attendance_status_cancelled
37-
AttendanceStatus.NO_SHOW -> R.string.booking_attendance_status_no_show
34+
BookingAttendanceStatus.BOOKED -> R.string.booking_attendance_status_booked
35+
BookingAttendanceStatus.CHECKED_IN -> R.string.booking_attendance_status_checked_in
36+
BookingAttendanceStatus.CANCELLED -> R.string.booking_attendance_status_cancelled
37+
BookingAttendanceStatus.NO_SHOW -> R.string.booking_attendance_status_no_show
3838
}.let { stringResource(it) }
3939
}
4040

4141
@Preview
4242
@Composable
4343
private fun AttendanceStatusTagPreview() {
4444
WooThemeWithBackground {
45-
AttendanceStatusTag(
46-
state = AttendanceStatus.BOOKED
45+
BookingAttendanceStatusTag(
46+
state = BookingAttendanceStatus.BOOKED
4747
)
4848
}
4949
}
@@ -52,8 +52,8 @@ private fun AttendanceStatusTagPreview() {
5252
@Composable
5353
private fun AttendanceStatusTagDarkPreview() {
5454
WooThemeWithBackground {
55-
AttendanceStatusTag(
56-
state = AttendanceStatus.CHECKED_IN
55+
BookingAttendanceStatusTag(
56+
state = BookingAttendanceStatus.CHECKED_IN
5757
)
5858
}
5959
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.woocommerce.android.ui.bookings.compose
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.ui.Modifier
5+
import androidx.compose.ui.res.colorResource
6+
import androidx.compose.ui.res.stringResource
7+
import androidx.compose.ui.text.font.FontWeight
8+
import androidx.compose.ui.tooling.preview.Preview
9+
import com.woocommerce.android.R
10+
import com.woocommerce.android.ui.compose.component.WCTag
11+
import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground
12+
13+
@Composable
14+
fun BookingStatusTag(
15+
state: BookingStatus,
16+
modifier: Modifier = Modifier,
17+
) {
18+
WCTag(
19+
text = state.text(),
20+
backgroundColor = colorResource(R.color.tagView_bg),
21+
textColor = colorResource(R.color.tagView_text),
22+
fontWeight = FontWeight.Normal,
23+
modifier = modifier
24+
)
25+
}
26+
27+
sealed interface BookingStatus {
28+
data object Unpaid : BookingStatus
29+
data object PendingConfirmation : BookingStatus
30+
data object Confirmed : BookingStatus
31+
data object Paid : BookingStatus
32+
data object Cancelled : BookingStatus
33+
data object Complete : BookingStatus
34+
data class Unknown(val key: String) : BookingStatus
35+
}
36+
37+
@Composable
38+
private fun BookingStatus.text(): String {
39+
return when (this) {
40+
BookingStatus.Unpaid -> stringResource(R.string.booking_payment_status_unpaid)
41+
BookingStatus.PendingConfirmation -> stringResource(R.string.booking_payment_status_pending_confirmation)
42+
BookingStatus.Confirmed -> stringResource(R.string.booking_payment_status_confirmed)
43+
BookingStatus.Paid -> stringResource(R.string.booking_payment_status_paid)
44+
BookingStatus.Cancelled -> stringResource(R.string.booking_payment_status_cancelled)
45+
BookingStatus.Complete -> stringResource(R.string.booking_payment_status_complete)
46+
is BookingStatus.Unknown -> key
47+
}
48+
}
49+
50+
@Preview
51+
@Composable
52+
private fun PaymentStatusTagPreview() {
53+
WooThemeWithBackground {
54+
BookingStatusTag(
55+
state = BookingStatus.Paid
56+
)
57+
}
58+
}
59+
60+
@Preview(uiMode = android.content.res.Configuration.UI_MODE_NIGHT_YES)
61+
@Composable
62+
private fun PaymentStatusTagDarkPreview() {
63+
WooThemeWithBackground {
64+
BookingStatusTag(
65+
state = BookingStatus.Complete
66+
)
67+
}
68+
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/BookingSummary.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,11 @@ fun BookingSummary(
5454
modifier = Modifier
5555
.padding(top = 8.dp)
5656
) {
57-
AttendanceStatusTag(
57+
BookingAttendanceStatusTag(
5858
state = model.attendanceStatus
5959
)
60-
BookingPaymentStatusTag(
61-
state = model.paymentStatus
60+
BookingStatusTag(
61+
state = model.status
6262
)
6363
}
6464
}
@@ -68,8 +68,8 @@ data class BookingSummaryModel(
6868
val date: String,
6969
val name: String,
7070
val customerName: String,
71-
val attendanceStatus: AttendanceStatus,
72-
val paymentStatus: BookingPaymentStatus,
71+
val attendanceStatus: BookingAttendanceStatus,
72+
val status: BookingStatus,
7373
)
7474

7575
@Preview
@@ -81,8 +81,8 @@ private fun BookingSummaryPreview() {
8181
date = "05/07/2025, 11:00 AM",
8282
name = "Women’s Haircut",
8383
customerName = "Margarita Nikolaevna",
84-
attendanceStatus = AttendanceStatus.CHECKED_IN,
85-
paymentStatus = BookingPaymentStatus.PAID
84+
attendanceStatus = BookingAttendanceStatus.CHECKED_IN,
85+
status = BookingStatus.Paid
8686
),
8787
modifier = Modifier.fillMaxWidth()
8888
)
@@ -98,8 +98,8 @@ private fun BookingSummaryDarkPreview() {
9898
date = "05/07/2025, 11:00 AM",
9999
name = "Women’s Haircut",
100100
customerName = "Margarita Nikolaevna",
101-
attendanceStatus = AttendanceStatus.BOOKED,
102-
paymentStatus = BookingPaymentStatus.PENDING_CONFIRMATION
101+
attendanceStatus = BookingAttendanceStatus.BOOKED,
102+
status = BookingStatus.PendingConfirmation
103103
),
104104
modifier = Modifier.fillMaxWidth()
105105
)

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/compose/PaymentStatusTag.kt

Lines changed: 0 additions & 72 deletions
This file was deleted.

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/details/BookingDetailsScreen.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ import androidx.compose.ui.res.colorResource
2020
import androidx.compose.ui.tooling.preview.Preview
2121
import androidx.compose.ui.unit.dp
2222
import com.woocommerce.android.R
23-
import com.woocommerce.android.ui.bookings.compose.AttendanceStatus
2423
import com.woocommerce.android.ui.bookings.compose.BookingAppointmentDetails
2524
import com.woocommerce.android.ui.bookings.compose.BookingAppointmentDetailsModel
2625
import com.woocommerce.android.ui.bookings.compose.BookingAttendanceSection
26+
import com.woocommerce.android.ui.bookings.compose.BookingAttendanceStatus
2727
import com.woocommerce.android.ui.bookings.compose.BookingAttendanceStatusBottomSheet
2828
import com.woocommerce.android.ui.bookings.compose.BookingCustomerDetails
29-
import com.woocommerce.android.ui.bookings.compose.BookingPaymentStatus
29+
import com.woocommerce.android.ui.bookings.compose.BookingStatus
3030
import com.woocommerce.android.ui.bookings.compose.BookingSummary
3131
import com.woocommerce.android.ui.bookings.compose.BookingSummaryModel
3232
import com.woocommerce.android.ui.compose.component.Toolbar
@@ -55,7 +55,7 @@ fun BookingDetailsScreen(
5555
viewState: BookingDetailsViewState,
5656
onBack: () -> Unit,
5757
onCancelBooking: () -> Unit,
58-
onAttendanceStatusSelected: (AttendanceStatus) -> Unit
58+
onAttendanceStatusSelected: (BookingAttendanceStatus) -> Unit
5959
) {
6060
val showAttendanceSheet = remember { mutableStateOf(false) }
6161
Scaffold(
@@ -120,8 +120,8 @@ private fun BookingDetailsPreview() {
120120
date = "05/07/2025, 11:00 AM",
121121
name = "Women’s Haircut",
122122
customerName = "Margarita Nikolaevna",
123-
attendanceStatus = AttendanceStatus.CHECKED_IN,
124-
paymentStatus = BookingPaymentStatus.PAID
123+
attendanceStatus = BookingAttendanceStatus.CHECKED_IN,
124+
status = BookingStatus.Paid
125125
),
126126
bookingsAppointmentDetails = BookingAppointmentDetailsModel(
127127
date = "Monday, 05 July 2025",

0 commit comments

Comments
 (0)