Updated on 2026-08-14

This commit is contained in:
Tangem 2023-01-20 18:52:52 +08:00
parent e6fcb9e2fe
commit 40c37826bf
198 changed files with 791 additions and 704 deletions

View file

@ -51,6 +51,7 @@ class SwapFragment : Fragment() {
}
}
@Suppress("TopLevelComposableFunctions")
@Composable
private fun ScreenContent(viewModel: SwapViewModel) {
Crossfade(targetState = viewModel.currentScreen) { screen ->

View file

@ -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,

View file

@ -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 {

View file

@ -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

View file

@ -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 = {},
)
}

View file

@ -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)

View file

@ -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()