diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/theme/Typography.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/theme/Typography.kt index 2d3e115d102..c9992f5b40b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/theme/Typography.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/theme/Typography.kt @@ -54,7 +54,8 @@ val WooTypography = Typography( h6 = TextStyle( fontWeight = FontWeight.Medium, fontSize = 20.sp, - lineHeight = 24.sp + lineHeight = 24.sp, + letterSpacing = 0.5.sp ), subtitle1 = TextStyle( fontWeight = FontWeight.Normal, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/DetermineMultipleLinesContext.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/DetermineMultipleLinesContext.kt deleted file mode 100644 index 66520a9b37e..00000000000 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/DetermineMultipleLinesContext.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.woocommerce.android.ui.orders.creation - -import com.woocommerce.android.R -import com.woocommerce.android.model.Order -import com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel.MultipleLinesContext -import com.woocommerce.android.viewmodel.ResourceProvider -import javax.inject.Inject - -class DetermineMultipleLinesContext @Inject constructor(private val resourceProvider: ResourceProvider) { - operator fun invoke(order: Order) = - when { - order.hasMultipleShippingLines -> MultipleLinesContext.Warning( - header = resourceProvider.getString( - R.string.lines_incomplete, - resourceProvider.getString(R.string.orderdetail_shipping_details) - ), - explanation = resourceProvider.getString( - R.string.lines_incomplete_explanation, - resourceProvider.getString(R.string.orderdetail_shipping_details).lowercase(), - ), - ) - else -> MultipleLinesContext.None - } -} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditFormFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditFormFragment.kt index 441ccc719da..d1f92a34a5f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditFormFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditFormFragment.kt @@ -15,6 +15,7 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnLifecycleDestroyed import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.dimensionResource @@ -50,6 +51,7 @@ import com.woocommerce.android.ui.barcodescanner.BarcodeScanningFragment import com.woocommerce.android.ui.base.BaseFragment import com.woocommerce.android.ui.base.UIMessageResolver import com.woocommerce.android.ui.compose.theme.WooTheme +import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground import com.woocommerce.android.ui.coupons.selector.CouponSelectorFragment.Companion.KEY_COUPON_SELECTOR_RESULT import com.woocommerce.android.ui.main.AppBarStatus import com.woocommerce.android.ui.main.MainActivity.Companion.BackPressListener @@ -59,8 +61,6 @@ import com.woocommerce.android.ui.orders.OrderNavigationTarget.ViewOrderStatusSe import com.woocommerce.android.ui.orders.OrderStatusUpdateSource import com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel.Mode.Creation import com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel.Mode.Edit -import com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel.MultipleLinesContext.None -import com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel.MultipleLinesContext.Warning import com.woocommerce.android.ui.orders.creation.configuration.EditProductConfigurationResult import com.woocommerce.android.ui.orders.creation.configuration.ProductConfigurationFragment import com.woocommerce.android.ui.orders.creation.customerlist.CustomerListFragment @@ -71,6 +71,7 @@ import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavi import com.woocommerce.android.ui.orders.creation.product.discount.OrderCreateEditProductDiscountFragment.Companion.KEY_PRODUCT_DISCOUNT_RESULT import com.woocommerce.android.ui.orders.creation.shipping.OrderShippingFragment.Companion.REMOVE_SHIPPING_RESULT import com.woocommerce.android.ui.orders.creation.shipping.OrderShippingFragment.Companion.UPDATE_SHIPPING_RESULT +import com.woocommerce.android.ui.orders.creation.shipping.ShippingLineFormSection import com.woocommerce.android.ui.orders.creation.shipping.ShippingUpdateResult import com.woocommerce.android.ui.orders.creation.simplepaymentsmigration.OrderCreateEditSimplePaymentsMigrationBottomSheetFragment import com.woocommerce.android.ui.orders.creation.taxes.rates.TaxRate @@ -374,7 +375,7 @@ class OrderCreateEditFormFragment : private fun FragmentOrderCreateEditFormBinding.initAdditionalInfoCollectionSection() { additionalInfoCollectionSection.addShippingButton.setOnClickListener { - viewModel.onShippingButtonClicked() + viewModel.onAddOrEditShipping() } } @@ -405,10 +406,30 @@ class OrderCreateEditFormFragment : bindCustomAmountsSection(binding.customAmountsSection, it) } + bindShippingLinesSection(binding) + observeViewStateChanges(binding) viewModel.event.observe(viewLifecycleOwner) { handleViewModelEvents(it, binding) } } + private fun bindShippingLinesSection(binding: FragmentOrderCreateEditFormBinding) { + binding.shippingLines.apply { + setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + setContent { + viewModel.shippingLineList.observeAsState().value?.let { shippingLines -> + WooThemeWithBackground { + ShippingLineFormSection( + shippingLineDetails = shippingLines, + formatCurrency = { amount -> currencyFormatter.formatCurrency(amount) }, + modifier = Modifier.padding(bottom = 1.dp), + onAdd = { viewModel.onAddOrEditShipping() }, + onEdit = { id -> viewModel.onAddOrEditShipping(id) } + ) + } + } + } + } + } @Suppress("LongMethod") private fun observeViewStateChanges(binding: FragmentOrderCreateEditFormBinding) { @@ -455,18 +476,6 @@ class OrderCreateEditFormFragment : binding.hideEditableControls() } } - new.multipleLinesContext.takeIfNotEqualTo(old?.multipleLinesContext) { multipleLinesContext -> - when (multipleLinesContext) { - None -> binding.multipleLinesWarningSection.root.visibility = View.GONE - is Warning -> { - binding.multipleLinesWarningSection.header.text = - multipleLinesContext.header - binding.multipleLinesWarningSection.explanation.text = - multipleLinesContext.explanation - binding.multipleLinesWarningSection.root.visibility = View.VISIBLE - } - } - } new.isCouponButtonEnabled.takeIfNotEqualTo(old?.isCouponButtonEnabled) { uiHelper.changeAddInfoButtonsEnabledState( binding, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt index 1345f5b6ac4..ca84dd4c6ef 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt @@ -108,6 +108,8 @@ import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavi import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget.ShowCreatedOrder import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget.TaxRateSelector import com.woocommerce.android.ui.orders.creation.product.discount.CurrencySymbolFinder +import com.woocommerce.android.ui.orders.creation.shipping.GetShippingMethodsWithOtherValue +import com.woocommerce.android.ui.orders.creation.shipping.ShippingLineDetails import com.woocommerce.android.ui.orders.creation.shipping.ShippingUpdateResult import com.woocommerce.android.ui.orders.creation.taxes.GetAddressFromTaxRate import com.woocommerce.android.ui.orders.creation.taxes.GetTaxRatesInfoDialogViewState @@ -161,6 +163,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.updateAndGet +import kotlinx.coroutines.flow.withIndex import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.parcelize.IgnoredOnParcel @@ -183,7 +186,6 @@ class OrderCreateEditViewModel @Inject constructor( private val orderCreateEditRepository: OrderCreateEditRepository, private val orderCreationProductMapper: OrderCreationProductMapper, private val createOrderItem: CreateOrderItem, - private val determineMultipleLinesContext: DetermineMultipleLinesContext, private val tracker: AnalyticsTrackerWrapper, private val productRepository: ProductListRepository, private val checkDigitRemoverFactory: CheckDigitRemoverFactory, @@ -204,6 +206,7 @@ class OrderCreateEditViewModel @Inject constructor( autoSyncOrder: AutoSyncOrder, autoSyncPriceModifier: AutoSyncPriceModifier, parameterRepository: ParameterRepository, + getShippingMethodsWithOtherValue: GetShippingMethodsWithOtherValue ) : ScopedViewModel(savedState) { companion object { val EMPTY_BIG_DECIMAL = -Double.MAX_VALUE.toBigDecimal() @@ -277,7 +280,6 @@ class OrderCreateEditViewModel @Inject constructor( ), mode = mode, viewState = viewState!!, - onShippingClicked = { onShippingButtonClicked() }, onCouponsClicked = { onCouponButtonClicked() }, onGiftClicked = { onEditGiftCardButtonClicked(selectedGiftCard) }, onTaxesLearnMore = { onTaxHelpButtonClicked() }, @@ -372,6 +374,25 @@ class OrderCreateEditViewModel @Inject constructor( private val giftCardWasEnabledAtLeastOnce: MutableStateFlow = savedState.getStateFlow(viewModelScope, false) + val shippingLineList = + combine( + _orderDraft.filter { it.shippingLines.isNotEmpty() } + .map { it.shippingLines.filter { line -> line.methodId != null } }, + getShippingMethodsWithOtherValue().withIndex() + ) { shippingLines, shippingMethods -> + val shippingMethodsMap = shippingMethods.value.associateBy { it.id } + + shippingLines.map { shippingLine -> + val method = shippingLine.methodId?.let { shippingMethodsMap[it] } + ShippingLineDetails( + id = shippingLine.itemId, + name = shippingLine.methodTitle, + shippingMethod = method, + amount = shippingLine.total + ) + } + }.asLiveData() + init { monitorPluginAvailabilityChanges() @@ -419,8 +440,7 @@ class OrderCreateEditViewModel @Inject constructor( viewState = viewState.copy( isUpdatingOrderDraft = false, showOrderUpdateSnackbar = false, - isEditable = order.isEditable, - multipleLinesContext = determineMultipleLinesContext(order) + isEditable = order.isEditable ) monitorOrderChanges() updateCouponButtonVisibility(order) @@ -1224,9 +1244,10 @@ class OrderCreateEditViewModel @Inject constructor( _selectedGiftCard.update { selectedGiftCard } } - fun onShippingButtonClicked() { + fun onAddOrEditShipping(itemId: Long? = null) { tracker.track(AnalyticsEvent.ORDER_ADD_SHIPPING_TAPPED) - triggerEvent(EditShipping(currentDraft.shippingLines.firstOrNull { it.methodId != null })) + val shippingLine = itemId?.let { id -> currentDraft.shippingLines.firstOrNull { it.itemId == id } } + triggerEvent(EditShipping(shippingLine)) } fun onCreateOrderClicked(order: Order, isTablet: Boolean = false) { @@ -1404,8 +1425,7 @@ class OrderCreateEditViewModel @Inject constructor( viewState = viewState.copy( isUpdatingOrderDraft = false, showOrderUpdateSnackbar = false, - isEditable = isOrderEditable(updateStatus), - multipleLinesContext = determineMultipleLinesContext(updateStatus.order) + isEditable = isOrderEditable(updateStatus) ) _orderDraft.updateAndGet { currentDraft -> if (mode is Mode.Creation) { @@ -1510,18 +1530,30 @@ class OrderCreateEditViewModel @Inject constructor( } ) _orderDraft.update { draft -> - val shipping: List = draft.shippingLines.map { shippingLine -> - if (shippingLine.itemId == shippingUpdateResult.id) { - shippingLine.copy( - methodId = shippingUpdateResult.methodId ?: "other", - total = shippingUpdateResult.amount, - methodTitle = shippingUpdateResult.name + val shipping = when { + shippingUpdateResult.id != null -> draft.shippingLines.map { shippingLine -> + if (shippingLine.itemId == shippingUpdateResult.id) { + shippingLine.copy( + methodId = shippingUpdateResult.methodId ?: "other", + total = shippingUpdateResult.amount, + methodTitle = shippingUpdateResult.name + ) + } else { + shippingLine + } + } + + draft.shippingLines.isNotEmpty() -> draft.shippingLines.toMutableList().also { + it.add( + ShippingLine( + methodId = shippingUpdateResult.methodId ?: "other", + total = shippingUpdateResult.amount, + methodTitle = shippingUpdateResult.name + ) ) - } else { - shippingLine } - }.ifEmpty { - listOf( + + else -> listOf( ShippingLine( methodId = shippingUpdateResult.methodId ?: "other", total = shippingUpdateResult.amount, @@ -1982,7 +2014,6 @@ class OrderCreateEditViewModel @Inject constructor( val shouldDisplayAddGiftCardButton: Boolean = false, val isEditable: Boolean = true, val isTotalsExpanded: Boolean = false, - val multipleLinesContext: MultipleLinesContext = MultipleLinesContext.None, val taxBasedOnSettingLabel: String = "", val autoTaxRateSetting: AutoTaxRateSettingState = AutoTaxRateSettingState(), val taxRateSelectorButtonState: TaxRateSelectorButtonState = TaxRateSelectorButtonState(), @@ -2035,17 +2066,6 @@ class OrderCreateEditViewModel @Inject constructor( @Parcelize data class Edit(val orderId: Long) : Mode() } - - sealed class MultipleLinesContext : Parcelable { - @Parcelize - object None : MultipleLinesContext() - - @Parcelize - data class Warning( - val header: String, - val explanation: String, - ) : MultipleLinesContext() - } } data class OnAddingProductViaScanningFailed( diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/ShippingLineDetails.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/ShippingLineDetails.kt new file mode 100644 index 00000000000..683195a7f7a --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/ShippingLineDetails.kt @@ -0,0 +1,11 @@ +package com.woocommerce.android.ui.orders.creation.shipping + +import com.woocommerce.android.model.ShippingMethod +import java.math.BigDecimal + +data class ShippingLineDetails( + val id: Long, + val shippingMethod: ShippingMethod?, + val amount: BigDecimal, + val name: String +) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/ShippingLineFormSection.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/ShippingLineFormSection.kt new file mode 100644 index 00000000000..3138ce58d09 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/ShippingLineFormSection.kt @@ -0,0 +1,189 @@ +package com.woocommerce.android.ui.orders.creation.shipping + +import android.content.res.Configuration +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Card +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.outlined.Edit +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.woocommerce.android.R +import com.woocommerce.android.model.ShippingMethod +import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground +import java.math.BigDecimal + +@Composable +fun ShippingLineFormSection( + shippingLineDetails: List, + onAdd: () -> Unit, + onEdit: (id: Long) -> Unit, + formatCurrency: (amount: BigDecimal) -> String, + modifier: Modifier = Modifier +) { + AnimatedVisibility(shippingLineDetails.isNotEmpty()) { + Card(shape = RectangleShape, modifier = modifier) { + Column(modifier = Modifier.padding(16.dp)) { + Row(modifier = Modifier.padding(bottom = 16.dp)) { + Text( + text = stringResource(id = R.string.shipping), + style = MaterialTheme.typography.h6, + modifier = modifier + .weight(2f, true) + .align(Alignment.CenterVertically) + ) + Icon( + imageVector = Icons.Default.Add, + contentDescription = stringResource(id = R.string.order_creation_add_shipping), + modifier = Modifier + .align(Alignment.CenterVertically) + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null + ) { onAdd() }, + tint = MaterialTheme.colors.primary + ) + } + + shippingLineDetails.forEachIndexed { i, shippingDetails -> + val itemModifier = if (i == 0) Modifier else Modifier.padding(top = 8.dp) + ShippingLineEditCard( + shippingLine = shippingDetails, + onEdit = onEdit, + formatCurrency = formatCurrency, + modifier = itemModifier + ) + } + } + } + } +} + +@Composable +fun ShippingLineEditCard( + shippingLine: ShippingLineDetails, + formatCurrency: (amount: BigDecimal) -> String, + onEdit: (id: Long) -> Unit, + modifier: Modifier = Modifier +) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = modifier + .fillMaxWidth() + .border( + brush = SolidColor(MaterialTheme.colors.onSurface.copy(alpha = 0.12f)), + width = 1.dp, + shape = RoundedCornerShape(dimensionResource(id = R.dimen.corner_radius_large)) + ) + .clickable { onEdit(shippingLine.id) } + .padding(dimensionResource(id = R.dimen.major_100)) + + ) { + Column( + modifier = Modifier + .weight(2f) + .align(Alignment.CenterVertically) + ) { + Text( + text = shippingLine.name, + style = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 18.sp + ), + color = colorResource(id = R.color.color_on_surface), + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + if (shippingLine.shippingMethod != null) { + Text( + text = shippingLine.shippingMethod.title, + style = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 14.sp, + color = Color.Gray + ), + color = colorResource(id = R.color.color_on_surface_medium), + modifier = Modifier.padding(top = 8.dp) + ) + } + } + Spacer(modifier = Modifier.weight(1f)) + Text( + text = formatCurrency(shippingLine.amount), + style = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 18.sp + ), + color = colorResource(id = R.color.color_on_surface), + modifier = Modifier.align(Alignment.CenterVertically) + ) + Icon( + imageVector = Icons.Outlined.Edit, + contentDescription = null, + modifier = Modifier + .align(Alignment.CenterVertically) + .padding(start = 16.dp) + ) + } +} + +@Preview +@Preview(name = "Dark mode", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun ShippingLineDetailsPreview() { + WooThemeWithBackground { + ShippingLineDetails( + id = 1L, + name = "UPS Shipping", + shippingMethod = ShippingMethod(id = "ups", title = "UPS"), + amount = BigDecimal.TEN, + ) + } +} + +@Preview +@Composable +fun ShippingLineFormSectionPreview() { + val shippingDetails = List(3) { i -> + ShippingLineDetails( + id = i * 1L, + shippingMethod = null, + amount = BigDecimal.TEN * i.toBigDecimal(), + name = "Shipping $i" + ) + } + WooThemeWithBackground { + ShippingLineFormSection( + shippingLineDetails = shippingDetails, + formatCurrency = { it.toString() }, + onAdd = { }, + onEdit = { } + ) + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/totals/OrderCreateEditTotalsHelper.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/totals/OrderCreateEditTotalsHelper.kt index 5a5d164b60e..2cd051fe0e8 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/totals/OrderCreateEditTotalsHelper.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/totals/OrderCreateEditTotalsHelper.kt @@ -22,7 +22,6 @@ class OrderCreateEditTotalsHelper @Inject constructor( order: Order, mode: OrderCreateEditViewModel.Mode, viewState: ViewState, - onShippingClicked: () -> Unit, onCouponsClicked: () -> Unit, onGiftClicked: () -> Unit, onTaxesLearnMore: () -> Unit, @@ -46,11 +45,7 @@ class OrderCreateEditTotalsHelper @Inject constructor( lines = listOfNotNull( order.toProductsSection(bigDecimalFormatter), order.toCustomAmountSection(bigDecimalFormatter), - order.toShippingSection( - enabled = viewState.isEditable, - bigDecimalFormatter, - onClick = onShippingClicked - ), + order.toShippingSection(bigDecimalFormatter), order.toCouponsSection( enabled = viewState.isCouponButtonEnabled && viewState.isIdle, bigDecimalFormatter, @@ -152,17 +147,11 @@ class OrderCreateEditTotalsHelper @Inject constructor( } } - private fun Order.toShippingSection( - enabled: Boolean, - bigDecimalFormatter: (BigDecimal) -> String, - onClick: () -> Unit - ): TotalsSectionsState.Line? = - if (shippingLines.firstOrNull { it.methodId != null } != null) { - TotalsSectionsState.Line.Button( - text = resourceProvider.getString(R.string.shipping), - value = shippingLines.sumByBigDecimal { it.total }.let(bigDecimalFormatter), - enabled = enabled, - onClick = onClick, + private fun Order.toShippingSection(bigDecimalFormatter: (BigDecimal) -> String): TotalsSectionsState.Line? = + if (shippingLines.filter { it.methodId != null }.isNotEmpty()) { + TotalsSectionsState.Line.Simple( + label = resourceProvider.getString(R.string.shipping), + value = shippingLines.sumByBigDecimal { it.total }.let(bigDecimalFormatter) ) } else { null diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailFragment.kt index 9b9b25c02cb..ededac524ed 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailFragment.kt @@ -77,6 +77,7 @@ import com.woocommerce.android.ui.orders.OrderStatusUpdateSource import com.woocommerce.android.ui.orders.OrdersCommunicationViewModel import com.woocommerce.android.ui.orders.OrdersCommunicationViewModel.CommunicationEvent.OrdersEmptyNotified import com.woocommerce.android.ui.orders.OrdersCommunicationViewModel.CommunicationEvent.OrdersLoadingNotified +import com.woocommerce.android.ui.orders.creation.shipping.ShippingLineDetails import com.woocommerce.android.ui.orders.details.adapter.OrderDetailShippingLabelsAdapter.OnShippingLabelClickListener import com.woocommerce.android.ui.orders.details.editing.OrderEditingViewModel import com.woocommerce.android.ui.orders.details.views.OrderDetailAttributionInfoView @@ -486,7 +487,7 @@ class OrderDetailFragment : viewModel.start() } - private fun showShippingLines(shippingLineList: LiveData>) { + private fun showShippingLines(shippingLineList: LiveData>) { binding.orderDetailShippingLines.apply { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailViewModel.kt index 93db229f890..bba2f6d09f0 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailViewModel.kt @@ -24,7 +24,6 @@ import com.woocommerce.android.model.OrderShipmentTracking import com.woocommerce.android.model.Refund import com.woocommerce.android.model.RequestResult.SUCCESS import com.woocommerce.android.model.ShippingLabel -import com.woocommerce.android.model.ShippingMethod import com.woocommerce.android.model.Subscription import com.woocommerce.android.model.WooPlugin import com.woocommerce.android.model.getNonRefundedProducts @@ -54,6 +53,7 @@ import com.woocommerce.android.ui.orders.OrderNavigationTarget.ViewRefundedProdu import com.woocommerce.android.ui.orders.OrderStatusUpdateSource import com.woocommerce.android.ui.orders.creation.shipping.GetShippingMethodsWithOtherValue import com.woocommerce.android.ui.orders.creation.shipping.RefreshShippingMethods +import com.woocommerce.android.ui.orders.creation.shipping.ShippingLineDetails import com.woocommerce.android.ui.orders.details.customfields.CustomOrderFieldsHelper import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam import com.woocommerce.android.ui.payments.cardreader.payment.CardReaderPaymentCollectibilityChecker @@ -85,7 +85,6 @@ import org.wordpress.android.fluxc.persistence.entity.OrderMetaDataEntity import org.wordpress.android.fluxc.store.WCOrderStore.UpdateOrderResult.OptimisticUpdateResult import org.wordpress.android.fluxc.store.WCOrderStore.UpdateOrderResult.RemoteUpdateResult import org.wordpress.android.fluxc.store.WooCommerceStore -import java.math.BigDecimal import javax.inject.Inject @HiltViewModel @@ -180,6 +179,7 @@ class OrderDetailViewModel @Inject constructor( shouldRefreshShippingMethods = shouldRefreshShippingMethods || shippingLine.methodId.isNullOrEmpty().not() && method == null && shippingMethods.index == 0 ShippingLineDetails( + id = shippingLine.itemId, name = shippingLine.methodTitle, shippingMethod = method, amount = shippingLine.total @@ -949,10 +949,4 @@ class OrderDetailViewModel @Inject constructor( data class ListInfo(val isVisible: Boolean = true, val list: List = emptyList()) data class TrashOrder(val orderId: Long) : MultiLiveEvent.Event() - - data class ShippingLineDetails( - val shippingMethod: ShippingMethod?, - val amount: BigDecimal, - val name: String - ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/ShippingLineCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/ShippingLineCard.kt index 80fef96bc13..1287b52c408 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/ShippingLineCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/ShippingLineCard.kt @@ -30,11 +30,12 @@ import androidx.compose.ui.unit.sp import com.woocommerce.android.R import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground import com.woocommerce.android.ui.orders.Header +import com.woocommerce.android.ui.orders.creation.shipping.ShippingLineDetails import java.math.BigDecimal @Composable fun ShippingLineSection( - shippingLineDetails: List, + shippingLineDetails: List, formatCurrency: (amount: BigDecimal) -> String, modifier: Modifier = Modifier ) { diff --git a/WooCommerce/src/main/res/layout/fragment_order_create_edit_form.xml b/WooCommerce/src/main/res/layout/fragment_order_create_edit_form.xml index c34a3101e56..48d9c2b981b 100644 --- a/WooCommerce/src/main/res/layout/fragment_order_create_edit_form.xml +++ b/WooCommerce/src/main/res/layout/fragment_order_create_edit_form.xml @@ -90,9 +90,11 @@ app:header="@string/custom_amounts" app:keepAddButtons="true" /> - + - \ No newline at end of file + diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderDetailViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderDetailViewModelTest.kt index 3d36598bc87..6be421de5b0 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderDetailViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderDetailViewModelTest.kt @@ -28,6 +28,7 @@ import com.woocommerce.android.ui.common.giftcard.GiftCardRepository import com.woocommerce.android.ui.orders.OrderNavigationTarget.PreviewReceipt import com.woocommerce.android.ui.orders.creation.shipping.GetShippingMethodsWithOtherValue import com.woocommerce.android.ui.orders.creation.shipping.RefreshShippingMethods +import com.woocommerce.android.ui.orders.creation.shipping.ShippingLineDetails import com.woocommerce.android.ui.orders.details.GetOrderSubscriptions import com.woocommerce.android.ui.orders.details.OrderDetailFragmentArgs import com.woocommerce.android.ui.orders.details.OrderDetailRepository @@ -2211,7 +2212,7 @@ class OrderDetailViewModelTest : BaseUnitTest() { viewModel.start() - var shippingLineDetails: List? = null + var shippingLineDetails: List? = null // When viewModel.viewStateData.observeForever { _, _ -> } @@ -2261,7 +2262,7 @@ class OrderDetailViewModelTest : BaseUnitTest() { viewModel.start() - var shippingLineDetails: List? = null + var shippingLineDetails: List? = null // When viewModel.viewStateData.observeForever { _, _ -> } @@ -2309,7 +2310,7 @@ class OrderDetailViewModelTest : BaseUnitTest() { viewModel.start() - var shippingLineDetails: List? = null + var shippingLineDetails: List? = null // When viewModel.viewStateData.observeForever { _, _ -> } diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/CreationFocusedOrderCreateEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/CreationFocusedOrderCreateEditViewModelTest.kt index e0cedfca25f..06a015253cb 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/CreationFocusedOrderCreateEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/CreationFocusedOrderCreateEditViewModelTest.kt @@ -43,7 +43,6 @@ import com.woocommerce.android.ui.orders.creation.coupon.edit.OrderCreateCouponD import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget.EditCustomer import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget.EditCustomerNote import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget.EditFee -import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget.EditShipping import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget.SelectItems import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget.ShowCreatedOrder import com.woocommerce.android.ui.orders.creation.taxes.TaxBasedOnSetting @@ -900,27 +899,6 @@ class CreationFocusedOrderCreateEditViewModelTest : UnifiedOrderEditViewModelTes assertThat(orderDraft?.feesLines).hasSize(1) } - @Test - fun `when hitting the shipping button with an existent one, then trigger EditShipping with the expected data`() { - var lastReceivedEvent: Event? = null - sut.event.observeForever { - lastReceivedEvent = it - } - - val newFeeTotal = BigDecimal(123.5) - sut.onShippingEdited(newFeeTotal, "1") - sut.onShippingButtonClicked() - - assertThat(lastReceivedEvent).isNotNull - lastReceivedEvent - .run { this as? EditShipping } - ?.let { editFeeEvent -> - val currentShippingLine = editFeeEvent.currentShippingLine - assertThat(currentShippingLine?.total).isEqualTo(newFeeTotal) - assertThat(currentShippingLine?.methodTitle).isEqualTo("1") - } ?: fail("Last event should be of EditShipping type") - } - @Test fun `when editing a shipping fee, then reuse the existent one with different value`() { var orderDraft: Order? = null @@ -1912,7 +1890,6 @@ class CreationFocusedOrderCreateEditViewModelTest : UnifiedOrderEditViewModelTes any(), any(), any(), - any(), ) ).thenReturn(totalsSectionsState) @@ -1944,7 +1921,6 @@ class CreationFocusedOrderCreateEditViewModelTest : UnifiedOrderEditViewModelTes any(), any(), any(), - any(), ) ).thenReturn(totalsSectionsState) var totalsData: TotalsSectionsState? = null @@ -1974,7 +1950,6 @@ class CreationFocusedOrderCreateEditViewModelTest : UnifiedOrderEditViewModelTes any(), any(), any(), - any(), onExpandCollapseClickedCaptor.capture(), any(), ) @@ -2022,7 +1997,6 @@ class CreationFocusedOrderCreateEditViewModelTest : UnifiedOrderEditViewModelTes any(), any(), any(), - any(), onHeightChangedCaptor.capture(), ) ).thenReturn(totalsSectionsState) @@ -2054,7 +2028,6 @@ class CreationFocusedOrderCreateEditViewModelTest : UnifiedOrderEditViewModelTes any(), any(), any(), - any(), onMainButtonClickedCaptor.capture(), any(), any(), diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/DetermineMultipleLinesContextTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/DetermineMultipleLinesContextTest.kt deleted file mode 100644 index f79c87b921b..00000000000 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/DetermineMultipleLinesContextTest.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.woocommerce.android.ui.orders.creation - -import com.woocommerce.android.model.AmbiguousLocation -import com.woocommerce.android.model.GetLocations -import com.woocommerce.android.model.Location -import com.woocommerce.android.model.OrderMapper -import com.woocommerce.android.ui.orders.OrderTestUtils -import com.woocommerce.android.ui.orders.details.editing.address.LocationCode -import com.woocommerce.android.util.DateUtils -import com.woocommerce.android.viewmodel.BaseUnitTest -import com.woocommerce.android.viewmodel.ResourceProvider -import kotlinx.coroutines.ExperimentalCoroutinesApi -import org.assertj.core.api.Assertions.assertThat -import org.junit.Test -import org.mockito.kotlin.any -import org.mockito.kotlin.mock -import org.mockito.kotlin.whenever - -@ExperimentalCoroutinesApi -class DetermineMultipleLinesContextTest : BaseUnitTest() { - - private val location: GetLocations = mock() - private val resourceProvider: ResourceProvider = mock() - private val dateUtils: DateUtils = mock() - - @Test - fun `when order has multiple shipping lines, then return proper multiple lines context`() { - whenever(location.invoke(any(), any())).thenReturn( - Pair( - Location(code = LocationCode(), name = ""), - AmbiguousLocation.EMPTY - ) - ) - whenever(resourceProvider.getString(any())).thenReturn("") - whenever(resourceProvider.getString(any(), any())).thenReturn("") - val sut = DetermineMultipleLinesContext(resourceProvider) - - val result = sut.invoke( - OrderMapper(location, dateUtils).toAppModel(OrderTestUtils.generateOrderWithMultipleShippingLines()) - ) - - assertThat(result).isInstanceOf(OrderCreateEditViewModel.MultipleLinesContext.Warning::class.java) - } - - @Test - fun `when order does not have multiple shipping lines, then return None MultipleLinesContext`() { - whenever(location.invoke(any(), any())).thenReturn( - Pair( - Location(code = LocationCode(), name = ""), - AmbiguousLocation.EMPTY - ) - ) - val sut = DetermineMultipleLinesContext(resourceProvider) - - val result = sut.invoke( - OrderMapper(location, dateUtils).toAppModel(OrderTestUtils.generateOrder()) - ) - - assertThat(result).isInstanceOf(OrderCreateEditViewModel.MultipleLinesContext.None::class.java) - } -} diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt index 0248f564f42..7a4d78c96aa 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt @@ -16,6 +16,7 @@ import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_SCANNING import com.woocommerce.android.analytics.AnalyticsTrackerWrapper import com.woocommerce.android.model.Address import com.woocommerce.android.model.Order +import com.woocommerce.android.model.ShippingMethod import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.barcodescanner.BarcodeScanningTracker import com.woocommerce.android.ui.orders.OrderTestUtils @@ -27,6 +28,8 @@ import com.woocommerce.android.ui.orders.creation.configuration.ProductConfigura import com.woocommerce.android.ui.orders.creation.configuration.ProductRules import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget import com.woocommerce.android.ui.orders.creation.product.discount.CurrencySymbolFinder +import com.woocommerce.android.ui.orders.creation.shipping.GetShippingMethodsWithOtherValue +import com.woocommerce.android.ui.orders.creation.shipping.ShippingLineDetails import com.woocommerce.android.ui.orders.creation.shipping.ShippingUpdateResult import com.woocommerce.android.ui.orders.creation.taxes.GetAddressFromTaxRate import com.woocommerce.android.ui.orders.creation.taxes.GetTaxRatesInfoDialogViewState @@ -85,7 +88,6 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { protected lateinit var orderCreateEditRepository: OrderCreateEditRepository protected lateinit var orderDetailRepository: OrderDetailRepository protected lateinit var parameterRepository: ParameterRepository - private lateinit var determineMultipleLinesContext: DetermineMultipleLinesContext protected lateinit var tracker: AnalyticsTrackerWrapper protected lateinit var resourceProvider: ResourceProvider private lateinit var barcodeScanningTracker: BarcodeScanningTracker @@ -101,6 +103,7 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { val currencySymbolFinder: CurrencySymbolFinder = mock() private lateinit var mapFeeLineToCustomAmountUiModel: MapFeeLineToCustomAmountUiModel protected lateinit var totalsHelper: OrderCreateEditTotalsHelper + private lateinit var getShippingMethodsWithOtherValue: GetShippingMethodsWithOtherValue protected val defaultOrderValue = Order.getEmptyOrder(Date(), Date()).copy(id = 123) @@ -168,9 +171,6 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { } ?: emptyList() } } - determineMultipleLinesContext = mock { - on { invoke(any()) } doReturn OrderCreateEditViewModel.MultipleLinesContext.None - } tracker = mock() barcodeScanningTracker = mock() checkDigitRemoverFactory = mock() @@ -192,6 +192,7 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { prefs = mock() mapFeeLineToCustomAmountUiModel = mock() totalsHelper = mock() + getShippingMethodsWithOtherValue = mock() } protected abstract val tracksFlow: String @@ -537,32 +538,33 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { } @Test - fun `given a order creation with gift card already set, when a gift card is removed, then track expected event`() = testBlocking { - initMocksForAnalyticsWithOrder(defaultOrderValue) - createSut() + fun `given a order creation with gift card already set, when a gift card is removed, then track expected event`() = + testBlocking { + initMocksForAnalyticsWithOrder(defaultOrderValue) + createSut() - sut.onGiftCardSelected("abc") + sut.onGiftCardSelected("abc") - verify(tracker).track( - AnalyticsEvent.ORDER_FORM_GIFT_CARD_SET, - mapOf( - AnalyticsTracker.KEY_FLOW to tracksFlow, - AnalyticsTracker.KEY_IS_GIFT_CARD_REMOVED to false, - AnalyticsTracker.KEY_HORIZONTAL_SIZE_CLASS to "compact" + verify(tracker).track( + AnalyticsEvent.ORDER_FORM_GIFT_CARD_SET, + mapOf( + AnalyticsTracker.KEY_FLOW to tracksFlow, + AnalyticsTracker.KEY_IS_GIFT_CARD_REMOVED to false, + AnalyticsTracker.KEY_HORIZONTAL_SIZE_CLASS to "compact" + ) ) - ) - sut.onGiftCardSelected("") + sut.onGiftCardSelected("") - verify(tracker).track( - AnalyticsEvent.ORDER_FORM_GIFT_CARD_SET, - mapOf( - AnalyticsTracker.KEY_FLOW to tracksFlow, - AnalyticsTracker.KEY_IS_GIFT_CARD_REMOVED to true, - AnalyticsTracker.KEY_HORIZONTAL_SIZE_CLASS to "compact" + verify(tracker).track( + AnalyticsEvent.ORDER_FORM_GIFT_CARD_SET, + mapOf( + AnalyticsTracker.KEY_FLOW to tracksFlow, + AnalyticsTracker.KEY_IS_GIFT_CARD_REMOVED to true, + AnalyticsTracker.KEY_HORIZONTAL_SIZE_CLASS to "compact" + ) ) - ) - } + } // region Scanned and Deliver @Test @@ -2501,10 +2503,82 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { @Test fun `when shipping button tapped, send tracks event`() { - sut.onShippingButtonClicked() + sut.onAddOrEditShipping() verify(tracker).track(AnalyticsEvent.ORDER_ADD_SHIPPING_TAPPED) } + + @Test + fun `when the shipping method is cached, then display the shipping method title`() { + val shippingMethodId = "other" + val shippingMethodTitle = "Other" + val shippingLines = listOf( + Order.ShippingLine( + methodId = shippingMethodId, + total = BigDecimal(10), + methodTitle = "Random name" + ) + ) + val getShippingMethodsResult = flowOf( + listOf( + ShippingMethod( + id = shippingMethodId, + title = shippingMethodTitle + ) + ) + ) + val order = defaultOrderValue.copy(shippingLines = shippingLines) + initMocksForAnalyticsWithOrder(order) + whenever(getShippingMethodsWithOtherValue.invoke()).doReturn(getShippingMethodsResult) + createSut() + + var shippingDetails: List? = null + sut.shippingLineList.observeForever { + shippingDetails = it + } + + assertThat(shippingDetails).isNotNull + assertThat(shippingDetails!!.size).isEqualTo(shippingLines.size) + val shippingMethod = shippingDetails!!.firstOrNull { it.shippingMethod?.id == shippingMethodId } + assertThat(shippingMethod).isNotNull + assertThat(shippingMethod!!.shippingMethod!!.title).isEqualTo(shippingMethodTitle) + } + + @Test + fun `when the shipping method is NOT cached, then DON'T display the shipping method title`() { + val shippingMethodId = "other" + val notFoundMethodId = "ups" + val shippingMethodTitle = "Other" + val shippingLines = listOf( + Order.ShippingLine( + methodId = notFoundMethodId, + total = BigDecimal(10), + methodTitle = "Random name" + ) + ) + val getShippingMethodsResult = flowOf( + listOf( + ShippingMethod( + id = shippingMethodId, + title = shippingMethodTitle + ) + ) + ) + val order = defaultOrderValue.copy(shippingLines = shippingLines) + initMocksForAnalyticsWithOrder(order) + whenever(getShippingMethodsWithOtherValue.invoke()).doReturn(getShippingMethodsResult) + createSut() + + var shippingDetails: List? = null + sut.shippingLineList.observeForever { + shippingDetails = it + } + + assertThat(shippingDetails).isNotNull + assertThat(shippingDetails!!.size).isEqualTo(shippingLines.size) + val shippingMethod = shippingDetails!!.firstOrNull { it.shippingMethod?.id == shippingMethodId } + assertThat(shippingMethod).isNull() + } //endregion protected fun createSut(savedStateHandle: SavedStateHandle = savedState) { @@ -2516,7 +2590,6 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { orderDetailRepository = orderDetailRepository, orderCreateEditRepository = orderCreateEditRepository, createOrderItem = createOrderItemUseCase, - determineMultipleLinesContext = determineMultipleLinesContext, parameterRepository = parameterRepository, autoSyncOrder = autoSyncOrder, autoSyncPriceModifier = autoSyncPriceModifier, @@ -2541,7 +2614,8 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { mapFeeLineToCustomAmountUiModel = mapFeeLineToCustomAmountUiModel, currencySymbolFinder = currencySymbolFinder, totalsHelper = totalsHelper, - dateUtils = mock() + dateUtils = mock(), + getShippingMethodsWithOtherValue = getShippingMethodsWithOtherValue ) } diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/totals/OrderCreateEditTotalsHelperTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/totals/OrderCreateEditTotalsHelperTest.kt index 0869e95ba33..89a900aa3f9 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/totals/OrderCreateEditTotalsHelperTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/totals/OrderCreateEditTotalsHelperTest.kt @@ -118,7 +118,6 @@ class OrderCreateEditTotalsHelperTest { whenever(bigDecimalFormatter.invoke(BigDecimal(15))).thenReturn("15.00$") whenever(bigDecimalFormatter.invoke(BigDecimal(16))).thenReturn("16.00$") - val onShippingClicked = mock<() -> Unit>() val onCouponsClicked = mock<() -> Unit>() val onGiftClicked = mock<() -> Unit>() val onTaxesLearnMore = mock<() -> Unit>() @@ -136,7 +135,6 @@ class OrderCreateEditTotalsHelperTest { OrderCreateEditViewModel.ViewState( taxBasedOnSettingLabel = taxBasedOnSettingLabel ), - onShippingClicked, onCouponsClicked, onGiftClicked, onTaxesLearnMore, @@ -162,11 +160,8 @@ class OrderCreateEditTotalsHelperTest { assertThat((actual.lines[1] as TotalsSectionsState.Line.Simple).label).isEqualTo("Custom Amounts") assertThat((actual.lines[1] as TotalsSectionsState.Line.Simple).value).isEqualTo("12.00$") - assertThat((actual.lines[2] as TotalsSectionsState.Line.Button).text).isEqualTo("Shipping") - assertThat((actual.lines[2] as TotalsSectionsState.Line.Button).value).isEqualTo("13.00$") - assertThat((actual.lines[2] as TotalsSectionsState.Line.Button).enabled).isTrue() - assertThat((actual.lines[2] as TotalsSectionsState.Line.Button).extraValue).isNull() - assertThat((actual.lines[2] as TotalsSectionsState.Line.Button).onClick == onShippingClicked).isTrue() + assertThat((actual.lines[2] as TotalsSectionsState.Line.Simple).label).isEqualTo("Shipping") + assertThat((actual.lines[2] as TotalsSectionsState.Line.Simple).value).isEqualTo("13.00$") assertThat((actual.lines[3] as TotalsSectionsState.Line.Button).text).isEqualTo("Coupons") assertThat((actual.lines[3] as TotalsSectionsState.Line.Button).value).isEqualTo("-14.00$") @@ -219,7 +214,6 @@ class OrderCreateEditTotalsHelperTest { {}, {}, {}, - {}, ) // THEN @@ -253,7 +247,6 @@ class OrderCreateEditTotalsHelperTest { {}, {}, {}, - {}, ) // THEN @@ -289,7 +282,6 @@ class OrderCreateEditTotalsHelperTest { {}, {}, {}, - {}, ) // THEN