Updated on 2026-08-14
This commit is contained in:
parent
950aafe4ed
commit
e0bc66f30c
8 changed files with 42 additions and 6 deletions
|
|
@ -193,6 +193,7 @@
|
||||||
<string name="exchange_send_view_header">Вы отправляете</string>
|
<string name="exchange_send_view_header">Вы отправляете</string>
|
||||||
<string name="exchange_tokens_available_tokens_header">Мои токены</string>
|
<string name="exchange_tokens_available_tokens_header">Мои токены</string>
|
||||||
<string name="exchange_tokens_empty_tokens">У вас нет добавленных токенов. Добавьте токены для обмена</string>
|
<string name="exchange_tokens_empty_tokens">У вас нет добавленных токенов. Добавьте токены для обмена</string>
|
||||||
|
<string name="express_token_list_empty_search">Токены не найдены. Пожалуйста, попробуйте другой запрос</string>
|
||||||
<string name="exchange_tokens_unavailable_tokens_header">Недоступен для обмена с %s</string>
|
<string name="exchange_tokens_unavailable_tokens_header">Недоступен для обмена с %s</string>
|
||||||
<string name="express_cex_fee_explanation">Кроме того, в курс обмена включена комиссия сети за отправку обмененных средств на ваш адрес</string>
|
<string name="express_cex_fee_explanation">Кроме того, в курс обмена включена комиссия сети за отправку обмененных средств на ваш адрес</string>
|
||||||
<string name="express_cex_status_button_title">Статус</string>
|
<string name="express_cex_status_button_title">Статус</string>
|
||||||
|
|
|
||||||
|
|
@ -192,6 +192,7 @@
|
||||||
<string name="exchange_send_view_header">You send</string>
|
<string name="exchange_send_view_header">You send</string>
|
||||||
<string name="exchange_tokens_available_tokens_header">My tokens</string>
|
<string name="exchange_tokens_available_tokens_header">My tokens</string>
|
||||||
<string name="exchange_tokens_empty_tokens">You haven\'t added any tokens yet. Add tokens via Market to swap</string>
|
<string name="exchange_tokens_empty_tokens">You haven\'t added any tokens yet. Add tokens via Market to swap</string>
|
||||||
|
<string name="express_token_list_empty_search">No tokens found. Please try another request</string>
|
||||||
<string name="exchange_tokens_unavailable_tokens_header">Cannot be swapped for %s</string>
|
<string name="exchange_tokens_unavailable_tokens_header">Cannot be swapped for %s</string>
|
||||||
<string name="express_cex_fee_explanation">Additionally, the network fee for sending the exchanged funds back to your address is included in the rate</string>
|
<string name="express_cex_fee_explanation">Additionally, the network fee for sending the exchanged funds back to your address is included in the rate</string>
|
||||||
<string name="express_cex_status_button_title">Status</string>
|
<string name="express_cex_status_button_title">Status</string>
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ data class TokensDataStateExpress(
|
||||||
companion object {
|
companion object {
|
||||||
val EMPTY =
|
val EMPTY =
|
||||||
TokensDataStateExpress(
|
TokensDataStateExpress(
|
||||||
fromGroup = CurrenciesGroup(emptyList(), emptyList()),
|
fromGroup = CurrenciesGroup(emptyList(), emptyList(), false),
|
||||||
toGroup = CurrenciesGroup(emptyList(), emptyList()),
|
toGroup = CurrenciesGroup(emptyList(), emptyList(), false),
|
||||||
allProviders = emptyList(),
|
allProviders = emptyList(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -21,4 +21,5 @@ data class TokensDataStateExpress(
|
||||||
data class CurrenciesGroup(
|
data class CurrenciesGroup(
|
||||||
val available: List<CryptoCurrencySwapInfo>,
|
val available: List<CryptoCurrencySwapInfo>,
|
||||||
val unavailable: List<CryptoCurrencySwapInfo>,
|
val unavailable: List<CryptoCurrencySwapInfo>,
|
||||||
|
val afterSearch: Boolean,
|
||||||
)
|
)
|
||||||
|
|
@ -148,6 +148,7 @@ internal class SwapInteractorImpl @Inject constructor(
|
||||||
return CurrenciesGroup(
|
return CurrenciesGroup(
|
||||||
available = availableCryptoCurrencies,
|
available = availableCryptoCurrencies,
|
||||||
unavailable = unavailableCryptoCurrencies.map { CryptoCurrencySwapInfo(it, emptyList()) },
|
unavailable = unavailableCryptoCurrencies.map { CryptoCurrencySwapInfo(it, emptyList()) },
|
||||||
|
afterSearch = false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,7 @@ class TokensDataConverter(
|
||||||
.toImmutableList(),
|
.toImmutableList(),
|
||||||
onSearchEntered = onSearchEntered,
|
onSearchEntered = onSearchEntered,
|
||||||
onTokenSelected = onTokenSelected,
|
onTokenSelected = onTokenSelected,
|
||||||
|
afterSearch = value.afterSearch,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import kotlinx.collections.immutable.ImmutableList
|
||||||
data class SwapSelectTokenStateHolder(
|
data class SwapSelectTokenStateHolder(
|
||||||
val availableTokens: ImmutableList<TokenToSelectState>,
|
val availableTokens: ImmutableList<TokenToSelectState>,
|
||||||
val unavailableTokens: ImmutableList<TokenToSelectState>,
|
val unavailableTokens: ImmutableList<TokenToSelectState>,
|
||||||
|
val afterSearch: Boolean,
|
||||||
val onSearchEntered: (String) -> Unit,
|
val onSearchEntered: (String) -> Unit,
|
||||||
val onTokenSelected: (String) -> Unit,
|
val onTokenSelected: (String) -> Unit,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -42,10 +42,16 @@ fun SwapSelectTokenScreen(state: SwapSelectTokenStateHolder, onBack: () -> Unit)
|
||||||
.background(color = TangemTheme.colors.background.secondary),
|
.background(color = TangemTheme.colors.background.secondary),
|
||||||
content = { padding ->
|
content = { padding ->
|
||||||
val modifier = Modifier.padding(padding)
|
val modifier = Modifier.padding(padding)
|
||||||
if (state.availableTokens.isEmpty() && state.unavailableTokens.isEmpty()) {
|
when {
|
||||||
EmptyTokensList(modifier)
|
state.availableTokens.isEmpty() && state.unavailableTokens.isEmpty() && state.afterSearch -> {
|
||||||
} else {
|
TokensNotFound(modifier)
|
||||||
ListOfTokens(state = state, modifier = modifier)
|
}
|
||||||
|
state.availableTokens.isEmpty() && state.unavailableTokens.isEmpty() && !state.afterSearch -> {
|
||||||
|
EmptyTokensList(modifier)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
ListOfTokens(state = state, modifier = modifier)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
topBar = {
|
topBar = {
|
||||||
|
|
@ -91,6 +97,26 @@ private fun EmptyTokensList(modifier: Modifier = Modifier) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun TokensNotFound(modifier: Modifier = Modifier) {
|
||||||
|
Box(
|
||||||
|
modifier = modifier
|
||||||
|
.background(TangemTheme.colors.background.secondary)
|
||||||
|
.fillMaxSize(),
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(top = TangemTheme.dimens.spacing32)
|
||||||
|
.padding(horizontal = TangemTheme.dimens.spacing30)
|
||||||
|
.align(Alignment.TopCenter),
|
||||||
|
text = stringResource(id = R.string.express_token_list_empty_search),
|
||||||
|
style = TangemTheme.typography.subtitle1,
|
||||||
|
color = TangemTheme.colors.text.tertiary,
|
||||||
|
textAlign = TextAlign.Center,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun ListOfTokens(state: SwapSelectTokenStateHolder, modifier: Modifier = Modifier) {
|
private fun ListOfTokens(state: SwapSelectTokenStateHolder, modifier: Modifier = Modifier) {
|
||||||
val screenBackgroundColor = TangemTheme.colors.background.secondary
|
val screenBackgroundColor = TangemTheme.colors.background.secondary
|
||||||
|
|
@ -283,6 +309,7 @@ private fun TokenScreenPreview() {
|
||||||
state = SwapSelectTokenStateHolder(
|
state = SwapSelectTokenStateHolder(
|
||||||
availableTokens = listOf(title, token, token, token).toImmutableList(),
|
availableTokens = listOf(title, token, token, token).toImmutableList(),
|
||||||
unavailableTokens = listOf(title, token, token, token).toImmutableList(),
|
unavailableTokens = listOf(title, token, token, token).toImmutableList(),
|
||||||
|
afterSearch = false,
|
||||||
onSearchEntered = {},
|
onSearchEntered = {},
|
||||||
onTokenSelected = {},
|
onTokenSelected = {},
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -586,13 +586,16 @@ internal class SwapViewModel @Inject constructor(
|
||||||
fromGroup = tokenDataState.fromGroup.copy(
|
fromGroup = tokenDataState.fromGroup.copy(
|
||||||
available = available,
|
available = available,
|
||||||
unavailable = unavailable,
|
unavailable = unavailable,
|
||||||
|
afterSearch = true,
|
||||||
),
|
),
|
||||||
|
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
tokenDataState.copy(
|
tokenDataState.copy(
|
||||||
toGroup = tokenDataState.toGroup.copy(
|
toGroup = tokenDataState.toGroup.copy(
|
||||||
available = available,
|
available = available,
|
||||||
unavailable = unavailable,
|
unavailable = unavailable,
|
||||||
|
afterSearch = true,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue