Updated on 2026-08-14
This commit is contained in:
parent
e6fcb9e2fe
commit
40c37826bf
198 changed files with 791 additions and 704 deletions
|
|
@ -51,6 +51,7 @@ class SwapFragment : Fragment() {
|
|||
}
|
||||
}
|
||||
|
||||
@Suppress("TopLevelComposableFunctions")
|
||||
@Composable
|
||||
private fun ScreenContent(viewModel: SwapViewModel) {
|
||||
Crossfade(targetState = viewModel.currentScreen) { screen ->
|
||||
|
|
|
|||
|
|
@ -96,13 +96,16 @@ fun SwapPermissionBottomSheetContent(
|
|||
)
|
||||
|
||||
SpacerH32()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun ApprovalBottomSheetInfo(
|
||||
currency: String, amount: String, walletAddress: String, spenderAddress: String, fee: String,
|
||||
currency: String,
|
||||
amount: String,
|
||||
walletAddress: String,
|
||||
spenderAddress: String,
|
||||
fee: String,
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
|
|
@ -114,7 +117,6 @@ private fun ApprovalBottomSheetInfo(
|
|||
),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
) {
|
||||
|
||||
AmountItem(currency = currency, amount = amount)
|
||||
DividerBottomSheet()
|
||||
WalletAddressItem(walletAddress = walletAddress)
|
||||
|
|
@ -142,7 +144,6 @@ private fun InformationItem(subtitle: String, value: String) {
|
|||
.fillMaxWidth()
|
||||
.padding(TangemTheme.dimens.spacing16),
|
||||
) {
|
||||
|
||||
Text(
|
||||
text = subtitle,
|
||||
color = TangemTheme.colors.text.primary1,
|
||||
|
|
|
|||
|
|
@ -39,8 +39,8 @@ internal fun SwapScreen(stateHolder: SwapStateHolder) {
|
|||
sheetContent = {
|
||||
SwapPermissionBottomSheetContent(
|
||||
data = stateHolder.permissionState as? SwapPermissionState.ReadyForRequest,
|
||||
onCancel = { coroutineScope.launch { bottomSheetScaffoldState.bottomSheetState.collapse() } },
|
||||
)
|
||||
onCancel = { coroutineScope.launch { bottomSheetScaffoldState.bottomSheetState.collapse() } },
|
||||
)
|
||||
},
|
||||
scaffoldState = bottomSheetScaffoldState,
|
||||
sheetShape = RoundedCornerShape(
|
||||
|
|
@ -54,8 +54,8 @@ internal fun SwapScreen(stateHolder: SwapStateHolder) {
|
|||
state = stateHolder,
|
||||
onPermissionWarningClick = {
|
||||
coroutineScope.launch {
|
||||
if (bottomSheetScaffoldState.bottomSheetState.isCollapsed
|
||||
&& stateHolder.permissionState is SwapPermissionState.ReadyForRequest
|
||||
if (bottomSheetScaffoldState.bottomSheetState.isCollapsed &&
|
||||
stateHolder.permissionState is SwapPermissionState.ReadyForRequest
|
||||
) {
|
||||
bottomSheetScaffoldState.bottomSheetState.expand()
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -58,7 +58,6 @@ internal fun SwapScreenContent(state: SwapStateHolder, onPermissionWarningClick:
|
|||
.fillMaxSize()
|
||||
.background(color = TangemTheme.colors.background.secondary),
|
||||
) {
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
|
|
@ -72,7 +71,6 @@ internal fun SwapScreenContent(state: SwapStateHolder, onPermissionWarningClick:
|
|||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing16),
|
||||
) {
|
||||
|
||||
MainInfo(state)
|
||||
|
||||
FeeItem(feeState = state.fee, currency = state.networkCurrency)
|
||||
|
|
@ -130,7 +128,6 @@ internal fun SwapScreenContent(state: SwapStateHolder, onPermissionWarningClick:
|
|||
color = TangemTheme.colors.text.primary1,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
|
||||
.background(TangemTheme.colors.button.secondary)
|
||||
.clickable { state.onMaxAmountSelected }
|
||||
.padding(
|
||||
|
|
@ -207,7 +204,6 @@ private fun MainInfo(state: SwapStateHolder) {
|
|||
|
||||
@Composable
|
||||
private fun FeeItem(feeState: FeeState, currency: String) {
|
||||
|
||||
val titleString = stringResource(id = R.string.send_fee_label)
|
||||
when (feeState) {
|
||||
is FeeState.Loaded -> {
|
||||
|
|
@ -229,7 +225,8 @@ private fun FeeItem(feeState: FeeState, currency: String) {
|
|||
|
||||
@Composable
|
||||
private fun SwapWarnings(
|
||||
warnings: List<SwapWarning>, onApproveWarningClick: () -> Unit,
|
||||
warnings: List<SwapWarning>,
|
||||
onApproveWarningClick: () -> Unit,
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
|
|
@ -322,4 +319,4 @@ private fun SwapScreenContentPreview() {
|
|||
}
|
||||
}
|
||||
|
||||
// endregion preview
|
||||
// endregion preview
|
||||
|
|
@ -38,7 +38,6 @@ import com.valentinilk.shimmer.shimmer
|
|||
|
||||
@Composable
|
||||
fun SwapSelectTokenScreen(state: SwapSelectTokenStateHolder, onBack: () -> Unit) {
|
||||
|
||||
TangemTheme {
|
||||
Scaffold(
|
||||
content = { padding ->
|
||||
|
|
@ -49,8 +48,8 @@ fun SwapSelectTokenScreen(state: SwapSelectTokenStateHolder, onBack: () -> Unit)
|
|||
title = stringResource(R.string.swapping_token_list_your_title),
|
||||
onBackClick = onBack,
|
||||
placeholderSearchText = stringResource(id = R.string.search_tokens_title),
|
||||
onSearchChanged = state.onSearchEntered,
|
||||
onSearchDisplayClosed = { state.onSearchEntered("") },
|
||||
onSearchChange = state.onSearchEntered,
|
||||
onSearchDisplayClose = { state.onSearchEntered("") },
|
||||
)
|
||||
},
|
||||
modifier = Modifier.background(color = TangemTheme.colors.background.secondary),
|
||||
|
|
@ -66,8 +65,7 @@ private fun ListOfTokens(state: SwapSelectTokenStateHolder, modifier: Modifier =
|
|||
.fillMaxWidth(),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
|
||||
) {
|
||||
|
||||
) {
|
||||
itemsIndexed(items = state.tokens) { index, item ->
|
||||
TokenItem(token = item, onTokenClick = { state.onTokenSelected(item.id) })
|
||||
|
||||
|
|
@ -82,13 +80,11 @@ private fun ListOfTokens(state: SwapSelectTokenStateHolder, modifier: Modifier =
|
|||
}
|
||||
|
||||
@Composable
|
||||
private fun TokenItem(token: TokenToSelect, onTokenClick: (String) -> Unit) {
|
||||
private fun TokenItem(token: TokenToSelect, onTokenClick: () -> Unit) {
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.clickable(
|
||||
onClick = { onTokenClick(token.id) },
|
||||
)
|
||||
.clickable(onClick = onTokenClick)
|
||||
.padding(
|
||||
vertical = TangemTheme.dimens.spacing14,
|
||||
horizontal = TangemTheme.dimens.spacing16,
|
||||
|
|
@ -210,9 +206,10 @@ private val tokenNotAvailable = token.copy(available = false)
|
|||
private fun TokenScreenPreview() {
|
||||
SwapSelectTokenScreen(
|
||||
state = SwapSelectTokenStateHolder(
|
||||
listOf(token, tokenNotAvailable, token), {}, {},
|
||||
tokens = listOf(token, tokenNotAvailable, token),
|
||||
onSearchEntered = {},
|
||||
onTokenSelected = {},
|
||||
),
|
||||
) {
|
||||
|
||||
}
|
||||
onBack = {},
|
||||
)
|
||||
}
|
||||
|
|
@ -68,7 +68,6 @@ import com.valentinilk.shimmer.shimmer
|
|||
@Suppress("LongParameterList")
|
||||
@Composable
|
||||
fun TransactionCard(
|
||||
modifier: Modifier = Modifier,
|
||||
type: TransactionCardType,
|
||||
balance: String,
|
||||
amount: String?,
|
||||
|
|
@ -79,7 +78,6 @@ fun TransactionCard(
|
|||
onChangeTokenClick: (() -> Unit)? = null,
|
||||
) {
|
||||
Card(
|
||||
modifier = modifier,
|
||||
shape = RoundedCornerShape(TangemTheme.dimens.radius12),
|
||||
backgroundColor = TangemTheme.colors.background.primary,
|
||||
elevation = TangemTheme.dimens.elevation2,
|
||||
|
|
@ -92,7 +90,6 @@ fun TransactionCard(
|
|||
verticalArrangement = Arrangement.SpaceBetween,
|
||||
horizontalAlignment = Alignment.Start,
|
||||
) {
|
||||
|
||||
Header(balance = balance, type = type)
|
||||
|
||||
Content(
|
||||
|
|
@ -126,7 +123,6 @@ fun TransactionCard(
|
|||
)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -193,7 +189,6 @@ private fun Content(
|
|||
verticalArrangement = Arrangement.SpaceBetween,
|
||||
horizontalAlignment = Alignment.Start,
|
||||
) {
|
||||
|
||||
when (type) {
|
||||
is TransactionCardType.ReceiveCard -> {
|
||||
if (amount != null) {
|
||||
|
|
@ -219,7 +214,7 @@ private fun Content(
|
|||
is TransactionCardType.SendCard -> {
|
||||
AutoSizeTextField(
|
||||
amount = amount ?: "1",
|
||||
onAmoutChanged = { type.onAmountChanged(it) },
|
||||
onAmountChange = { type.onAmountChanged(it) },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -249,18 +244,16 @@ private fun Content(
|
|||
)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("MagicNumber")
|
||||
@Composable
|
||||
private fun AutoSizeTextField(amount: String, onAmoutChanged: (String) -> Unit) {
|
||||
private fun AutoSizeTextField(amount: String, onAmountChange: (String) -> Unit) {
|
||||
val focusManager = LocalFocusManager.current
|
||||
val textFieldFocusRequester = remember { FocusRequester() }
|
||||
|
||||
BoxWithConstraints(modifier = Modifier.fillMaxWidth()) {
|
||||
|
||||
var shrunkFontSize = TangemTheme.typography.h2.fontSize
|
||||
val calculateIntrinsics = @Composable {
|
||||
ParagraphIntrinsics(
|
||||
|
|
@ -289,12 +282,9 @@ private fun AutoSizeTextField(amount: String, onAmoutChanged: (String) -> Unit)
|
|||
CompositionLocalProvider(
|
||||
LocalTextSelectionColors provides customTextSelectionColors,
|
||||
) {
|
||||
|
||||
BasicTextField(
|
||||
value = amount,
|
||||
onValueChange = {
|
||||
onAmoutChanged(it)
|
||||
},
|
||||
onValueChange = onAmountChange,
|
||||
singleLine = true,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
|
|
@ -334,7 +324,6 @@ fun Token(
|
|||
verticalArrangement = Arrangement.Bottom,
|
||||
horizontalAlignment = Alignment.End,
|
||||
) {
|
||||
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.padding(end = TangemTheme.dimens.spacing16)
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ internal class SwapViewModel @Inject constructor(
|
|||
var uiState: SwapStateHolder by mutableStateOf(stateBuilder.createInitialLoadingState(currency.symbol))
|
||||
private set
|
||||
|
||||
//shows currency order (direct - swap initial to selected, reversed = selected to initial)
|
||||
// shows currency order (direct - swap initial to selected, reversed = selected to initial)
|
||||
private var isOrderReversed = false
|
||||
private val lastAmount = mutableStateOf(INITIAL_AMOUNT)
|
||||
private var swapRouter: SwapRouter by Delegates.notNull()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue