From 2754318b8ea33c2c2cb2e24ff9185991e0526eb2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 29 Mar 2024 15:18:29 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../ui/components/fields/AmountTextField.kt | 10 +++++----- .../com/tangem/utils/coroutines/JobHolder.kt | 7 ++++--- .../state/amount/AmountStateFactory.kt | 7 +++++++ .../presentation/ui/SendNavigationButtons.kt | 2 +- .../presentation/ui/amount/AmountButtons.kt | 2 ++ .../presentation/ui/amount/AmountField.kt | 3 ++- .../ui/amount/AmountFieldContainer.kt | 1 + .../ui/amount/SendAmountContent.kt | 6 +++++- .../presentation/viewmodel/SendViewModel.kt | 20 +++++++++++++++++-- 9 files changed, 45 insertions(+), 13 deletions(-) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/fields/AmountTextField.kt b/core/ui/src/main/java/com/tangem/core/ui/components/fields/AmountTextField.kt index fee185d0ab..fb140e00d4 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/fields/AmountTextField.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/fields/AmountTextField.kt @@ -64,6 +64,7 @@ fun AmountTextField( keyboardType = KeyboardType.Number, ), keyboardActions: KeyboardActions = KeyboardActions.Default, + isEnabled: Boolean = true, isAutoResize: Boolean = false, @FloatRange(from = 0.0, to = 1.0, fromInclusive = false, toInclusive = false) reduceFactor: Double = 0.9, @@ -106,21 +107,20 @@ fun AmountTextField( textStyle = textStyle.copy( fontSize = fontSize, textDirection = TextDirection.ContentOrLtr, - textAlign = TextAlign.Center, ), color = color, keyboardOptions = keyboardOptions, keyboardActions = keyboardActions, singleLine = true, + readOnly = !isEnabled, visualTransformation = AmountVisualTransformation(decimals, symbol, decimalFormat), modifier = Modifier.background(TangemTheme.colors.background.action), decorationBox = { innerTextField -> Box { if (value.isBlank() && showPlaceholder) { - val placeholder = if (symbol != null) { - decimalFormat.defaultFormat().plus(" $symbol") - } else { - decimalFormat.defaultFormat() + var placeholder = decimalFormat.defaultFormat() + if (symbol != null) { + placeholder = placeholder.plus(" $symbol") } Text( text = placeholder, diff --git a/core/utils/src/main/java/com/tangem/utils/coroutines/JobHolder.kt b/core/utils/src/main/java/com/tangem/utils/coroutines/JobHolder.kt index 42c4c7b296..14e64f1b62 100644 --- a/core/utils/src/main/java/com/tangem/utils/coroutines/JobHolder.kt +++ b/core/utils/src/main/java/com/tangem/utils/coroutines/JobHolder.kt @@ -11,10 +11,11 @@ class JobHolder { private var job: Job? = null - /** Update current [job] */ - fun update(job: Job?) { + /** Update current [JobHolder.job] and return new [job] */ + fun update(job: Job): Job { this.job?.cancel() this.job = job + return job } /** Cancel current [job] */ @@ -23,4 +24,4 @@ class JobHolder { } } -fun Job.saveIn(jobHolder: JobHolder) = jobHolder.update(job = this) \ No newline at end of file +fun Job.saveIn(jobHolder: JobHolder): Job = jobHolder.update(job = this) \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountStateFactory.kt index 626da0c89b..4577927cc1 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountStateFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountStateFactory.kt @@ -50,4 +50,11 @@ internal class AmountStateFactory( amountState = state.amountState?.copy(notifications = notifications), ) } + + fun getOnAmountFeeLoadingCancel(): SendUiState { + val state = currentStateProvider() + return state.copy( + amountState = state.amountState?.copy(isFeeLoading = false), + ) + } } \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt index f7252345fd..94b544a15e 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt @@ -104,7 +104,7 @@ private fun SendNavigationButton( modifier = Modifier .clip(RoundedCornerShape(TangemTheme.dimens.radius16)) .background(TangemTheme.colors.button.secondary) - .clickable(enabled = !showProgress) { uiState.clickIntents.onPrevClick() } + .clickable { uiState.clickIntents.onPrevClick() } .padding(TangemTheme.dimens.spacing12), ) } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt index 68573bf3c7..00af1e90e7 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt @@ -28,6 +28,7 @@ private const val AMOUNT_BUTTONS_KEY = "amountButtonsKey" internal fun LazyListScope.buttons( segmentedButtonConfig: PersistentList, clickIntents: SendClickIntents, + isMaxButtonEnabled: Boolean, ) { item( key = AMOUNT_BUTTONS_KEY, @@ -55,6 +56,7 @@ internal fun LazyListScope.buttons( } SecondaryButton( text = stringResource(R.string.send_max_amount), + enabled = isMaxButtonEnabled, onClick = { hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress) clickIntents.onMaxValueClick() diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountField.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountField.kt index d9ef26bd3c..e6206028fe 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountField.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountField.kt @@ -22,7 +22,7 @@ import com.tangem.core.ui.utils.rememberDecimalFormat import com.tangem.features.send.impl.presentation.state.fields.SendTextField @Composable -internal fun AmountField(sendField: SendTextField.AmountField, isFiat: Boolean) { +internal fun AmountField(sendField: SendTextField.AmountField, isFiat: Boolean, isEnabled: Boolean) { val decimalFormat = rememberDecimalFormat() val (primaryValue, secondaryValue) = if (isFiat) { sendField.fiatValue to sendField.value @@ -47,6 +47,7 @@ internal fun AmountField(sendField: SendTextField.AmountField, isFiat: Boolean) color = TangemTheme.colors.text.primary1, textAlign = TextAlign.Center, ), + isEnabled = isEnabled, placeholderAlignment = TopCenter, modifier = Modifier .padding( diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountFieldContainer.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountFieldContainer.kt index 9b44cc2e1f..836ffd79a8 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountFieldContainer.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountFieldContainer.kt @@ -63,6 +63,7 @@ internal fun LazyListScope.amountField( AmountField( sendField = amountState.amountTextField, isFiat = amountState.amountTextField.isFiatValue, + isEnabled = !amountState.isFeeLoading, ) } } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt index 3f3d18d3bd..f38b4c48a1 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt @@ -28,7 +28,11 @@ internal fun SendAmountContent( .background(TangemTheme.colors.background.tertiary), ) { amountField(amountState = amountState, isBalanceHiding = isBalanceHiding) - buttons(amountState.segmentedButtonConfig, clickIntents) + buttons( + segmentedButtonConfig = amountState.segmentedButtonConfig, + clickIntents = clickIntents, + isMaxButtonEnabled = !amountState.isFeeLoading, + ) notifications(amountState.notifications) } } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt index decc2cc4d6..67e152dae9 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt @@ -482,7 +482,11 @@ internal class SendViewModel @Inject constructor( // region screen state navigation override fun popBackStack() = stateRouter.popBackStack() - override fun onBackClick() = stateRouter.onBackClick(isSuccess = uiState.sendState?.isSuccess == true) + override fun onBackClick() { + cancelFeeRequest() + stateRouter.onBackClick(isSuccess = uiState.sendState?.isSuccess == true) + } + override fun onNextClick() { val currentState = stateRouter.currentState.value sendOnNextScreenAnalyticSender.send(currentState.type, uiState) @@ -504,7 +508,10 @@ internal class SendViewModel @Inject constructor( stateRouter.onNextClick() } - override fun onPrevClick() = stateRouter.onPrevClick() + override fun onPrevClick() { + cancelFeeRequest() + stateRouter.onPrevClick() + } override fun onQrCodeScanClick() { analyticsEventHandler.send(SendAnalyticEvents.QrCodeButtonClicked) @@ -541,6 +548,12 @@ internal class SendViewModel @Inject constructor( false } } + + private fun cancelFeeRequest() { + viewModelScope.launch(dispatchers.main) { + feeJobHolder.cancel() + } + } // endregion // region amount state clicks @@ -691,6 +704,9 @@ internal class SendViewModel @Inject constructor( updateFeeNotifications() updateAmountNotifications() }.saveIn(feeJobHolder) + .invokeOnCompletion { + uiState = amountStateFactory.getOnAmountFeeLoadingCancel() + } } private suspend fun checkIfSubtractAvailable() {