Updated on 2026-08-14

This commit is contained in:
Tangem 2024-08-29 18:01:49 +05:00
commit f52e85bcca
28 changed files with 310 additions and 290 deletions

View file

@ -43,8 +43,6 @@ fun NavigationButtonsBlock(buttonState: NavigationButtonsState, modifier: Modifi
PreviousButton(state?.prevButton)
PrimaryButton(state?.primaryButton, modifier = Modifier.weight(1f))
}
SecondaryButton(state?.secondaryButton)
}
}
@ -79,35 +77,6 @@ private fun PrimaryButton(primaryButton: NavigationButton?, modifier: Modifier =
}
}
@Composable
private fun SecondaryButton(secondaryButton: NavigationButton?) {
val wrappedButton by rememberNavigationButton(secondaryButton)
AnimatedContent(
targetState = wrappedButton,
transitionSpec = { navigationButtonsTransition() },
contentAlignment = Alignment.Center,
label = "Animate show secondary button",
modifier = Modifier.fillMaxWidth(),
) { button ->
if (button != null && button.textReference != TextReference.EMPTY) {
val icon = button.iconRes?.let { TangemButtonIconPosition.End(iconResId = it) }
?: TangemButtonIconPosition.None
TangemButton(
text = button.textReference.resolveReference(),
enabled = button.isEnabled,
onClick = button.onClick,
icon = icon,
showProgress = button.showProgress,
colors = TangemButtonsDefaults.secondaryButtonColors,
modifier = Modifier.padding(top = TangemTheme.dimens.spacing12),
)
} else {
Spacer(modifier = Modifier.fillMaxWidth())
}
}
}
@Composable
private fun PreviousButton(prevButton: NavigationButton?) {
AnimatedVisibility(

View file

@ -10,7 +10,6 @@ sealed class NavigationButtonsState {
data class Data(
val primaryButton: NavigationButton,
val prevButton: NavigationButton?,
val secondaryButton: NavigationButton?,
val extraButtons: ImmutableList<NavigationButton>,
val txUrl: String? = null,
) : NavigationButtonsState()

View file

@ -30,14 +30,6 @@ internal object NavigationButtonsPreview {
),
)
private val next = NavigationButton(
textReference = resourceReference(R.string.common_next),
isSecondary = false,
isIconVisible = false,
showProgress = false,
isEnabled = true,
onClick = {},
)
private val prev = NavigationButton(
textReference = TextReference.EMPTY,
iconRes = R.drawable.ic_back_24,
@ -60,7 +52,6 @@ internal object NavigationButtonsPreview {
val allButtons = NavigationButtonsState.Data(
primaryButton = finished,
prevButton = prev,
secondaryButton = next,
extraButtons = extraButtons,
txUrl = "https://tangem.com",
)

View file

@ -104,7 +104,6 @@
<string name="common_explore">Erkunden</string>
<string name="common_explore_transaction_history">Transaktionsverlauf einsehen</string>
<string name="common_explorer">Explorer</string>
<string name="common_fee_label">Gebühr</string>
<string name="common_fee_selector_footer">Netzwerkgebühren sind Gebühren, die Nutzer für die Verarbeitung und Bestätigung von Transaktionen zahlen. Die Höhe der Gebühren kann von der Überlastung des Netzes, der Größe der Transaktion und der Ausführungspriorität abhängen. %s</string>
<string name="common_fee_selector_option_fast">Schnell</string>
<string name="common_fee_selector_option_market">Markt</string>
@ -114,6 +113,10 @@
<string name="common_go_to_provider">Zum Anbieter gehen</string>
<string name="common_go_to_token">Zum Token</string>
<string name="common_import">Importieren</string>
<plurals name="common_in_days">
<item quantity="one">in %d Tag</item>
<item quantity="other">in %d Tagen</item>
</plurals>
<string name="common_later">Später</string>
<string name="common_locked">Gesperrt</string>
<string name="common_main_network">Hauptnetz</string>
@ -169,7 +172,9 @@
<string name="custom_token_contract_address_input_title">Vertragsadresse</string>
<string name="custom_token_creation_error_invalid_contract_address">Vertragsadresse ist ungültig</string>
<string name="custom_token_creation_error_network_not_selected">Bitte wähle das Netzwerk</string>
<string name="custom_token_creation_error_wrong_decimals">Dezimalzahl muss eine gültige Ganzzahl sein, bis zu %li</string>
<string name="custom_token_creation_error_token_already_exist_message">Dieses Token wurde bereits zur Liste hinzugefügt</string>
<string name="custom_token_creation_error_token_already_exist_title">Token existiert bereits</string>
<string name="custom_token_creation_error_wrong_decimals">Dezimalzahl muss eine gültige Ganzzahl sein, bis zu %d</string>
<string name="custom_token_custom_derivation">Benutzerdefinierte Ableitung(derivation)</string>
<string name="custom_token_custom_derivation_placeholder">E. g. m/00\'/0000\'/0\'/0/0</string>
<string name="custom_token_custom_derivation_title">Benutzerdefinierte Ableitung (Derivation) eingeben</string>
@ -339,12 +344,14 @@
<string name="markets_add_to_my_portfolio_description">Um mit dem Kauf, Tausch oder Erhalt dieses Vermögenswerts zu beginnen, füge diesen Token zu mindestens 1 Netzwerk hinzu</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Dieses Asset ist nicht verfügbar</string>
<string name="markets_add_to_portfolio_button">Zum Portfolio hinzufügen</string>
<string name="markets_add_token">Token hinzufügen</string>
<string name="markets_add_token">Hinzufügen</string>
<string name="markets_available_networks">Verfügbare Netzwerke</string>
<string name="markets_common_my_portfolio">Mein Portfolio</string>
<string name="markets_common_title">Markt</string>
<string name="markets_generate_addresses_notification">Um Adressen für ausgewählte Netzwerke zu generieren, musst du eine Tangem-Karte scannen</string>
<string name="markets_insights_info_description_message">Die Daten dieses Abschnitts stammen aus den folgenden Netzwerken: %s</string>
<string name="markets_loading_error_title">Die Daten konnten nicht geladen werden...</string>
<string name="markets_loading_no_data_title">Keine Daten</string>
<string name="markets_quick_actions">Schnelle Aktionen</string>
<string name="markets_search_result_title">Ergebnis</string>
<string name="markets_search_see_tokens_under_100k">Token unter 100k Marktkapitalisierung anzeigen</string>
@ -370,7 +377,7 @@
<item quantity="one">Bewertung, basierend auf %d</item>
<item quantity="other">Bewertungen, basierend auf %d</item>
</plurals>
<string name="markets_token_details_blockchain_site">Blockchain-Site</string>
<string name="markets_token_details_blockchain_site">Webseite</string>
<string name="markets_token_details_buy_pressure">Kaufdruck</string>
<string name="markets_token_details_buy_pressure_description">Die Differenz zwischen Käufer- und Verkäufervolumen</string>
<string name="markets_token_details_circulating_supply">Umlaufmenge</string>
@ -466,7 +473,7 @@
<string name="onboarding_seed_intro_title">Seed-Phrase verwenden</string>
<string name="onboarding_seed_mnemonic_invalid_checksum">Ungültige Seed-Phrase. Bitte überprüfe die Wortreihenfolge.</string>
<string name="onboarding_seed_mnemonic_wrong_words">Ungültige Seed-Phrase. Bitte überprüfe die Rechtschreibung.</string>
<string name="onboarding_seed_phrase_intro_legacy">veralteter Standard</string>
<string name="onboarding_seed_phrase_intro_legacy">Veralteter Standard</string>
<string name="onboarding_seed_user_validation_message">Um zu überprüfen, ob du deine Seed-Phrase richtig aufgeschrieben hast, gib bitte das 2., 7. und 11 Wort ein.</string>
<string name="onboarding_seed_user_validation_title">Eine letzte Prüfung!</string>
<string name="onboarding_subtitle_no_backup_cards">Um den Sicherungsvorgang zu starten, füge bis zu zwei Sicherungskarten hinzu.</string>
@ -572,18 +579,11 @@
<string name="send_custom_kaspa_per_utxo_footer">Die Gebühr, die für die Nutzung jeder nicht ausgegebenen Transaktionsausgabe (UTXO) im Kaspa-Netzwerk erforderlich ist. Je mehr UTXOs du in einer Transaktion verwenden, desto höher ist die Gebühr.</string>
<string name="send_custom_kaspa_per_utxo_title">KAS per UTXO</string>
<string name="send_date_format">%1$s, %2$s</string>
<string name="send_destination_hint_address">Adresse</string>
<string name="send_destination_tag_field">Ziel-Tag</string>
<string name="send_enter_address_field">Adresse eingeben</string>
<string name="send_error_address_same_as_wallet">Die Adresse stimmt mit der Adresse Ihrer Brieftasche überein</string>
<string name="send_extras_error_invalid_destination_tag">Ungültiges Tag. Es wird der Transaktion nicht hinzugefügt.</string>
<string name="send_extras_error_invalid_memo">Ungültiges Memo. Sie wird der Transaktion nicht hinzugefügt.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="send_fee_include_description">inkl. Gebühr</string>
<string name="send_fee_picker_low">Niedrig</string>
<string name="send_fee_picker_normal">Normal</string>
<string name="send_fee_picker_priority">Priorität</string>
<string name="send_fee_unreachable_error_text">Überprüfe deine Netzwerkverbindung</string>
<string name="send_fee_unreachable_error_title">Informationen zur Netzwerkgebühr nicht erreichbar</string>
<string name="send_from_wallet_android">Von</string>
@ -598,7 +598,7 @@
<string name="send_network_fee_warning_title">Abdeckung der Netzgebühren</string>
<string name="send_notification_exceed_balance_text">Unzureichende Mittel für die Überweisung, da die Summe aus Gebühr und Überweisungsbetrag das bestehende Guthaben übersteigt</string>
<string name="send_notification_exceed_balance_title">Gesamtbetrag übersteigt den Saldo</string>
<string name="send_notification_existential_deposit_text">Das Konto wird von der Blockchain gelöscht, wenn der Kontostand unter die Mindesteinlage fällt. Bitte belasse %s auf deinem Konto.</string>
<string name="send_notification_existential_deposit_text">Ein Guthaben von mindestens %s ist erforderlich, um dein Konto in der Blockchain aktiv zu halten und Sicherheitsrisiken zu vermeiden. Dieser Betrag verbleibt auf deinem Guthaben und kann nicht abgehoben werden.</string>
<string name="send_notification_existential_deposit_title">Mindesteinlage</string>
<string name="send_notification_fee_too_high_text">Der Kommissionsbetrag ist %s mal der empfohlene Betrag. Stelle sicher, dass die benutzerdefinierten Einstellungen korrekt sind.</string>
<string name="send_notification_fee_too_high_title">Die individuelle Gebühr ist hoch</string>
@ -632,21 +632,15 @@
<string name="send_summary_title">Versende %s</string>
<string name="send_summary_transaction_description">Du sendest **%1$s** inklusive der Netzwerkgebühr %2$s</string>
<string name="send_summary_transaction_description_no_fiat_fee">Du sendest **%1$s** und %2$s</string>
<string name="send_title_currency_format">Senden %s</string>
<string name="send_total_label">Gesamt</string>
<string name="send_total_subtitle_asset_format">%1$s und %2$s werden gesendet</string>
<string name="send_total_subtitle_fiat_format">≈ %1$s (inkl. Gebühr: %2$s)</string>
<string name="send_total_subtitle_format">%s wird gesendet</string>
<string name="send_transaction_success">Die Transaktion wurde erfolgreich signiert und an den Blockchain-Knoten gesendet. Die Walletbilanz wird aktualisiert</string>
<string name="send_tron_account_activation_error">%1$s ist ein Vermögenswert im Tron-Netzwerk. Um die Gebühr zu berechnen und eine Transaktion durchzuführen, musst du etwas Tron (TRX) auf deinem Konto einzahlen.</string>
<string name="send_validation_invalid_address">Ungültige Adresse</string>
<string name="sent_transaction_sent_title">Transaktion gesendet</string>
<string name="settings_card_settings_footer">Bereite das Scannen der Karte vor, die du einrichten möchtest.</string>
<string name="settings_forget_wallet">Entferne diese Wallet</string>
<string name="settings_forget_wallet_footer">Hiermit wird die Wallet aus der Anwendung entfernt. Die Wallet selbst kann wieder hinzugefügt werden.</string>
<string name="settings_wallet_name_title">Name</string>
<string name="staking_active">Aktiv</string>
<string name="staking_active_footer">Um deine Kryptos zu unstaken, klick hier.</string>
<string name="staking_active_footer">Um deine Vermögenswerte freizugeben, tippe auf den Block oben</string>
<string name="staking_amount_requirement_error">Die Anzahl der zu stakenden Krypros muss mindesten %s betragen</string>
<string name="staking_claim_unstaked">Nicht gestakte beanspruche</string>
<string name="staking_details_annual_percentage_rate">Jährliche prozentuale Rendite</string>
@ -659,12 +653,12 @@
<string name="staking_details_market_rating">Marktbewertung</string>
<string name="staking_details_metrics_block_header">Metriken</string>
<string name="staking_details_minimum_requirement">Mindestanforderungen</string>
<string name="staking_details_no_rewards_to_claim">Keine Belohnungen zu beanspruchen.</string>
<string name="staking_details_no_rewards_to_claim">Keine Belohnungen</string>
<string name="staking_details_reward_claiming">Belohnungen beanspruchen</string>
<string name="staking_details_reward_claiming_info">Eine Möglichkeit, Staking-Belohnungen zu erhalten. Es kann automatisch oder manuell beansprucht werden.</string>
<string name="staking_details_reward_schedule">Belohnungszeitplan</string>
<string name="staking_details_reward_schedule_info">Dabei handelt es sich um einen Zeitplan, der festlegt, wann die Teilnehmer am Staking ihre Belohnungen erhalten.</string>
<string name="staking_details_rewards_to_claim">Belohnungen, die du beanspruchen kannst: %s</string>
<string name="staking_details_rewards_to_claim">Belohnungen %s</string>
<string name="staking_details_title">Staking %s</string>
<string name="staking_details_unbonding_period">Entbindungsdauer</string>
<string name="staking_details_unbonding_period_info">Der Zeitraum, den du nach der Beantragung der Abhebung von Geldern aus dem Staking warten musst, bevor die Token verfügbar werden.</string>
@ -678,6 +672,7 @@
<string name="staking_notification_earn_rewards_text_period_week">Mit dem Staking kannst Du %1$s verdienen. Deine Staking-Belohnungen erhältst Du jede Woche.</string>
<string name="staking_notification_earn_rewards_title">Verdiene Staking-Belohnungen</string>
<string name="staking_notification_unstake_text">Die Belohnungen werden sofort nach dem unstaken gestoppt. Der unstakingprozess dauert %s.</string>
<string name="staking_ready_to_withdraw">Bereit zum Abheben</string>
<string name="staking_rebond">Erneut binden</string>
<string name="staking_restake">Erneut staken</string>
<string name="staking_restake_rewards">Belohnungen erneut staken</string>
@ -698,6 +693,7 @@
<string name="staking_stake_more">Mehr staken</string>
<string name="staking_title_stake">Stake %s</string>
<string name="staking_title_unstake">Staking beenden%s</string>
<string name="staking_unbonding">Lösen der Bindungen</string>
<string name="staking_unlocked_locked">Gelocktes unlocken</string>
<string name="staking_unstaked">Unstaken</string>
<string name="staking_unstaked_footer">Prüfe, was nicht eingesetzt wurde, um dein Vermögen zu beanspruchen</string>
@ -862,7 +858,7 @@
<string name="warning_express_not_enough_fee_for_token_tx_description">Um eine Transaktion durchzuführen, du etwas etwas einzahlen %1$s %2$s</string>
<string name="warning_express_not_enough_fee_for_token_tx_title">Die Gebühr %s kann nicht gedeckt werden</string>
<string name="warning_express_notification_invalid_reserve_amount_title">Der zu erhaltende Betrag muss mindestens %s betragen</string>
<string name="warning_express_pair_unavailable_message">Dies kann passieren, weil der Anbieter derzeit nicht in der Lage ist, dein ausgewähltes Paar zu swappen. Bitte warte einen Moment und versuche es später erneut. (Code %@)</string>
<string name="warning_express_pair_unavailable_message">Dies kann passieren, weil der Anbieter derzeit nicht in der Lage ist, dein ausgewähltes Paar zu swappen. Bitte warte einen Moment und versuche es später erneut. (Code %s)</string>
<string name="warning_express_pair_unavailable_title">Ausgewähltes Paar vorübergehend nicht verfügbar</string>
<string name="warning_express_refresh_required_title">Service vorübergehend nicht verfügbar</string>
<string name="warning_express_too_maximum_amount_title">Die Menge der zu tauschenden Token darf folgende Werte nicht überschreiten %s</string>

View file

@ -101,7 +101,6 @@
<string name="common_explore">Explorez</string>
<string name="common_explore_transaction_history">Explorez l\'historique des transactions</string>
<string name="common_explorer">Explorateur</string>
<string name="common_fee_label">Commissions</string>
<string name="common_fee_selector_footer">Les frais de réseau sont des charges que les utilisateurs paient pour traiter et confirmer les transactions. Le montant des frais peut être affecté par la congestion du réseau, la taille de la transaction et la priorité d\'exécution. %s</string>
<string name="common_fee_selector_option_fast">Rapide</string>
<string name="common_fee_selector_option_market">Marché</string>
@ -164,7 +163,7 @@
<string name="custom_token_contract_address_input_title">Adresse du contrat</string>
<string name="custom_token_creation_error_invalid_contract_address">L\'adresse du contrat n\'est pas valide</string>
<string name="custom_token_creation_error_network_not_selected">Veuillez sélectionner le réseau</string>
<string name="custom_token_creation_error_wrong_decimals">Les décimales doivent être un entier valide, jusqu\'à %li</string>
<string name="custom_token_creation_error_wrong_decimals">Les décimales doivent être un entier valide, jusqu\'à %d</string>
<string name="custom_token_custom_derivation">Dérivation personnalisée</string>
<string name="custom_token_custom_derivation_placeholder">Par exemple m/00\'/0000\'/0\'/0/0</string>
<string name="custom_token_custom_derivation_title">Entrez une dérivation personnalisée</string>
@ -508,18 +507,11 @@
<string name="send_custom_kaspa_per_utxo_footer">Les frais requis pour l\'utilisation de chaque sortie de transaction non dépensée (UTXO) dans le réseau Kaspa. Plus vous utilisez dUTXO dans une transaction, plus les frais seront élevés.</string>
<string name="send_custom_kaspa_per_utxo_title">KAS pour UTXO</string>
<string name="send_date_format">%1$s, %2$s</string>
<string name="send_destination_hint_address">Adresse</string>
<string name="send_destination_tag_field">ID de destination</string>
<string name="send_enter_address_field">Entrez l\'adresse</string>
<string name="send_error_address_same_as_wallet">L\'adresse est la même que celle de votre portefeuille</string>
<string name="send_extras_error_invalid_destination_tag">Tag invalide. Il ne sera pas ajouté à la transaction.</string>
<string name="send_extras_error_invalid_memo">Mémo invalide. Il ne sera pas ajouté à la transaction.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="send_fee_include_description">Inclure les commissions</string>
<string name="send_fee_picker_low">Bas</string>
<string name="send_fee_picker_normal">Normal</string>
<string name="send_fee_picker_priority">Priorité</string>
<string name="send_fee_unreachable_error_text">Vérifiez votre connexion réseau</string>
<string name="send_fee_unreachable_error_title">Informations sur les frais de réseau inaccessibles</string>
<string name="send_from_wallet_android">De</string>
@ -534,7 +526,7 @@
<string name="send_network_fee_warning_title">Couverture des frais de réseau</string>
<string name="send_notification_exceed_balance_text">Fonds insuffisants pour le transfert, car le total des frais et du montant du transfert dépasse le solde existant</string>
<string name="send_notification_exceed_balance_title">Le total dépasse le solde</string>
<string name="send_notification_existential_deposit_text">Le compte sera effacé de la blockchain si un solde descend en dessous du dépôt existentiel. Veuillez en laisser %s sur votre solde.</string>
<string name="send_notification_existential_deposit_text">Un solde d\'au moins %s est requis pour conserver votre compte sur la blockchain afin d\'éviter les risques de sécurité. Ce montant restera sur votre solde et ne pourra pas être retiré.</string>
<string name="send_notification_existential_deposit_title">Dépôt existentiel</string>
<string name="send_notification_fee_too_high_text">Le montant de la commission est %s fois le montant recommandé. Assurez-vous que les paramètres personnalisés sont corrects.</string>
<string name="send_notification_fee_too_high_title">Les frais de douane sont élevés</string>
@ -568,21 +560,16 @@
<string name="send_summary_title">Envoyer %s</string>
<string name="send_summary_transaction_description">Vous envoyez **%1$s** incluant des frais de réseau de %2$s</string>
<string name="send_summary_transaction_description_no_fiat_fee">Vous envoyez **%1$s** et %2$s</string>
<string name="send_title_currency_format">Envoi de %s</string>
<string name="send_total_label">Total</string>
<string name="send_total_subtitle_asset_format">Sera envoyé %1$s et %2$s</string>
<string name="send_total_subtitle_fiat_format">≈ %1$s (incl. les commissions : %2$s)</string>
<string name="send_total_subtitle_format">Sera envoyé %s</string>
<string name="send_transaction_success">La transaction a été signée avec succès et envoyée au nœud de blockchain. Le solde du portefeuille sera mis à jour après un certain temps</string>
<string name="send_tron_account_activation_error">%1$s est un actif du réseau Tron. Pour calculer les frais et effectuer une transaction, déposez du Tron (TRX) sur votre compte.</string>
<string name="send_validation_invalid_address">Adresse incorrecte</string>
<string name="sent_transaction_sent_title">Transaction envoyée</string>
<string name="settings_card_settings_footer">Scannez la carte que vous souhaitez configurer.</string>
<string name="settings_forget_wallet">Oublier le portefeuille</string>
<string name="settings_forget_wallet_footer">Cela supprimera le portefeuille de l\'application. Le portefeuille lui-même peut être ajouté à nouveau.</string>
<string name="settings_wallet_name_title">Nom</string>
<string name="staking_active">Actif</string>
<string name="staking_active_footer">Afin d\'unstaker vos actifs, cliquez ici.</string>
<string name="staking_active_footer">Afin d\'unstaker vos actifs, appuyez sur le bloc ci-dessus</string>
<string name="staking_details_annual_percentage_rate">Pourcentage de rendement annuel</string>
<string name="staking_details_annual_percentage_rate_info">Le pourcentage de rendement annuel que vous pouvez gagner en participant au staking.</string>
<string name="staking_details_apr">APR</string>
<string name="staking_details_available">Disponible</string>
@ -604,6 +591,7 @@
<string name="staking_details_warmup_period_info">Le temps imparti pour activer la participation au staking.</string>
<string name="staking_native">Native staking</string>
<string name="staking_notification_earn_rewards_title">Gagnez des récompenses de staking</string>
<string name="staking_notification_unstake_text">Les récompenses cessent de s\'accumuler immédiatement après que vous ayez commencé le unstaking. Le processus de unstaking prend %s.</string>
<string name="staking_rewards">Récompenses</string>
<string name="staking_stake_locked">Stake verrouillé</string>
<string name="staking_stake_more">Staker plus</string>
@ -761,7 +749,8 @@
<string name="warning_express_not_enough_fee_for_token_tx_description">Pour effectuer une transaction, vous devez déposer %1$s %2$s</string>
<string name="warning_express_not_enough_fee_for_token_tx_title">Impossible de couvrir %s frais</string>
<string name="warning_express_notification_invalid_reserve_amount_title">Le montant à recevoir doit être d\'au moins %s</string>
<string name="warning_express_pair_unavailable_message">Cela peut se produire car le fournisseur n\'est actuellement pas en mesure d\'échanger la paire que vous avez sélectionnée. Veuillez patienter un instant et réessayer. (Code %@)</string>
<string name="warning_express_pair_unavailable_message">Cela peut se produire car le fournisseur n\'est actuellement pas en mesure d\'échanger la paire que vous avez sélectionnée. Veuillez patienter un instant et réessayer. (Code %s)</string>
<string name="warning_express_pair_unavailable_title">La paire sélectionnée est temporairement indisponible</string>
<string name="warning_express_refresh_required_title">Service temporairement indisponible</string>
<string name="warning_express_too_maximum_amount_title">Le nombre de jetons à échanger ne doit pas dépasser %s</string>
<string name="warning_express_too_minimal_amount_title">Le montant à échanger doit être d\'au moins %s</string>

View file

@ -8,7 +8,6 @@
<string name="common_delete">Rimuovere</string>
<string name="common_done">Fatto</string>
<string name="common_error">Errore</string>
<string name="common_fee_label">Commissione</string>
<string name="common_network_fee_title">Costi della rete</string>
<string name="common_ok">OK</string>
<string name="common_save_changes">Mantieni le modifiche</string>
@ -35,21 +34,10 @@
<string name="initial_message_tap_header">Avvicina la carta</string>
<string name="onboarding_create_wallet_button_create_wallet">Crea portafoglio</string>
<string name="send_amount_label">Importo</string>
<string name="send_destination_hint_address">Indirizzo</string>
<string name="send_error_address_same_as_wallet">L\'indirizzo corrisponde all\'indirizzo del tuo portafoglio</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="send_fee_include_description">Includi commissione</string>
<string name="send_fee_picker_low">Insufficiente</string>
<string name="send_fee_picker_normal">Normale</string>
<string name="send_fee_picker_priority">Prioritario</string>
<string name="send_max_amount_label">Importo totale</string>
<string name="send_total_label">Totale</string>
<string name="send_total_subtitle_asset_format">Sarà inviato %1$s e %2$s</string>
<string name="send_total_subtitle_fiat_format">≈ %1$s (inc. commissione: %2$s)</string>
<string name="send_total_subtitle_format">Sarà inviato %s</string>
<string name="send_transaction_success">La transazione è stata firmata con successo e inviata al nodo blockchain. Il saldo del portafoglio verrà aggiornato dopo un po\' di tempo</string>
<string name="send_validation_invalid_address">Indirizzo non valido</string>
<string name="twins_recreate_toolbar">Tangem Twin</string>
<string name="wallet_connect_title">WalletConnect</string>
<string name="wallet_notification_address_copied">L\'indirizzo è stato copiato con successo</string>

View file

@ -39,7 +39,7 @@
<string name="biometric_lockout_warning_title">試行回数が多すぎます</string>
<string name="biometric_unavailable_warning">お使いの携帯電話で生体認証が無効になっているため、アプリにウォレットを保存できません。ウォレットを保存するには、携帯電話の設定で生体認証機能を有効にしてください。</string>
<string name="button_start_backup_process">バックアップ処理を開始する</string>
<string name="buy_token_description">法定通貨カードまたは銀行口座から</string>
<string name="buy_token_description">銀行カードまたは銀行口座から</string>
<plurals name="card_label_card_count">
<item quantity="other">%d カード</item>
</plurals>
@ -102,7 +102,6 @@
<string name="common_explore">移動する</string>
<string name="common_explore_transaction_history">取引履歴を調べる</string>
<string name="common_explorer">エクスプローラー</string>
<string name="common_fee_label">手数料</string>
<string name="common_fee_selector_footer">ネットワーク手数料は、取引の処理と確認のためにユーザーが支払う料金です。手数料の額は、ネットワークの混雑さ、取引のサイズ、実行の優先度によって左右されます。 %s</string>
<string name="common_fee_selector_option_fast">速い</string>
<string name="common_fee_selector_option_market">マーケット</string>
@ -112,6 +111,9 @@
<string name="common_go_to_provider">プロバイダーへ移動</string>
<string name="common_go_to_token">トークンへ移動</string>
<string name="common_import">インポート</string>
<plurals name="common_in_days">
<item quantity="other">%d日で</item>
</plurals>
<string name="common_later">後で</string>
<string name="common_locked">ロックされています</string>
<string name="common_main_network">メインネットワーク</string>
@ -167,7 +169,9 @@
<string name="custom_token_contract_address_input_title">コントラクトアドレス</string>
<string name="custom_token_creation_error_invalid_contract_address">コントラクトアドレスが無効です</string>
<string name="custom_token_creation_error_network_not_selected">ネットワークを選択してください</string>
<string name="custom_token_creation_error_wrong_decimals">小数は%liまでの有効な整数である必要があります</string>
<string name="custom_token_creation_error_token_already_exist_message">このトークンはすでにリストに追加されています</string>
<string name="custom_token_creation_error_token_already_exist_title">トークンはすでに存在します</string>
<string name="custom_token_creation_error_wrong_decimals">小数は%dまでの有効な整数である必要があります</string>
<string name="custom_token_custom_derivation">カスタム派生パス</string>
<string name="custom_token_custom_derivation_placeholder">m/00\'/0000\'/0\'/0/0</string>
<string name="custom_token_custom_derivation_title">カスタム派生パスを入力</string>
@ -333,15 +337,17 @@
<string name="manage_tokens_unavailable_vote">賛成票を投じる</string>
<string name="manage_tokens_wallet_selector_title">ウォレットを選択</string>
<string name="manage_tokens_wallet_support_only_one_network_title">ウォレットは複数のネットワークをサポートしていません。</string>
<string name="markets_add_to_my_portfolio_description">このアセットの購入、交換、受け取りを開始するには、このトークンを少なくとも1つのネットワークに追加してください。</string>
<string name="markets_add_to_my_portfolio_description">このアセットの購入、交換、受け取りを開始するには、ポートフォリオに追加してください。</string>
<string name="markets_add_to_my_portfolio_unavailable_description">このアセットは利用できません</string>
<string name="markets_add_to_portfolio_button">ポートフォリオに追加</string>
<string name="markets_add_token">トークンを追加</string>
<string name="markets_add_token">追加</string>
<string name="markets_available_networks">利用可能なネットワーク</string>
<string name="markets_common_my_portfolio">私のポートフォリオ</string>
<string name="markets_common_title">マーケット</string>
<string name="markets_generate_addresses_notification">選択したネットワークのアドレスを生成するには、Tangemカードをスキャンする必要があります。</string>
<string name="markets_insights_info_description_message">このセクションのデータは、次のネットワークから取得されています: %s</string>
<string name="markets_loading_error_title">データを読み込めません…</string>
<string name="markets_loading_no_data_title">データなし</string>
<string name="markets_quick_actions">クイックアクション</string>
<string name="markets_search_result_title">結果</string>
<string name="markets_search_see_tokens_under_100k">時価総額10万ドル以下のトークンを見る</string>
@ -366,7 +372,7 @@
<plurals name="markets_token_details_based_on_ratings">
<item quantity="other">%d のレーティングに基づいて</item>
</plurals>
<string name="markets_token_details_blockchain_site">ロックチェーンサイト</string>
<string name="markets_token_details_blockchain_site">ウェブサイト</string>
<string name="markets_token_details_buy_pressure">買い圧力</string>
<string name="markets_token_details_buy_pressure_description">買い手と売り手の取引量の差</string>
<string name="markets_token_details_circulating_supply">循環供給量</string>
@ -447,7 +453,7 @@
</plurals>
<string name="onboarding_seed_generate_title">あなたのシードフレーズ</string>
<plurals name="onboarding_seed_generate_words_count">
<item quantity="other"> %d 単語</item>
<item quantity="other">%d 単語</item>
</plurals>
<string name="onboarding_seed_import_message">ウォレットをインポートするには、下のフィールドにシードフレーズを入力してください。</string>
<string name="onboarding_seed_intro_button_generate">シードフレーズを生成する</string>
@ -498,7 +504,7 @@
<string name="qr_scanner_camera_denied_title">カメラへのアクセスが拒否されました</string>
<string name="receive_bottom_sheet_warning_message">%3$sネットワーク上の%1$s ( %2$s )</string>
<string name="receive_bottom_sheet_warning_message_full">このアドレスには%sのみを送金してください。他のトークンを送信すると、取り返しのつかない損失が発生します。</string>
<string name="receive_token_description">QRコードを表示するか、アドレスを共有します</string>
<string name="receive_token_description">QRコードを表示するか、アドレスを共有してください</string>
<string name="referral_button_participate">参加する</string>
<string name="referral_error_failed_to_load_info">紹介プログラムに関する情報を読み込めませんでした。しばらくしてからもう一度お試しください。</string>
<string name="referral_error_failed_to_load_info_with_reason">紹介プログラムに関する情報を読み込めませんでした。エラー コード: %s 。しばらくしてからもう一度お試しください。</string>
@ -560,18 +566,11 @@
<string name="send_custom_kaspa_per_utxo_footer">Kaspaネットワークで未使用の取引出力UTXOを使用するために必要な手数料です。取引で使用するUTXOが多ければ多いほど、手数料は高くなります。</string>
<string name="send_custom_kaspa_per_utxo_title">UTXOあたりのKAS</string>
<string name="send_date_format">%1$s 、 %2$s</string>
<string name="send_destination_hint_address">アドレス</string>
<string name="send_destination_tag_field">宛先タグ</string>
<string name="send_enter_address_field">アドレスを入力</string>
<string name="send_error_address_same_as_wallet">アドレスはウォレットアドレスと同じです</string>
<string name="send_extras_error_invalid_destination_tag">無効なタグです。取引には追加されません。</string>
<string name="send_extras_error_invalid_memo">無効なメモです。取引には追加されません。</string>
<string name="send_extras_hint_destination_tag">タグ</string>
<string name="send_extras_hint_memo">メモ</string>
<string name="send_fee_include_description">手数料込み</string>
<string name="send_fee_picker_low">低い</string>
<string name="send_fee_picker_normal">普通</string>
<string name="send_fee_picker_priority">優先</string>
<string name="send_fee_unreachable_error_text">ネットワーク接続を確認してください</string>
<string name="send_fee_unreachable_error_title">ネットワーク手数料についての情報にアクセスできません</string>
<string name="send_from_wallet_android">より</string>
@ -586,7 +585,7 @@
<string name="send_network_fee_warning_title">ネットワーク手数料のカバー</string>
<string name="send_notification_exceed_balance_text">手数料と送金額の合計が残高を超えているため、送金に必要な資金が不足しています。</string>
<string name="send_notification_exceed_balance_title">合計が残高を超えています</string>
<string name="send_notification_existential_deposit_text">残高が最低量を下回ると、当アカウントはブロックチェーンから消去されます。残高に%sを残しておいてください</string>
<string name="send_notification_existential_deposit_text">セキュリティリスクを防ぐため、ブロックチェーン上にアカウントを維持するには、少なくとも%s の残高が必要です。この金額は残高に残り、引き出すことはできません</string>
<string name="send_notification_existential_deposit_title">アカウント維持に必要な最低残高</string>
<string name="send_notification_fee_too_high_text">手数料額が推奨額の%s倍となっています。カスタム設定が正しいことを再度確認してください。</string>
<string name="send_notification_fee_too_high_title">カスタム手数料が高くなっています</string>
@ -620,21 +619,15 @@
<string name="send_summary_title">%sを送金する</string>
<string name="send_summary_transaction_description">**%1$s** を送金する (ネットワーク手数料%2$sを含む)</string>
<string name="send_summary_transaction_description_no_fiat_fee">**%1$s** と %2$s を送金しています。</string>
<string name="send_title_currency_format">%sを送信しています</string>
<string name="send_total_label">合計</string>
<string name="send_total_subtitle_asset_format">%1$sと%2$sが送信されます</string>
<string name="send_total_subtitle_fiat_format">≈ %1$s (%2$s: 手数料を含む)</string>
<string name="send_total_subtitle_format">%sが送信されます</string>
<string name="send_transaction_success">取引は正常に署名され、ブロックチェーンノードに送信されました。ウォレットの残高はしばらくして更新されます。</string>
<string name="send_tron_account_activation_error">%1$sはTronネットワークのアセットです。手数料を計算して取引を行うには、アカウントにTronTRXを入金する必要があります。</string>
<string name="send_validation_invalid_address">無効なアドレス</string>
<string name="sent_transaction_sent_title">取引が送信されました</string>
<string name="settings_card_settings_footer">セットアップしたいカードをスキャンするために準備してください。</string>
<string name="settings_forget_wallet">ウォレット削除</string>
<string name="settings_forget_wallet_footer">これにより、ウォレットがアプリから削除されます。ウォレットは再度追加できます。</string>
<string name="settings_wallet_name_title">名前</string>
<string name="staking_active">アクティブ</string>
<string name="staking_active_footer">資産のステーキングを解除するには、ここをクリックしてください。</string>
<string name="staking_active_footer">資産のステーキングを解除するには、上のブロックをタップしてください</string>
<string name="staking_amount_requirement_error">ステーキング金額は %s 以上である必要があります</string>
<string name="staking_claim_unstaked">ステーキング解除分を請求する</string>
<string name="staking_details_annual_percentage_rate">年率</string>
@ -647,25 +640,27 @@
<string name="staking_details_market_rating">市場評価</string>
<string name="staking_details_metrics_block_header">指標</string>
<string name="staking_details_minimum_requirement">最低要件</string>
<string name="staking_details_no_rewards_to_claim">請求できる報酬はありません</string>
<string name="staking_details_no_rewards_to_claim">報酬なし</string>
<string name="staking_details_reward_claiming">請求中の報酬</string>
<string name="staking_details_reward_claiming_info">ステーキング報酬を受け取る方法。自動または手動で請求できます。</string>
<string name="staking_details_reward_claiming_info">ステーキング報酬の受け取り方法。\n自動であなたのアドレスに報酬が入金される方法と、手動で取引を生成して報酬を引き出す方法があります。</string>
<string name="staking_details_reward_schedule">報酬スケジュール</string>
<string name="staking_details_reward_schedule_info">これは、ステーキングの参加者がいつ報酬を受け取るかを決定するスケジュールです。</string>
<string name="staking_details_rewards_to_claim">受け取る報酬: %s</string>
<string name="staking_details_rewards_to_claim">報酬: %s</string>
<string name="staking_details_title">ステーキング%s</string>
<string name="staking_details_unbonding_period">解約完了までの期間</string>
<string name="staking_details_unbonding_period_info">ステーキングから資金の引き出しを要求した後、トークンが利用可能になるまでの待機期間。</string>
<string name="staking_details_warmup_period">ウォームアップ期間</string>
<string name="staking_details_warmup_period_info">ステーキングへの参加を有効にするために割り当てられた時間。</string>
<string name="staking_locked">ロック中</string>
<string name="staking_migrate">移行</string>
<string name="staking_native">ネイティブステーキング</string>
<string name="staking_notification_earn_rewards_text_period_day">ステーキングにより%1$sを獲得できます。ステーキング報酬は毎日受け取れます。</string>
<string name="staking_notification_earn_rewards_text_period_hour">ステーキングにより%1$sを獲得できます。ステーキング報酬は1時間ごとに受け取れます。</string>
<string name="staking_notification_earn_rewards_text_period_hour">ステーキングにより%1$sを獲得できます。ステーキング報酬は毎時間受け取れます。</string>
<string name="staking_notification_earn_rewards_text_period_month">ステーキングにより%1$sを獲得できます。ステーキング報酬は毎月受け取れます。</string>
<string name="staking_notification_earn_rewards_text_period_week">ステーキングにより%1$sを獲得できます。ステーキング報酬は毎週受け取れます。</string>
<string name="staking_notification_earn_rewards_title">ステーキング報酬を獲得</string>
<string name="staking_notification_unstake_text">ステーキング解除後、報酬の獲得はすぐに停止します。ステーキング解除プロセスには%sかかります。</string>
<string name="staking_notification_unstake_text">ステーキング解除プロセスの開始後、報酬の獲得はすぐに停止します。ステーキング解除には%sかかります。</string>
<string name="staking_ready_to_withdraw">引き出し準備完了</string>
<string name="staking_rebond">再結束</string>
<string name="staking_restake">再度ステーキングする</string>
<string name="staking_restake_rewards">報酬をステーキングする</string>
@ -686,8 +681,9 @@
<string name="staking_stake_more">もっとステーキングする</string>
<string name="staking_title_stake">%sをステーキングする</string>
<string name="staking_title_unstake">%sのステーキング解除</string>
<string name="staking_unbonding">ステーキング解約中</string>
<string name="staking_unlocked_locked">ステーキング解除はロックされています</string>
<string name="staking_unstaked">タックされていない</string>
<string name="staking_unstaked">テーキングされていない</string>
<string name="staking_unstaked_footer">資産を請求するために、unstakedを確認してください</string>
<string name="staking_unstaking">ステーキング解除</string>
<string name="staking_validator">バリデーター</string>
@ -842,7 +838,7 @@
<string name="warning_existential_deposit_title">ネットワークには最低残高が必要です</string>
<string name="warning_express_active_transaction_message">スワップは、%s の取引完了後に利用可能となります。</string>
<string name="warning_express_active_transaction_title">アクティブな取引があります</string>
<string name="warning_express_approval_in_progress_message">スワップ承認は現在進行中で、まもなく完了する予定です。</string>
<string name="warning_express_approval_in_progress_message">スワップ承認は現在進行中で、まもなく完了する予定です。</string>
<string name="warning_express_approval_in_progress_title">承認が進行中</string>
<string name="warning_express_dust_message">最低のスワップ金額は%1$s です。スワップ後の残金が%2$s を下回らないようにしてください。</string>
<string name="warning_express_no_exchangeable_coins_description">あなたのリストには、交換可能な %s トークンがありません。</string>
@ -850,7 +846,7 @@
<string name="warning_express_not_enough_fee_for_token_tx_description">取引を行うには、 %1$s %2$sを入金する必要があります。</string>
<string name="warning_express_not_enough_fee_for_token_tx_title">%s 手数料を支払えません</string>
<string name="warning_express_notification_invalid_reserve_amount_title">受け取る金額は、 %s 以上である必要があります。</string>
<string name="warning_express_pair_unavailable_message">これは、選択したペアがプロバイダーでは現在交換できないために発生する可能性があります。しばらく待ってからもう一度お試しください。(コード%@ )</string>
<string name="warning_express_pair_unavailable_message">これは、選択したペアがプロバイダーでは現在交換できないために発生する可能性があります。しばらく待ってからもう一度お試しください。(コード%s )</string>
<string name="warning_express_pair_unavailable_title">選択されたペアは一時的に利用できません</string>
<string name="warning_express_refresh_required_title">サービスは一時的に利用できません</string>
<string name="warning_express_too_maximum_amount_title">スワップするトークンの量は %s を超えないでください</string>
@ -866,6 +862,8 @@
<string name="warning_low_signatures_message">このカードには%sの署名のみが残っています。資金をすべて引き出す必要があります。</string>
<string name="warning_low_signatures_title">署名数が少ないです</string>
<string name="warning_manage_tokens_legacy_derivation_message">異なるネットワーク上のトークンは、異なるアドレスを持つ場合があります。資金を送金する際には、アドレスがネットワークと一致していることを再確認してください。</string>
<string name="warning_matic_migration_message">MATICはPOLに移行中です。ただし、期限は設定されておらず、MATICはまだ廃止されていません。MATICトークンを引き続き安全に使用することも、取引所でPOLに交換することもできます。</string>
<string name="warning_matic_migration_title">MATICからPOLへの移行</string>
<plurals name="warning_missing_derivation_message">
<item quantity="other">%d ネットワークのアドレスを取得するために、カードを利用してください</item>
</plurals>

View file

@ -71,6 +71,7 @@
<string name="common_access_denied">Доступ запрещен</string>
<string name="common_all">Все</string>
<string name="common_allow">Разрешить</string>
<string name="common_analytics">Аналитика</string>
<string name="common_apply">Применить</string>
<string name="common_approval">Одобрение</string>
<string name="common_approve">Подтвердить</string>
@ -177,7 +178,7 @@
<string name="custom_token_contract_address_input_title">Адрес контракта</string>
<string name="custom_token_creation_error_invalid_contract_address">Адрес контракта некорректен</string>
<string name="custom_token_creation_error_network_not_selected">Пожалуйста, выберите сеть</string>
<string name="custom_token_creation_error_wrong_decimals">Десятичное число должно быть действительным целым числом, до %li</string>
<string name="custom_token_creation_error_wrong_decimals">Десятичное число должно быть действительным целым числом, до %d</string>
<string name="custom_token_custom_derivation">Своя деривация</string>
<string name="custom_token_custom_derivation_placeholder">Например m/00\'/0000\'/0\'/0/0</string>
<string name="custom_token_custom_derivation_title">Введите свою деривацию</string>
@ -353,6 +354,7 @@
<string name="markets_common_title">Рынок</string>
<string name="markets_generate_addresses_notification">Чтобы создать адреса для выбранных сетей, отсканируйте вашу карту Tangem кошелька</string>
<string name="markets_insights_info_description_message">Данные раздела получены из следующих сетей: %s</string>
<string name="markets_loading_no_data_title">Нет данных</string>
<string name="markets_quick_actions">Быстрые действия</string>
<string name="markets_search_result_title">Результат</string>
<string name="markets_search_see_tokens_under_100k">Токены с капитализацией меньше 100к</string>
@ -647,7 +649,7 @@
<string name="staking_active_footer">Для завершения стейкинга нажмите на блок выше</string>
<string name="staking_amount_requirement_error">Сумма для стейкинга должна быть не менее %s</string>
<string name="staking_claim_unstaked">Забрать средства</string>
<string name="staking_details_annual_percentage_rate">Годовая процентная ставка</string>
<string name="staking_details_annual_percentage_rate">Процентная ставка</string>
<string name="staking_details_annual_percentage_rate_info">Годовой процентный доход, который вы можете получить от участия в стейкинге.</string>
<string name="staking_details_apr">APR</string>
<string name="staking_details_available">Доступно</string>
@ -668,6 +670,7 @@
<string name="staking_details_unbonding_period_info">Период, который необходимо подождать после запроса на вывод средств из стейкинга, прежде чем токены станут доступны.</string>
<string name="staking_details_warmup_period">Период прогрева</string>
<string name="staking_details_warmup_period_info">Время, необходимое для начала процесса стейкинга и активации процесса начисления наград</string>
<string name="staking_locked">Заблокировано</string>
<string name="staking_migrate">Переместить</string>
<string name="staking_native">Нативный стейкинг</string>
<string name="staking_notification_earn_rewards_text_period_day">Стейкинг дает возможность вам получать %1$s. Награда будет зачисляться каждый день.</string>
@ -696,7 +699,7 @@
<string name="staking_title_stake">Застейкать %s</string>
<string name="staking_title_unstake">Вывести %s</string>
<string name="staking_unlocked_locked">Разблокировать</string>
<string name="staking_unstaked">Выведено из стейкинга</string>
<string name="staking_unstaked">Вывод из стейкинга</string>
<string name="staking_unstaked_footer">Проверьте процесс завершения стейкинга, чтобы вывести свои средства.</string>
<string name="staking_unstaking">Завершение стейкинга</string>
<string name="staking_validator">Валидатор</string>
@ -860,7 +863,7 @@
<string name="warning_express_not_enough_fee_for_token_tx_description">Чтобы совершить транзакцию, вам необходимо внести немного %1$s %2$s</string>
<string name="warning_express_not_enough_fee_for_token_tx_title">Невозможно покрыть комиссию %s</string>
<string name="warning_express_notification_invalid_reserve_amount_title">Сумма получения не может быть менее %s</string>
<string name="warning_express_pair_unavailable_message">Это может произойти из-за того, что провайдер временно не предоставляет обмен выбранной вами пары. Пожалуйста, подождите некоторое время и попробуйте снова. (Код %@)</string>
<string name="warning_express_pair_unavailable_message">Это может произойти из-за того, что провайдер временно не предоставляет обмен выбранной вами пары. Пожалуйста, подождите некоторое время и попробуйте снова. (Код %s)</string>
<string name="warning_express_pair_unavailable_title">Выбранная пара временно недоступна</string>
<string name="warning_express_refresh_required_title">Cервис временно недоступен</string>
<string name="warning_express_too_maximum_amount_title">Сумма для обмена должна быть не более %s</string>

View file

@ -78,8 +78,8 @@
<string name="common_attention">Увага</string>
<string name="common_balance">Баланс: %s</string>
<string name="common_balance_title">Баланс</string>
<string name="common_biometric_authentication">біометрична автентифікація</string>
<string name="common_biometrics">біометрією</string>
<string name="common_biometric_authentication">біометричну автентифікацію</string>
<string name="common_biometrics">біометрії</string>
<string name="common_buy">Купити</string>
<string name="common_buy_currency">Перейдіть до %1$s</string>
<string name="common_camera_denied_alert_message">Ви не надали доступ до камери, будь ласка, змініть налаштування конфіденційності</string>
@ -107,7 +107,6 @@
<string name="common_explore">Оглядач</string>
<string name="common_explore_transaction_history">Переглянути історію транзакцій</string>
<string name="common_explorer">Оглядач</string>
<string name="common_fee_label">Комісія</string>
<string name="common_fee_selector_footer">Мережеві комісії це збори, які користувачі сплачують за обробку та підтвердження транзакцій. На розмір комісії може впливати перевантаження мережі, розмір транзакції та пріоритет виконання. %s</string>
<string name="common_fee_selector_option_fast">Швидко</string>
<string name="common_fee_selector_option_market">За ринком</string>
@ -152,7 +151,7 @@
<string name="common_stake">Застейкати</string>
<string name="common_staking">Стейкінг</string>
<string name="common_start">Почати</string>
<string name="common_submit">Надіслати</string>
<string name="common_submit">Продовжити</string>
<string name="common_success">Успіх</string>
<string name="common_support">Підтримка</string>
<string name="common_swap">Обмін</string>
@ -172,7 +171,7 @@
<string name="custom_token_contract_address_input_title">Адреса контракту</string>
<string name="custom_token_creation_error_invalid_contract_address">Адреса контракту недійсна</string>
<string name="custom_token_creation_error_network_not_selected">Будь ласка, оберіть мережу</string>
<string name="custom_token_creation_error_wrong_decimals">Десяткове число повинно бути дійсним цілим числом, до %li</string>
<string name="custom_token_creation_error_wrong_decimals">Десяткове число повинно бути дійсним цілим числом, до %d</string>
<string name="custom_token_custom_derivation">Власна деривація</string>
<string name="custom_token_custom_derivation_placeholder">Наприклад, m/00\'/0000\'/0\'/0/0</string>
<string name="custom_token_custom_derivation_title">Введіть власну деривацію</string>
@ -377,7 +376,7 @@
<item quantity="many">На основі %d оцінок</item>
<item quantity="other">На основі %d оцінок</item>
</plurals>
<string name="markets_token_details_blockchain_site">Блокчейн сайт</string>
<string name="markets_token_details_blockchain_site">Веб-сайт</string>
<string name="markets_token_details_buy_pressure">Давлення покупця</string>
<string name="markets_token_details_buy_pressure_description">Різниця між обсягом покупців та обсягом продавців</string>
<string name="markets_token_details_circulating_supply">Циркуляційний запас</string>
@ -473,7 +472,7 @@
<string name="onboarding_seed_intro_title">Використовувати seed-фразу</string>
<string name="onboarding_seed_mnemonic_invalid_checksum">Невірна seed-фраза. Будь ласка, перевірте порядок слів.</string>
<string name="onboarding_seed_mnemonic_wrong_words">Невірна seed-фраза. Будь ласка, перевірте правопис.</string>
<string name="onboarding_seed_phrase_intro_legacy">Застарілий</string>
<string name="onboarding_seed_phrase_intro_legacy">Застаріло</string>
<string name="onboarding_seed_user_validation_message">Щоб перевірити чи правильно ви записали seed-фразу, введіть 2-е, 7-е та 11-те слова</string>
<string name="onboarding_seed_user_validation_title">Отже, давайте перевіримо</string>
<string name="onboarding_subtitle_no_backup_cards">Щоб почати процес резервного копіювання, додайте одну або дві резервні картки.</string>
@ -530,7 +529,7 @@
<item quantity="many">за %d гаманців</item>
<item quantity="other">за %d гаманців</item>
</plurals>
<string name="referral_point_currencies_description">Отримайте ^^%1$s^^ на вашу адресу в мережі %2$s%3$s ^^через 30 днів^^ за кожен гаманець, який придбає ваш друг</string>
<string name="referral_point_currencies_description">Отримаєте ^^%1$s^^ на вашу адресу в мережі %2$s %3$s ^^через 30 днів^^ за кожен гаманець, який придбає ваш друг</string>
<string name="referral_point_currencies_title">Ви</string>
<string name="referral_point_discount_description_prefix">Отримає</string>
<string name="referral_point_discount_description_suffix">при купівлі гаманця на сайті tangem.com</string>
@ -583,18 +582,11 @@
<string name="send_custom_kaspa_per_utxo_footer">Комісія, необхідна за використання кожної невитраченої транзакції (UTXO) у мережі Kaspa. Чим більше UTXO ви використовуєте в транзакції, тим вищою буде комісія.</string>
<string name="send_custom_kaspa_per_utxo_title">KAS за UTXO</string>
<string name="send_date_format">%1$s, %2$s</string>
<string name="send_destination_hint_address">Адреса</string>
<string name="send_destination_tag_field">Тег призначення</string>
<string name="send_enter_address_field">Введіть адресу</string>
<string name="send_error_address_same_as_wallet">Адреса збігається з адресою гаманця</string>
<string name="send_extras_error_invalid_destination_tag">Недопустимий Tag. Він не буде доданий у транзакцію.</string>
<string name="send_extras_error_invalid_memo">Недопустимий Memo. Він не буде доданий до транзакції.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="send_fee_include_description">Включаючи комісію</string>
<string name="send_fee_picker_low">Низька</string>
<string name="send_fee_picker_normal">Нормальна</string>
<string name="send_fee_picker_priority">Пріоритетна</string>
<string name="send_fee_unreachable_error_text">Перевірте підключення до мережі</string>
<string name="send_fee_unreachable_error_title">Інформація щодо комісії в мережі недоступна</string>
<string name="send_from_wallet_android">Із</string>
@ -609,7 +601,7 @@
<string name="send_network_fee_warning_title">Покриття мережевої комісії</string>
<string name="send_notification_exceed_balance_text">Недостатньо коштів для здійснення переказу, оскільки загальна сума комісії та переказу перевищує наявний баланс</string>
<string name="send_notification_exceed_balance_title">Сума перевищує баланс</string>
<string name="send_notification_existential_deposit_text">Рахунок буде видалено з блокчейну, якщо баланс стане нижчим за екзистенційний депозит. Будь ласка, залиште %s на своєму балансі.</string>
<string name="send_notification_existential_deposit_text">Для збереження вашого акаунту у блокчейні та захисту від можливих ризиків необхідний баланс не менше %s. Ця сума залишиться на вашому рахунку та не може бути знята.</string>
<string name="send_notification_existential_deposit_title">Екзистенційний депозит</string>
<string name="send_notification_fee_too_high_text">Сума комісії в %s разів перевищує рекомендовану. Переконайтеся, що користувацькі налаштування вірні.</string>
<string name="send_notification_fee_too_high_title">Встановлена комісія завелика</string>
@ -643,23 +635,18 @@
<string name="send_summary_title">Надіслати %s</string>
<string name="send_summary_transaction_description">Ви надсилаєте **%1$s**, включно з комісію мережі %2$s</string>
<string name="send_summary_transaction_description_no_fiat_fee">Ви надсилаєте **%1$s** і %2$s</string>
<string name="send_title_currency_format">Надсилання %s</string>
<string name="send_total_label">Всього</string>
<string name="send_total_subtitle_asset_format">%1$s та %2$s буде надіслано</string>
<string name="send_total_subtitle_fiat_format">≈ %1$s (вкл. комісію: %2$s )</string>
<string name="send_total_subtitle_format">%s буде надіслано</string>
<string name="send_transaction_success">Транзакція успішно підписана і відправлена до блокчейну. Баланс гаманця буде оновлено через деякий час</string>
<string name="send_tron_account_activation_error">%1$s — це монета у мережі Tron. Щоб розрахувати комісію та здійснити транзакцію, вам необхідно внести певну кількість Tron (TRX) на свій рахунок.</string>
<string name="send_validation_invalid_address">Недійсна адреса</string>
<string name="sent_transaction_sent_title">Трансакцію надіслано</string>
<string name="settings_card_settings_footer">Підготуйтеся до сканування картку, яку потрібно налаштувати.</string>
<string name="settings_card_settings_footer">Підготуйте до сканування картку, яку потрібно налаштувати.</string>
<string name="settings_forget_wallet">Забути гаманець</string>
<string name="settings_forget_wallet_footer">Це призведе до видалення гаманця з застосунку. Сам гаманець можна додати знову.</string>
<string name="settings_wallet_name_title">Ім\'я</string>
<string name="staking_active">Активний</string>
<string name="staking_active_footer">Щоб вивести активи зі стейкінгу, натисніть тут.</string>
<string name="staking_active_footer">Для завершення стейкінгу натисніть на блок вище</string>
<string name="staking_amount_requirement_error">Сума для стейкінгу має бути не менше %s</string>
<string name="staking_claim_unstaked">Зняти кошти</string>
<string name="staking_details_annual_percentage_rate">Процентна ставка</string>
<string name="staking_details_annual_percentage_rate_info">Річний відсоток, який ви можете отримати, беручи участь у стейкінгу.</string>
<string name="staking_details_apr">APR</string>
<string name="staking_details_available">Доступно</string>
@ -843,8 +830,6 @@
<string name="wallet_settings_title">Налаштування гаманця</string>
<string name="wallet_title">Tangem</string>
<string name="warning_access_denied_message">Використовуйте %s або відскануйте картку, щоб розблокувати доступ до гаманця</string>
<string name="warning_approval_in_progress_message">Затвердження обміну триває і незабаром буде завершено</string>
<string name="warning_approval_in_progress_title">Затвердження в процесі</string>
<string name="warning_backup_errors_message">Схоже, що активація картки була виконана неправильно. Це може бути пов\'язано з проблемою з модулем NFC вашого пристрою або неправильним прикладанням картки до пристрою. Зверніться за допомогою до нашої служби підтримки.</string>
<string name="warning_backup_errors_title">Помилка активації</string>
<string name="warning_beacon_chain_retirement_content">За рішенням розробників мережі BNB стандарт BEP-2 перестане підтримуватись у червні 2024 року. Щоб не втратити свої активи, їх необхідно конвертувати у стандарт BEP-20. Використовуйте функцію обміну, щоб перевести їх у мережу BNB Smart Chain.</string>
@ -862,13 +847,16 @@
<string name="warning_existential_deposit_title">Для роботи з мережею вимагається депозит</string>
<string name="warning_express_active_transaction_message">Обмін буде доступний після завершення %s транзакції</string>
<string name="warning_express_active_transaction_title">У вас є активна транзакція</string>
<string name="warning_express_approval_in_progress_message">Затвердження обміну триває і незабаром буде завершено</string>
<string name="warning_express_approval_in_progress_title">Затвердження в процесі</string>
<string name="warning_express_dust_message">Мінімальна сума обміну становить - %1$s. Будь ласка, переконайтеся, що залишок на рахунку після обміну буде не менше за %2$s.</string>
<string name="warning_express_no_exchangeable_coins_description">У вашому списку немає доступних монет для обміну %s</string>
<string name="warning_express_no_exchangeable_coins_title">Немає доступних токенів для обміну</string>
<string name="warning_express_not_enough_fee_for_token_tx_description">Щоб здійснити транзакцію, вам потрібно внести трохи %1$s %2$s</string>
<string name="warning_express_not_enough_fee_for_token_tx_title">Неможливо покрити комісію %s</string>
<string name="warning_express_notification_invalid_reserve_amount_title">Сума отримання не може бути меншою за %s</string>
<string name="warning_express_pair_unavailable_message">Це може статися тому, що провайдер наразі не може обміняти обрану пару. Будь ласка, зачекайте трохи та спробуйте ще раз. (Код %@)</string>
<string name="warning_express_pair_unavailable_message">Це може статися тому, що провайдер наразі не може обміняти обрану пару. Будь ласка, зачекайте трохи та спробуйте ще раз. (Код %s)</string>
<string name="warning_express_pair_unavailable_title">Обрана пара тимчасово недоступна</string>
<string name="warning_express_refresh_required_title">Сервіс тимчасово недоступний</string>
<string name="warning_express_too_maximum_amount_title">Сума до обміну не повинна перевищувати %s</string>
<string name="warning_express_too_minimal_amount_title">Сума для обміну має бути не менше %s</string>

View file

@ -57,7 +57,6 @@
<string name="common_enable">允許</string>
<string name="common_enabled">啟用</string>
<string name="common_error">錯誤</string>
<string name="common_fee_label">費用</string>
<string name="common_import">導入</string>
<string name="common_network_fee_title">網路費</string>
<string name="common_no"></string>
@ -251,24 +250,11 @@
<string name="scan_card_settings_message">掃描卡片以更改其設置。這些更改只會影響您掃描過的卡,不會影響綁定到您錢包的其他卡。</string>
<string name="scan_card_settings_title">準備好您的卡!</string>
<string name="send_amount_label">數量</string>
<string name="send_destination_hint_address">地址</string>
<string name="send_error_address_same_as_wallet">地址與錢包地址相同</string>
<string name="send_extras_error_invalid_destination_tag">標籤無效。它不會被添加到交易中</string>
<string name="send_extras_error_invalid_memo">Memo無效。 它不會被添加到交易中</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="send_fee_include_description">包含費用</string>
<string name="send_fee_picker_low"></string>
<string name="send_fee_picker_normal">正常</string>
<string name="send_fee_picker_priority">優先</string>
<string name="send_max_amount_label">最大值</string>
<string name="send_title_currency_format">發送 %s</string>
<string name="send_total_label">總計</string>
<string name="send_total_subtitle_asset_format">%1$s 和 %2$s 將被發送</string>
<string name="send_total_subtitle_fiat_format">≈ %1$s (費用包含: %2$s)</string>
<string name="send_total_subtitle_format">%s 將被發送</string>
<string name="send_transaction_success">交易已成功簽署並發送至區塊鏈節點。錢包餘額稍後更新</string>
<string name="send_validation_invalid_address">無效地址</string>
<string name="story_awe_description">安全地存儲您的加密貨幣,同時將私鑰保存在您的卡中</string>
<string name="story_awe_title">創新式的硬體錢包</string>
<string name="story_backup_description">最多 3張實體卡片 到一個錢包</string>

View file

@ -70,6 +70,7 @@
<string name="common_access_denied">Access denied</string>
<string name="common_all">All</string>
<string name="common_allow">Allow</string>
<string name="common_analytics">Analytics</string>
<string name="common_apply">Apply</string>
<string name="common_approval">Approval</string>
<string name="common_approve">Approve</string>
@ -82,6 +83,7 @@
<string name="common_buy_currency">Go to %1$s</string>
<string name="common_camera_denied_alert_message">You have not given access to your camera, please adjust your privacy settings</string>
<string name="common_cancel">Cancel</string>
<string name="common_choose_action">Choose action</string>
<string name="common_claim_rewards">Claim rewards</string>
<string name="common_close">Close</string>
<string name="common_continue">Continue</string>
@ -174,7 +176,7 @@
<string name="custom_token_creation_error_network_not_selected">Please select the network</string>
<string name="custom_token_creation_error_token_already_exist_message">This token has already been added to the list</string>
<string name="custom_token_creation_error_token_already_exist_title">Token already exists</string>
<string name="custom_token_creation_error_wrong_decimals">Decimal must be a valid integer, up to %li</string>
<string name="custom_token_creation_error_wrong_decimals">Decimal must be a valid integer, up to %d</string>
<string name="custom_token_custom_derivation">Custom derivation</string>
<string name="custom_token_custom_derivation_placeholder">E. g. m/00\'/0000\'/0\'/0/0</string>
<string name="custom_token_custom_derivation_title">Enter custom derivation</string>
@ -351,6 +353,7 @@
<string name="markets_generate_addresses_notification">To generate addresses for selected networks, you must scan your Tangem Wallet card</string>
<string name="markets_insights_info_description_message">This sections data is sourced from the following networks: %s</string>
<string name="markets_loading_error_title">Unable to load the data…</string>
<string name="markets_loading_no_data_title">No data</string>
<string name="markets_quick_actions">Quick actions</string>
<string name="markets_search_result_title">Result</string>
<string name="markets_search_see_tokens_under_100k">See tokens under 100k market cap</string>
@ -659,6 +662,7 @@
<string name="staking_details_unbonding_period_info">The period you must wait after requesting to withdraw funds from staking before the tokens become available.</string>
<string name="staking_details_warmup_period">Warmup period</string>
<string name="staking_details_warmup_period_info">The allocated time for activating participation in staking.</string>
<string name="staking_locked">Locked</string>
<string name="staking_migrate">Migrate</string>
<string name="staking_native">Native staking</string>
<string name="staking_notification_earn_rewards_text_period_day">Staking allows you to earn %1$s. Your staking rewards arrive every day.</string>
@ -854,7 +858,7 @@
<string name="warning_express_not_enough_fee_for_token_tx_description">To make a transaction you need to deposit some %1$s %2$s</string>
<string name="warning_express_not_enough_fee_for_token_tx_title">Unable to cover %s fee</string>
<string name="warning_express_notification_invalid_reserve_amount_title">The amount to receive must be at least %s</string>
<string name="warning_express_pair_unavailable_message">This may occur because the provider is currently unable to exchange your selected pair. Please wait a moment and try again. (Code %@)</string>
<string name="warning_express_pair_unavailable_message">This may occur because the provider is currently unable to exchange your selected pair. Please wait a moment and try again. (Code %s)</string>
<string name="warning_express_pair_unavailable_title">Selected pair temporarily unavailable</string>
<string name="warning_express_refresh_required_title">Service temporarily unavailable</string>
<string name="warning_express_too_maximum_amount_title">The amount of tokens to be swapped must not exceed %s</string>

View file

@ -43,9 +43,9 @@ import com.tangem.core.ui.res.TangemThemePreview
*/
@Composable
fun InputRowDefault(
title: TextReference,
text: TextReference,
modifier: Modifier = Modifier,
title: TextReference? = null,
titleColor: Color = TangemTheme.colors.text.secondary,
textColor: Color = TangemTheme.colors.text.primary1,
iconRes: Int? = null,
@ -66,16 +66,18 @@ fun InputRowDefault(
modifier = Modifier
.weight(1f),
) {
Text(
text = title.resolveReference(),
style = TangemTheme.typography.subtitle2,
color = titleColor,
)
title?.let {
Text(
text = title.resolveReference(),
style = TangemTheme.typography.subtitle2,
color = titleColor,
modifier = Modifier.padding(bottom = TangemTheme.dimens.spacing8),
)
}
Text(
text = text.resolveReference(),
style = TangemTheme.typography.body2,
color = textColor,
modifier = Modifier.padding(top = TangemTheme.dimens.spacing8),
)
}
iconRes?.let {

View file

@ -83,11 +83,10 @@ internal sealed class StakingStates {
val innerState: InnerConfirmationStakingState,
val feeState: FeeState,
val validatorState: ValidatorState,
val pendingActions: ImmutableList<PendingAction>,
val pendingAction: PendingAction?,
val notifications: ImmutableList<StakingNotification>,
val footerText: String,
val transactionDoneState: TransactionDoneState,
val pendingActionInProgress: PendingAction? = null,
val isApprovalNeeded: Boolean,
) : ConfirmationState()

View file

@ -0,0 +1,11 @@
package com.tangem.features.staking.impl.presentation.state.bottomsheet
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.core.ui.extensions.TextReference
import com.tangem.domain.staking.model.stakekit.PendingAction
internal data class StakingActionSelectionBottomSheetConfig(
val title: TextReference,
val actions: List<PendingAction>,
val onActionSelect: (PendingAction) -> Unit,
) : TangemBottomSheetConfigContent

View file

@ -9,9 +9,6 @@ import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.features.staking.impl.R
import com.tangem.features.staking.impl.presentation.state.*
import com.tangem.features.staking.impl.presentation.state.StakingNotification
import com.tangem.features.staking.impl.presentation.state.StakingStates
import com.tangem.features.staking.impl.presentation.state.ValidatorState
import kotlinx.collections.immutable.persistentListOf
import java.math.BigDecimal
@ -90,7 +87,7 @@ internal object ConfirmationStatePreviewData {
),
),
transactionDoneState = TransactionDoneState.Empty,
pendingActions = persistentListOf(),
pendingAction = null,
isApprovalNeeded = false,
)
}

View file

@ -6,16 +6,15 @@ import com.tangem.domain.staking.model.stakekit.action.StakingActionCommonType
import com.tangem.features.staking.impl.presentation.state.BalanceState
import com.tangem.features.staking.impl.presentation.state.bottomsheet.InfoType
import com.tangem.features.staking.impl.presentation.viewmodel.StakingClickIntents
import kotlinx.collections.immutable.ImmutableList
@Suppress("TooManyFunctions")
internal object StakingClickIntentsStub : StakingClickIntents {
override fun onBackClick() {}
override fun onNextClick(actionType: StakingActionCommonType?, pendingActions: ImmutableList<PendingAction>) {}
override fun onNextClick(actionType: StakingActionCommonType?, pendingAction: PendingAction?) {}
override fun onActionClick(pendingAction: PendingAction?) {}
override fun onActionClick() {}
override fun onPrevClick() {}

View file

@ -5,10 +5,9 @@ import com.tangem.common.ui.navigationButtons.NavigationButtonsState
import com.tangem.core.ui.R
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.domain.staking.model.stakekit.PendingAction
import com.tangem.domain.staking.model.stakekit.action.StakingActionCommonType
import com.tangem.domain.staking.model.stakekit.action.StakingActionType
import com.tangem.features.staking.impl.presentation.state.*
import com.tangem.features.staking.impl.presentation.state.utils.getPendingActionTitle
import com.tangem.utils.transformer.Transformer
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
@ -22,7 +21,6 @@ internal class SetButtonsStateTransformer : Transformer<StakingUiState> {
NavigationButtonsState.Data(
primaryButton = getPrimaryButton(prevState),
prevButton = getPrevButton(prevState),
secondaryButton = getSecondaryButton(prevState),
extraButtons = getExtraButtons(prevState),
txUrl = (confirmState?.transactionDoneState as? TransactionDoneState.Content)?.txUrl,
)
@ -37,48 +35,22 @@ internal class SetButtonsStateTransformer : Transformer<StakingUiState> {
val confirmState = prevState.confirmationState as? StakingStates.ConfirmationState.Data
val innerConfirmState = confirmState?.innerState
val isPrimaryInProgress =
confirmState?.pendingActions?.getPrimaryAction() == confirmState?.pendingActionInProgress
val isConfirmation = prevState.currentStep == StakingStep.Confirmation
val isInProgress = innerConfirmState == InnerConfirmationStakingState.IN_PROGRESS
val isCompleted = innerConfirmState == InnerConfirmationStakingState.COMPLETED
val isIconVisible = isConfirmation && !isCompleted
val isShowProgress = isInProgress && isPrimaryInProgress
return NavigationButton(
textReference = prevState.getButtonText(),
iconRes = R.drawable.ic_tangem_24,
isSecondary = false,
isIconVisible = isIconVisible,
showProgress = isShowProgress,
showProgress = isInProgress,
isEnabled = prevState.isButtonEnabled(),
onClick = { prevState.onPrimaryClick() },
)
}
private fun getSecondaryButton(prevState: StakingUiState): NavigationButton? {
val confirmState = prevState.confirmationState as? StakingStates.ConfirmationState.Data
val innerConfirmState = confirmState?.innerState
val isConfirmation = prevState.currentStep == StakingStep.Confirmation
val isInProgress = innerConfirmState == InnerConfirmationStakingState.IN_PROGRESS
val isCompleted = innerConfirmState == InnerConfirmationStakingState.COMPLETED
return confirmState?.pendingActions?.getSecondaryAction()?.let { pendingAction ->
val isSecondaryInProgress = pendingAction == confirmState.pendingActionInProgress
val isShowProgress = isInProgress && isSecondaryInProgress
NavigationButton(
textReference = getPendingActionTitle(pendingAction.type),
iconRes = R.drawable.ic_tangem_24,
isSecondary = true,
isIconVisible = true,
showProgress = isShowProgress,
isEnabled = prevState.isButtonEnabled(),
onClick = { prevState.clickIntents.onActionClick(pendingAction) },
).takeIf { isConfirmation && !isCompleted }
}
}
private fun getPrevButton(prevState: StakingUiState): NavigationButton? {
return NavigationButton(
textReference = TextReference.EMPTY,
@ -114,10 +86,6 @@ internal class SetButtonsStateTransformer : Transformer<StakingUiState> {
)
}
private fun List<PendingAction>.getPrimaryAction(): PendingAction? = getOrNull(0)
private fun List<PendingAction>.getSecondaryAction(): PendingAction? = getOrNull(1)
private fun StakingUiState.isButtonsVisible(): Boolean = when (currentStep) {
StakingStep.RewardsValidators -> false
else -> true
@ -158,7 +126,7 @@ internal class SetButtonsStateTransformer : Transformer<StakingUiState> {
StakingActionCommonType.EXIT -> resourceReference(R.string.common_unstake)
StakingActionCommonType.PENDING_OTHER,
StakingActionCommonType.PENDING_REWARDS,
-> getPendingActionTitle(confirmationState.pendingActions.firstOrNull()?.type)
-> confirmationState.pendingAction?.type.getPendingActionTitle()
}
}
} else {
@ -192,7 +160,7 @@ internal class SetButtonsStateTransformer : Transformer<StakingUiState> {
if (isEnterAction && isApproveNeeded) {
clickIntents.showApprovalBottomSheet()
} else {
clickIntents.onActionClick(confirmationState.pendingActions.firstOrNull())
clickIntents.onActionClick()
}
}
} else {
@ -219,25 +187,4 @@ internal class SetButtonsStateTransformer : Transformer<StakingUiState> {
StakingStep.Validators -> true
}
}
@Suppress("CyclomaticComplexMethod")
private fun getPendingActionTitle(type: StakingActionType?): TextReference = when (type) {
StakingActionType.CLAIM_REWARDS -> resourceReference(R.string.common_claim_rewards)
StakingActionType.RESTAKE_REWARDS -> resourceReference(R.string.staking_restake_rewards)
StakingActionType.WITHDRAW -> resourceReference(R.string.staking_withdraw)
StakingActionType.RESTAKE -> resourceReference(R.string.staking_restake)
StakingActionType.CLAIM_UNSTAKED -> resourceReference(R.string.staking_claim_unstaked)
StakingActionType.UNLOCK_LOCKED -> resourceReference(R.string.staking_unlocked_locked)
StakingActionType.STAKE_LOCKED -> resourceReference(R.string.staking_stake_locked)
StakingActionType.VOTE -> resourceReference(R.string.staking_vote)
StakingActionType.REVOKE -> resourceReference(R.string.staking_revoke)
StakingActionType.VOTE_LOCKED -> resourceReference(R.string.staking_vote_locked)
StakingActionType.REVOTE -> resourceReference(R.string.staking_revote)
StakingActionType.REBOND -> resourceReference(R.string.staking_rebond)
StakingActionType.MIGRATE -> resourceReference(R.string.staking_migrate)
StakingActionType.STAKE -> resourceReference(R.string.common_stake)
StakingActionType.UNSTAKE -> resourceReference(R.string.common_unstake)
StakingActionType.UNKNOWN -> TextReference.EMPTY
null -> TextReference.EMPTY
}
}

View file

@ -10,13 +10,12 @@ import com.tangem.features.staking.impl.presentation.state.StakingStates
import com.tangem.features.staking.impl.presentation.state.StakingUiState
import com.tangem.utils.Provider
import com.tangem.utils.transformer.Transformer
import kotlinx.collections.immutable.ImmutableList
internal class SetConfirmationStateAssentTransformer(
private val appCurrencyProvider: Provider<AppCurrency>,
private val feeCryptoCurrencyStatus: CryptoCurrencyStatus?,
private val fee: Fee,
private val pendingActionList: ImmutableList<PendingAction>,
private val action: PendingAction?,
) : Transformer<StakingUiState> {
override fun transform(prevState: StakingUiState): StakingUiState {
@ -38,7 +37,7 @@ internal class SetConfirmationStateAssentTransformer(
isFeeApproximate = false,
),
validatorState = validatorState.copySealed(isClickable = true),
pendingActions = pendingActionList,
pendingAction = action,
isPrimaryButtonEnabled = true,
isApprovalNeeded = false,
)

View file

@ -1,14 +1,11 @@
package com.tangem.features.staking.impl.presentation.state.transformers
import com.tangem.domain.staking.model.stakekit.PendingAction
import com.tangem.features.staking.impl.presentation.state.InnerConfirmationStakingState
import com.tangem.features.staking.impl.presentation.state.StakingStates
import com.tangem.features.staking.impl.presentation.state.StakingUiState
import com.tangem.utils.transformer.Transformer
internal class SetConfirmationStateInProgressTransformer(
private val pendingAction: PendingAction?,
) : Transformer<StakingUiState> {
internal class SetConfirmationStateInProgressTransformer : Transformer<StakingUiState> {
override fun transform(prevState: StakingUiState): StakingUiState {
return prevState.copy(
@ -22,7 +19,6 @@ internal class SetConfirmationStateInProgressTransformer(
isPrimaryButtonEnabled = false,
innerState = InnerConfirmationStakingState.IN_PROGRESS,
validatorState = validatorState.copySealed(isClickable = false),
pendingActionInProgress = pendingAction,
)
} else {
this

View file

@ -32,8 +32,7 @@ internal class SetConfirmationStateLoadingTransformer(
notifications = getNotifications(prevState),
footerText = "",
transactionDoneState = TransactionDoneState.Empty,
pendingActions = persistentListOf(),
pendingActionInProgress = null,
pendingAction = null,
isApprovalNeeded = false,
),
)

View file

@ -212,8 +212,7 @@ internal class SetInitialDataStateTransformer(
notifications = persistentListOf(),
footerText = "",
transactionDoneState = TransactionDoneState.Empty,
pendingActions = persistentListOf(),
pendingActionInProgress = null,
pendingAction = null,
isApprovalNeeded = isApprovalNeeded,
)
}

View file

@ -0,0 +1,30 @@
package com.tangem.features.staking.impl.presentation.state.transformers
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.domain.staking.model.stakekit.PendingAction
import com.tangem.features.staking.impl.R
import com.tangem.features.staking.impl.presentation.state.StakingUiState
import com.tangem.features.staking.impl.presentation.state.bottomsheet.StakingActionSelectionBottomSheetConfig
import com.tangem.utils.transformer.Transformer
import kotlinx.collections.immutable.ImmutableList
internal class ShowActionSelectorBottomSheetTransformer(
private val pendingActions: ImmutableList<PendingAction>,
private val onActionSelect: (PendingAction) -> Unit,
private val onDismiss: () -> Unit,
) : Transformer<StakingUiState> {
override fun transform(prevState: StakingUiState): StakingUiState {
return prevState.copy(
bottomSheetConfig = TangemBottomSheetConfig(
isShow = true,
content = StakingActionSelectionBottomSheetConfig(
title = resourceReference(R.string.common_choose_action),
actions = pendingActions,
onActionSelect = onActionSelect,
),
onDismissRequest = onDismiss,
),
)
}
}

View file

@ -0,0 +1,27 @@
package com.tangem.features.staking.impl.presentation.state.utils
import com.tangem.core.ui.R
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.domain.staking.model.stakekit.action.StakingActionType
@Suppress("CyclomaticComplexMethod")
internal fun StakingActionType?.getPendingActionTitle(): TextReference = when (this) {
StakingActionType.CLAIM_REWARDS -> resourceReference(R.string.common_claim_rewards)
StakingActionType.RESTAKE_REWARDS -> resourceReference(R.string.staking_restake_rewards)
StakingActionType.WITHDRAW -> resourceReference(R.string.staking_withdraw)
StakingActionType.RESTAKE -> resourceReference(R.string.staking_restake)
StakingActionType.CLAIM_UNSTAKED -> resourceReference(R.string.staking_claim_unstaked)
StakingActionType.UNLOCK_LOCKED -> resourceReference(R.string.staking_unlocked_locked)
StakingActionType.STAKE_LOCKED -> resourceReference(R.string.staking_stake_locked)
StakingActionType.VOTE -> resourceReference(R.string.staking_vote)
StakingActionType.REVOKE -> resourceReference(R.string.staking_revoke)
StakingActionType.VOTE_LOCKED -> resourceReference(R.string.staking_vote_locked)
StakingActionType.REVOTE -> resourceReference(R.string.staking_revote)
StakingActionType.REBOND -> resourceReference(R.string.staking_rebond)
StakingActionType.MIGRATE -> resourceReference(R.string.staking_migrate)
StakingActionType.STAKE -> resourceReference(R.string.common_stake)
StakingActionType.UNSTAKE -> resourceReference(R.string.common_unstake)
StakingActionType.UNKNOWN -> TextReference.EMPTY
null -> TextReference.EMPTY
}

View file

@ -24,7 +24,9 @@ import com.tangem.features.staking.impl.R
import com.tangem.features.staking.impl.presentation.state.StakingStates
import com.tangem.features.staking.impl.presentation.state.StakingStep
import com.tangem.features.staking.impl.presentation.state.StakingUiState
import com.tangem.features.staking.impl.presentation.state.bottomsheet.StakingActionSelectionBottomSheetConfig
import com.tangem.features.staking.impl.presentation.state.bottomsheet.StakingInfoBottomSheetConfig
import com.tangem.features.staking.impl.presentation.ui.bottomsheet.StakingActionSelectorBottomSheet
import com.tangem.features.staking.impl.presentation.ui.bottomsheet.StakingInfoBottomSheet
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.first
@ -74,6 +76,7 @@ fun StakingBottomSheet(bottomSheetConfig: TangemBottomSheetConfig?) {
when (bottomSheetConfig.content) {
is StakingInfoBottomSheetConfig -> StakingInfoBottomSheet(bottomSheetConfig)
is GiveTxPermissionBottomSheetConfig -> GiveTxPermissionBottomSheet(bottomSheetConfig)
is StakingActionSelectionBottomSheetConfig -> StakingActionSelectorBottomSheet(bottomSheetConfig)
}
}

View file

@ -58,7 +58,7 @@ internal fun StakingValidatorListContent(
InputRowImageSelector(
subtitle = stringReference(item.name),
caption = combinedReference(
resourceReference(R.string.staking_details_apr),
resourceReference(R.string.staking_details_annual_percentage_rate),
annotatedReference {
appendSpace()
appendColored(

View file

@ -0,0 +1,92 @@
package com.tangem.features.staking.impl.presentation.ui.bottomsheet
import android.content.res.Configuration
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.tooling.preview.Preview
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheet
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetTitle
import com.tangem.core.ui.components.inputrow.InputRowDefault
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.domain.staking.model.stakekit.PendingAction
import com.tangem.domain.staking.model.stakekit.action.StakingActionType
import com.tangem.features.staking.impl.R
import com.tangem.features.staking.impl.presentation.state.bottomsheet.StakingActionSelectionBottomSheetConfig
import com.tangem.features.staking.impl.presentation.state.utils.getPendingActionTitle
import kotlinx.collections.immutable.persistentListOf
@Composable
internal fun StakingActionSelectorBottomSheet(config: TangemBottomSheetConfig) {
TangemBottomSheet<StakingActionSelectionBottomSheetConfig>(
config = config,
title = { content ->
TangemBottomSheetTitle(title = content.title)
},
containerColor = TangemTheme.colors.background.tertiary,
) { content ->
Column(
modifier = Modifier
.padding(
start = TangemTheme.dimens.spacing16,
end = TangemTheme.dimens.spacing16,
bottom = TangemTheme.dimens.spacing32,
)
.clip(TangemTheme.shapes.roundedCornersXMedium)
.background(TangemTheme.colors.background.action),
) {
content.actions.forEachIndexed { index, action ->
InputRowDefault(
text = action.type.getPendingActionTitle(),
textColor = TangemTheme.colors.text.primary1,
showDivider = index != content.actions.lastIndex,
modifier = Modifier
.fillMaxWidth()
.clickable {
content.onActionSelect(action)
},
)
}
}
}
}
// region Preview
@Composable
@Preview(showBackground = true)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
private fun Preview_StakingActionSelectorBottomSheet() {
TangemThemePreview {
StakingActionSelectorBottomSheet(
config = TangemBottomSheetConfig(
isShow = true,
onDismissRequest = {},
content = StakingActionSelectionBottomSheetConfig(
title = resourceReference(R.string.common_select_action),
actions = persistentListOf(
PendingAction(
type = StakingActionType.CLAIM_REWARDS,
passthrough = "",
args = null,
),
PendingAction(
type = StakingActionType.RESTAKE_REWARDS,
passthrough = "",
args = null,
),
),
onActionSelect = {},
),
),
)
}
}
// endregion Preview

View file

@ -6,19 +6,14 @@ import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.staking.model.stakekit.action.StakingActionCommonType
import com.tangem.features.staking.impl.presentation.state.BalanceState
import com.tangem.features.staking.impl.presentation.state.bottomsheet.InfoType
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
internal interface StakingClickIntents : AmountScreenClickIntents {
fun onBackClick()
fun onNextClick(
actionType: StakingActionCommonType? = null,
pendingActions: ImmutableList<PendingAction> = persistentListOf(),
)
fun onNextClick(actionType: StakingActionCommonType? = null, pendingAction: PendingAction? = null)
fun onActionClick(pendingAction: PendingAction?)
fun onActionClick()
fun onPrevClick()

View file

@ -63,7 +63,6 @@ import com.tangem.utils.Provider
import com.tangem.utils.coroutines.*
import com.tangem.utils.extensions.isSingleItem
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.collections.immutable.ImmutableList
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import timber.log.Timber
@ -157,25 +156,25 @@ internal class StakingViewModel @Inject constructor(
stakingStateRouter.onBackClick()
}
override fun onNextClick(actionType: StakingActionCommonType?, pendingActions: ImmutableList<PendingAction>) {
override fun onNextClick(actionType: StakingActionCommonType?, pendingAction: PendingAction?) {
if (actionType != null) {
stateController.update { it.copy(actionType = actionType) }
}
stakingStateRouter.onNextClick()
if (isAssentState()) {
getFee(pendingActions)
getFee(pendingAction)
}
}
override fun onActionClick(pendingAction: PendingAction?) {
handleOnNextConfirmationClick(pendingAction)
override fun onActionClick() {
handleOnNextConfirmationClick()
stakingStateRouter.onNextClick()
}
private fun handleOnNextConfirmationClick(pendingAction: PendingAction?) {
private fun handleOnNextConfirmationClick() {
if (isAssentState()) {
viewModelScope.launch {
stateController.update(SetConfirmationStateInProgressTransformer(pendingAction))
stateController.update(SetConfirmationStateInProgressTransformer())
val confirmationState =
value.confirmationState as? StakingStates.ConfirmationState.Data ?: error("No confirmation state")
@ -186,6 +185,7 @@ internal class StakingViewModel @Inject constructor(
val fee = (confirmationState.feeState as? FeeState.Content)?.fee ?: error("No fee provided")
val defaultAddress = cryptoCurrencyStatus.value.networkAddress?.defaultAddress?.value
?: error("No available address")
val pendingAction = confirmationState.pendingAction
val stakingTransactions = getStakingTransactionUseCase(
userWalletId = userWalletId,
@ -230,13 +230,13 @@ internal class StakingViewModel @Inject constructor(
sendStakingTransaction(
fullTransactionsData = fullTransactionsData,
fee = fee,
pendingActionList = confirmationState.pendingActions,
pendingAction = confirmationState.pendingAction,
)
}
}
}
private fun getFee(pendingActions: ImmutableList<PendingAction>) {
private fun getFee(pendingAction: PendingAction?) {
viewModelScope.launch {
stateController.update(
SetConfirmationStateLoadingTransformer(
@ -270,7 +270,7 @@ internal class StakingViewModel @Inject constructor(
)
} else {
estimateGas(
pendingActions = pendingActions,
pendingAction = pendingAction,
amount = amount,
sourceAddress = sourceAddress,
validatorAddress = validatorAddress,
@ -278,7 +278,7 @@ internal class StakingViewModel @Inject constructor(
}
} else {
estimateGas(
pendingActions = pendingActions,
pendingAction = pendingAction,
amount = amount,
sourceAddress = sourceAddress,
validatorAddress = validatorAddress,
@ -288,12 +288,11 @@ internal class StakingViewModel @Inject constructor(
}
private suspend fun estimateGas(
pendingActions: ImmutableList<PendingAction>,
pendingAction: PendingAction?,
amount: BigDecimal,
sourceAddress: String,
validatorAddress: String,
) {
val pendingAction = pendingActions.firstOrNull()
val gasEstimate = estimateGasUseCase(
userWalletId = userWalletId,
network = cryptoCurrencyStatus.currency.network,
@ -323,7 +322,7 @@ internal class StakingViewModel @Inject constructor(
decimals = gasEstimate.token.decimals,
),
),
pendingActionList = pendingActions,
action = pendingAction,
),
)
}
@ -397,14 +396,29 @@ internal class StakingViewModel @Inject constructor(
}
override fun onActiveStake(activeStake: BalanceState) {
val actionType = if (activeStake.pendingActions.isEmpty()) {
StakingActionCommonType.EXIT
if (activeStake.pendingActions.size > 1) {
stateController.update(
ShowActionSelectorBottomSheetTransformer(
pendingActions = activeStake.pendingActions,
onActionSelect = {
onNextClick(actionType = StakingActionCommonType.PENDING_OTHER, pendingAction = it)
stateController.update(DismissBottomSheetStateTransformer())
},
onDismiss = {
stateController.update(DismissBottomSheetStateTransformer())
},
),
)
} else {
StakingActionCommonType.PENDING_OTHER
val actionType = if (activeStake.pendingActions.isEmpty()) {
StakingActionCommonType.EXIT
} else {
StakingActionCommonType.PENDING_OTHER
}
stateController.update(ValidatorSelectChangeTransformer(activeStake.validator))
stateController.update(AmountChangeStateTransformer(cryptoCurrencyStatus, activeStake.cryptoValue, yield))
onNextClick(actionType, activeStake.pendingActions.firstOrNull())
}
stateController.update(ValidatorSelectChangeTransformer(activeStake.validator))
stateController.update(AmountChangeStateTransformer(cryptoCurrencyStatus, activeStake.cryptoValue, yield))
onNextClick(actionType, activeStake.pendingActions)
}
override fun showApprovalBottomSheet() {
@ -479,13 +493,13 @@ internal class StakingViewModel @Inject constructor(
ifRight = {
stateController.update(SetApprovalInProgressTransformer)
stateController.update(DismissBottomSheetStateTransformer())
awaitForAllowance(confirmationState.pendingActions)
awaitForAllowance(confirmationState.pendingAction)
},
)
}.saveIn(approvalJobHolder)
}
private fun awaitForAllowance(pendingActions: ImmutableList<PendingAction>) {
private fun awaitForAllowance(pendingAction: PendingAction?) {
val approval = stakingApproval as? StakingApproval.Needed ?: return
allowanceTaskScheduler.scheduleTask(
scope = viewModelScope,
@ -504,7 +518,7 @@ internal class StakingViewModel @Inject constructor(
val amount = (value.amountState as? AmountState.Data)?.amountTextField?.cryptoAmount?.value
?: error("No amount provided")
if (allowance >= amount) {
getFee(pendingActions)
getFee(pendingAction)
allowanceTaskScheduler.cancelTask()
}
},
@ -643,7 +657,7 @@ internal class StakingViewModel @Inject constructor(
private suspend fun sendStakingTransaction(
fullTransactionsData: List<FullTransactionData>,
fee: Fee,
pendingActionList: ImmutableList<PendingAction>,
pendingAction: PendingAction?,
) {
sendMultipleTransactionUseCase(
txsData = fullTransactionsData.map { it.tangemTransaction },
@ -657,7 +671,7 @@ internal class StakingViewModel @Inject constructor(
appCurrencyProvider = Provider { appCurrency },
feeCryptoCurrencyStatus = feeCryptoCurrencyStatus,
fee = fee,
pendingActionList = pendingActionList,
action = pendingAction,
),
)
stakingEventFactory.createSendTransactionErrorAlert(error)