Skip to content

Commit f8bb8f0

Browse files
authored
Merge pull request #14805 from woocommerce/feat/WOOMOB-1154-POS-Order-details-email-refresh-after
[POS - Historical Orders] Refresh orders after the receipt was sent.
2 parents bf0d3b4 + e0ea365 commit f8bb8f0

File tree

12 files changed

+217
-8
lines changed

12 files changed

+217
-8
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/emailreceipt/WooPosEmailReceiptNavigation.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.woocommerce.android.ui.woopos.home.HOME_ROUTE
1111
import com.woocommerce.android.ui.woopos.root.navigation.WooPosNavigationEvent
1212
import com.woocommerce.android.ui.woopos.root.navigation.navigateOnce
1313

14+
const val EMAIL_RECEIPT_SENT = "email_receipt_sent"
1415
const val EMAIL_RECEIPT_ROUTE_ORDER_ID_KEY = "orderId"
1516
private const val EMAIL_RECEIPT_ROUTE = "$HOME_ROUTE/email_receipt/{$EMAIL_RECEIPT_ROUTE_ORDER_ID_KEY}"
1617

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/emailreceipt/WooPosEmailReceiptScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ fun WooPosEmailReceiptScreen(onNavigationEvent: (WooPosNavigationEvent) -> Unit)
4747
onEmailAddressChanged = { viewModel.onUIEvent(WooPosEmailReceiptUIEvent.EmailChanged(it)) },
4848
onSendReceiptClicked = { viewModel.onUIEvent(WooPosEmailReceiptUIEvent.SendEmailClicked) },
4949
onBackClicked = { onNavigationEvent(WooPosNavigationEvent.GoBack) },
50-
onEmailSent = { onNavigationEvent(WooPosNavigationEvent.GoBack) }
50+
onEmailSent = { onNavigationEvent(WooPosNavigationEvent.GoBackWithResult(key = EMAIL_RECEIPT_SENT, true)) }
5151
)
5252
}
5353

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/orders/WooPosOrdersDataSource.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,31 @@ class WooPosOrdersDataSource @Inject constructor(
6767
suspend fun loadMore(searchQuery: String? = null): Result<List<Order>> =
6868
withContext(Dispatchers.IO) { loadNextPage(searchQuery) }
6969

70+
suspend fun refreshOrderById(orderId: Long): Result<Order> {
71+
val site = selectedSite.get()
72+
val payload = restClient.fetchSingleOrder(site, orderId)
73+
return if (payload.error == null) {
74+
val entity = payload.orderWithMeta.first
75+
val order = orderMapper.toAppModel(entity)
76+
77+
updateCachedOrderIfPresent(order)
78+
79+
Result.success(order)
80+
} else {
81+
Result.failure(Throwable("[${payload.error.type}] ${payload.error.message}"))
82+
}
83+
}
84+
85+
private fun updateCachedOrderIfPresent(order: Order) {
86+
val current = ordersCache.getAll()
87+
val idx = current.indexOfFirst { it.id == order.id }
88+
if (idx < 0) return
89+
90+
val updated = current.toMutableList()
91+
updated[idx] = order
92+
ordersCache.setAll(updated)
93+
}
94+
7095
private suspend fun loadFirstPage(searchQuery: String? = null): Result<List<Order>> {
7196
page.set(1)
7297
canLoadMore.set(false)

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/orders/WooPosOrdersNavigation.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package com.woocommerce.android.ui.woopos.orders
22

33
import androidx.compose.animation.slideInHorizontally
44
import androidx.compose.animation.slideOutHorizontally
5+
import androidx.compose.runtime.collectAsState
56
import androidx.navigation.NavController
67
import androidx.navigation.NavGraphBuilder
78
import androidx.navigation.compose.composable
9+
import com.woocommerce.android.ui.woopos.emailreceipt.EMAIL_RECEIPT_SENT
810
import com.woocommerce.android.ui.woopos.home.HOME_ROUTE
911
import com.woocommerce.android.ui.woopos.root.navigation.WooPosNavigationEvent
1012
import com.woocommerce.android.ui.woopos.root.navigation.navigateOnce
@@ -40,9 +42,16 @@ fun NavGraphBuilder.ordersScreen(
4042
targetOffsetX = { fullWidth -> fullWidth },
4143
)
4244
},
43-
) {
45+
) { backStackEntry ->
46+
val navigatedFromEmailReceiptSent = backStackEntry.savedStateHandle
47+
.getStateFlow(EMAIL_RECEIPT_SENT, false)
48+
.collectAsState()
49+
50+
backStackEntry.savedStateHandle.remove<Boolean>(EMAIL_RECEIPT_SENT)
51+
4452
WooPosOrdersScreen(
4553
onNavigationEvent = onNavigationEvent,
54+
navigatedFromEmailReceiptSent = navigatedFromEmailReceiptSent.value
4655
)
4756
}
4857
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/orders/WooPosOrdersScreen.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,15 @@ val WOO_POS_ORDERS_TOOLBAR_HEIGHT = 56.dp
8181
@Composable
8282
fun WooPosOrdersScreen(
8383
onNavigationEvent: (WooPosNavigationEvent) -> Unit,
84+
navigatedFromEmailReceiptSent: Boolean,
8485
) {
8586
val viewModel: WooPosOrdersViewModel = hiltViewModel()
8687
val state by viewModel.state.collectAsState()
8788

89+
if (navigatedFromEmailReceiptSent) {
90+
viewModel.onBackFromSuccessfullySendingEmailReceipt()
91+
}
92+
8893
val context = LocalContext.current
8994

9095
LaunchedEffect(Unit) {

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/orders/WooPosOrdersState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ sealed class WooPosOrdersState {
6363
override val pullToRefreshState: WooPosPullToRefreshState,
6464
override val searchInputState: WooPosSearchInputState,
6565
val selectedDetails: OrderDetailsViewState,
66-
val paginationState: WooPosPaginationState,
66+
val paginationState: WooPosPaginationState
6767
) : WooPosOrdersState() {
6868
sealed class Items {
6969
data class Loaded(val items: Map<OrderItemViewState, OrderDetailsViewState>) : Items()

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/orders/WooPosOrdersViewModel.kt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,38 @@ class WooPosOrdersViewModel @Inject constructor(
230230
}
231231
}
232232

233+
fun onBackFromSuccessfullySendingEmailReceipt() {
234+
refreshSelectedOrder()
235+
}
236+
237+
private fun refreshSelectedOrder() {
238+
val current = _state.value as? WooPosOrdersState.Content ?: return
239+
val selectedOrderId = current.selectedDetails.id
240+
241+
viewModelScope.launch {
242+
ordersDataSource.refreshOrderById(selectedOrderId)
243+
.onSuccess { applyOrderUpdate(it) }
244+
}
245+
}
246+
247+
private suspend fun applyOrderUpdate(updated: Order) {
248+
val current = _state.value as? WooPosOrdersState.Content ?: return
249+
val loaded = current.items as? WooPosOrdersState.Content.Items.Loaded ?: return
250+
251+
val selectedId = loaded.items.keys.firstOrNull { it.isSelected }?.id
252+
val newItem = mapOrderItem(updated, selectedId)
253+
val newDetails = mapOrderDetails(updated)
254+
255+
val newMap = loaded.items.entries.associate { (item, details) ->
256+
if (item.id == updated.id) newItem to newDetails else item to details
257+
}
258+
259+
_state.value = current.copy(
260+
items = WooPosOrdersState.Content.Items.Loaded(newMap),
261+
selectedDetails = if (selectedId == updated.id) newDetails else current.selectedDetails
262+
)
263+
}
264+
233265
private fun updateSearchState(searchState: WooPosSearchInputState) {
234266
_state.value = when (val currentState = _state.value) {
235267
is WooPosOrdersState.Content -> currentState.copy(searchInputState = searchState)

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosNavigationEvent.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ sealed class WooPosNavigationEvent {
99
data class OpenCashPayment(val orderId: Long) : WooPosNavigationEvent()
1010
data class OpenEmailReceipt(val orderId: Long) : WooPosNavigationEvent()
1111
data object GoBack : WooPosNavigationEvent()
12+
data class GoBackWithResult(val key: String, val value: Any) : WooPosNavigationEvent()
1213
data object OpenHomeFromCashPaymentAfterSuccessfulPayment : WooPosNavigationEvent()
1314
data object ReturnHomeFromCashPayment : WooPosNavigationEvent()
1415
data class OpenEligibilityScreenFromSplash(

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosNavigationEventHandler.kt

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,32 @@ fun NavHostController.handleNavigationEvent(
2121

2222
is WooPosNavigationEvent.OpenHomeFromSplash -> navigateToHomeScreen()
2323
is WooPosNavigationEvent.OpenCashPayment -> navigateToCashPaymentScreen(event.orderId)
24+
25+
is WooPosNavigationEvent.GoBackWithResult -> {
26+
previousBackStackEntry
27+
?.savedStateHandle
28+
?.set(event.key, event.value)
29+
popBackStack()
30+
}
31+
2432
is WooPosNavigationEvent.GoBack -> popBackStack()
33+
2534
is WooPosNavigationEvent.OpenHomeFromCashPaymentAfterSuccessfulPayment ->
2635
navigateToHomeScreenAfterSuccessfulCashPayment()
2736

28-
is WooPosNavigationEvent.OpenEmailReceipt -> navigateToEmailReceipt(event.orderId)
29-
WooPosNavigationEvent.ReturnHomeFromCashPayment -> navigateToHomeScreenIfHomeScreenNotOpen()
37+
is WooPosNavigationEvent.OpenEmailReceipt ->
38+
navigateToEmailReceipt(event.orderId)
39+
40+
WooPosNavigationEvent.ReturnHomeFromCashPayment ->
41+
navigateToHomeScreenIfHomeScreenNotOpen()
3042

3143
is WooPosNavigationEvent.OpenEligibilityScreenFromSplash ->
3244
navigateToEligibilityScreen(event.reason)
33-
is WooPosNavigationEvent.OpenSettings -> navigateToSettingsScreen()
34-
is WooPosNavigationEvent.OpenOrders -> navigateToOrdersScreen()
45+
46+
is WooPosNavigationEvent.OpenSettings ->
47+
navigateToSettingsScreen()
48+
49+
is WooPosNavigationEvent.OpenOrders ->
50+
navigateToOrdersScreen()
3551
}
3652
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosRootHost.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ fun WooPosRootHost(
4141
) {
4242
mainGraph(
4343
onNavigationEvent = onNavigationEvent,
44-
homeViewModel = homeViewModel,
44+
homeViewModel = homeViewModel
4545
)
4646
}
4747
}

0 commit comments

Comments
 (0)