Skip to content

Order create edit shipping lines support #11571

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -374,7 +375,7 @@ class OrderCreateEditFormFragment :

private fun FragmentOrderCreateEditFormBinding.initAdditionalInfoCollectionSection() {
additionalInfoCollectionSection.addShippingButton.setOnClickListener {
viewModel.onShippingButtonClicked()
viewModel.onAddOrEditShipping()
}
}

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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,
Expand All @@ -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()
Expand Down Expand Up @@ -277,7 +280,6 @@ class OrderCreateEditViewModel @Inject constructor(
),
mode = mode,
viewState = viewState!!,
onShippingClicked = { onShippingButtonClicked() },
onCouponsClicked = { onCouponButtonClicked() },
onGiftClicked = { onEditGiftCardButtonClicked(selectedGiftCard) },
onTaxesLearnMore = { onTaxHelpButtonClicked() },
Expand Down Expand Up @@ -372,6 +374,25 @@ class OrderCreateEditViewModel @Inject constructor(
private val giftCardWasEnabledAtLeastOnce: MutableStateFlow<Boolean> =
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()

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -1510,18 +1530,30 @@ class OrderCreateEditViewModel @Inject constructor(
}
)
_orderDraft.update { draft ->
val shipping: List<ShippingLine> = 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,
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
@@ -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
)
Loading
Loading