Skip to content

Commit 07b967a

Browse files
committed
Merge branch 'trunk' of github.com:woocommerce/woocommerce-android into migrate/wc-global-attribute-model-to-room
# Conflicts: # libs/fluxc-plugin/schemas/org.wordpress.android.fluxc.persistence.WCAndroidDatabase/56.json # libs/fluxc-plugin/src/main/kotlin/org/wordpress/android/fluxc/di/WCDatabaseModule.kt # libs/fluxc-plugin/src/main/kotlin/org/wordpress/android/fluxc/persistence/WCAndroidDatabase.kt
2 parents 3c29985 + 4e56f2c commit 07b967a

File tree

69 files changed

+2968
-375
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+2968
-375
lines changed

RELEASE-NOTES.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@
55
-----
66
- [*] You can now remove background from product images in the app. Just open the product image and click "Remove background" button. [https://github.com/woocommerce/woocommerce-android/pull/14445]
77
- [*] Fixed bug when an order was not selected when navigating from my store screen [https://github.com/woocommerce/woocommerce-android/pull/14436]
8-
- [*] [Shipping Labels] Display split shipment instructions only when necessary [https://github.com/woocommerce/woocommerce-android/pull/14450]
8+
- [*] Shipping Labels: Display split shipment instructions only when necessary [https://github.com/woocommerce/woocommerce-android/pull/14450]
99
- [*] Updated behavior on the POS cash payment screen [https://github.com/woocommerce/woocommerce-android/pull/14449]
1010
- [Internal] Added support for persisting log files in the app's internal storage [https://github.com/woocommerce/woocommerce-android/pull/14425]
1111
- [*] Shipping Labels: Fix layout issue with address status indicator [https://github.com/woocommerce/woocommerce-android/pull/14437]
1212
- [*] Shipping Labels: Updated shipments tab layout [https://github.com/woocommerce/woocommerce-android/pull/14448]
13+
- [*] Shipping Labels: Add a message for purchased shipments to the Split Shipments screen [https://github.com/woocommerce/woocommerce-android/pull/14455]
14+
- [Internal] Migrate the cache of the `/config` endpoint to Room instead of DataStore [https://github.com/woocommerce/woocommerce-android/pull/14462]
15+
- [*] Improved error handling in login flow when the WP API is not reachable [https://github.com/woocommerce/woocommerce-android/pull/14472]
1316

1417
23.0
1518
-----

WooCommerce/src/main/kotlin/com/woocommerce/android/AppUrls.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,4 @@ object AppUrls {
136136

137137
const val BLAZE_CAMPAIGN_CREATION_SURVEY_URL_I1 =
138138
"https://wordpressdotcom.survey.fm/blaze-on-woo-mobile-survey-sept-2024-i1"
139-
140-
// POS
141-
const val WOO_POS_DOCUMENTATION_URL =
142-
"https://woocommerce.com/document/woo-mobile-app-point-of-sale-mode/"
143139
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailViewModel.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ import com.woocommerce.android.ui.orders.creation.shipping.GetShippingMethodsWit
5757
import com.woocommerce.android.ui.orders.creation.shipping.RefreshShippingMethods
5858
import com.woocommerce.android.ui.orders.creation.shipping.ShippingLineDetails
5959
import com.woocommerce.android.ui.orders.creation.shipping.ShippingMethodsRepository
60-
import com.woocommerce.android.ui.orders.wooshippinglabels.datasource.WooShippingConfigDataStore
6160
import com.woocommerce.android.ui.orders.wooshippinglabels.datasource.WooShippingEligibilityDataStore
6261
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShippingLabelModel
6362
import com.woocommerce.android.ui.orders.wooshippinglabels.models.fillProducts
@@ -114,7 +113,6 @@ class OrderDetailViewModel @Inject constructor(
114113
private val shippingLabelOnboardingRepository: ShippingLabelOnboardingRepository,
115114
private val shippingLabelRepository: WooShippingLabelRepository,
116115
private val eligibilityDataStore: WooShippingEligibilityDataStore,
117-
private val configDataStore: WooShippingConfigDataStore,
118116
private val orderDetailsTransactionLauncher: OrderDetailsTransactionLauncher,
119117
private val getOrderSubscriptions: GetOrderSubscriptions,
120118
private val giftCardRepository: GiftCardRepository,
@@ -908,11 +906,11 @@ class OrderDetailViewModel @Inject constructor(
908906

909907
private suspend fun loadOrderShippingLabels(): ListInfo<ShippingLabelModel> {
910908
if (isRevampWooShippingEnabled) {
911-
configDataStore.getPurchasedLabels(navArgs.orderId).first()
909+
shippingLabelRepository.getPurchasedLabels(navArgs.orderId)
912910
} else {
913911
orderDetailRepository.getOrderShippingLabels(navArgs.orderId)
914912
.map { it.toShippingLabelModel() }
915-
}?.fillProducts(awaitOrder().items)
913+
}.fillProducts(awaitOrder().items)
916914
.whenNotNullNorEmpty { return ListInfo(list = it) }
917915
return ListInfo(isVisible = false)
918916
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/GetShipments.kt

Lines changed: 11 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,18 @@ package com.woocommerce.android.ui.orders.wooshippinglabels
33
import com.woocommerce.android.model.Order
44
import com.woocommerce.android.model.getNonRefundedProducts
55
import com.woocommerce.android.ui.orders.details.OrderDetailRepository
6-
import com.woocommerce.android.ui.orders.wooshippinglabels.datasource.WooShippingConfigDataStore
76
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShipmentUIModel
87
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShippableItemModel
8+
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShippingLabelModel
99
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShippingLabelStatus
10-
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.ShippingLabelDTO
11-
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.WooShippingNetworkingMapper
12-
import com.woocommerce.android.ui.orders.wooshippinglabels.rates.networking.DestinationAddressDTO
13-
import com.woocommerce.android.ui.orders.wooshippinglabels.rates.networking.OriginAddressDTO
10+
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.WooShippingLabelRepository
1411
import com.woocommerce.android.ui.products.details.ProductDetailRepository
15-
import kotlinx.coroutines.flow.first
1612
import javax.inject.Inject
1713

1814
class GetShipments @Inject constructor(
15+
private val wooShippingLabelRepository: WooShippingLabelRepository,
1916
private val orderDetailRepository: OrderDetailRepository,
20-
private val productDetailRepository: ProductDetailRepository,
21-
private val configDataStore: WooShippingConfigDataStore,
22-
private val mapper: WooShippingNetworkingMapper,
17+
private val productDetailRepository: ProductDetailRepository
2318
) {
2419
suspend operator fun invoke(order: Order): List<ShipmentUIModel> {
2520
val refunds = orderDetailRepository.getOrderRefunds(order.id)
@@ -46,11 +41,10 @@ class GetShipments @Inject constructor(
4641
}
4742
}
4843

49-
val config = configDataStore.observeConfig(order.id).first()
44+
val shipments = wooShippingLabelRepository.getShipments(order.id)
45+
val labels = wooShippingLabelRepository.getLabels(order.id)
5046

51-
val shipments = config?.shipments
52-
53-
var shipmentUIModelList = if (shipments.isNullOrEmpty()) {
47+
var shipmentUIModelList = if (shipments.isEmpty()) {
5448
listOf(ShipmentUIModel(localId = "0", items = orderItems))
5549
} else {
5650
shipments.map { (shipmentId, shipmentItems) ->
@@ -64,55 +58,23 @@ class GetShipments @Inject constructor(
6458
}
6559
}.sortedBy { it.localId.toLong() }
6660

67-
config?.shippingLabelData?.let { data ->
68-
// If there are purchased labels, merge their data into the result list
69-
data.currentOrderLabels?.let { labels ->
70-
shipmentUIModelList = mergePurchaseData(shipmentUIModelList, labels)
71-
}
72-
73-
// If there are stored addresses, merge them into the result list
74-
data.storedData?.let { storedData ->
75-
shipmentUIModelList = mergeAddresses(
76-
shipmentUIModelList,
77-
storedData.selectedOrigin,
78-
storedData.selectedDestination
79-
)
80-
}
81-
}
61+
// If there are purchased labels, merge their data into the result list
62+
shipmentUIModelList = mergePurchaseData(shipmentUIModelList, labels)
8263

8364
return shipmentUIModelList
8465
}
8566

8667
private fun mergePurchaseData(
8768
shipmentUIModelList: List<ShipmentUIModel>,
88-
currentOrderLabels: List<ShippingLabelDTO>
69+
currentOrderLabels: List<ShippingLabelModel>
8970
) = shipmentUIModelList.map { shipmentUIModel ->
9071
val purchasedNonRefundedLabel = currentOrderLabels.find {
9172
it.shipmentId == shipmentUIModel.remoteId && it.status == ShippingLabelStatus.PURCHASED && it.refund == null
9273
}
9374
if (purchasedNonRefundedLabel == null) {
9475
shipmentUIModel
9576
} else {
96-
shipmentUIModel.copy(purchased = true, label = mapper.invoke(purchasedNonRefundedLabel))
77+
shipmentUIModel.copy(purchased = true, label = purchasedNonRefundedLabel)
9778
}
9879
}
99-
100-
private fun mergeAddresses(
101-
shipmentUIModelList: List<ShipmentUIModel>,
102-
originAddresses: Map<String, OriginAddressDTO>?,
103-
destinationAddresses: Map<String, DestinationAddressDTO>?
104-
): List<ShipmentUIModel> = shipmentUIModelList.map { shipmentUIModel ->
105-
val remoteId = shipmentUIModel.remoteId ?: return@map shipmentUIModel
106-
val key = getStoredDataKey(remoteId)
107-
108-
val updatedLabel = shipmentUIModel.label?.copy(
109-
originAddress = originAddresses?.get(key)?.let { mapper(it) }
110-
?: shipmentUIModel.label.originAddress,
111-
destinationAddress = destinationAddresses?.get(key)?.let { mapper(it) }
112-
?: shipmentUIModel.label.destinationAddress
113-
)
114-
shipmentUIModel.copy(label = updatedLabel)
115-
}
116-
117-
private fun getStoredDataKey(shipmentId: String) = "shipment_$shipmentId"
11880
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/ShipmentDetails.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,8 +281,8 @@ private fun ShipmentDetailsPortrait(
281281
Divider()
282282
if (!shipmentPurchased) {
283283
PaymentSection(paymentsSectionUI = paymentsSectionUI)
284+
Divider()
284285
}
285-
Divider()
286286
ShipmentCostSection(shipmentCostUI = shipmentCostUI)
287287
}
288288
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/SplitShipment.kt

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
package com.woocommerce.android.ui.orders.wooshippinglabels
22

33
import com.woocommerce.android.tools.SelectedSite
4-
import com.woocommerce.android.ui.orders.wooshippinglabels.datasource.WooShippingConfigDataStore
54
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShipmentUIModel
65
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShippableItemModel
7-
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.Item
8-
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.ShipmentMap
6+
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.ShipmentItem
97
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.WooShippingLabelRepository
10-
import kotlinx.coroutines.flow.first
118
import javax.inject.Inject
129

1310
class SplitShipment @Inject constructor(
1411
private val selectedSite: SelectedSite,
15-
private val wooShippingLabelRepository: WooShippingLabelRepository,
16-
private val configDataStore: WooShippingConfigDataStore,
12+
private val wooShippingLabelRepository: WooShippingLabelRepository
1713
) {
1814

1915
suspend operator fun invoke(orderId: Long, shipments: List<ShipmentUIModel>): Result<List<ShipmentUIModel>> {
@@ -30,7 +26,6 @@ class SplitShipment @Inject constructor(
3026
if (response.isError || result == null) {
3127
Result.failure(Exception("Split shipment failed"))
3228
} else {
33-
updateCachedShipments(orderId, result.data)
3429
// Update remote ids
3530
val newShipments = shipments.map { it.copy(remoteId = it.localId) }
3631
Result.success(newShipments)
@@ -52,7 +47,7 @@ class SplitShipment @Inject constructor(
5247
}.associate { it.remoteId!! to it.localId.toInt() }
5348

5449
private fun List<ShipmentUIModel>.toShipmentMap() = associate {
55-
it.localId to it.items.map { item -> Item(id = item.itemId, subItems = item.subItems()) }
50+
it.localId to it.items.map { item -> ShipmentItem(id = item.itemId, subItems = item.subItems()) }
5651
}
5752

5853
/**
@@ -65,10 +60,4 @@ class SplitShipment @Inject constructor(
6560
} else {
6661
emptyList()
6762
}
68-
69-
private suspend fun updateCachedShipments(orderId: Long, newShipments: ShipmentMap) {
70-
configDataStore.observeConfig(orderId).first()?.let {
71-
configDataStore.saveConfig(orderId, it.copy(shipments = newShipments))
72-
}
73-
}
7463
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/WooShippingLabelCreationViewModel.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,10 @@ class WooShippingLabelCreationViewModel @Inject constructor(
740740

741741
val originAddresses = shippingAddresses.value.first().originAddresses
742742
shippingAddresses.updateSize(
743-
WooShippingAddresses.EMPTY.copy(originAddresses = originAddresses, shipFrom = originAddresses.first())
743+
WooShippingAddresses.EMPTY.copy(
744+
originAddresses = originAddresses,
745+
shipFrom = originAddresses.firstOrNull() ?: WooShippingAddresses.EMPTY.shipFrom
746+
)
744747
)
745748
selectedPackagesFlow.updateSize(null)
746749
customsFormDataFlow.updateSize(null)

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/WooShippingProductsCard.kt

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,7 @@ fun SelectableShippingProduct(
475475
weight: String,
476476
price: String,
477477
quantity: Float,
478+
selectable: Boolean,
478479
isSelected: Boolean,
479480
onSelectionChange: ((Boolean) -> Unit)?,
480481
modifier: Modifier = Modifier,
@@ -497,6 +498,7 @@ fun SelectableShippingProduct(
497498
weight = weight,
498499
price = price,
499500
quantity = quantity,
501+
selectable = selectable,
500502
isSelected = isSelected,
501503
onSelectionChange = onSelectionChange,
502504
imageUrl = imageUrl
@@ -511,6 +513,7 @@ fun ExpandableSelectableShippingProduct(
511513
weight: String,
512514
price: String,
513515
quantity: Float,
516+
selectable: Boolean,
514517
isSelected: Boolean,
515518
onSelectionChange: ((Boolean) -> Unit)?,
516519
onInnerSelectionChange: ((Boolean, Int) -> Unit)?,
@@ -536,13 +539,15 @@ fun ExpandableSelectableShippingProduct(
536539
.height(IntrinsicSize.Min)
537540
.padding(start = 8.dp)
538541
) {
539-
SelectionCheck(
540-
isSelected = isSelected,
541-
onSelectionChange = onSelectionChange,
542-
modifier = Modifier
543-
.align(Alignment.CenterVertically)
544-
.padding(8.dp)
545-
)
542+
if (selectable) {
543+
SelectionCheck(
544+
isSelected = isSelected,
545+
onSelectionChange = onSelectionChange,
546+
modifier = Modifier
547+
.align(Alignment.CenterVertically)
548+
.padding(8.dp)
549+
)
550+
}
546551
ShippingProductDetails(
547552
title = title,
548553
description = description,
@@ -593,6 +598,7 @@ fun ExpandableSelectableShippingProduct(
593598
weight = singleWeight,
594599
price = singlePrice,
595600
quantity = quantity,
601+
selectable = selectable,
596602
isSelected = isInnerItemSelected,
597603
onSelectionChange = {
598604
onInnerSelectionChange?.invoke(isInnerItemSelected, index)
@@ -620,6 +626,7 @@ fun SelectableShippingProductDetails(
620626
weight: String,
621627
price: String,
622628
quantity: Float,
629+
selectable: Boolean,
623630
isSelected: Boolean,
624631
onSelectionChange: ((Boolean) -> Unit)?,
625632
modifier: Modifier = Modifier,
@@ -628,13 +635,15 @@ fun SelectableShippingProductDetails(
628635
displayQuantity: Boolean = true
629636
) {
630637
Row(modifier) {
631-
SelectionCheck(
632-
isSelected = isSelected,
633-
onSelectionChange = onSelectionChange,
634-
modifier = Modifier
635-
.align(Alignment.CenterVertically)
636-
.padding(8.dp)
637-
)
638+
if (selectable) {
639+
SelectionCheck(
640+
isSelected = isSelected,
641+
onSelectionChange = onSelectionChange,
642+
modifier = Modifier
643+
.align(Alignment.CenterVertically)
644+
.padding(8.dp)
645+
)
646+
}
638647
ShippingProductDetails(
639648
title = title,
640649
description = description,
@@ -668,6 +677,7 @@ fun SelectableShippingProductPreview() {
668677
weight = "0.6kg",
669678
quantity = 1f,
670679
price = "$12.99",
680+
selectable = true,
671681
isSelected = true,
672682
onSelectionChange = {}
673683
)
@@ -686,6 +696,7 @@ fun ExpandableSelectableShippingProductPreview(@PreviewParameter(IsExpandedProvi
686696
weight = "0.6kg",
687697
quantity = 3f,
688698
price = "$12.99",
699+
selectable = true,
689700
isSelected = true,
690701
onSelectionChange = {},
691702
isExpanded = isExpanded,

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/datasource/WooShippingConfigDataStore.kt

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

0 commit comments

Comments
 (0)