Skip to content

Commit 07ee3f6

Browse files
authored
Merge pull request #14590 from woocommerce/issue/woomob-1280-woo-poslocal-catalog-use-new-pos-specific-product-model-step-7
POS Product Migration Step 7
2 parents 0e38476 + 3085b9e commit 07ee3f6

File tree

10 files changed

+225
-178
lines changed

10 files changed

+225
-178
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/common/data/WooPosVariationMapper.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.google.gson.reflect.TypeToken
66
import com.woocommerce.android.R
77
import com.woocommerce.android.model.Product
88
import com.woocommerce.android.model.ProductVariation
9+
import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2
910
import com.woocommerce.android.util.WooLog
1011
import com.woocommerce.android.viewmodel.ResourceProvider
1112
import org.wordpress.android.fluxc.model.WCProductVariationModel
@@ -91,7 +92,7 @@ class WooPosVariationMapper @Inject constructor(
9192

9293
fun getNameForPOS(
9394
variation: WooPosVariation,
94-
parentProduct: Product? = null,
95+
parentProduct: WooPosProductModelVersion2? = null,
9596
resourceProvider: ResourceProvider,
9697
): String {
9798
return parentProduct?.variationEnabledAttributes?.joinToString(", ") { attribute ->
@@ -167,7 +168,7 @@ fun WCPosVariationModel.toWooPosVariation(mapper: WooPosVariationMapper): WooPos
167168

168169
fun WooPosVariation.getNameForPOS(
169170
mapper: WooPosVariationMapper,
170-
parentProduct: Product? = null,
171+
parentProduct: WooPosProductModelVersion2? = null,
171172
resourceProvider: ResourceProvider,
172173
): String = mapper.getNameForPOS(this, parentProduct, resourceProvider)
173174

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/common/data/models/WooPosProductModelVersion2.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.woocommerce.android.ui.woopos.common.data.models
22

33
import android.os.Parcelable
4+
import kotlinx.parcelize.IgnoredOnParcel
45
import kotlinx.parcelize.Parcelize
56
import org.wordpress.android.fluxc.network.rest.wpcom.wc.product.CoreProductStatus
67
import java.math.BigDecimal
@@ -30,6 +31,11 @@ data class WooPosProductModelVersion2(
3031
val variationIds: List<Long> = emptyList(),
3132
) : Parcelable {
3233

34+
@IgnoredOnParcel
35+
val variationEnabledAttributes by lazy {
36+
attributes.filter { it.isVariation }
37+
}
38+
3339
sealed class WooPosPricing : Parcelable {
3440
@Parcelize
3541
data object NoPricing : WooPosPricing()

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/cart/WooPosCartViewModel.kt

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import androidx.lifecycle.asLiveData
77
import androidx.lifecycle.map
88
import androidx.lifecycle.viewModelScope
99
import com.woocommerce.android.R
10-
import com.woocommerce.android.model.Product
1110
import com.woocommerce.android.ui.woopos.common.composeui.modifier.BarcodeInputDetector
1211
import com.woocommerce.android.ui.woopos.common.data.WooPosGetCouponById
1312
import com.woocommerce.android.ui.woopos.common.data.WooPosGetProductById
1413
import com.woocommerce.android.ui.woopos.common.data.WooPosGetVariationById
1514
import com.woocommerce.android.ui.woopos.common.data.WooPosVariation
1615
import com.woocommerce.android.ui.woopos.common.data.WooPosVariationMapper
1716
import com.woocommerce.android.ui.woopos.common.data.getNameForPOS
17+
import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2
1818
import com.woocommerce.android.ui.woopos.common.data.searchbyidentifier.WooPosSearchByIdentifier
1919
import com.woocommerce.android.ui.woopos.common.data.searchbyidentifier.WooPosSearchByIdentifierResult
2020
import com.woocommerce.android.ui.woopos.common.util.WooPosLogWrapper
@@ -26,6 +26,7 @@ import com.woocommerce.android.ui.woopos.home.ParentToChildrenEvent
2626
import com.woocommerce.android.ui.woopos.home.WooPosChildrenToParentEventSender
2727
import com.woocommerce.android.ui.woopos.home.WooPosParentToChildrenEventReceiver
2828
import com.woocommerce.android.ui.woopos.home.cart.WooPosCartItemViewState.Coupon.CouponValidationState
29+
import com.woocommerce.android.ui.woopos.home.cart.WooPosCartItemViewState.Product
2930
import com.woocommerce.android.ui.woopos.home.cart.WooPosCartStatus.CHECKOUT
3031
import com.woocommerce.android.ui.woopos.home.cart.WooPosCartStatus.EDITABLE
3132
import com.woocommerce.android.ui.woopos.home.cart.WooPosCartStatus.EMPTY
@@ -177,8 +178,8 @@ class WooPosCartViewModel @Inject constructor(
177178
private fun getCartItemsDataList(): List<WooPosItemsViewModel.ItemClickedData> {
178179
val itemClickedDataList = (_state.value.body as WooPosCartState.Body.WithItems).itemsInCart.mapNotNull {
179180
when (it) {
180-
is WooPosCartItemViewState.Product.Simple -> WooPosItemsViewModel.ItemClickedData.Product.Simple(it.id)
181-
is WooPosCartItemViewState.Product.Variation -> WooPosItemsViewModel.ItemClickedData.Product.Variation(
181+
is Product.Simple -> WooPosItemsViewModel.ItemClickedData.Product.Simple(it.id)
182+
is Product.Variation -> WooPosItemsViewModel.ItemClickedData.Product.Variation(
182183
productId = it.id,
183184
id = it.variationId
184185
)
@@ -575,27 +576,26 @@ class WooPosCartViewModel @Inject constructor(
575576
.map { item ->
576577
when (item) {
577578
is WooPosCartItemViewState.Coupon -> item.copy(validationState = CouponValidationState.Unknown)
578-
is WooPosCartItemViewState.Product -> item
579+
is Product -> item
579580
is WooPosCartItemViewState.Error -> item
580581
is WooPosCartItemViewState.Loading -> item
581582
}
582583
}
583584

584-
private suspend fun Product.toCartListItem(itemNumber: Int): WooPosCartItemViewState.Product.Simple =
585-
WooPosCartItemViewState.Product.Simple(
586-
itemNumber = itemNumber,
587-
id = this.remoteId,
588-
name = name,
589-
description = null,
590-
price = formatPrice(price),
591-
imageUrl = firstImageUrl,
592-
)
585+
private suspend fun WooPosProductModelVersion2.toCartListItem(itemNumber: Int): Product.Simple = Product.Simple(
586+
itemNumber = itemNumber,
587+
id = this.remoteId,
588+
name = name,
589+
description = null,
590+
price = formatPrice(pricing.displayPrice),
591+
imageUrl = firstImageUrl,
592+
)
593593

594594
private suspend fun WooPosVariation.toCartListItem(
595595
itemNumber: Int,
596-
product: Product
597-
): WooPosCartItemViewState.Product.Variation =
598-
WooPosCartItemViewState.Product.Variation(
596+
product: WooPosProductModelVersion2
597+
): Product.Variation =
598+
Product.Variation(
599599
itemNumber = itemNumber,
600600
id = product.remoteId,
601601
variationId = this.remoteVariationId,
@@ -609,7 +609,7 @@ class WooPosCartViewModel @Inject constructor(
609609
(_state.value.body as? WooPosCartState.Body.WithItems)?.itemsInCart?.maxOfOrNull { it.itemNumber } ?: 1
610610

611611
private fun cartContainsPurchasableItems(body: WooPosCartState.Body.WithItems) =
612-
body.itemsInCart.filterIsInstance<WooPosCartItemViewState.Product>().isNotEmpty()
612+
body.itemsInCart.filterIsInstance<Product>().isNotEmpty()
613613

614614
private fun cartContainsLoadingOrErrorItems(body: WooPosCartState.Body.WithItems) =
615615
body.itemsInCart.any { it is WooPosCartItemViewState.Loading || it is WooPosCartItemViewState.Error }
@@ -621,18 +621,18 @@ class WooPosCartViewModel @Inject constructor(
621621
return when (this) {
622622
is WooPosSearchByIdentifierResult.Success -> {
623623
val product = this.product
624-
WooPosCartItemViewState.Product.Simple(
624+
Product.Simple(
625625
itemNumber = itemNumber,
626626
id = product.remoteId,
627627
name = product.name,
628628
description = null,
629-
price = formatPrice(product.price),
629+
price = formatPrice(product.pricing.displayPrice),
630630
imageUrl = product.firstImageUrl
631631
)
632632
}
633633

634634
is WooPosSearchByIdentifierResult.VariationSuccess -> {
635-
WooPosCartItemViewState.Product.Variation(
635+
Product.Variation(
636636
itemNumber = itemNumber,
637637
id = variation.remoteProductId,
638638
variationId = variation.remoteVariationId,

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosProductSearchPredicate.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.woocommerce.android.ui.woopos.home.items.search
22

33
import com.woocommerce.android.extensions.semverCompareTo
4-
import com.woocommerce.android.model.Product
4+
import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2
55
import com.woocommerce.android.util.GetWooCorePluginCachedVersion
66
import javax.inject.Inject
77
import javax.inject.Singleton
@@ -13,14 +13,14 @@ class WooPosProductSearchPredicate @Inject constructor(
1313
private val whitespaceRegex = "\\s+".toRegex()
1414
private var cachedSupportsNameOrSkuSearch: Boolean? = null
1515

16-
operator fun invoke(query: String): (Product) -> Boolean =
16+
operator fun invoke(query: String): (WooPosProductModelVersion2) -> Boolean =
1717
when {
1818
query.isBlank() -> { _ -> true }
1919
isWooCoreSupportsNameOrSkuSearch() -> tokenizedSkuOrNameSearchPredicate(query)
2020
else -> simpleSearchPredicate(query)
2121
}
2222

23-
private fun simpleSearchPredicate(query: String): (Product) -> Boolean {
23+
private fun simpleSearchPredicate(query: String): (WooPosProductModelVersion2) -> Boolean {
2424
val terms: List<String> = query.split(whitespaceRegex).filter { it.isNotBlank() }.map { it.lowercase() }
2525

2626
return { product ->
@@ -36,7 +36,7 @@ class WooPosProductSearchPredicate @Inject constructor(
3636
}
3737
}
3838

39-
private fun tokenizedSkuOrNameSearchPredicate(query: String): (Product) -> Boolean {
39+
private fun tokenizedSkuOrNameSearchPredicate(query: String): (WooPosProductModelVersion2) -> Boolean {
4040
val tokens: List<String> = query
4141
.trim()
4242
.split(whitespaceRegex)

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosSearchProductsDataSource.kt

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.woocommerce.android.ui.woopos.home.items.search
22

33
import com.woocommerce.android.WooException
4-
import com.woocommerce.android.model.Product
5-
import com.woocommerce.android.model.toAppModel
64
import com.woocommerce.android.tools.SelectedSite
75
import com.woocommerce.android.ui.woopos.common.data.WooPosProductsCache
86
import com.woocommerce.android.ui.woopos.common.data.WooPosProductsTypesFilterConfig
7+
import com.woocommerce.android.ui.woopos.common.data.models.WCProductToWooPosProductModelMapper
8+
import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2
99
import com.woocommerce.android.util.WooLog
1010
import kotlinx.coroutines.Dispatchers
1111
import kotlinx.coroutines.withContext
@@ -21,7 +21,8 @@ class WooPosSearchProductsDataSource @Inject constructor(
2121
private val productsCache: WooPosProductsCache,
2222
private val searchResultsIndex: WooPosSearchResultsIndex,
2323
private val searchPredicate: WooPosProductSearchPredicate,
24-
private val productsTypesFilterConfig: WooPosProductsTypesFilterConfig
24+
private val productsTypesFilterConfig: WooPosProductsTypesFilterConfig,
25+
private val posProductModelMapper: WCProductToWooPosProductModelMapper,
2526
) {
2627
companion object {
2728
private const val PAGE_SIZE = 15
@@ -33,22 +34,23 @@ class WooPosSearchProductsDataSource @Inject constructor(
3334
val hasMorePages: Boolean
3435
get() = canLoadMore.get()
3536

36-
suspend fun searchLocalProducts(query: String): List<Product> = withContext(Dispatchers.IO) {
37+
suspend fun searchLocalProducts(query: String): List<WooPosProductModelVersion2> = withContext(Dispatchers.IO) {
3738
sortProducts(productsCache.getAll().filter(searchPredicate(query))).take(PAGE_SIZE)
3839
}
3940

40-
suspend fun searchRemoteProducts(query: String): Result<List<Product>> = withContext(Dispatchers.IO) {
41-
searchResultsIndex.clearCache()
41+
suspend fun searchRemoteProducts(query: String): Result<List<WooPosProductModelVersion2>> =
42+
withContext(Dispatchers.IO) {
43+
searchResultsIndex.clearCache()
4244

43-
performRemoteSearch(query).fold(
44-
onSuccess = { result ->
45-
Result.success(result.products.sortedBy { it.name.lowercase() })
46-
},
47-
onFailure = { error -> Result.failure(error) }
48-
)
49-
}
45+
performRemoteSearch(query).fold(
46+
onSuccess = { result ->
47+
Result.success(result.products.sortedBy { it.name.lowercase() })
48+
},
49+
onFailure = { error -> Result.failure(error) }
50+
)
51+
}
5052

51-
suspend fun loadMore(query: String): Result<List<Product>> {
53+
suspend fun loadMore(query: String): Result<List<WooPosProductModelVersion2>> {
5254
if (!canLoadMore.get()) {
5355
return Result.success(searchResultsIndex.getSearchResults(query))
5456
}
@@ -88,7 +90,7 @@ class WooPosSearchProductsDataSource @Inject constructor(
8890
} else {
8991
val searchResult = result.model!!
9092
val products = searchResult.products
91-
.map { product -> product.toAppModel() }
93+
.map { product -> posProductModelMapper.map(product) }
9294
.sortedBy { it.name.lowercase() }
9395

9496
canLoadMore.set(searchResult.canLoadMore)
@@ -106,17 +108,17 @@ class WooPosSearchProductsDataSource @Inject constructor(
106108
}
107109
}
108110

109-
private fun sortProducts(products: List<Product>): List<Product> {
111+
private fun sortProducts(products: List<WooPosProductModelVersion2>): List<WooPosProductModelVersion2> {
110112
return products.sortedBy { it.name.lowercase() }
111113
}
112114

113115
sealed class ProductsResult {
114-
data class Cached(val products: List<Product>) : ProductsResult()
115-
data class Remote(val productsResult: Result<List<Product>>) : ProductsResult()
116+
data class Cached(val products: List<WooPosProductModelVersion2>) : ProductsResult()
117+
data class Remote(val productsResult: Result<List<WooPosProductModelVersion2>>) : ProductsResult()
116118
}
117119

118120
data class SearchResult(
119-
val products: List<Product>,
121+
val products: List<WooPosProductModelVersion2>,
120122
val canLoadMore: Boolean
121123
)
122124
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosSearchResultsIndex.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.woocommerce.android.ui.woopos.home.items.search
22

3-
import com.woocommerce.android.model.Product
43
import com.woocommerce.android.ui.woopos.common.data.WooPosProductsCache
4+
import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2
55
import kotlinx.coroutines.sync.Mutex
66
import kotlinx.coroutines.sync.withLock
77
import javax.inject.Inject
@@ -22,7 +22,7 @@ class WooPosSearchResultsIndex @Inject constructor(
2222
paginatedResults = (paginatedResults + productIds).distinct()
2323
}
2424

25-
suspend fun getSearchResults(query: String): List<Product> = mutex.withLock {
25+
suspend fun getSearchResults(query: String): List<WooPosProductModelVersion2> = mutex.withLock {
2626
if (currentSearchQuery != query.lowercase()) {
2727
return emptyList()
2828
}

0 commit comments

Comments
 (0)