Updated on 2026-08-14

This commit is contained in:
Tangem 2025-08-13 17:22:08 +05:00
parent 947c5e44e6
commit ee097ad9f0
17 changed files with 247 additions and 147 deletions

View file

@ -9,6 +9,7 @@ import com.tangem.common.ui.amountScreen.models.AmountSegmentedButtonsConfig
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.common.ui.amountScreen.models.EnterAmountBoundary
import com.tangem.core.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter
import com.tangem.core.ui.extensions.combinedReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.stringReference
import com.tangem.core.ui.extensions.wrappedList
@ -18,6 +19,7 @@ import com.tangem.core.ui.format.bigdecimal.format
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.models.currency.CryptoCurrencyStatus
import com.tangem.utils.Provider
import com.tangem.utils.StringsSigns.DOT
import com.tangem.utils.converter.Converter
import com.tangem.utils.isNullOrZero
import kotlinx.collections.immutable.persistentListOf
@ -120,7 +122,11 @@ class AmountStateConverterV2(
return AmountState.Data(
title = value.title,
availableBalance = if (isRedesignEnabled) {
resourceReference(R.string.common_balance, wrappedList(crypto))
combinedReference(
stringReference(crypto),
stringReference(" $DOT "),
stringReference(fiat),
)
} else {
resourceReference(R.string.common_crypto_fiat_format, wrappedList(crypto, fiat))
},

View file

@ -3,13 +3,16 @@ package com.tangem.common.ui.amountScreen.converters.field
import com.tangem.common.ui.R
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.common.ui.amountScreen.models.EnterAmountBoundary
import com.tangem.core.ui.extensions.combinedReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.stringReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.core.ui.format.bigdecimal.crypto
import com.tangem.core.ui.format.bigdecimal.fiat
import com.tangem.core.ui.format.bigdecimal.format
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.models.currency.CryptoCurrencyStatus
import com.tangem.utils.StringsSigns.DOT
import com.tangem.utils.transformer.Transformer
/**
@ -34,7 +37,11 @@ class AmountBoundaryUpdateTransformer(
val crypto = maxEnterAmount.amount.format { crypto(cryptoCurrencyStatus.currency) }
val availableBalance = if (isRedesignEnabled) {
resourceReference(R.string.common_balance, wrappedList(crypto))
combinedReference(
stringReference(crypto),
stringReference(" $DOT "),
stringReference(fiat),
)
} else {
resourceReference(R.string.common_crypto_fiat_format, wrappedList(crypto, fiat))
}

View file

@ -113,7 +113,7 @@ internal fun LazyListScope.amountFieldV2(
} else {
Text(
text = amountState.title.resolveReference(),
style = TangemTheme.typography.caption2,
style = TangemTheme.typography.subtitle2,
color = TangemTheme.colors.text.tertiary,
)
}
@ -164,7 +164,7 @@ private fun AmountInfo(amountUM: AmountState, onMaxAmountClick: () -> Unit, modi
modifier = Modifier
.padding(end = 16.dp)
.clip(RoundedCornerShape(16.dp))
.background(TangemTheme.colors.background.secondary)
.background(TangemTheme.colors.button.secondary)
.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = ripple(),

View file

@ -127,7 +127,7 @@ private fun AmountSecondary(amountUM: AmountState, onCurrencyChange: (Boolean) -
modifier = Modifier
.fillMaxWidth()
.animateContentSize()
.padding(top = 8.dp),
.padding(top = 4.dp),
) {
if (amountUM is AmountState.Empty) {
TextShimmer(
@ -141,6 +141,7 @@ private fun AmountSecondary(amountUM: AmountState, onCurrencyChange: (Boolean) -
AmountFieldCurrencyInfo(
amountUM = amountUM,
onCurrencyChange = onCurrencyChange,
)
AmountFieldError(
isError = amountUM.amountTextField.isError,
@ -148,7 +149,7 @@ private fun AmountSecondary(amountUM: AmountState, onCurrencyChange: (Boolean) -
error = amountUM.amountTextField.error,
modifier = Modifier
.align(BottomCenter)
.padding(top = 20.dp),
.padding(top = 24.dp),
)
}
}
@ -161,12 +162,13 @@ private fun BoxScope.AmountFieldCurrencyInfo(amountUM: AmountState.Data, onCurre
horizontalArrangement = Arrangement.spacedBy(4.dp),
modifier = Modifier
.align(TopCenter)
.padding(bottom = 20.dp)
.padding(bottom = 16.dp)
.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = null,
onClick = { onCurrencyChange(!amountUM.amountTextField.isFiatValue) },
),
)
.padding(4.dp),
) {
val iconRotateState by animateFloatAsState(
targetValue = if (amountUM.amountTextField.isFiatValue) ROTATED_DEGREE else INITIAL_DEGREE,
@ -324,6 +326,7 @@ private class AmountFieldV2PreviewProvider : PreviewParameterProvider<AmountStat
get() = sequenceOf(
AmountStatePreviewData.emptyState,
AmountStatePreviewData.amountState,
AmountStatePreviewData.amountErrorState,
)
}
// endregion

View file

@ -320,6 +320,8 @@
<string name="details_title">Details</string>
<string name="disclaimer_error_loading">Überprüfe deine Internetverbindung oder wechseln zu einem anderen Netzwerk</string>
<string name="disclaimer_title">Nutzungsbedingungen</string>
<string name="email_preface_wc_error">Hallo Support-Team, ich habe einen Fehler mit dem Code %s festgestellt.</string>
<string name="email_subject_wc_error">WalletConnect-Fehler</string>
<string name="error_wrong_wallet_tapped">Du hast eine Karte oder Ring aus einer anderen Wallet verwendet. Tippe auf die Karte oder Ring, die dieser Wallet zugeordnet ist.</string>
<string name="eth_gas_required_exceeds_allowance">Nicht genug Geld für die Transaktion. Bitte lade dein Konto auf.</string>
<string name="exchange_tokens_available_tokens_header">Meine Token</string>
@ -1431,6 +1433,12 @@
<string name="wc_disconnect_all">Alle trennen</string>
<string name="wc_disconnect_all_alert_desc">Text über die Trennung aller dApps</string>
<string name="wc_disconnect_all_alert_title">Alle dApps trennen</string>
<string name="wc_errors_invalid_domain_subtitle">Versuchen Sie erneut, mit einer neuen URI zu koppeln</string>
<string name="wc_errors_invalid_domain_title">Ungültige dApp-Domain</string>
<string name="wc_errors_no_blockchains_subtitle">%s gibt keine Blockchains an — weder erforderlich noch optional.\nBitte stellen Sie sicher, dass Sie die richtige URI verwendet haben</string>
<string name="wc_errors_no_blockchains_title">Keine Netzwerke</string>
<string name="wc_errors_proposal_expired_subtitle">Bitte generieren Sie eine neue URI und versuchen Sie erneut, eine Verbindung herzustellen</string>
<string name="wc_errors_proposal_expired_title">Verbindungsvorschlag abgelaufen</string>
<string name="wc_estimated_wallet_changes">Geschätzte Wallet-Änderungen</string>
<string name="wc_estimated_wallet_changes_not_simulated">Die Transaktion konnte nicht simuliert werden. Bitte sei vorsichtig.</string>
<string name="wc_malicious_transaction">Böswillige/ gefährliche Transaktion</string>

View file

@ -318,7 +318,8 @@
<string name="disclaimer_error_loading">Compruebe su conexión a internet o cambia a una red diferente</string>
<string name="disclaimer_title">Condiciones de uso</string>
<string name="domain_receive_assets_navigation_title">Recibir activos</string>
<string name="email_subject_wc_error">Error de Wallet Connect</string>
<string name="email_preface_wc_error">Hola equipo de soporte, he encontrado un error con el código: %s</string>
<string name="email_subject_wc_error">Error de WalletConnect</string>
<string name="error_wrong_wallet_tapped">Ha usado una tarjeta de otra billetera. Toque la tarjeta asociada con esta billetera</string>
<string name="eth_gas_required_exceeds_allowance">No hay fondos suficientes para la transacción. Por favor, recargue su cuenta.</string>
<string name="exchange_tokens_available_tokens_header">Mis tokens</string>

View file

@ -293,6 +293,8 @@
<string name="details_title">Détails</string>
<string name="disclaimer_error_loading">Vérifiez votre connexion Internet ou passez à un réseau différent</string>
<string name="disclaimer_title">Conditions d\'utilisation</string>
<string name="email_preface_wc_error">Bonjour équipe de support, jai rencontré une erreur avec le code : %s</string>
<string name="email_subject_wc_error">Erreur WalletConnect</string>
<string name="error_wrong_wallet_tapped">Vous avez utilisé une carte d\'un autre portefeuille. Appuyez sur la carte associée à ce portefeuille</string>
<string name="eth_gas_required_exceeds_allowance">Pas assez de fonds pour la transaction. Veuillez recharger votre compte.</string>
<string name="exchange_tokens_available_tokens_header">Mes jetons</string>
@ -1332,6 +1334,12 @@
<string name="wc_disconnect_all">Déconnecter tout</string>
<string name="wc_disconnect_all_alert_desc">Texte sur la déconnexion de toutes les dApps</string>
<string name="wc_disconnect_all_alert_title">Déconnecter toutes les dApps</string>
<string name="wc_errors_invalid_domain_subtitle">Essayez de jumeler à nouveau avec un nouvel URI</string>
<string name="wc_errors_invalid_domain_title">Domaine dApp invalide</string>
<string name="wc_errors_no_blockchains_subtitle">%s ne spécifie aucune blockchain — ni requise ni optionnelle.\nVeuillez vous assurer que vous avez utilisé lURI correct</string>
<string name="wc_errors_no_blockchains_title">Aucun réseau</string>
<string name="wc_errors_proposal_expired_subtitle">Veuillez générer un nouvel URI et essayer de vous connecter à nouveau</string>
<string name="wc_errors_proposal_expired_title">La proposition de connexion a expiré</string>
<string name="wc_estimated_wallet_changes">Modifications estimées du portefeuille</string>
<string name="wc_estimated_wallet_changes_not_simulated">La transaction n\'a pas pu être simulée. Veuillez procéder avec prudence.</string>
<string name="wc_malicious_transaction">Transaction malveillante</string>

View file

@ -10,6 +10,7 @@
<string name="common_build_tx_error">Impossibile creare la transazione</string>
<string name="common_camera_denied_alert_message">Non hai fornito l\'accesso alla tua videocamera, modifica le tue impostazioni sulla privacy</string>
<string name="common_cancel">Annulla</string>
<string name="common_choose_wallet">Scegli portafoglio</string>
<string name="common_connecting">Connessione in corso</string>
<string name="common_delete">Rimuovere</string>
<string name="common_done">Fatto</string>
@ -39,6 +40,8 @@
<string name="details_row_title_signed_hashes">Firmato</string>
<string name="details_title">Requisiti</string>
<string name="disclaimer_title">Termini del servizio</string>
<string name="email_preface_wc_error">Ciao team di supporto, ho riscontrato un errore con il codice: %s</string>
<string name="email_subject_wc_error">Errore WalletConnect</string>
<string name="eth_gas_required_exceeds_allowance">Not enough funds for the transaction. Please top up your account.</string>
<string name="generic_error">An error occurred</string>
<string name="generic_requires_memo_error">Notifica richiesta</string>
@ -71,6 +74,12 @@
<string name="wallet_notification_no_internet">Nessuna connessione a Internet</string>
<string name="wallet_title">Tangem</string>
<string name="warning_button_ok">Ok, ho capito!</string>
<string name="wc_errors_invalid_domain_subtitle">Prova a eseguire nuovamente lassociazione con un nuovo URI</string>
<string name="wc_errors_invalid_domain_title">Dominio dApp non valido</string>
<string name="wc_errors_no_blockchains_subtitle">%s non specifica alcuna blockchain — né obbligatoria né opzionale.\nAssicurati di aver utilizzato lURI corretto</string>
<string name="wc_errors_no_blockchains_title">Nessuna rete</string>
<string name="wc_errors_proposal_expired_subtitle">Genera un nuovo URI e prova a connetterti di nuovo</string>
<string name="wc_errors_proposal_expired_title">La proposta di connessione è scaduta</string>
<string name="xtz_withdrawal_message_ignore">No, invia l\'intero importo</string>
<string name="xtz_withdrawal_message_reduce">Riduci di %s XTZ</string>
<string name="xtz_withdrawal_message_warning">Per evitare di pagare una commissione maggiore la prossima volta che ricarichi il tuo portafoglio, riduci l\'importo di %s XTZ</string>

View file

@ -352,6 +352,8 @@
<string name="domain_receive_assets_onboarding_description">他のネットワークで資産を送金すると、永久に失われます。</string>
<string name="domain_receive_assets_onboarding_network_name">%sネットワーク</string>
<string name="domain_receive_assets_onboarding_title">下記のみを使用して資金を送金する</string>
<string name="email_preface_wc_error">サポートチームの皆様、コード %s のエラーが発生しました。</string>
<string name="email_subject_wc_error">WalletConnect エラー</string>
<string name="error_wrong_wallet_tapped">別のウォレットのカードまたはリングを使用しました。このウォレットにリンクしているカードまたはリングをタップしてください。</string>
<string name="eth_gas_required_exceeds_allowance">取引に必要な資金が不足しています。アカウントに入金してください。</string>
<string name="exchange_tokens_available_tokens_header">マイトークン</string>
@ -457,6 +459,7 @@
<string name="home_button_scan">Tangemをスキャン</string>
<string name="hot_crypto_add_token_subtitle">%sへ</string>
<string name="hot_crypto_token_network">%sネットワーク</string>
<string name="hw_access_code_create_alert_title">アクセスコードの作成プロセスを終了してもよろしいですか?</string>
<string name="hw_activation_need_backup">今すぐバックアップ</string>
<string name="hw_activation_need_description">セットアップを完了するには、ウォレットをバックアップし、アクセスコードを使用してアプリへのアクセスを保護します。</string>
<string name="hw_activation_need_finish">今すぐ実施</string>
@ -975,17 +978,17 @@
<string name="send_validation_invalid_amount">無効な金額</string>
<string name="send_validation_invalid_fee">手数料が残高を超えています</string>
<string name="send_validation_invalid_total">合計金額が残高を超えています</string>
<string name="send_with_swap_change_token_alert_message">トークンを変更してもよろしいですか? 変更後、以前のデータはリセットされます。</string>
<string name="send_with_swap_change_token_alert_message">受信トークンを変更してもよろしいですか? 変更すると、以前入力したデータがリセットされます。</string>
<string name="send_with_swap_change_token_alert_title">トークンの変更</string>
<string name="send_with_swap_confirm_title">スワップして送信</string>
<string name="send_with_swap_convert_token_alert_message">変換を続行しますか? 以前のデータはリセットされます。</string>
<string name="send_with_swap_convert_token_alert_message">変換を続行しますか? これにより以前のデータは消去されます。</string>
<string name="send_with_swap_convert_token_alert_title">変換を確定</string>
<string name="send_with_swap_notification_text">トークンを送信すれば、送信中に変換されます。受信者は必要なものをシームレスに受け取ります。</string>
<string name="send_with_swap_recipient_amount_success_title">受信者は受け取ります</string>
<string name="send_with_swap_recipient_amount_text">信者に送信されます</string>
<string name="send_with_swap_recipient_amount_text">取人へ</string>
<string name="send_with_swap_recipient_amount_title">受取金額</string>
<string name="send_with_swap_remove_convert_alert_message">変換をキャンセルしてもよろしいですか? 変更後、以前のデータはリセットされます。</string>
<string name="send_with_swap_remove_convert_alert_title">キャンセルを確定</string>
<string name="send_with_swap_remove_convert_alert_message">変換をキャンセルしてもよろしいですか?以前のデータは消去されます。</string>
<string name="send_with_swap_remove_convert_alert_title">変換を削除</string>
<string name="send_with_swap_title">スワップして送信</string>
<string name="sent_transaction_sent_title">取引が送信されました</string>
<string name="settings_card_settings_footer">設定したいカードまたはリングをスキャンするために準備してください。</string>

View file

@ -116,7 +116,7 @@
<string name="common_choose_action">Выберите действие</string>
<string name="common_choose_network">Выберите сеть</string>
<string name="common_choose_token">Выберите токен</string>
<string name="common_choose_wallet">Выберите кошелек</string>
<string name="common_choose_wallet">Выберите кошелёк</string>
<string name="common_claim">Получить</string>
<string name="common_claim_rewards">Вывести награду</string>
<string name="common_close">Закрыть</string>
@ -291,6 +291,8 @@
<string name="details_title">Подробности</string>
<string name="disclaimer_error_loading">Проверьте подключение с интернетом или переключитесь на другую сеть</string>
<string name="disclaimer_title">Условия использования</string>
<string name="email_preface_wc_error">Привет, команда поддержки, у меня возникла ошибка с кодом: %s</string>
<string name="email_subject_wc_error">Ошибка WalletConnect</string>
<string name="error_wrong_wallet_tapped">Вы использовали карту или кольцо от другого кошелька. Приложите карту или кольцо, связанную с этим кошельком.</string>
<string name="eth_gas_required_exceeds_allowance">Недостаточно средств для совершения транзакции. Пожалуйста, пополните свой аккаунт.</string>
<string name="exchange_tokens_available_tokens_header">Мои токены</string>
@ -1304,7 +1306,7 @@
<string name="warning_token_trustline_title">Требуется трастлайн</string>
<string name="wc_alert_audit_malicious_domain">Вредоносный домен</string>
<string name="wc_alert_audit_unknown_domain">Неизвестный домен</string>
<string name="wc_alert_connect_anyway">Подключиться всё равно</string>
<string name="wc_alert_connect_anyway">Всё равно подключиться</string>
<string name="wc_alert_connection_timeout_description">Ошибка тайм-аута. Пожалуйста, попробуйте позже.</string>
<string name="wc_alert_connection_timeout_title">Не удалось подключиться через Wallet Connect</string>
<string name="wc_alert_domain_issues_description">Этот домен не может быть верифицирован. Внимательно проверьте запрос перед одобрением.</string>
@ -1348,6 +1350,12 @@
<string name="wc_dapp_disconnected">dApp отключен</string>
<string name="wc_disconnect_all">Отключить все</string>
<string name="wc_disconnect_all_alert_title">Отключить все dApp</string>
<string name="wc_errors_invalid_domain_subtitle">Попробуйте соединиться снова, используя новый URI</string>
<string name="wc_errors_invalid_domain_title">Недействительный домен dApp</string>
<string name="wc_errors_no_blockchains_subtitle">%s не указывает никаких блокчейнов — ни обязательных, ни опциональных.\nПожалуйста, убедитесь, что вы использовали правильный URI</string>
<string name="wc_errors_no_blockchains_title">Нет сетей</string>
<string name="wc_errors_proposal_expired_subtitle">Пожалуйста, сгенерируйте новый URI и попробуйте подключиться снова</string>
<string name="wc_errors_proposal_expired_title">Предложение подключения истекло</string>
<string name="wc_estimated_wallet_changes">Предварительные изменения</string>
<string name="wc_estimated_wallet_changes_not_simulated">Не удалось выполнить симуляцию транзакции. Пожалуйста, действуйте с осторожностью.</string>
<string name="wc_estimation_is_not_supported">Оценка не поддерживается для %s</string>

View file

@ -192,6 +192,7 @@
<string name="common_reject">Відхилити</string>
<string name="common_reload">Оновити</string>
<string name="common_rename">Перейменувати</string>
<string name="common_required">Обов\'язково</string>
<string name="common_save">Зберегти</string>
<string name="common_save_changes">Зберегти зміни</string>
<string name="common_search">Пошук</string>
@ -289,6 +290,8 @@
<string name="details_title">Деталі</string>
<string name="disclaimer_error_loading">Перевірте підключення до інтернету або змініть мережу</string>
<string name="disclaimer_title">Умови використання</string>
<string name="email_preface_wc_error">Привіт, команда підтримки, я зіткнувся з помилкою з кодом: %s</string>
<string name="email_subject_wc_error">Помилка WalletConnect</string>
<string name="error_wrong_wallet_tapped">Ви використали картку або кільце від іншого гаманця. Прикладіть картку або кільце, пов\'язану з цим гаманцем.</string>
<string name="eth_gas_required_exceeds_allowance">Недостатньо коштів для здійснення транзакції. Будь ласка, поповніть свій акаунт.</string>
<string name="exchange_tokens_available_tokens_header">Мої токени</string>
@ -1289,18 +1292,64 @@
<string name="warning_token_trustline_button_title">Відкрити Trustline</string>
<string name="warning_token_trustline_subtitle">Щоб отримати цей токен, потрібно увімкнути Trustline. Мережа вимагає резерв %1$s %2$s.</string>
<string name="warning_token_trustline_title">Відкрийте Trustline</string>
<string name="wc_alert_audit_unknown_domain">Невідомий домен</string>
<string name="wc_alert_connect_anyway">Все одно підключитися</string>
<string name="wc_alert_connection_timeout_description">Помилка тайм-ауту. Будь ласка, спробуйте пізніше.</string>
<string name="wc_alert_connection_timeout_title">Не вдалося зʼєднатися через Wallet Connect</string>
<string name="wc_alert_domain_issues_description">Цей домен не може бути підтверджений. Уважно перевірте запит перед схваленням.</string>
<string name="wc_alert_session_disconnected_description">Будь ласка, поверніться до браузеру і повторно підключіться через WalletConnect.</string>
<string name="wc_alert_session_disconnected_title">Сеанс Wallet Connect було завершено</string>
<string name="wc_alert_unknown_error_description">Код помилки: %s. Якщо проблема зберігається, зверніться до нашої служби підтримки.</string>
<string name="wc_alert_unknown_error_title">Ми зіткнулися з невідомою помилкою</string>
<string name="wc_alert_unsupported_networks_description">Tangem наразі не підтримує необхідну мережу для %s.</string>
<string name="wc_alert_unsupported_networks_title">Непідтримувані мережі</string>
<string name="wc_alert_verified_domain_description">Tangem підтримує мережу, необхідну для %s</string>
<string name="wc_alert_verified_domain_title">Верифікований домен</string>
<string name="wc_alert_wrong_card_description">Обрана не вірна картка або кільце</string>
<string name="wc_alert_wrong_card_title">Схоже, виникла проблема</string>
<string name="wc_all_dapps_disconnected">Усі dApps відключені</string>
<string name="wc_common_address">Адреса</string>
<string name="wc_common_connect">Підключення</string>
<string name="wc_common_network">Мережа</string>
<string name="wc_common_networks">Мережі</string>
<string name="wc_common_wallet">Гаманець</string>
<string name="wc_connected_app_title">Підключений додаток</string>
<string name="wc_connected_networks">Підключені мережі</string>
<string name="wc_connected_to">Підключений до %1$s</string>
<string name="wc_connection_reqeust_can_view_balance">Переглянути баланс гаманця та активність</string>
<string name="wc_connection_reqeust_cant_sign">Підписати транзакцію без вашої участі</string>
<string name="wc_connection_reqeust_request_approval">Запит схвалення на транзакцію</string>
<string name="wc_connection_reqeust_will_not">Не має можливості</string>
<string name="wc_connection_reqeust_would_like">Хотіли б</string>
<string name="wc_connection_request">Запит на підключення</string>
<string name="wc_connections">З\'єднання</string>
<string name="wc_contents">Вміст</string>
<string name="wc_copy_data_button_text">Копіювати дані</string>
<string name="wc_dapp_disconnected">dApp відключено</string>
<string name="wc_disconnect_all">Розʼєднати все</string>
<string name="wc_disconnect_all_alert_desc">Відключити всі dApps</string>
<string name="wc_disconnect_all_alert_title">Відключити всі dApps</string>
<string name="wc_errors_invalid_domain_subtitle">Спробуйте ще раз з новим URI</string>
<string name="wc_errors_invalid_domain_title">Недійсний домен dApp</string>
<string name="wc_errors_no_blockchains_subtitle">%s не вказує жодних блокчейнів — ні обов\'язкових, ні необов\'язкових. \n Переконайтеся, що ви використали правильний URI</string>
<string name="wc_errors_no_blockchains_title">Немає мереж</string>
<string name="wc_errors_proposal_expired_subtitle">Будь ласка, згенеруйте новий URI та спробуйте ще раз</string>
<string name="wc_errors_proposal_expired_title">Термін для з’єднання минув</string>
<string name="wc_insufficient_warning_subtitle">Поповніть баланс, щоб покрити комісію мережі</string>
<string name="wc_insufficient_warning_title">Недостатньо %1$s</string>
<string name="wc_missing_required_network_description">Додайте %s мережі до вашого портфелю для цього гаманця</string>
<string name="wc_missing_required_network_title">В гаманці не додані необхідні мережі</string>
<string name="wc_new_connection">Нове з\'єднання</string>
<string name="wc_no_sessions_desc">Підключайте свій гаманець до різних dApps</string>
<string name="wc_no_sessions_title">Немає підключень</string>
<string name="wc_notification_security_risk_subtitle">Виявлено потенційні ризики або шкідливу активність. Підключення чи підпис транзакцій можуть призвести до втрати коштів.</string>
<string name="wc_notification_security_risk_title">Відомий ризик безпеки</string>
<string name="wc_qr_scan_hint">Відкрийте програму Web3 та виберіть опцію WalletConnect</string>
<string name="wc_request_from">Запит від</string>
<string name="wc_signature_type">Тип підпису</string>
<string name="wc_specify_networks_subtitle">Для підключення dApp потрібна принаймні одна мережа</string>
<string name="wc_specify_networks_title">Вкажіть вибрані мережі</string>
<string name="wc_successfully_signed">Успішно підписано</string>
<string name="wc_transaction_info_to_title">До</string>
<string name="wc_transaction_request">Запит транзакції</string>
<string name="wc_transaction_request_title">Запит транзакції</string>

View file

@ -52,6 +52,7 @@
<string name="common_camera_denied_alert_message">您尚未授予相機訪問權限,請更改您的隱私設置</string>
<string name="common_cancel">删除</string>
<string name="common_choose_token">選擇代幣</string>
<string name="common_choose_wallet">選擇錢包</string>
<string name="common_close">關閉</string>
<string name="common_connecting">連線中</string>
<string name="common_continue">繼續</string>
@ -133,6 +134,7 @@
<string name="details_title">更多</string>
<string name="disclaimer_error_loading">檢查您的網路連接或切換到其他網絡</string>
<string name="disclaimer_title">服務條款</string>
<string name="email_preface_wc_error">您好,支援團隊,我遇到了一個錯誤,代碼為:%s</string>
<string name="email_subject_wc_error">WalletConnect 錯誤</string>
<string name="error_wrong_wallet_tapped">您使用了另一個錢包中的卡。點按與此錢包關聯的卡片</string>
<string name="eth_gas_required_exceeds_allowance">沒有足夠的資金進行交易。請先入金</string>
@ -377,6 +379,12 @@
<string name="warning_failed_to_verify_card_title">認證檢查失敗</string>
<string name="warning_network_unreachable_title">網路無法使用</string>
<string name="warning_solana_rent_fee_message">Solana 網絡每 2 天收取 %1$s 的費用。無法付此費用的帳戶將從網絡中清除。向您的帳戶存入超過 %2$s 即可免費使用</string>
<string name="wc_errors_invalid_domain_subtitle">請使用新的 URI 再次嘗試配對</string>
<string name="wc_errors_invalid_domain_title">無效的 dApp 網域</string>
<string name="wc_errors_no_blockchains_subtitle">%s 未指定任何區塊鏈——無論是必須的還是可選的。\n請確保您使用了正確的 URI</string>
<string name="wc_errors_no_blockchains_title">沒有網路</string>
<string name="wc_errors_proposal_expired_subtitle">請生成新的 URI然後再次嘗試連線</string>
<string name="wc_errors_proposal_expired_title">連線提案已過期</string>
<string name="welcome_interrupted_backup_alert_discard">捨棄</string>
<string name="welcome_interrupted_backup_alert_message">您有一個備份中斷了,您想繼續嗎?</string>
<string name="welcome_interrupted_backup_alert_resume">是的,恢復</string>

View file

@ -12,6 +12,8 @@
<string name="access_code_create_description">Set a %s-digit Access Code to unlock your wallet.</string>
<string name="access_code_create_title">Create Access Code</string>
<string name="access_code_navtitle">Access code</string>
<string name="account_archived_recover">Recover</string>
<string name="account_archived_title">Archived</string>
<string name="account_details_archive">Archive account</string>
<string name="account_details_archive_action">Archive</string>
<string name="account_details_archive_description">You are archiving this account, but you can always get it back.</string>
@ -359,7 +361,8 @@
<string name="domain_receive_assets_onboarding_description">Sending assets in other networks will result in permanent loss.</string>
<string name="domain_receive_assets_onboarding_network_name">%s network</string>
<string name="domain_receive_assets_onboarding_title">Send funds using only</string>
<string name="email_subject_wc_error">Wallet Connect error</string>
<string name="email_preface_wc_error">Hi support team, I\'ve encountered an error with code: %s</string>
<string name="email_subject_wc_error">WalletConnect error</string>
<string name="error_wrong_wallet_tapped">You have used a card or ring from another wallet. Tap the card or ring associated with this wallet</string>
<string name="eth_gas_required_exceeds_allowance">Not enough funds for the transaction. Please top up your account.</string>
<string name="exchange_tokens_available_tokens_header">My tokens</string>
@ -1002,6 +1005,7 @@
<string name="send_with_swap_recipient_amount_success_title">Recipient will receive</string>
<string name="send_with_swap_recipient_amount_text">To recipient</string>
<string name="send_with_swap_recipient_amount_title">Amount to receive</string>
<string name="send_with_swap_recipient_get_amount">Recipient get %s</string>
<string name="send_with_swap_remove_convert_alert_message">Are you sure you want to cancel the conversion? Your previous data will be cleared.</string>
<string name="send_with_swap_remove_convert_alert_title">Remove Conversion</string>
<string name="send_with_swap_title">Send with swap</string>
@ -1569,7 +1573,7 @@
<string name="wc_specify_networks_subtitle">At least one network is required for dApp connection</string>
<string name="wc_specify_networks_title">Specify selected networks</string>
<string name="wc_successfully_signed">Successfully signed</string>
<string name="wc_transaction_flow_title" translatable="false">Wallet connect</string>
<string name="wc_transaction_flow_title" translatable="false">WalletConnect</string>
<string name="wc_transaction_info_to_title">To</string>
<string name="wc_transaction_request">Transaction request</string>
<string name="wc_transaction_request_title">Transaction request</string>

View file

@ -134,7 +134,7 @@ private fun AddressWithMemoBlock(
Column(modifier = Modifier.weight(1f)) {
Text(
text = address.value,
style = TangemTheme.typography.body2,
style = TangemTheme.typography.body1,
color = TangemTheme.colors.text.primary1,
)
val blockchainAddress = address.briefBlockchainAddress

View file

@ -8,6 +8,7 @@ import com.tangem.core.ui.components.atoms.text.TextEllipsis
import com.tangem.core.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter
import com.tangem.core.ui.extensions.*
import com.tangem.core.ui.format.bigdecimal.crypto
import com.tangem.core.ui.format.bigdecimal.fiat
import com.tangem.core.ui.format.bigdecimal.format
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.models.currency.CryptoCurrencyStatus
@ -16,6 +17,7 @@ import com.tangem.domain.swap.models.SwapDirection
import com.tangem.features.swap.v2.impl.R
import com.tangem.features.swap.v2.impl.amount.entity.SwapAmountFieldUM
import com.tangem.features.swap.v2.impl.amount.entity.SwapAmountType
import com.tangem.utils.StringsSigns.DOT
internal class SwapAmountFieldConverter(
private val swapDirection: SwapDirection,
@ -60,15 +62,26 @@ internal class SwapAmountFieldConverter(
}
private fun getSubtitle(selectedType: SwapAmountType, cryptoCurrencyStatus: CryptoCurrencyStatus) = when {
selectedType.isEnteringField() -> resourceReference(
R.string.common_balance,
wrappedList(
selectedType.isEnteringField() -> combinedReference(
stringReference(
cryptoCurrencyStatus.value.amount.format {
crypto(cryptoCurrency = cryptoCurrencyStatus.currency)
},
),
stringReference(value = " $DOT "),
stringReference(
cryptoCurrencyStatus.value.fiatAmount.format {
fiat(
fiatCurrencyCode = appCurrency.code,
fiatCurrencySymbol = appCurrency.symbol,
)
},
),
).orMaskWithStars(isBalanceHidden)
selectedType.isViewingField() -> resourceReference(R.string.send_with_swap_recipient_amount_text)
selectedType.isViewingField() -> resourceReference(
R.string.send_with_swap_recipient_get_amount,
)
else -> TextReference.Companion.EMPTY
}

View file

@ -154,10 +154,7 @@ private fun SwapAmountDivider(modifier: Modifier = Modifier) {
style = TangemTheme.typography.caption1,
color = TangemTheme.colors.text.tertiary,
modifier = Modifier
.background(TangemTheme.colors.stroke.primary, RoundedCornerShape(32.dp))
.padding(1.dp)
.background(TangemTheme.colors.text.primary2, RoundedCornerShape(32.dp)) // workaround
.background(TangemTheme.colors.icon.informative.copy(alpha = 0.1f), RoundedCornerShape(32.dp))
.background(TangemTheme.colors.button.secondary, RoundedCornerShape(32.dp))
.padding(horizontal = 11.dp, vertical = 5.dp)
.align(Alignment.Center),
)

View file

@ -3,8 +3,6 @@ package com.tangem.features.swap.v2.impl.amount.ui
import android.content.res.Configuration
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
@ -26,7 +24,7 @@ import androidx.compose.ui.unit.dp
import androidx.constraintlayout.compose.ConstraintLayout
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.common.ui.amountScreen.ui.AmountFieldV2
import com.tangem.core.ui.components.RectangleShimmer
import com.tangem.core.ui.components.SpacerH2
import com.tangem.core.ui.components.SpacerWMax
import com.tangem.core.ui.components.TextShimmer
import com.tangem.core.ui.components.atoms.text.EllipsisText
@ -38,7 +36,6 @@ import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.domain.express.models.ExpressRateType
import com.tangem.domain.swap.models.SwapDirection
import com.tangem.features.swap.v2.impl.R
import com.tangem.features.swap.v2.impl.amount.entity.SwapAmountFieldUM
import com.tangem.features.swap.v2.impl.amount.entity.SwapAmountType
@ -54,13 +51,17 @@ internal fun SwapAmountContent(
clickIntents: SwapAmountClickIntents,
modifier: Modifier = Modifier,
) {
val swapAmountContent = amountUM as? SwapAmountUM.Content
val isFixedRate = swapAmountContent?.swapRateType == ExpressRateType.Fixed
ConstraintLayout(
modifier = modifier,
) {
val (amountFromRef, amountToRef, middleButtonRef) = createRefs()
SwapAmountBlock(
amountUM = amountUM,
amountFieldUM = amountUM.primaryAmount,
selectedAmountType = amountUM.selectedAmountType,
selectedQuote = swapAmountContent?.selectedQuote,
isFixedRate = isFixedRate,
clickIntents = clickIntents,
modifier = Modifier.constrainAs(amountFromRef) {
top.linkTo(parent.top)
@ -69,8 +70,10 @@ internal fun SwapAmountContent(
},
)
SwapAmountBlock(
amountUM = amountUM,
amountFieldUM = amountUM.secondaryAmount,
selectedAmountType = amountUM.selectedAmountType,
selectedQuote = swapAmountContent?.selectedQuote,
isFixedRate = isFixedRate,
clickIntents = clickIntents,
modifier = Modifier.constrainAs(amountToRef) {
top.linkTo(amountFromRef.bottom, 8.dp)
@ -100,7 +103,7 @@ private fun SwapAmountBlockSeparator(onClick: () -> Unit, modifier: Modifier = M
modifier = modifier
.heightIn(max = 28.dp)
.clip(RoundedCornerShape(32.dp))
.background(TangemTheme.colors.background.secondary)
.background(TangemTheme.colors.button.secondary)
.clickable(onClick = onClick)
.padding(vertical = 6.dp, horizontal = 12.dp),
) {
@ -109,10 +112,6 @@ private fun SwapAmountBlockSeparator(onClick: () -> Unit, modifier: Modifier = M
style = TangemTheme.typography.caption1,
color = TangemTheme.colors.text.tertiary,
)
VerticalDivider(
thickness = 1.dp,
color = TangemTheme.colors.icon.inactive,
)
Icon(
painter = rememberVectorPainter(
ImageVector.vectorResource(R.drawable.ic_close_24),
@ -126,11 +125,14 @@ private fun SwapAmountBlockSeparator(onClick: () -> Unit, modifier: Modifier = M
@Composable
private fun SwapAmountBlock(
amountUM: SwapAmountUM,
amountFieldUM: SwapAmountFieldUM,
selectedQuote: SwapQuoteUM?,
selectedAmountType: SwapAmountType,
isFixedRate: Boolean,
clickIntents: SwapAmountClickIntents,
modifier: Modifier = Modifier,
) {
val isSelectedAmountType = selectedAmountType == amountFieldUM.amountType
Column(
modifier = modifier
.padding(horizontal = 16.dp)
@ -138,7 +140,7 @@ private fun SwapAmountBlock(
.fillMaxWidth()
.background(TangemTheme.colors.background.action),
) {
AnimatedVisibility(amountUM.selectedAmountType == amountFieldUM.amountType) {
AnimatedVisibility(isSelectedAmountType) {
Box {
SwapAmountEditBlock(
amountFieldUM = amountFieldUM,
@ -157,8 +159,10 @@ private fun SwapAmountBlock(
}
}
SwapAmountInfo(
amountUM = amountUM,
amountFieldUM = amountFieldUM,
selectedQuote = selectedQuote,
isSelectedAmountType = isSelectedAmountType,
isFixedRate = isFixedRate,
onExpandEditField = clickIntents::onExpandEditField,
onSelectTokenClick = clickIntents::onSelectTokenClick,
onMaxAmountClick = clickIntents::onMaxValueClick,
@ -187,7 +191,7 @@ private fun SwapAmountEditBlock(
} else {
Text(
text = (amountFieldUM.amountField as AmountState.Data).title.resolveReference(),
style = TangemTheme.typography.caption2,
style = TangemTheme.typography.subtitle2,
color = TangemTheme.colors.text.tertiary,
)
}
@ -201,10 +205,13 @@ private fun SwapAmountEditBlock(
}
}
@Suppress("LongParameterList")
@Composable
private fun SwapAmountInfo(
amountUM: SwapAmountUM,
amountFieldUM: SwapAmountFieldUM,
selectedQuote: SwapQuoteUM?,
isSelectedAmountType: Boolean,
isFixedRate: Boolean,
onExpandEditField: (SwapAmountType) -> Unit,
onMaxAmountClick: () -> Unit,
onSelectTokenClick: () -> Unit,
@ -220,7 +227,7 @@ private fun SwapAmountInfo(
indication = ripple(),
enabled = (amountFieldUM as? SwapAmountFieldUM.Content)?.isClickEnabled == true,
onClick = {
if ((amountUM as? SwapAmountUM.Content)?.swapRateType == ExpressRateType.Fixed) {
if (isFixedRate) {
onExpandEditField(amountFieldUM.amountType)
} else {
onSelectTokenClick()
@ -237,107 +244,85 @@ private fun SwapAmountInfo(
bottom = 16.dp,
),
)
SwapAmountInfoMain(amountFieldUM = amountFieldUM)
SwapAmountInfoMain(
amountFieldUM = amountFieldUM,
selectedQuote = selectedQuote,
isSelectedAmountType = isSelectedAmountType,
)
SpacerWMax()
AnimatedContent(
amountFieldUM,
) { wrappedFieldAmountUM ->
if (amountUM is SwapAmountUM.Content) {
SwapAmountInfoExtra(
amountUM = amountUM,
amountFieldUM = wrappedFieldAmountUM,
onMaxAmountClick = onMaxAmountClick,
targetState = isSelectedAmountType,
) { isSelected ->
if (isSelected) {
AmountMaxButton(onMaxAmountClick)
} else {
SwapAmountInfoQuote(
quoteUM = selectedQuote,
isFixedRate = isFixedRate,
onSelectTokenClick = onSelectTokenClick,
)
} else {
RectangleShimmer()
}
}
}
}
@Composable
private fun SwapAmountInfoMain(amountFieldUM: SwapAmountFieldUM, modifier: Modifier = Modifier) {
AnimatedContent(
targetState = amountFieldUM is SwapAmountFieldUM.Content,
private fun SwapAmountInfoMain(
amountFieldUM: SwapAmountFieldUM,
selectedQuote: SwapQuoteUM?,
isSelectedAmountType: Boolean,
modifier: Modifier = Modifier,
) {
Column(
modifier = modifier,
) { isContent ->
if (isContent && amountFieldUM is SwapAmountFieldUM.Content) {
Column(
verticalArrangement = Arrangement.spacedBy(2.dp),
) {
) {
AnimatedContent(amountFieldUM is SwapAmountFieldUM.Content) { isContent ->
if (isContent && amountFieldUM is SwapAmountFieldUM.Content) {
Text(
text = amountFieldUM.title.resolveReference(),
style = TangemTheme.typography.subtitle2,
color = TangemTheme.colors.text.primary1,
maxLines = 1,
)
} else {
TextShimmer(
style = TangemTheme.typography.subtitle2,
modifier = Modifier.width(56.dp),
)
}
}
AnimatedContent(isSelectedAmountType) { isSelected ->
if (isSelected && amountFieldUM is SwapAmountFieldUM.Content) {
SpacerH2()
EllipsisText(
text = amountFieldUM.subtitle.resolveReference(),
style = TangemTheme.typography.caption2,
color = TangemTheme.colors.text.tertiary,
ellipsis = amountFieldUM.subtitleEllipsis,
)
}
} else {
Column(
verticalArrangement = Arrangement.spacedBy(2.dp),
) {
TextShimmer(
style = TangemTheme.typography.subtitle2,
modifier = Modifier.width(56.dp),
)
TextShimmer(
style = TangemTheme.typography.caption2,
modifier = Modifier.width(72.dp),
)
}
}
}
}
@Composable
private fun SwapAmountInfoExtra(
amountUM: SwapAmountUM.Content,
amountFieldUM: SwapAmountFieldUM,
onMaxAmountClick: () -> Unit,
onSelectTokenClick: () -> Unit,
) {
when (amountFieldUM.amountType) {
SwapAmountType.From -> when (amountUM.swapDirection) {
SwapDirection.Direct -> {
AnimatedVisibility(
visible = amountUM.selectedAmountType == amountFieldUM.amountType,
enter = fadeIn(),
exit = fadeOut(),
) {
AmountMaxButton(onMaxAmountClick)
}
}
SwapDirection.Reverse -> {
SwapAmountInfoQuote(
quoteUM = amountUM.selectedQuote,
swapRateType = amountUM.swapRateType,
onSelectTokenClick = onSelectTokenClick,
)
}
}
SwapAmountType.To -> when (amountUM.swapDirection) {
SwapDirection.Direct -> {
SwapAmountInfoQuote(
quoteUM = amountUM.selectedQuote,
swapRateType = amountUM.swapRateType,
onSelectTokenClick = onSelectTokenClick,
)
}
SwapDirection.Reverse -> {
AnimatedVisibility(
visible = amountUM.selectedAmountType == amountFieldUM.amountType,
enter = fadeIn(),
exit = fadeOut(),
) {
AmountMaxButton(onMaxAmountClick)
} else {
AnimatedContent(selectedQuote) { quote ->
when (quote) {
is SwapQuoteUM.Content -> {
SpacerH2()
EllipsisText(
text = stringResourceSafe(
R.string.send_with_swap_recipient_get_amount,
quote.quoteAmountValue.resolveReference(),
),
style = TangemTheme.typography.caption2,
color = TangemTheme.colors.text.tertiary,
)
}
SwapQuoteUM.Loading -> {
SpacerH2()
TextShimmer(
style = TangemTheme.typography.caption2,
modifier = Modifier.width(72.dp),
)
}
else -> Unit
}
}
}
}
@ -353,7 +338,7 @@ private fun AmountMaxButton(onMaxAmountClick: () -> Unit) {
modifier = Modifier
.padding(end = 16.dp)
.clip(RoundedCornerShape(16.dp))
.background(TangemTheme.colors.background.secondary)
.background(TangemTheme.colors.button.secondary)
.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = ripple(),
@ -364,11 +349,11 @@ private fun AmountMaxButton(onMaxAmountClick: () -> Unit) {
}
@Composable
private fun SwapAmountInfoQuote(quoteUM: SwapQuoteUM, swapRateType: ExpressRateType, onSelectTokenClick: () -> Unit) {
private fun SwapAmountInfoQuote(quoteUM: SwapQuoteUM?, isFixedRate: Boolean, onSelectTokenClick: () -> Unit) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.conditionalCompose(
condition = swapRateType == ExpressRateType.Fixed,
condition = isFixedRate,
modifier = {
clickable(
interactionSource = remember { MutableInteractionSource() },
@ -378,29 +363,20 @@ private fun SwapAmountInfoQuote(quoteUM: SwapQuoteUM, swapRateType: ExpressRateT
},
),
) {
when (quoteUM) {
is SwapQuoteUM.Content -> EllipsisText(
text = quoteUM.quoteAmountValue.resolveReference(),
style = TangemTheme.typography.body2,
color = TangemTheme.colors.text.tertiary,
modifier = Modifier.padding(end = 2.dp),
)
is SwapQuoteUM.Error,
is SwapQuoteUM.Empty,
-> Box(modifier = Modifier.padding(start = 16.dp))
is SwapQuoteUM.Loading -> CircularProgressIndicator(
color = TangemTheme.colors.icon.inactive,
modifier = Modifier
.padding(end = 4.dp)
.size(20.dp),
)
is SwapQuoteUM.Allowance -> Text(
text = "ALLOWANCE NOT IMPLEMENTED",
)
AnimatedContent(
quoteUM,
) { quote ->
when (quote) {
is SwapQuoteUM.Loading -> CircularProgressIndicator(
color = TangemTheme.colors.icon.inactive,
modifier = Modifier
.padding(end = 4.dp)
.size(20.dp),
)
else -> Box(modifier = Modifier.padding(start = 16.dp))
}
}
Icon(
painter = rememberVectorPainter(
ImageVector.vectorResource(R.drawable.ic_chevron_24),