Skip to content

Commit c398383

Browse files
Merge pull request #6620 from woocommerce/issue/6585-onboarding-sl-banner-display-logic
Issue/6585 onboarding sl banner display logic
2 parents 9487e00 + 0f20123 commit c398383

File tree

5 files changed

+436
-358
lines changed

5 files changed

+436
-358
lines changed

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

Lines changed: 32 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import androidx.core.view.ViewCompat
1212
import androidx.core.view.isVisible
1313
import androidx.fragment.app.viewModels
1414
import androidx.hilt.navigation.fragment.hiltNavGraphViewModels
15-
import androidx.lifecycle.Observer
1615
import androidx.navigation.fragment.findNavController
1716
import com.google.android.material.snackbar.Snackbar
1817
import com.google.android.material.transition.MaterialContainerTransform
@@ -228,64 +227,46 @@ class OrderDetailFragment : BaseFragment(R.layout.fragment_order_detail), OrderP
228227
binding.orderRefreshLayout.isRefreshing = it
229228
}
230229
new.refreshedProductId?.takeIfNotEqualTo(old?.refreshedProductId) { refreshProduct(it) }
231-
new.installWcShippingBanner?.takeIfNotEqualTo(old?.installWcShippingBanner) {
230+
new.installWcShippingBannerVisible?.takeIfNotEqualTo(old?.installWcShippingBannerVisible) {
232231
showInstallWcShippingBanner(it)
233232
}
234233
}
235234

236-
viewModel.orderNotes.observe(
237-
viewLifecycleOwner,
238-
Observer {
239-
showOrderNotes(it)
240-
}
241-
)
242-
viewModel.orderRefunds.observe(
243-
viewLifecycleOwner,
244-
Observer {
245-
showOrderRefunds(it, viewModel.order)
246-
}
247-
)
248-
viewModel.productList.observe(
249-
viewLifecycleOwner,
250-
Observer {
251-
showOrderProducts(it, viewModel.order.currency)
252-
}
253-
)
254-
viewModel.shipmentTrackings.observe(
255-
viewLifecycleOwner,
256-
Observer {
257-
showShipmentTrackings(it)
258-
}
259-
)
260-
viewModel.shippingLabels.observe(
261-
viewLifecycleOwner,
262-
Observer {
263-
showShippingLabels(it, viewModel.order.currency)
264-
}
265-
)
235+
viewModel.orderNotes.observe(viewLifecycleOwner) {
236+
showOrderNotes(it)
237+
}
238+
viewModel.orderRefunds.observe(viewLifecycleOwner) {
239+
showOrderRefunds(it, viewModel.order)
240+
}
241+
viewModel.productList.observe(viewLifecycleOwner) {
242+
showOrderProducts(it, viewModel.order.currency)
243+
}
244+
viewModel.shipmentTrackings.observe(viewLifecycleOwner) {
245+
showShipmentTrackings(it)
246+
}
247+
viewModel.shippingLabels.observe(viewLifecycleOwner) {
248+
showShippingLabels(it, viewModel.order.currency)
249+
}
266250

267-
viewModel.event.observe(
268-
viewLifecycleOwner,
269-
Observer { event ->
270-
when (event) {
271-
is ShowSnackbar -> {
272-
if (event.args.isNotEmpty()) {
273-
uiMessageResolver.getSnack(event.message, *event.args).show()
274-
} else {
275-
uiMessageResolver.showSnack(event.message)
276-
}
277-
}
278-
is ShowUndoSnackbar -> {
279-
displayUndoSnackbar(event.message, event.undoAction, event.dismissAction)
280-
}
281-
is OrderNavigationTarget -> navigator.navigate(this, event)
282-
is TakePaymentViewModel.SharePaymentUrl -> {
283-
sharePaymentUrl(event.storeName, event.paymentUrl)
251+
viewModel.event.observe(viewLifecycleOwner) { event ->
252+
when (event) {
253+
is ShowSnackbar -> {
254+
if (event.args.isNotEmpty()) {
255+
uiMessageResolver.getSnack(event.message, *event.args).show()
256+
} else {
257+
uiMessageResolver.showSnack(event.message)
284258
}
285-
else -> event.isHandled = false
286259
}
260+
is ShowUndoSnackbar -> {
261+
displayUndoSnackbar(event.message, event.undoAction, event.dismissAction)
262+
}
263+
is OrderNavigationTarget -> navigator.navigate(this, event)
264+
is TakePaymentViewModel.SharePaymentUrl -> {
265+
sharePaymentUrl(event.storeName, event.paymentUrl)
266+
}
267+
else -> event.isHandled = false
287268
}
288-
)
269+
}
289270
viewModel.start()
290271
}
291272

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

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_FLOW_E
2626
import com.woocommerce.android.analytics.AnalyticsTrackerWrapper
2727
import com.woocommerce.android.annotations.OpenClassOnDebug
2828
import com.woocommerce.android.extensions.isNotEqualTo
29-
import com.woocommerce.android.extensions.semverCompareTo
3029
import com.woocommerce.android.extensions.whenNotNullNorEmpty
3130
import com.woocommerce.android.model.Order
3231
import com.woocommerce.android.model.Order.OrderStatus
@@ -98,12 +97,8 @@ final class OrderDetailViewModel @Inject constructor(
9897
private val paymentCollectibilityChecker: CardReaderPaymentCollectibilityChecker,
9998
private val cardReaderTracker: CardReaderTracker,
10099
private val trackerWrapper: AnalyticsTrackerWrapper,
100+
private val shippingLabelOnboardingRepository: ShippingLabelOnboardingRepository,
101101
) : ScopedViewModel(savedState), OnProductFetchedListener {
102-
companion object {
103-
// The required version to support shipping label creation
104-
const val SUPPORTED_WCS_VERSION = "1.25.11"
105-
}
106-
107102
private val navArgs: OrderDetailFragmentArgs by savedState.navArgs()
108103

109104
final var order: Order
@@ -140,12 +135,6 @@ final class OrderDetailViewModel @Inject constructor(
140135
private val _shippingLabels = MutableLiveData<List<ShippingLabel>>()
141136
val shippingLabels: LiveData<List<ShippingLabel>> = _shippingLabels
142137

143-
private val isShippingPluginReady: Boolean by lazy {
144-
val pluginInfo = orderDetailRepository.getWooServicesPluginInfo()
145-
pluginInfo.isInstalled && pluginInfo.isActive &&
146-
(pluginInfo.version ?: "0.0.0").semverCompareTo(SUPPORTED_WCS_VERSION) >= 0
147-
}
148-
149138
override fun onCleared() {
150139
super.onCleared()
151140
productImageMap.unsubscribeFromOnProductFetchedEvents(this)
@@ -575,7 +564,7 @@ final class OrderDetailViewModel @Inject constructor(
575564
}
576565

577566
private fun fetchSLCreationEligibilityAsync() = async {
578-
if (isShippingPluginReady) {
567+
if (shippingLabelOnboardingRepository.isShippingPluginReady) {
579568
orderDetailRepository.fetchSLCreationEligibility(order.id)
580569
}
581570
}
@@ -646,7 +635,7 @@ final class OrderDetailViewModel @Inject constructor(
646635
val orderEligibleForInPersonPayments = viewState.orderInfo?.isPaymentCollectableWithCardReader == true &&
647636
FeatureFlag.CARD_READER.isEnabled()
648637

649-
val isOrderEligibleForSLCreation = isShippingPluginReady &&
638+
val isOrderEligibleForSLCreation = shippingLabelOnboardingRepository.isShippingPluginReady &&
650639
orderDetailRepository.isOrderEligibleForSLCreation(order.id) &&
651640
!orderEligibleForInPersonPayments
652641

@@ -670,7 +659,10 @@ final class OrderDetailViewModel @Inject constructor(
670659
isShipmentTrackingAvailable = shipmentTracking.isVisible,
671660
isProductListVisible = orderProducts.isVisible,
672661
areShippingLabelsVisible = shippingLabels.isVisible,
673-
installWcShippingBanner = true
662+
installWcShippingBannerVisible = shippingLabelOnboardingRepository.shouldShowWcShippingBanner(
663+
order,
664+
orderEligibleForInPersonPayments
665+
)
674666
)
675667
}
676668

@@ -711,7 +703,7 @@ final class OrderDetailViewModel @Inject constructor(
711703
val areShippingLabelsVisible: Boolean? = null,
712704
val isProductListMenuVisible: Boolean? = null,
713705
val isSharePaymentLinkVisible: Boolean? = null,
714-
val installWcShippingBanner: Boolean? = null
706+
val installWcShippingBannerVisible: Boolean? = null
715707
) : Parcelable {
716708
val isMarkOrderCompleteButtonVisible: Boolean?
717709
get() = if (orderStatus != null) orderStatus.statusKey == CoreOrderStatus.PROCESSING.value else null
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.woocommerce.android.ui.orders.details
2+
3+
import com.woocommerce.android.extensions.semverCompareTo
4+
import com.woocommerce.android.model.Order
5+
import javax.inject.Inject
6+
7+
class ShippingLabelOnboardingRepository @Inject constructor(
8+
private val orderDetailRepository: OrderDetailRepository
9+
) {
10+
companion object {
11+
// The required version to support shipping label creation
12+
const val SUPPORTED_WCS_VERSION = "1.25.11"
13+
const val SUPPORTED_WCS_CURRENCY = "USD"
14+
const val SUPPORTED_WCS_COUNTRY = "US"
15+
}
16+
17+
val isShippingPluginReady: Boolean by lazy {
18+
val pluginInfo = orderDetailRepository.getWooServicesPluginInfo()
19+
pluginInfo.isInstalled && pluginInfo.isActive &&
20+
(pluginInfo.version ?: "0.0.0").semverCompareTo(SUPPORTED_WCS_VERSION) >= 0
21+
}
22+
23+
fun shouldShowWcShippingBanner(order: Order, eligibleForIpp: Boolean): Boolean =
24+
!isShippingPluginReady &&
25+
orderDetailRepository.getStoreCountryCode() == SUPPORTED_WCS_COUNTRY &&
26+
order.currency == SUPPORTED_WCS_CURRENCY &&
27+
!order.isCashPayment &&
28+
!eligibleForIpp &&
29+
!hasVirtualProductsOnly(order)
30+
31+
private fun hasVirtualProductsOnly(order: Order): Boolean {
32+
return if (order.items.isNotEmpty()) {
33+
val remoteProductIds = order.getProductIds()
34+
orderDetailRepository.hasVirtualProductsOnly(remoteProductIds)
35+
} else false
36+
}
37+
}

0 commit comments

Comments
 (0)