diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/changeduecalculator/ChangeDueCalculatorFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/changeduecalculator/ChangeDueCalculatorFragment.kt index 869d351fe61..befffdc3908 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/changeduecalculator/ChangeDueCalculatorFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/changeduecalculator/ChangeDueCalculatorFragment.kt @@ -11,6 +11,7 @@ import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import com.woocommerce.android.ui.base.BaseFragment import com.woocommerce.android.ui.main.AppBarStatus +import com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -30,14 +31,29 @@ class ChangeDueCalculatorFragment : BaseFragment() { } } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { return ComposeView(requireContext()).apply { setContent { val uiState by viewModel.uiState.collectAsState() ChangeDueCalculatorScreen( uiState = uiState, onNavigateUp = { viewModel.onBackPressed() }, - onCompleteOrderClick = {} + onCompleteOrderClick = { + val action = ChangeDueCalculatorFragmentDirections + .actionChangeDueCalculatorFragmentToSelectPaymentMethodFragment( + cardReaderFlowParam = CardReaderFlowParam.PaymentOrRefund.Payment( + viewModel.navArgs.orderId, + CardReaderFlowParam.PaymentOrRefund.Payment.PaymentType.ORDER + ), + isOrderPaid = true + ) + findNavController().navigate(action) + }, + onAmountReceivedChanged = { viewModel.updateAmountReceived(it) } ) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/changeduecalculator/ChangeDueCalculatorScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/changeduecalculator/ChangeDueCalculatorScreen.kt index adc0ea85a5c..f9bdeed1558 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/changeduecalculator/ChangeDueCalculatorScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/changeduecalculator/ChangeDueCalculatorScreen.kt @@ -30,6 +30,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -39,6 +40,7 @@ import androidx.compose.ui.unit.TextUnitType import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import com.woocommerce.android.R +import com.woocommerce.android.extensions.filterNotNull import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground import com.woocommerce.android.widgets.WCMaterialOutlinedCurrencyEditTextView import java.math.BigDecimal @@ -47,9 +49,11 @@ import java.math.BigDecimal fun ChangeDueCalculatorScreen( uiState: ChangeDueCalculatorViewModel.UiState, onNavigateUp: () -> Unit, - onCompleteOrderClick: () -> Unit + onCompleteOrderClick: () -> Unit, + onAmountReceivedChanged: (BigDecimal) -> Unit ) { val context = LocalContext.current + val lifecycleOwner = LocalLifecycleOwner.current WooThemeWithBackground { Scaffold( @@ -109,6 +113,9 @@ fun ChangeDueCalculatorScreen( supportsNegativeValues = false hint = hintString setValueIfDifferent(uiState.amountDue) + value.filterNotNull().observe(lifecycleOwner) { + onAmountReceivedChanged(it) + } view = this } }, @@ -130,7 +137,7 @@ fun ChangeDueCalculatorScreen( ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = "$0.00", + text = if (uiState.change < BigDecimal.ZERO) "-" else uiState.change.toPlainString(), style = LocalTextStyle.current.copy( fontWeight = FontWeight.Bold, fontSize = TextUnit(44f, TextUnitType.Sp) @@ -217,9 +224,11 @@ fun ChangeDueCalculatorScreenSuccessPreview() { ChangeDueCalculatorScreen( uiState = ChangeDueCalculatorViewModel.UiState.Success( amountDue = BigDecimal("666.00"), - change = BigDecimal("0.00") + change = BigDecimal("0.00"), + amountReceived = BigDecimal("0.00") ), onNavigateUp = {}, - onCompleteOrderClick = {} + onCompleteOrderClick = {}, + onAmountReceivedChanged = {} ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/changeduecalculator/ChangeDueCalculatorViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/changeduecalculator/ChangeDueCalculatorViewModel.kt index f90c63487cb..3e337d4164d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/changeduecalculator/ChangeDueCalculatorViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/changeduecalculator/ChangeDueCalculatorViewModel.kt @@ -24,7 +24,12 @@ class ChangeDueCalculatorViewModel @Inject constructor( sealed class UiState { data object Loading : UiState() - data class Success(val amountDue: BigDecimal, val change: BigDecimal) : UiState() + data class Success( + val amountDue: BigDecimal, + val change: BigDecimal, + val amountReceived: BigDecimal + ) : UiState() + data object Error : UiState() } @@ -42,7 +47,8 @@ class ChangeDueCalculatorViewModel @Inject constructor( launch { val order = orderDetailRepository.getOrderById(orderId) order?.let { - _uiState.value = UiState.Success(amountDue = order.total, change = BigDecimal.ZERO) + _uiState.value = + UiState.Success(amountDue = order.total, change = BigDecimal.ZERO, amountReceived = BigDecimal.ZERO) } ?: run { _uiState.value = UiState.Error } @@ -52,4 +58,12 @@ class ChangeDueCalculatorViewModel @Inject constructor( fun onBackPressed() { _navigationEvent.value = Unit } + + fun updateAmountReceived(amount: BigDecimal) { + val currentState = _uiState.value + if (currentState is UiState.Success) { + val newChange = amount - currentState.amountDue + _uiState.value = currentState.copy(amountReceived = amount, change = newChange) + } + } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt index 4d6f34851e0..2fd11f7b07d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/methodselection/SelectPaymentMethodViewModel.kt @@ -88,6 +88,9 @@ class SelectPaymentMethodViewModel @Inject constructor( init { checkStatus() + if (FeatureFlag.OTHER_PAYMENT_METHODS.isEnabled()) { + handleIsOrderPaidNavigationArgs() + } } private fun checkStatus() { @@ -120,6 +123,12 @@ class SelectPaymentMethodViewModel @Inject constructor( } } + private fun handleIsOrderPaidNavigationArgs() { + if (navArgs.isOrderPaid) { + onCashPaymentConfirmed() + } + } + private suspend fun showPaymentState() { val isPaymentCollectableWithCardReader = cardPaymentCollectibilityChecker.isCollectable(order.first()) val isPaymentCollectableWithTapToPay = isTapToPayAvailable() diff --git a/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml b/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml index bd76fb2c6a9..c098beace53 100644 --- a/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml +++ b/WooCommerce/src/main/res/navigation/nav_graph_payment_flow.xml @@ -13,6 +13,10 @@ android:name="cardReaderFlowParam" app:argType="com.woocommerce.android.ui.payments.cardreader.onboarding.CardReaderFlowParam" app:nullable="false" /> + @@ -70,6 +74,16 @@ + + + +