diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/SendFragment.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/SendFragment.kt index 0a3521b1eb..cebe88712f 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/SendFragment.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/SendFragment.kt @@ -5,6 +5,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import arrow.core.getOrElse @@ -73,7 +74,8 @@ internal class SendFragment : ComposeFragment() { SystemBarsEffect { setSystemBarsColor(systemBarsColor) } - SendScreen(viewModel.uiState, viewModel.stateRouter.currentState) + val currentState = viewModel.stateRouter.currentState.collectAsStateWithLifecycle() + SendScreen(viewModel.uiState, currentState.value) } override fun onDestroy() { diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendEventEffect.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendEventEffect.kt index 84e638eb8a..53378ca7f7 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendEventEffect.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendEventEffect.kt @@ -3,6 +3,7 @@ package com.tangem.features.send.impl.presentation.ui import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource import com.tangem.core.ui.components.BasicDialog import com.tangem.core.ui.components.DialogButton @@ -18,6 +19,11 @@ internal fun SendEventEffect(event: StateEvent, snackbarHostState: Sn val resources = LocalContext.current.resources var alertConfig by remember { mutableStateOf(value = null) } + val keyboardController = LocalSoftwareKeyboardController.current + LaunchedEffect(key1 = alertConfig) { + keyboardController?.hide() + } + alertConfig?.let { SendAlert(state = it, onDismiss = { alertConfig = null }) } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt index fe28791ec9..55bebe81a7 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt @@ -11,7 +11,6 @@ import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.tangem.core.ui.components.appbar.AppBarWithBackButtonAndIcon import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.extensions.resourceReference @@ -25,11 +24,9 @@ import com.tangem.features.send.impl.presentation.ui.amount.SendAmountContent import com.tangem.features.send.impl.presentation.ui.fee.SendSpeedAndFeeContent import com.tangem.features.send.impl.presentation.ui.recipient.SendRecipientContent import com.tangem.features.send.impl.presentation.ui.send.SendContent -import kotlinx.coroutines.flow.StateFlow @Composable -internal fun SendScreen(uiState: SendUiState, currentStateFlow: StateFlow) { - val currentState = currentStateFlow.collectAsStateWithLifecycle() +internal fun SendScreen(uiState: SendUiState, currentState: SendUiCurrentScreen) { val snackbarHostState = remember { SnackbarHostState() } val sendState = uiState.sendState ?: return BackHandler { uiState.clickIntents.onBackClick() } @@ -37,11 +34,10 @@ internal fun SendScreen(uiState: SendUiState, currentStateFlow: StateFlow resourceReference(R.string.send_amount_label) SendUiStateType.Recipient -> resourceReference(R.string.send_recipient_label) SendUiStateType.Fee -> resourceReference(R.string.common_fee_selector_title) @@ -52,13 +48,13 @@ internal fun SendScreen(uiState: SendUiState, currentStateFlow: StateFlow null } - val isSending = currentState.value.type == SendUiStateType.Send && !uiState.sendState.isSuccess + val isSending = currentState.type == SendUiStateType.Send && !uiState.sendState.isSuccess val subtitleRes = if (isSending) { uiState.amountState?.walletName } else { null } - val iconRes = if (currentState.value.type == SendUiStateType.Recipient) { + val iconRes = if (currentState.type == SendUiStateType.Recipient) { R.drawable.ic_qrcode_scan_24 } else { null @@ -74,17 +70,16 @@ internal fun SendScreen(uiState: SendUiState, currentStateFlow: StateFlow item::class.java }, contentType = { _, item -> item::class.java }, itemContent = { i, item -> - val bottomPadding = if (i == notifications.lastIndex) { - TangemTheme.dimens.spacing72 - } else { - TangemTheme.dimens.spacing0 - } val topPadding = if (i == 0 && hasPaddingAbove) { TangemTheme.dimens.spacing0 } else { @@ -34,10 +29,7 @@ internal fun LazyListScope.notifications( Notification( config = item.config, modifier = modifier - .padding( - top = topPadding, - bottom = bottomPadding, - ) + .padding(top = topPadding) .animateItemPlacement(), containerColor = when (item) { is SendNotification.Error.ExceedsBalance, diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/fee/SendCustomFee.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/fee/SendCustomFee.kt index 79cff9da25..1c7e332844 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/fee/SendCustomFee.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/fee/SendCustomFee.kt @@ -29,20 +29,19 @@ internal fun SendCustomFee( enter = expandVertically().plus(fadeIn()), exit = shrinkVertically().plus(fadeOut()), ) { + val bottomPadding = if (hasNotifications) { + TangemTheme.dimens.spacing12 + } else { + TangemTheme.dimens.spacing0 + } Column( verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing12), - modifier = modifier, + modifier = modifier.padding(bottom = bottomPadding), ) { repeat(customValues.size) { index -> val value = customValues[index] - val bottomPadding = if (index == customValues.lastIndex && !hasNotifications) { - TangemTheme.dimens.spacing72 - } else { - TangemTheme.dimens.spacing0 - } FooterContainer( footer = value.footer.resolveReference(), - modifier = Modifier.padding(bottom = bottomPadding), ) { if (value.label != null) { InputRowEnterInfoAmount( diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/fee/SendSpeedAndFeeContent.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/fee/SendSpeedAndFeeContent.kt index 6281bfd810..88f4a37a85 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/fee/SendSpeedAndFeeContent.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/fee/SendSpeedAndFeeContent.kt @@ -31,7 +31,9 @@ internal fun SendSpeedAndFeeContent(state: SendStates.FeeState?, clickIntents: S .fillMaxSize() .background(TangemTheme.colors.background.tertiary) .padding( - horizontal = TangemTheme.dimens.spacing16, + start = TangemTheme.dimens.spacing16, + end = TangemTheme.dimens.spacing16, + bottom = TangemTheme.dimens.spacing16, ), ) { feeSelector(state, clickIntents) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/SendRecipientContent.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/SendRecipientContent.kt index 539d82e49c..eb9b2b544a 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/SendRecipientContent.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/SendRecipientContent.kt @@ -51,7 +51,11 @@ internal fun SendRecipientContent( modifier = Modifier .fillMaxSize() .background(TangemTheme.colors.background.tertiary) - .padding(horizontal = TangemTheme.dimens.spacing16), + .padding( + start = TangemTheme.dimens.spacing16, + end = TangemTheme.dimens.spacing16, + bottom = TangemTheme.dimens.spacing16, + ), ) { addressItem( address = address, @@ -222,7 +226,6 @@ private fun LazyListScope.listItem( .then( if (isLast && index == list.lastIndex) { Modifier - .padding(bottom = TangemTheme.dimens.spacing72) .clip( shape = RoundedCornerShape( bottomStart = TangemTheme.dimens.radius16, diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/SendContent.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/SendContent.kt index 78809756c4..0c92c24fd5 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/SendContent.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/SendContent.kt @@ -35,7 +35,11 @@ internal fun SendContent(uiState: SendUiState) { LazyColumn( modifier = Modifier .fillMaxSize() - .padding(horizontal = TangemTheme.dimens.spacing16), + .padding( + start = TangemTheme.dimens.spacing16, + end = TangemTheme.dimens.spacing16, + bottom = TangemTheme.dimens.spacing16, + ), ) { blocks(uiState) tapHelp(isDisplay = sendState.showTapHelp) 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 099bcd007f..069a34f6a3 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 @@ -465,7 +465,7 @@ internal class SendViewModel @Inject constructor( .conflate() .distinctUntilChanged() .onEach { uiState = feeStateFactory.getFeeNotificationState(notifications = it) } - .flowOn(dispatchers.io) + .flowOn(dispatchers.main) .launchIn(viewModelScope) .saveIn(feeNotificationsJobHolder) }