Updated on 2026-08-14
This commit is contained in:
parent
4dc994e8cf
commit
03da1731ea
24 changed files with 335 additions and 92 deletions
|
|
@ -2,6 +2,7 @@ package com.tangem.tap.routing.utils
|
|||
|
||||
import com.tangem.common.routing.AppRoute
|
||||
import com.tangem.core.decompose.context.AppComponentContext
|
||||
import com.tangem.domain.models.PortfolioId
|
||||
import com.tangem.domain.qrscanning.models.SourceType
|
||||
import com.tangem.feature.qrscanning.QrScanningComponent
|
||||
import com.tangem.feature.referral.api.ReferralComponent
|
||||
|
|
@ -19,6 +20,7 @@ import com.tangem.features.hotwallet.*
|
|||
import com.tangem.features.kyc.KycComponent
|
||||
import com.tangem.features.managetokens.component.ChooseManagedTokensComponent
|
||||
import com.tangem.features.managetokens.component.ManageTokensComponent
|
||||
import com.tangem.features.managetokens.component.ManageTokensMode
|
||||
import com.tangem.features.managetokens.component.ManageTokensSource
|
||||
import com.tangem.features.markets.details.MarketsTokenDetailsComponent
|
||||
import com.tangem.features.markets.tokenlist.MarketsTokenListComponent
|
||||
|
|
@ -140,9 +142,15 @@ internal class ChildFactory @Inject constructor(
|
|||
AppRoute.ManageTokens.Source.STORIES -> ManageTokensSource.STORIES
|
||||
}
|
||||
|
||||
val mode = when (val portfolio = route.portfolioId) {
|
||||
is PortfolioId.Account -> ManageTokensMode.Account(portfolio.accountId)
|
||||
is PortfolioId.Wallet -> ManageTokensMode.Wallet(portfolio.userWalletId)
|
||||
null -> ManageTokensMode.None
|
||||
}
|
||||
|
||||
createComponentChild(
|
||||
context = context,
|
||||
params = ManageTokensComponent.Params(route.userWalletId, source),
|
||||
params = ManageTokensComponent.Params(mode, source),
|
||||
componentFactory = manageTokensComponentFactory,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -121,8 +121,8 @@ sealed class AppRoute(val path: String) : Route {
|
|||
@Serializable
|
||||
data class ManageTokens(
|
||||
val source: Source,
|
||||
val userWalletId: UserWalletId? = null,
|
||||
) : AppRoute(path = "${source.name.lowercase()}/manage_tokens/$userWalletId") {
|
||||
val portfolioId: PortfolioId? = null,
|
||||
) : AppRoute(path = "${source.name.lowercase()}/manage_tokens/${portfolioId?.stringValue}") {
|
||||
|
||||
enum class Source {
|
||||
STORIES,
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@
|
|||
<string name="access_code_alert_skip_ok">Trotzdem überspringen</string>
|
||||
<string name="access_code_alert_skip_title">Zugangscode nicht festgelegt</string>
|
||||
<string name="access_code_check_title">Zugangscode eingeben</string>
|
||||
<string name="access_code_check_warining_delete">Falscher Zugangscode. Deine Hot-Wallet wird nach %s weiteren Fehlversuchen gelöscht.</string>
|
||||
<string name="access_code_check_warining_lock">Falscher Zugangscode. App wird bei %s weiteren Eingabefehlern gesperrt</string>
|
||||
<string name="access_code_check_warining_delete">Falscher Zugangscode. Deine mobile Wallet wird nach %s weiteren Fehlversuchen gelöscht.</string>
|
||||
<string name="access_code_check_warining_lock">Falscher Zugangscode. Die App wird nach %s weiteren Fehlversuchen gesperrt.</string>
|
||||
<string name="access_code_check_warining_wait">Falscher Zugangscode.\nBitte warte %s Sekunden und versuche es erneut.</string>
|
||||
<string name="access_code_confirm_description">Bestätige Deinen zuvor eingegebenen Code, um fortzufahren</string>
|
||||
<string name="access_code_confirm_title">Zugangscode erneut eingeben</string>
|
||||
|
|
@ -19,6 +19,7 @@
|
|||
<string name="account_archived_recover">Wiederherstellen</string>
|
||||
<string name="account_archived_recover_dialog_description">Du bist dabei, dich zu erholen \"%1$s”.</string>
|
||||
<string name="account_archived_recover_dialog_title">Konto wiederherstellen</string>
|
||||
<string name="account_archived_recover_error_message">Du hast das Limit von 20 aktiven Konten bereits überschritten. Archiviere eines, um es wiederherzustellen.</string>
|
||||
<string name="account_archived_title">Archiviert</string>
|
||||
<string name="account_create_success_message">Konto erstellt</string>
|
||||
<string name="account_details_archive">Archivkonto</string>
|
||||
|
|
@ -30,6 +31,7 @@
|
|||
<string name="account_form_create_button">Konto hinzufügen</string>
|
||||
<string name="account_form_edit_button">Speichern</string>
|
||||
<string name="account_form_name">Kontoname</string>
|
||||
<string name="account_form_name_already_exist_error_description">Der Kontoname ist bereits vorhanden</string>
|
||||
<string name="account_form_placeholder_edit_account">Konto</string>
|
||||
<string name="account_form_placeholder_new_account">Neues Konto</string>
|
||||
<string name="account_form_title_create">Konto hinzufügen</string>
|
||||
|
|
@ -104,7 +106,7 @@
|
|||
<item quantity="one">%s Karte</item>
|
||||
<item quantity="other">%s Karten</item>
|
||||
</plurals>
|
||||
<string name="auth_wallet_mobile_description">Handy-Wallet</string>
|
||||
<string name="auth_wallet_mobile_description">Mobile-Wallet</string>
|
||||
<string name="backup_complete_description">Du hast Deine Wallet erfolgreich gesichert.</string>
|
||||
<string name="backup_complete_seed_description">Diese Wörter können bei Verlust nicht wiederhergestellt werden. Bewahre diese an einem sicheren Ort auf.</string>
|
||||
<string name="backup_complete_title">Sicherung abgeschlossen</string>
|
||||
|
|
@ -174,6 +176,7 @@
|
|||
<string name="common_accept">Akzeptieren</string>
|
||||
<string name="common_access_denied">Zugang verweigert</string>
|
||||
<string name="common_accounts">Konten</string>
|
||||
<string name="common_activate">Aktivieren</string>
|
||||
<string name="common_add">Hinzufügen</string>
|
||||
<string name="common_add_to_portfolio">Zum Portfolio hinzufügen</string>
|
||||
<string name="common_add_token">Token hinzufügen</string>
|
||||
|
|
@ -182,6 +185,7 @@
|
|||
<string name="common_allow">Erlauben</string>
|
||||
<string name="common_amount">Betrag</string>
|
||||
<string name="common_analytics">Analysen</string>
|
||||
<string name="common_and">und</string>
|
||||
<string name="common_apply">Anwenden</string>
|
||||
<string name="common_approval">Genehmigung</string>
|
||||
<string name="common_approve">Genehmigen</string>
|
||||
|
|
@ -198,6 +202,7 @@
|
|||
<string name="common_camera_denied_alert_message">D hast keinen Zugang zur Kamera erteilt, bitte passe deine Datenschutzeinstellungen an</string>
|
||||
<string name="common_cancel">Abbrechen</string>
|
||||
<string name="common_change">Ändern</string>
|
||||
<string name="common_choose_account">Konto auswählen</string>
|
||||
<string name="common_choose_action">Aktion wählen</string>
|
||||
<string name="common_choose_network">Netzwerk auswählen</string>
|
||||
<string name="common_choose_token">Token auswählen</string>
|
||||
|
|
@ -246,7 +251,9 @@
|
|||
<string name="common_fee_selector_title">Gebühren</string>
|
||||
<string name="common_finish">Beenden</string>
|
||||
<string name="common_free">Kostenlos</string>
|
||||
<string name="common_from">Vom</string>
|
||||
<string name="common_generate_addresses">Adressen synchronisieren</string>
|
||||
<string name="common_get_started">Erste Schritte</string>
|
||||
<string name="common_go_to_provider">Zum Anbieter gehen</string>
|
||||
<string name="common_go_to_token">Zum Token</string>
|
||||
<string name="common_got_it">Verstanden</string>
|
||||
|
|
@ -255,6 +262,7 @@
|
|||
<string name="common_import">Importieren</string>
|
||||
<string name="common_in_progress">In Arbeit</string>
|
||||
<string name="common_later">Später</string>
|
||||
<string name="common_learn_more">Mehr erfahren</string>
|
||||
<string name="common_left">%1$s übrig</string>
|
||||
<string name="common_legacy_bitcoin_address">Legacy Bitcoin</string>
|
||||
<string name="common_locked">Gesperrt</string>
|
||||
|
|
@ -505,6 +513,7 @@
|
|||
<string name="home_button_create_new_wallet">Neues Wallet erstellen</string>
|
||||
<string name="home_button_order">Karte oder Ring bestellen</string>
|
||||
<string name="home_button_scan">Karte oder Ring scannen</string>
|
||||
<string name="hot_access_code_set_biometric_ask">Möchtest Du „Tangem“ die biometrische Authentifizierung erlauben? Um Deine Identität zu bestätigen und die App zu öffnen</string>
|
||||
<string name="hot_crypto_add_token_subtitle">An %s</string>
|
||||
<string name="hot_crypto_token_network">Im %s Netzwerk</string>
|
||||
<string name="hw_access_code_create_alert_title">Willst Du den Vorgang zur Erstellung des Zugangscodes wirklich beenden?</string>
|
||||
|
|
@ -516,7 +525,7 @@
|
|||
<string name="hw_backup_alert_description">Wenn dies der Fall ist, musst Du von vorne beginnen.</string>
|
||||
<string name="hw_backup_alert_title">Bist Du sicher, dass Du den Aktivierungsprozess beenden willst?</string>
|
||||
<string name="hw_backup_close_description">Wenn dies der Fall ist, musst Du von vorne beginnen.</string>
|
||||
<string name="hw_backup_google_drive_description">Wiederherstellung einer bestehenden Wallet, die in Ihrem Google Drive-Backup gespeichert ist</string>
|
||||
<string name="hw_backup_google_drive_description">Vorhandene Wallet über Google Drive-Backup wiederherstellen</string>
|
||||
<string name="hw_backup_google_drive_title">Google Drive-Backup</string>
|
||||
<string name="hw_backup_hardware_description">Verbesser Deine Sicherheit sofort mit einer erstklassigen Hardware-Wallet von Tangem.</string>
|
||||
<string name="hw_backup_hardware_title">Hardware-Wallet</string>
|
||||
|
|
@ -528,6 +537,7 @@
|
|||
<string name="hw_create_keys_title">Schlüssel werden in der App gespeichert</string>
|
||||
<string name="hw_create_seed_title">Sicherung der Seed-Phrase</string>
|
||||
<string name="hw_create_title">Mobile Wallet erstellen</string>
|
||||
<string name="hw_import_existing_wallet">Vorhandene Wallet importieren</string>
|
||||
<string name="hw_import_seed_phrase_already_imported">Diese Wiederherstellungsphrase wurde bereits importiert</string>
|
||||
<string name="hw_mobile_wallet">Mobile Wallet</string>
|
||||
<string name="hw_upgrade_funds_access_description">Dein Geld bleibt während des gesamten Prozesses sicher und vollständig zugänglich</string>
|
||||
|
|
@ -848,6 +858,7 @@
|
|||
<string name="onboarding_wallet_info_title_fourth">Zugangscode wiederherstellen</string>
|
||||
<string name="onboarding_wallet_info_title_second">Identische Karten oder Ring</string>
|
||||
<string name="onboarding_wallet_info_title_third">Zugangscode</string>
|
||||
<string name="onramp_all_offers_button_title">Alle Angebote</string>
|
||||
<string name="onramp_avaiable_with_payment_methods">Verfügbar mit %s</string>
|
||||
<string name="onramp_choose_provider_title_hint">Anbieter erleichtern Transaktionen</string>
|
||||
<string name="onramp_country_search">Suche nach Land</string>
|
||||
|
|
@ -855,13 +866,24 @@
|
|||
<string name="onramp_currency_other">Andere Währungen</string>
|
||||
<string name="onramp_currency_popular">Beliebte Fiats</string>
|
||||
<string name="onramp_currency_search">Suche nach Währung</string>
|
||||
<string name="onramp_instant_status">Sofort</string>
|
||||
<string name="onramp_legal">Durch die Nutzung der Onramp-Funktionalität stimmst Du den %1$s und %2$s des Anbieters zu.</string>
|
||||
<string name="onramp_legal_text">Der Service wird von einem externen Anbieter bereitgestellt. \n Tangem übernimmt keine Verantwortung.</string>
|
||||
<string name="onramp_max_amount_restriction">Der Kaufbetrag sollte nicht höher sein als %s</string>
|
||||
<string name="onramp_min_amount_restriction">Der zu kaufende Betrag muss mindestens %s betragen</string>
|
||||
<string name="onramp_no_available_providers">Keine verfügbaren Anbieter für diese Währung</string>
|
||||
<string name="onramp_offer_type_fastet">Schnellste</string>
|
||||
<string name="onramp_pay_with">Bezahlen mit</string>
|
||||
<string name="onramp_payment_method_subtitle">Zahlungsmethode</string>
|
||||
<string name="onramp_provider_max_amount">Verfügbar bis zu %s</string>
|
||||
<string name="onramp_provider_min_amount">Erhältlich bei %s</string>
|
||||
<plurals name="onramp_providers_count">
|
||||
<item quantity="one">Anbieter</item>
|
||||
<item quantity="other">Anbieter</item>
|
||||
</plurals>
|
||||
<string name="onramp_providers_subtitle">Anbieter</string>
|
||||
<string name="onramp_recently_used_title">Kürzlich verwendet</string>
|
||||
<string name="onramp_recommended_title">Empfohlen</string>
|
||||
<string name="onramp_redirecting_to_provider_subtitle">Du kannst Deine Transaktion beim Drittanbieter %s abschließen.</string>
|
||||
<string name="onramp_redirecting_to_provider_title">Umleitung auf %s…</string>
|
||||
<string name="onramp_residency_bottomsheet_country_not_supported">Unsere Dienstleistungen sind in diesem Land nicht verfügbar</string>
|
||||
|
|
@ -870,13 +892,18 @@
|
|||
<string name="onramp_settings_residence_description">Bitte wähle das richtige Land aus, um korrekte Zahlungsoptionen und Dienstleistungen zu gewährleisten.</string>
|
||||
<string name="onramp_settings_title">Einstellungen</string>
|
||||
<string name="onramp_statuses_view_footer">Du kannst diesen Bildschirm schließen und den Transaktionsstatus auf dem Bildschirm mit den Token-Details überprüfen.</string>
|
||||
<string name="onramp_timing_minutes">%s min</string>
|
||||
<string name="onramp_title_you_get">Du erhältst</string>
|
||||
<string name="onramp_tos_external_providers">Der Service wird von einem externen Anbieter bereitgestellt. \n Tangem übernimmt keine Verantwortung.</string>
|
||||
<string name="onramp_transaction_status_footer_text">Du kannst diesen Bildschirm schließen und den Transaktionsstatus auf dem Bildschirm mit den Token-Details überprüfen.</string>
|
||||
<string name="onramp_up_to_rate">Bis zu</string>
|
||||
<string name="onramp_via">Über</string>
|
||||
<string name="onramp_you_will_pay_title">Du zahlst</string>
|
||||
<string name="organize_tokens_group">Gruppe erstellen</string>
|
||||
<string name="organize_tokens_sort_by_balance">Nach Guthaben</string>
|
||||
<string name="organize_tokens_title">Token organisieren</string>
|
||||
<string name="organize_tokens_ungroup">Gruppe löschen</string>
|
||||
<string name="provider_name_support">%s Unterstützung</string>
|
||||
<string name="push_notifications_more_info">Mehr Infos</string>
|
||||
<string name="push_notifications_permission_alert_description">Du kannst Benachrichtigungen für Tangem in den Einstellungen aktivieren.</string>
|
||||
<string name="push_notifications_permission_alert_negative_button">Später aktivieren</string>
|
||||
|
|
@ -895,6 +922,7 @@
|
|||
<string name="receive_bottom_sheet_warning_message_full">Sende nur %s an diese Adresse. Der Versand einer anderen Währung führt zu ihrem unwiderruflichen Verlust.</string>
|
||||
<string name="receive_bottom_sheet_warning_title">Senden nur %1$s im Netzwerk %2$s</string>
|
||||
<string name="receive_token_description">Überweise Geld von einem anderen Wallet oder einer anderen Börse</string>
|
||||
<string name="referral_address_for_rewards">Adresse für Prämien</string>
|
||||
<string name="referral_button_participate">Teilnehmen</string>
|
||||
<string name="referral_error_failed_to_load_info">Die Informationen zum Empfehlungsprogramm konnten nicht geladen werden. Bitte versuche es später noch einmal.</string>
|
||||
<string name="referral_error_failed_to_load_info_with_reason">Die Informationen über das Empfehlungsprogramm konnten nicht geladen werden. Fehlercode: %s. Bitte versuche es später noch einmal.</string>
|
||||
|
|
@ -1071,6 +1099,9 @@
|
|||
<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="stake_token_description">Lass deinen Token für dich arbeiten</string>
|
||||
<string name="staking_account_initialization_footer">Eine Netzwerkgebühr ist eine kleine Zahlung, die erforderlich ist, um Deine Transaktion auf der Blockchain zu verarbeiten und zu bestätigen.</string>
|
||||
<string name="staking_account_initialization_message">Um mit dem Staking zu beginnen, muss Dein TON-Konto mit einer Selbsttransaktion von 1 TON aktiviert werden. Das Guthaben verbleibt in Deiner Wallet – dieser Schritt aktiviert Dein Konto lediglich für das Staking.</string>
|
||||
<string name="staking_account_initialization_title">Kontoaktivierung</string>
|
||||
<string name="staking_amount_requirement_error">Die Anzahl der zu stakenden Krypros muss mindesten %s betragen</string>
|
||||
<string name="staking_amount_tron_integer_error">Der Stakingbetrag wird aufgrund der Netzwerkregeln auf %1$s TRX aufgerundet.</string>
|
||||
<string name="staking_amount_tron_integer_error_unstaking">Der Betrag der unstaked wird, wird aufgrund der Netzwerkregeln auf %1$s TRX gerundet.</string>
|
||||
|
|
@ -1079,6 +1110,7 @@
|
|||
<string name="staking_details_account_fee_info">Ein Staking-Konto ist ein spezielles Konto, auf dem eingesetzte SOL-Token gespeichert werden. Es wird erstellt, indem Sie Ihre Token an einen Validator delegieren, um an der Transaktionsvalidierung teilzunehmen und Belohnungen zu erhalten. Für die Einrichtung des Staking-Kontos wird eine geringe Gebühr erhoben, die nach Abschluss des Stakings zurückerstattet wird.</string>
|
||||
<string name="staking_details_annual_percentage_rate">Jährliche prozentuale Rendite</string>
|
||||
<string name="staking_details_annual_percentage_rate_info">Die jährliche prozentuale Rendite, die du durch die Teilnahme am Staking erzielen kannst.</string>
|
||||
<string name="staking_details_annual_percentage_yield_info">APY zeigt den jährlichen prozentualen Ertrag des Validators basierend auf seiner Leistung</string>
|
||||
<string name="staking_details_apr">Effektiver Jahreszins</string>
|
||||
<string name="staking_details_auto_claiming_rewards_daily_text">Belohnungen sammeln sich täglich automatisch in deinem Staking-Konto an.</string>
|
||||
<string name="staking_details_available">Verfügbar</string>
|
||||
|
|
@ -1134,6 +1166,8 @@
|
|||
<string name="staking_notification_restake_rewards_text">Reinvestiert Deine verdienten Prämien in Deinen Einsatzbetrag und erhöht so den potenziellen Gewinn.</string>
|
||||
<string name="staking_notification_restake_text">Mit Restake kannst Du Dein Guthaben von einem Validator zu einem anderen verschieben, ohne dass Du den Stake aufheben musst.</string>
|
||||
<string name="staking_notification_stake_entire_balance_text">Du bist dabei, Dein gesamtes Guthaben zu staken. Wir empfehlen, einen kleinen Betrag übrig zu lassen, um die Netzwerkgebühren für die Aufhebung des Stakes oder das Einfordern von Prämien abzudecken.</string>
|
||||
<string name="staking_notification_ton_account_initialization_message">Um mit dem Staking zu beginnen, muss Dein TON-Konto mit einer Selbsttransaktion von 1 TON aktiviert werden. Das Guthaben verbleibt in Deiner Wallet – dieser Schritt aktiviert Dein Konto lediglich für das Staking.</string>
|
||||
<string name="staking_notification_ton_account_initialization_title">Kontoaktivierung</string>
|
||||
<string name="staking_notification_ton_activate_account">Um mit dem Staking bei TON zu beginnen, führe zunächst eine ausgehende Transaktion in beliebiger Höhe durch – dadurch wird Deine Wallet aktiviert.</string>
|
||||
<string name="staking_notification_ton_extra_reserve_info">Für den Abschluss der Transaktion können zusätzlich zur Netzwerkgebühr bis zu 0,2 TON erforderlich sein. Nicht genutzte Beträge werden zurückerstattet.</string>
|
||||
<string name="staking_notification_ton_extra_reserve_is_required">Für diesen Vorgang sind zusätzlich zur Netzwerkgebühr 0,2 TON erforderlich. Bitte lade Dein Guthaben auf.</string>
|
||||
|
|
@ -1166,6 +1200,7 @@
|
|||
<string name="staking_reward_schedule_month">Monatlich</string>
|
||||
<string name="staking_reward_schedule_week">Wöchentlich</string>
|
||||
<string name="staking_rewards">Belohnungen</string>
|
||||
<string name="staking_soloana_details_auto_claiming_rewards_daily_text">Belohnungen auf Solana werden automatisch Deinem Staking-Guthaben hinzugefügt und können nicht separat angezeigt werden.</string>
|
||||
<string name="staking_stake_locked">Stake gesperrt</string>
|
||||
<string name="staking_stake_more">Mehr staken</string>
|
||||
<string name="staking_stake_more_button_unavailability_reason">Beim Staking %1$s wird Dein gesamtes %2$s -Guthaben eingesetzt. Alle weiteren %2$s due Du in Deine Tangem-Wallet einzahlst, werden ebenfalls automatisch eingesetzt.</string>
|
||||
|
|
@ -1205,6 +1240,7 @@
|
|||
<string name="story_web3_title">Web 3.0-kompatibel</string>
|
||||
<string name="sui_not_enough_coin_for_fee_description">Zum Fortfahren ist eine eingehende Transaktion von mindestens %1$s erforderlich</string>
|
||||
<string name="sui_not_enough_coin_for_fee_title">Unzureichende Mittel</string>
|
||||
<string name="swap_approve_description">Durch die Genehmigung erlaubst Du dem Smart Contract, Deine Token in zukünftigen Transaktionen zu verwenden.</string>
|
||||
<string name="swap_fixed_rate">Fester Zinssatz</string>
|
||||
<string name="swap_give_permission_fee_footer">Das Netzwerk erhebt eine Token-Genehmigungsgebühr, um zu überprüfen, ob Sie die Verwendung Ihres Tokens für den Swap genehmigen.</string>
|
||||
<string name="swap_promo_text">Tausche mehr Token zu besseren Kursen direkt in deiner Brieftasche.</string>
|
||||
|
|
@ -1237,6 +1273,19 @@
|
|||
<string name="swapping_to_title">Du erhältst</string>
|
||||
<string name="swapping_token_list_title">Token auswählen</string>
|
||||
<string name="swapping_token_not_available">Nicht verfügbar</string>
|
||||
<string name="tangempay_card_details_error_text">Daten konnten nicht geladen werden. Versuche es später noch einmal.</string>
|
||||
<string name="tangempay_card_details_hide_text">Verstecken</string>
|
||||
<string name="tangempay_card_details_reveal_text">Aufdecken</string>
|
||||
<string name="tangempay_card_details_title">Kartendetails</string>
|
||||
<string name="tangempay_onboarding_get_card_button_text">Karte erhalten</string>
|
||||
<string name="tangempay_onboarding_pay_description">Füge es Deiner Wallet hinzu und bezahle überall mit Deinem Smartphone.</string>
|
||||
<string name="tangempay_onboarding_pay_title">Apple Pay & Google Pay</string>
|
||||
<string name="tangempay_onboarding_purchases_description">Verwende Dein USDC-Guthaben, um alltägliche Einkäufe problemlos zu bezahlen.</string>
|
||||
<string name="tangempay_onboarding_purchases_title">Einkäufe im Alltag</string>
|
||||
<string name="tangempay_onboarding_security_description">Deine Kartendaten sind geschützt – volle Kontrolle in der App.</string>
|
||||
<string name="tangempay_onboarding_security_title">Integrierte Sicherheit</string>
|
||||
<string name="tangempay_onboarding_title">Hol Dir Deine kostenlose Crypto Card \n in wenigen Minuten</string>
|
||||
<string name="tangempay_title">Tangem Pay</string>
|
||||
<string name="this_is_my_wallet_title">Das ist meine Wallet</string>
|
||||
<string name="toast_balances_hidden">Guthaben versteckt</string>
|
||||
<string name="toast_balances_shown">Angezeigte Salden</string>
|
||||
|
|
@ -1264,6 +1313,7 @@
|
|||
<string name="token_details_token_type_subtitle_no_standard">Token in %%image%% %1$s Netzwerk</string>
|
||||
<string name="token_details_unable_hide_alert_message">Der %1$s (%2$s) Token ist die Hauptwährung im %3$s Netzwerk und kann nicht versteckt werden, solange du andere Token dieses Netzwerks in der Liste aktiv hast.</string>
|
||||
<string name="token_details_unable_hide_alert_title">%s kann nicht ausgeblendet werden</string>
|
||||
<string name="token_receive_show_qr_code_title">QR-Code anzeigen</string>
|
||||
<string name="token_swap_changelly_promotion_message">Tausche diesen Token gegen einen anderen zu %1$s Servicegebühren von Februar %2$s-%3$s.</string>
|
||||
<string name="token_swap_changelly_promotion_title">Tausche mit Changelly, %s Gebühren</string>
|
||||
<string name="token_swap_promotion_button">Jetzt tauschen</string>
|
||||
|
|
@ -1312,6 +1362,8 @@
|
|||
<string name="user_push_notification_agreement_argument_two_subtitle">Frühzeitiger Zugriff auf neue Funktionen und exklusive Angebote.</string>
|
||||
<string name="user_push_notification_agreement_argument_two_title">Updates zu Funktionen und Neuigkeiten</string>
|
||||
<string name="user_push_notification_agreement_header">Möchtest du Push-Benachrichtigungen verwenden?</string>
|
||||
<string name="user_push_notification_banner_subtitle">Aktiviere Push-Benachrichtigungen und wir benachrichtigen Dich sofort, wenn Gelder eintreffen \n</string>
|
||||
<string name="user_push_notification_banner_title">Verpasse keine Transaktion</string>
|
||||
<string name="user_wallet_list_add_button">Neues Wallet hinzufügen</string>
|
||||
<string name="user_wallet_list_delete_prompt">Möchtest Du diese Wallet wirklich entfernen?</string>
|
||||
<string name="user_wallet_list_error_unable_to_unlock">Es ist ein Fehler aufgetreten, bitte scanne deine Karte oder Ring, um sich anzumelden</string>
|
||||
|
|
@ -1548,6 +1600,7 @@
|
|||
<string name="wc_alert_wrong_card_title">Wir haben eine Art Problem</string>
|
||||
<string name="wc_all_dapps_disconnected">Alle dApps getrennt</string>
|
||||
<string name="wc_allow_to_spend">Erlaubnis auszugeben</string>
|
||||
<string name="wc_approve_description">Durch die Genehmigung erlaubst Du dApps oder Smart Contracts, Token in zukünftigen Transaktionen zu verwenden.</string>
|
||||
<string name="wc_common_address">Vertragsadresse</string>
|
||||
<string name="wc_common_connect">Verbinden</string>
|
||||
<string name="wc_common_loading">Laden</string>
|
||||
|
|
@ -1622,4 +1675,31 @@
|
|||
<string name="xtz_withdrawal_message_ignore">Nein, alles senden</string>
|
||||
<string name="xtz_withdrawal_message_reduce">Um %s XTZ reduziert</string>
|
||||
<string name="xtz_withdrawal_message_warning">Damit Sie beim nächsten Aufladen Ihrer Brieftasche keine erhöhte Provision zahlen, soll der Betrag um %s XTZ reduziert werden</string>
|
||||
<string name="yield_module_chart_loading_error">Chart konnte nicht geladen werden...</string>
|
||||
<string name="yield_module_deposit_error_notification_title">Der erhaltene Betrag %1$s %2$s wurde nicht auf Aave eingezahlt.</string>
|
||||
<string name="yield_module_fee_policy_sheet_current_fee_title">Aktuelle Gebühr</string>
|
||||
<string name="yield_module_fee_policy_sheet_max_fee_title">Maximale Gebühr</string>
|
||||
<string name="yield_module_fee_policy_sheet_title">Gebührenpolitik</string>
|
||||
<string name="yield_module_high_fee_error">Die Netzwerkgebühr ist derzeit zu hoch. Warte, bis sie unter Dein Limit fällt.</string>
|
||||
<string name="yield_module_historical_returns">Historische Renditen</string>
|
||||
<string name="yield_module_promo_screen_cash_out_title">Sofortige Auszahlung</string>
|
||||
<string name="yield_module_promo_screen_how_it_works_button_title">Wie funktioniert das?</string>
|
||||
<string name="yield_module_promo_screen_title">Verdiene %s%% jährlich</string>
|
||||
<string name="yield_module_promo_screen_variable_rate_info">Aave • Variabler Zinssatz</string>
|
||||
<string name="yield_module_provider">Aave</string>
|
||||
<string name="yield_module_rate_info_sheet_chart_average">Durchschnitt %s</string>
|
||||
<string name="yield_module_rate_info_sheet_chart_title">Renditen des letzten Jahres</string>
|
||||
<string name="yield_module_rate_info_sheet_powered_by">Unterstützt durch</string>
|
||||
<string name="yield_module_rate_info_sheet_title">Der Zinssatz ist variabel</string>
|
||||
<string name="yield_module_start_earning">Beginn des Verdienstes</string>
|
||||
<string name="yield_module_start_earning_sheet_fee_policy">Siehe Gebührenrichtlinie</string>
|
||||
<string name="yield_module_status_active">Aktiv</string>
|
||||
<string name="yield_module_status_paused">Pausiert</string>
|
||||
<string name="yield_module_supply_apr">Effektiver Jahreszins für Versorgung</string>
|
||||
<string name="yield_module_token_details_earn_notification_description">Lass Dein Geld arbeiten – verdiene Zinsen auf Dein Guthaben.</string>
|
||||
<string name="yield_module_token_details_earn_notification_earning_on_your_balance_title">Verdienst auf Dein Guthaben</string>
|
||||
<string name="yield_module_token_details_earn_notification_title">Verdienen %1$s%% pro Jahr</string>
|
||||
<string name="yield_module_unavailable_subtitle">Der Stakingservice ist derzeit nicht verfügbar. Bitte versuche es später erneut.</string>
|
||||
<string name="yield_module_unavailable_title">Einnahmen nicht verfügbar</string>
|
||||
<string name="yield_supply_chart_loading_error">Chart konnte nicht geladen werden...</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
<string name="account_archived_recover">回復する</string>
|
||||
<string name="account_archived_recover_dialog_description">「 %1$s 」を回復しようとしています。</string>
|
||||
<string name="account_archived_recover_dialog_title">アカウントを回復する</string>
|
||||
<string name="account_archived_recover_error_message">すでにアクティブアカウント数の上限(20件)を超えています。復元するには1件アーカイブしてください。</string>
|
||||
<string name="account_archived_recover_error_message">すでにアクティブアカウントの上限(20件)に達しています。復元するには、1つをアーカイブしてください。</string>
|
||||
<string name="account_archived_recover_error_title">アカウントを復元できません</string>
|
||||
<string name="account_archived_title">アーカイブ済み</string>
|
||||
<string name="account_could_not_create">アカウントを作成できませんでした。しばらくしてからもう一度お試しください。</string>
|
||||
|
|
@ -176,6 +176,7 @@
|
|||
<string name="common_accept">受け入れる</string>
|
||||
<string name="common_access_denied">アクセスが拒否されました</string>
|
||||
<string name="common_accounts">アカウント</string>
|
||||
<string name="common_activate">有効化</string>
|
||||
<string name="common_add">追加</string>
|
||||
<string name="common_add_to_portfolio">ポートフォリオに追加</string>
|
||||
<string name="common_add_token">トークンを追加</string>
|
||||
|
|
@ -248,6 +249,7 @@
|
|||
<string name="common_fee_selector_title">速度と料金</string>
|
||||
<string name="common_finish">終了</string>
|
||||
<string name="common_free">無料</string>
|
||||
<string name="common_from">送信元</string>
|
||||
<string name="common_generate_addresses">アドレスを同期する</string>
|
||||
<string name="common_get_started">はじめる</string>
|
||||
<string name="common_go_to_provider">プロバイダーへ移動</string>
|
||||
|
|
@ -532,6 +534,7 @@
|
|||
<string name="hw_create_keys_title">鍵はアプリに保存されます</string>
|
||||
<string name="hw_create_seed_title">シードフレーズのバックアップ</string>
|
||||
<string name="hw_create_title">モバイルウォレットを作成する</string>
|
||||
<string name="hw_import_existing_wallet">既存のウォレットをインポートする</string>
|
||||
<string name="hw_import_seed_phrase_already_imported">このリカバリーフレーズはすでにインポートされています。</string>
|
||||
<string name="hw_mobile_wallet">モバイルウォレット</string>
|
||||
<string name="hw_upgrade_error_card_already_has_wallet">アップグレードできません。このデバイスにはすでにウォレットが存在します。</string>
|
||||
|
|
@ -896,6 +899,7 @@
|
|||
<string name="organize_tokens_sort_by_balance">残高順</string>
|
||||
<string name="organize_tokens_title">トークンを整理する</string>
|
||||
<string name="organize_tokens_ungroup">グループ解除</string>
|
||||
<string name="provider_name_support">%sサポート</string>
|
||||
<string name="push_notifications_more_info">詳細はこちら</string>
|
||||
<string name="push_notifications_permission_alert_description">Tangemの通知は設定で有効にできます。</string>
|
||||
<string name="push_notifications_permission_alert_negative_button">後で有効にする</string>
|
||||
|
|
@ -1089,6 +1093,9 @@
|
|||
<string name="settings_forget_wallet_footer">これにより、ウォレットがアプリから削除されます。ウォレットは再度追加できます。</string>
|
||||
<string name="settings_wallet_name_title">名前</string>
|
||||
<string name="stake_token_description">トークンを活用しよう</string>
|
||||
<string name="staking_account_initialization_footer">ネットワーク手数料とは、ブロックチェーン上で取引を処理し、承認するために支払う少額の料金です。</string>
|
||||
<string name="staking_account_initialization_message">ステーキングを始めるには、1 TONの自己取引によってTONアカウントを有効化する必要があります。資金はウォレット内にそのまま残ります。これは、ステーキング有効化のためのステップにすぎません。</string>
|
||||
<string name="staking_account_initialization_title">アカウントの有効化</string>
|
||||
<string name="staking_amount_requirement_error">ステーキング金額は %s 以上である必要があります</string>
|
||||
<string name="staking_amount_tron_integer_error">ネットワークルールにより、ステーキング金額は%1$s TRX に切り上げられます。</string>
|
||||
<string name="staking_amount_tron_integer_error_unstaking">ネットワークルールにより、ステーキング解除の量は%1$s TRX に切り上げられます。</string>
|
||||
|
|
@ -1154,6 +1161,8 @@
|
|||
<string name="staking_notification_restake_rewards_text">獲得した報酬をステーキングに再投資し、潜在的な収益を増やします。</string>
|
||||
<string name="staking_notification_restake_text">再ステーキングを使うと、ステーキングを解除することなく、あるバリデータから別のバリデータに資金を移動できます。</string>
|
||||
<string name="staking_notification_stake_entire_balance_text">残高のすべてをステーキングしようとしています。ステーキング解除や報酬請求にかかるネットワーク手数料をカバーするために、少額を残しておくことをお勧めします。</string>
|
||||
<string name="staking_notification_ton_account_initialization_message">ステーキングを始めるには、TONアカウントを1 TONの自己取引で有効化する必要があります。資金はウォレット内にそのまま残り、この手順でステーキング用にアカウントを有効化できます。</string>
|
||||
<string name="staking_notification_ton_account_initialization_title">アカウントの有効化</string>
|
||||
<string name="staking_notification_ton_activate_account">TONのステーキングを開始するには、まず自分のアドレスに少額の取引を送信します。これによりウォレットが有効になります。</string>
|
||||
<string name="staking_notification_ton_extra_reserve_info">取引を完了するには、ネットワーク手数料に加えて最大0.2TONが必要になる場合があります。未使用分は返金されます。</string>
|
||||
<string name="staking_notification_ton_extra_reserve_is_required">この操作を続行するには、ネットワーク手数料に加えて0.2 TONが必要です。残高を補充してください。</string>
|
||||
|
|
@ -1186,6 +1195,7 @@
|
|||
<string name="staking_reward_schedule_month">毎月</string>
|
||||
<string name="staking_reward_schedule_week">毎週</string>
|
||||
<string name="staking_rewards">報酬</string>
|
||||
<string name="staking_soloana_details_auto_claiming_rewards_daily_text">Solanaの報酬は自動的にステーキング残高に追加され、個別に表示することはできません。</string>
|
||||
<string name="staking_stake_locked">ステーキングはロックされています</string>
|
||||
<string name="staking_stake_more">もっとステーキングする</string>
|
||||
<string name="staking_stake_more_button_unavailability_reason">%1$sをステーキングすると、 %2$s残高全体がステーキングされます。Tangemウォレットに入金した追加の%2$sも、自動的にステーキングされます。</string>
|
||||
|
|
@ -1647,6 +1657,13 @@
|
|||
<string name="wc_uri_already_used_title">URIはすでに使用されています</string>
|
||||
<string name="wc_wallet_connect">WalletConnect</string>
|
||||
<string name="wc_warning_transaction">不審な取引</string>
|
||||
<string name="welcome_create_wallet_feature_class">業界最高水準のハードウェアウォレット</string>
|
||||
<string name="welcome_create_wallet_feature_delivery">迅速な配送</string>
|
||||
<string name="welcome_create_wallet_feature_use">シンプルな操作</string>
|
||||
<string name="welcome_create_wallet_hardware_description">Tangemでハードウェアウォレットを作成しましょう。銀行のカードのようにスリムで、金庫のように安全です。</string>
|
||||
<string name="welcome_create_wallet_mobile_description">ソフトウェアウォレットを作成またはインポート</string>
|
||||
<string name="welcome_create_wallet_mobile_title">モバイルウォレットから始める</string>
|
||||
<string name="welcome_create_wallet_other_method">その他の方法</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>
|
||||
|
|
|
|||
|
|
@ -1,8 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<resources>
|
||||
<string name="access_code_alert_skip_description">Ваш кошелёк не защищён без кода доступа.</string>
|
||||
<string name="account_archived_recover_error_message">Лимит в 20 активных аккаунтов достигнут. Пожалуйста, зархивируйте один аккаунт, чтобы продолжить.</string>
|
||||
<string name="account_archived_recover_error_title">Невозможно восстановить аккаунт</string>
|
||||
<string name="account_details_archive_action">Архив</string>
|
||||
<string name="account_details_archive_description">Вы архивируете свой аккаунт, но в любое время можете вернуть его обратно</string>
|
||||
<string name="account_form_name_already_exist_error_description">Имя аккаунта уже существует</string>
|
||||
<string name="account_form_placeholder_edit_account">Аккаунт</string>
|
||||
<string name="account_form_placeholder_new_account">Новый аккаунт</string>
|
||||
<string name="account_main_account_title">Основной аккаунт</string>
|
||||
|
|
@ -118,6 +121,7 @@
|
|||
<string name="cardano_max_amount_has_token_title">Недостаточно ADA</string>
|
||||
<string name="common_accept">Принять</string>
|
||||
<string name="common_access_denied">Доступ запрещен</string>
|
||||
<string name="common_activate">Активировать</string>
|
||||
<string name="common_add">Добавить</string>
|
||||
<string name="common_add_to_portfolio">Добавить в портфель</string>
|
||||
<string name="common_add_token">Добавить токен</string>
|
||||
|
|
@ -188,6 +192,7 @@
|
|||
<string name="common_fee_selector_option_slow">Медленно</string>
|
||||
<string name="common_fee_selector_title">Скорость и комиссия</string>
|
||||
<string name="common_finish">Завершить</string>
|
||||
<string name="common_from">Из</string>
|
||||
<string name="common_generate_addresses">Синхронизировать адреса</string>
|
||||
<string name="common_go_to_provider">К провайдеру</string>
|
||||
<string name="common_go_to_token">Перейти в токен</string>
|
||||
|
|
@ -859,6 +864,7 @@
|
|||
<string name="receive_bottom_sheet_warning_message_full">Отправляйте только %s на этот адрес. Использование другой сети может привести к утрате средств.</string>
|
||||
<string name="receive_bottom_sheet_warning_title">Отправляйте только %1$s в сети %2$s</string>
|
||||
<string name="receive_token_description">Переводите средства с любого кошелька или биржи</string>
|
||||
<string name="referral_address_for_rewards">Адрес для начислений</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>
|
||||
|
|
@ -1035,6 +1041,9 @@
|
|||
<string name="settings_forget_wallet_footer">Это приведет к удалению кошелька из приложения. Сам кошелек можно добавить снова.</string>
|
||||
<string name="settings_wallet_name_title">Имя</string>
|
||||
<string name="stake_token_description">Заставьте ваш токен работать</string>
|
||||
<string name="staking_account_initialization_footer">Сетевая комиссия — это небольшая плата за обработку и подтверждение вашей транзакции в блокчейне.</string>
|
||||
<string name="staking_account_initialization_message">Чтобы начать стейкинг, ваш TON-аккаунт должен быть активирован транзакцией самому себе на 1 TON. Средства остаются в вашем кошельке — этот шаг лишь активирует ваш аккаунт для участия в стейкинге.</string>
|
||||
<string name="staking_account_initialization_title">Активация аккаунта</string>
|
||||
<string name="staking_amount_requirement_error">Сумма для стейкинга должна быть не менее %s</string>
|
||||
<string name="staking_amount_tron_integer_error">Согласно правилам сети, сумма стейкинга будет округлена до %1$sTRX.</string>
|
||||
<string name="staking_amount_tron_integer_error_unstaking">Сумма для вывода из стейкинга будет округлена до %1$s TRX ввиду особенностей сети.</string>
|
||||
|
|
@ -1098,6 +1107,8 @@
|
|||
<string name="staking_notification_restake_rewards_text">Реинвестируйте свои заработанные награды в вашу застейканную сумму, увеличивая потенциальный доход</string>
|
||||
<string name="staking_notification_restake_text">Рестейк позволяет вам переместить средства из одного валидатора в другого без необходимости выхода из стейкинга.</string>
|
||||
<string name="staking_notification_stake_entire_balance_text">Вы собираетесь застейкать весь баланс, рекомендуем оставить небольшую сумму для оплаты комиссии сети при выходе из стейкинга или получении награды.</string>
|
||||
<string name="staking_notification_ton_account_initialization_message">Чтобы начать стейкинг, ваш TON-аккаунт должен быть активирован транзакцией самому себе на 1 TON. Средства остаются в вашем кошельке — этот шаг лишь активирует ваш аккаунт для участия в стейкинге.</string>
|
||||
<string name="staking_notification_ton_account_initialization_title">Активация аккаунта</string>
|
||||
<string name="staking_notification_ton_activate_account">Чтобы начать стейкинг в TON, сначала отправьте небольшую транзакцию на свой же адрес — это активирует ваш кошелёк.</string>
|
||||
<string name="staking_notification_ton_extra_reserve_info">До 0.2 TON может потребоваться сверх сетевой комиссии для завершения транзакции. Неиспользованная часть будет возвращена.</string>
|
||||
<string name="staking_notification_ton_extra_reserve_is_required">Для выполнения операции требуется дополнительно 0.2 TON, помимо сетевой комиссии. Пожалуйста, пополните баланс.</string>
|
||||
|
|
@ -1130,6 +1141,7 @@
|
|||
<string name="staking_reward_schedule_month">Месяц</string>
|
||||
<string name="staking_reward_schedule_week">Еженедельно</string>
|
||||
<string name="staking_rewards">Вознаграждения</string>
|
||||
<string name="staking_soloana_details_auto_claiming_rewards_daily_text">Вознаграждения в сети Solana автоматически добавляются к вашему стейкинг-балансу и не могут отображаться отдельно.</string>
|
||||
<string name="staking_stake_locked">Стейкинг закрыт</string>
|
||||
<string name="staking_stake_more">Застейкать еще</string>
|
||||
<string name="staking_stake_more_button_unavailability_reason">При стейкинге %1$s используется весь ваш баланс в %2$s. Любой дополнительный %2$s депозит будет автоматически застейкан.</string>
|
||||
|
|
@ -1169,6 +1181,7 @@
|
|||
<string name="story_web3_title">Поддержка Web 3.0</string>
|
||||
<string name="sui_not_enough_coin_for_fee_description">Для отправки требуется входящая транзакция на сумму не менее %1$s</string>
|
||||
<string name="sui_not_enough_coin_for_fee_title">Недостаточно средств</string>
|
||||
<string name="swap_approve_description">Подтверждая, вы разрешаете смарт-контракту использовать ваши токены в будущих транзакциях.</string>
|
||||
<string name="swap_give_permission_fee_footer">Комиссия сети за одобрение токена будет взиматься за подтверждение того, что именно вы разрешаете использовать ваш токен для обмена.</string>
|
||||
<string name="swap_promo_text">Обменивайте больше токенов по лучшим курсам прямо в вашем кошельке.</string>
|
||||
<string name="swap_promo_title">Новый провайдер обмена!</string>
|
||||
|
|
@ -1227,6 +1240,7 @@
|
|||
<string name="token_details_token_type_subtitle_no_standard">Токен в сети %%image%% %1$s</string>
|
||||
<string name="token_details_unable_hide_alert_message">Токен %1$s (%2$s) является основной валютой в сети %3$s и не может быть скрыт до тех пор, пока у вас в списке есть другие токены этой сети</string>
|
||||
<string name="token_details_unable_hide_alert_title">Невозможно скрыть %s</string>
|
||||
<string name="token_receive_show_qr_code_title">Показать QR код</string>
|
||||
<string name="token_swap_changelly_promotion_message">Обменивайте этот токен на другие с %1$s комиссии за обслуживание с %2$s по %3$s февраля.</string>
|
||||
<string name="token_swap_changelly_promotion_title">Обмен с Changelly, %s комиссии</string>
|
||||
<string name="token_swap_promotion_button">Обменять</string>
|
||||
|
|
@ -1516,6 +1530,7 @@
|
|||
<string name="wc_no_wallet_changes_detected">Изменения в кошельке не обнаружены.</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_send_anyway">Подписать всё равно</string>
|
||||
<string name="wc_signature_type">Тип подписи</string>
|
||||
|
|
@ -1544,4 +1559,13 @@
|
|||
<string name="xtz_withdrawal_message_ignore">Нет, отправить все</string>
|
||||
<string name="xtz_withdrawal_message_reduce">Уменьшить на %s XTZ</string>
|
||||
<string name="xtz_withdrawal_message_warning">Чтобы не платить повышенную комиссию при следующем пополнении кошелька, уменьшите сумму на %s XTZ</string>
|
||||
<string name="yield_module_chart_loading_error">Невозможно загрузить график</string>
|
||||
<string name="yield_module_deposit_error_notification_title">Полученная сумма, %1$s %2$s, не была зачислена на Aave.</string>
|
||||
<string name="yield_module_high_fee_error">Сетевая комиссия сейчас слишком высокая. Ожидаем, пока она упадёт ниже вашего лимита.</string>
|
||||
<string name="yield_module_historical_returns">Историческая доходность</string>
|
||||
<string name="yield_module_network_fee_unreachable_notification_description">Проверьте ваше интернет соединение</string>
|
||||
<string name="yield_module_supply_apr">Годовая доходность</string>
|
||||
<string name="yield_module_unavailable_subtitle">Сервис начисления процентов в данный момент недоступен. Пожалуйста, попробуйте позже.</string>
|
||||
<string name="yield_module_unavailable_title">Данные о доходе недоступны</string>
|
||||
<string name="yield_supply_chart_loading_error">Невозможно загрузить график</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -1183,8 +1183,12 @@
|
|||
<string name="unlock_wallet_description_full">Використовуйте %s або відскануйте картку/кільце, щоб отримати доступ до свого гаманця</string>
|
||||
<string name="unsupported_wc_version">Не вдалося встановити з\'єднання: Цей dApp використовує Wallet Connect версії 1.0, яка не підтримується. Будь ласка, переконайтеся, що dApp підтримує Wallet Connect версії 2.0 для успішного підключення.</string>
|
||||
<string name="user_push_notification_agreement_argument_one">Будьте в курсі останніх функцій та новин</string>
|
||||
<string name="user_push_notification_agreement_argument_one_subtitle">Миттєві сповіщення про транзакції, обміни та важливі оновлення.</string>
|
||||
<string name="user_push_notification_agreement_argument_one_title">Сповіщення про транзакції</string>
|
||||
<string name="user_push_notification_agreement_argument_three">Отримуйте сповіщення про вхідні транзакції</string>
|
||||
<string name="user_push_notification_agreement_argument_two">Дізнавайтеся першими про нові акції</string>
|
||||
<string name="user_push_notification_agreement_argument_two_subtitle">Ранній доступ до нових функцій та ексклюзивних пропозицій.</string>
|
||||
<string name="user_push_notification_agreement_argument_two_title">Нові функції та важливі новини</string>
|
||||
<string name="user_push_notification_agreement_header">Бажаєте використовувати Push-повідомлення?</string>
|
||||
<string name="user_wallet_list_add_button">Додати новий гаманець</string>
|
||||
<string name="user_wallet_list_delete_prompt">Ви впевнені, що хочете видалити цей гаманець?</string>
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
<string name="account_archived_recover">Recover</string>
|
||||
<string name="account_archived_recover_dialog_description">You’re about to recover “%1$s”.</string>
|
||||
<string name="account_archived_recover_dialog_title">Recover account</string>
|
||||
<string name="account_archived_recover_error_message">You have already exceeded the limit of 20 active accounts. Archive one to recover</string>
|
||||
<string name="account_archived_recover_error_message">You have already exceeded the limit of 20 active accounts. Archive one to recover.</string>
|
||||
<string name="account_archived_recover_error_title">Can\'t recover account</string>
|
||||
<string name="account_archived_title">Archived</string>
|
||||
<string name="account_could_not_create">We couldn’t create account. Please try again later.</string>
|
||||
|
|
@ -355,6 +355,8 @@
|
|||
<string name="common_yes">Yes</string>
|
||||
<string name="contract_address_copied_message">Contract address copied!</string>
|
||||
<string name="currency_subtitle_expanded">Available networks</string>
|
||||
<string name="custom_token_another_account_dialog_description">Derivation of your token matches the derivation of %1$s. Your token will be added to this account.</string>
|
||||
<string name="custom_token_another_account_dialog_title">Derivation belongs to another account.</string>
|
||||
<string name="custom_token_contract_address_input_title">Contract address</string>
|
||||
<string name="custom_token_creation_error_invalid_contract_address">Contract address is invalid</string>
|
||||
<string name="custom_token_creation_error_network_not_selected">Please select the network</string>
|
||||
|
|
@ -1713,7 +1715,7 @@
|
|||
<string name="wc_no_wallet_changes_detected">No wallet changes detected</string>
|
||||
<string name="wc_notification_security_risk_subtitle">Potential risks or malicious behavior have been detected. Connecting or signing transactions may lead to loss of funds.</string>
|
||||
<string name="wc_notification_security_risk_title">Known security risk</string>
|
||||
<string name="wc_qr_scan_hint">Open Web3 app and chose WalletConnect option</string>
|
||||
<string name="wc_qr_scan_hint">Open the Web3 app and choose the WalletConnect option.</string>
|
||||
<string name="wc_request_from">Request from</string>
|
||||
<string name="wc_send_anyway">Sign anyway</string>
|
||||
<string name="wc_signature_type">Signature Type</string>
|
||||
|
|
@ -1729,6 +1731,13 @@
|
|||
<string name="wc_uri_already_used_title">URI already used</string>
|
||||
<string name="wc_wallet_connect">WalletConnect</string>
|
||||
<string name="wc_warning_transaction">Suspicious transaction</string>
|
||||
<string name="welcome_create_wallet_feature_class">Best in class hardware wallet</string>
|
||||
<string name="welcome_create_wallet_feature_delivery">Fast delivery</string>
|
||||
<string name="welcome_create_wallet_feature_use">Simple to use</string>
|
||||
<string name="welcome_create_wallet_hardware_description">Create a hardware wallet with Tangem. Slim as a bank card, secure as a bank vault.</string>
|
||||
<string name="welcome_create_wallet_mobile_description">Create or import a software wallet</string>
|
||||
<string name="welcome_create_wallet_mobile_title">Start with Mobile Wallet</string>
|
||||
<string name="welcome_create_wallet_other_method">Other method</string>
|
||||
<string name="welcome_interrupted_backup_alert_discard">Discard</string>
|
||||
<string name="welcome_interrupted_backup_alert_message">You have an interrupted backup. Do you want to resume?</string>
|
||||
<string name="welcome_interrupted_backup_alert_resume">Yes, resume</string>
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@ package com.tangem.domain.account.status.supplier
|
|||
import com.tangem.domain.account.models.AccountStatusList
|
||||
import com.tangem.domain.account.status.producer.SingleAccountStatusListProducer
|
||||
import com.tangem.domain.core.flow.FlowCachingSupplier
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
/**
|
||||
* Supplier that provides a single [AccountStatusList] for a specific user wallet.
|
||||
|
|
@ -12,4 +14,10 @@ import com.tangem.domain.core.flow.FlowCachingSupplier
|
|||
abstract class SingleAccountStatusListSupplier(
|
||||
override val factory: SingleAccountStatusListProducer.Factory,
|
||||
override val keyCreator: (SingleAccountStatusListProducer.Params) -> String,
|
||||
) : FlowCachingSupplier<SingleAccountStatusListProducer, SingleAccountStatusListProducer.Params, AccountStatusList>()
|
||||
) : FlowCachingSupplier<SingleAccountStatusListProducer, SingleAccountStatusListProducer.Params, AccountStatusList>() {
|
||||
|
||||
operator fun invoke(userWalletId: UserWalletId): Flow<AccountStatusList> {
|
||||
val params = SingleAccountStatusListProducer.Params(userWalletId)
|
||||
return this.invoke(params)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
package com.tangem.domain.tokens
|
||||
|
||||
import com.tangem.blockchain.common.Blockchain
|
||||
import com.tangem.blockchain.common.Token
|
||||
import org.rekotlin.Action
|
||||
|
||||
sealed interface TokensAction : Action {
|
||||
|
||||
/** Single way to pass data to the screen */
|
||||
sealed interface SetArgs : TokensAction {
|
||||
object ManageAccess : SetArgs
|
||||
object ReadAccess : SetArgs
|
||||
}
|
||||
}
|
||||
|
||||
data class TokenWithBlockchain(val token: Token, val blockchain: Blockchain)
|
||||
|
|
@ -13,7 +13,10 @@ import com.tangem.core.ui.message.DialogMessage
|
|||
import com.tangem.core.ui.message.EventMessageAction
|
||||
import com.tangem.core.ui.message.ToastMessage
|
||||
import com.tangem.domain.account.usecase.ArchiveCryptoPortfolioUseCase
|
||||
import com.tangem.domain.models.PortfolioId
|
||||
import com.tangem.domain.models.account.Account
|
||||
import com.tangem.domain.models.wallet.isMultiCurrency
|
||||
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
|
||||
import com.tangem.features.account.AccountDetailsComponent
|
||||
import com.tangem.features.account.createedit.entity.AccountCreateEditUMBuilder.Companion.portfolioIcon
|
||||
import com.tangem.features.account.details.entity.AccountDetailsUM
|
||||
|
|
@ -30,6 +33,7 @@ internal class AccountDetailsModel @Inject constructor(
|
|||
private val router: Router,
|
||||
override val dispatchers: CoroutineDispatcherProvider,
|
||||
private val archiveCryptoPortfolioUseCase: ArchiveCryptoPortfolioUseCase,
|
||||
private val getUserWalletUseCase: GetUserWalletUseCase,
|
||||
) : Model() {
|
||||
|
||||
private val params = paramsContainer.require<AccountDetailsComponent.Params>()
|
||||
|
|
@ -42,8 +46,11 @@ internal class AccountDetailsModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun onManageTokensClick() {
|
||||
// todo account add account param
|
||||
router.push(AppRoute.ManageTokens(source = AppRoute.ManageTokens.Source.SETTINGS))
|
||||
val route = AppRoute.ManageTokens(
|
||||
source = AppRoute.ManageTokens.Source.SETTINGS,
|
||||
portfolioId = PortfolioId(params.account.accountId),
|
||||
)
|
||||
router.push(route)
|
||||
}
|
||||
|
||||
private fun onArchiveAccountClick() {
|
||||
|
|
@ -89,6 +96,8 @@ internal class AccountDetailsModel @Inject constructor(
|
|||
)
|
||||
}
|
||||
}
|
||||
val isMultiCurrency = getUserWalletUseCase(params.account.accountId.userWalletId)
|
||||
.getOrNull()?.isMultiCurrency ?: false
|
||||
return AccountDetailsUM(
|
||||
accountName = params.account.accountName.toUM().value,
|
||||
accountIcon = params.account.portfolioIcon.toUM(),
|
||||
|
|
@ -96,6 +105,7 @@ internal class AccountDetailsModel @Inject constructor(
|
|||
onAccountEditClick = ::onEditAccountClick,
|
||||
onManageTokensClick = ::onManageTokensClick,
|
||||
archiveMode = archiveMode,
|
||||
isManageTokensAvailable = isMultiCurrency,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -7,6 +7,7 @@ internal data class AccountDetailsUM(
|
|||
val accountName: TextReference,
|
||||
val accountIcon: CryptoPortfolioIconUM,
|
||||
val archiveMode: ArchiveMode,
|
||||
val isManageTokensAvailable: Boolean,
|
||||
val onCloseClick: () -> Unit,
|
||||
val onAccountEditClick: () -> Unit,
|
||||
val onManageTokensClick: () -> Unit,
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ import com.tangem.common.ui.R
|
|||
import com.tangem.common.ui.account.AccountIconPreviewData
|
||||
import com.tangem.common.ui.account.AccountRow
|
||||
import com.tangem.core.ui.components.SpacerH
|
||||
import com.tangem.core.ui.components.SpacerH16
|
||||
import com.tangem.core.ui.components.appbar.AppBarWithBackButton
|
||||
import com.tangem.core.ui.components.buttons.SecondarySmallButton
|
||||
import com.tangem.core.ui.components.buttons.SmallButtonConfig
|
||||
|
|
@ -49,6 +48,7 @@ internal fun AccountDetailsContent(state: AccountDetailsUM, modifier: Modifier =
|
|||
)
|
||||
|
||||
Column(
|
||||
verticalArrangement = Arrangement.spacedBy(16.dp),
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(horizontal = TangemTheme.dimens.spacing16)
|
||||
|
|
@ -61,21 +61,22 @@ internal fun AccountDetailsContent(state: AccountDetailsUM, modifier: Modifier =
|
|||
style = TangemTheme.typography.h1,
|
||||
color = TangemTheme.colors.text.primary1,
|
||||
)
|
||||
SpacerH16()
|
||||
AccountRow(state)
|
||||
SpacerH16()
|
||||
ManageTokensRow(state)
|
||||
if (state.isManageTokensAvailable) {
|
||||
ManageTokensRow(state)
|
||||
}
|
||||
when (state.archiveMode) {
|
||||
is AccountDetailsUM.ArchiveMode.Available -> {
|
||||
SpacerH16()
|
||||
ArchiveAccountRow(state.archiveMode)
|
||||
SpacerH(8.dp)
|
||||
Text(
|
||||
modifier = Modifier.padding(horizontal = 12.dp),
|
||||
text = stringResourceSafe(R.string.account_details_archive_description),
|
||||
style = TangemTheme.typography.caption2,
|
||||
color = TangemTheme.colors.text.tertiary,
|
||||
)
|
||||
Column {
|
||||
ArchiveAccountRow(state.archiveMode)
|
||||
SpacerH(8.dp)
|
||||
Text(
|
||||
modifier = Modifier.padding(horizontal = 12.dp),
|
||||
text = stringResourceSafe(R.string.account_details_archive_description),
|
||||
style = TangemTheme.typography.caption2,
|
||||
color = TangemTheme.colors.text.tertiary,
|
||||
)
|
||||
}
|
||||
}
|
||||
AccountDetailsUM.ArchiveMode.None -> Unit
|
||||
}
|
||||
|
|
@ -186,10 +187,12 @@ private class PreviewStateProvider : CollectionPreviewParameterProvider<AccountD
|
|||
),
|
||||
accountName = stringReference(accountName),
|
||||
accountIcon = portfolioIcon,
|
||||
isManageTokensAvailable = true,
|
||||
)
|
||||
add(first)
|
||||
portfolioIcon = AccountIconPreviewData.randomAccountIcon(letter = true)
|
||||
add(first.copy(accountIcon = portfolioIcon))
|
||||
add(first.copy(archiveMode = AccountDetailsUM.ArchiveMode.None))
|
||||
add(first.copy(isManageTokensAvailable = false))
|
||||
},
|
||||
)
|
||||
|
|
@ -2,21 +2,13 @@ package com.tangem.features.managetokens.component
|
|||
|
||||
import com.tangem.core.decompose.factory.ComponentFactory
|
||||
import com.tangem.core.ui.decompose.ComposableContentComponent
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
|
||||
interface ManageTokensComponent : ComposableContentComponent {
|
||||
|
||||
data class Params(
|
||||
val mode: ManageTokensMode,
|
||||
val source: ManageTokensSource,
|
||||
) {
|
||||
constructor(userWalletId: UserWalletId?, source: ManageTokensSource) : this(
|
||||
source = source,
|
||||
mode = userWalletId
|
||||
?.let { ManageTokensMode.Wallet(userWalletId) }
|
||||
?: ManageTokensMode.None,
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
interface Factory : ComponentFactory<Params, ManageTokensComponent>
|
||||
}
|
||||
|
|
@ -17,6 +17,13 @@ sealed interface ManageTokensMode {
|
|||
}
|
||||
|
||||
sealed interface AddCustomTokenMode {
|
||||
data class Wallet(val userWalletId: UserWalletId) : AddCustomTokenMode
|
||||
|
||||
val userWalletId: UserWalletId
|
||||
get() = when (this) {
|
||||
is Account -> accountId.userWalletId
|
||||
is Wallet -> userWalletId
|
||||
}
|
||||
|
||||
data class Wallet(override val userWalletId: UserWalletId) : AddCustomTokenMode
|
||||
data class Account(val accountId: AccountId) : AddCustomTokenMode
|
||||
}
|
||||
|
|
@ -25,6 +25,8 @@ dependencies {
|
|||
implementation(projects.common.ui)
|
||||
|
||||
/* Project - Domain */
|
||||
implementation(projects.domain.account.status)
|
||||
implementation(projects.domain.account)
|
||||
implementation(projects.domain.card)
|
||||
implementation(projects.domain.legacy)
|
||||
implementation(projects.domain.manageTokens)
|
||||
|
|
@ -35,6 +37,14 @@ dependencies {
|
|||
implementation(projects.domain.swap.models)
|
||||
implementation(projects.domain.notifications)
|
||||
|
||||
// region Project - Libs
|
||||
implementation(projects.libs.crypto)
|
||||
// endregion
|
||||
|
||||
// region Tangem SDKs
|
||||
implementation(tangemDeps.blockchain)
|
||||
// endregion
|
||||
|
||||
/* AndroidX */
|
||||
implementation(deps.androidx.activity.compose)
|
||||
implementation(deps.lifecycle.compose)
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ internal sealed class ManageTokensUM {
|
|||
isSavingInProgress: Boolean = this is ManageContent && this.isSavingInProgress,
|
||||
scrollToTop: StateEvent<Unit> = this.scrollToTop,
|
||||
needToInteractWithColdWallet: Boolean = this is ManageContent && this.needToInteractWithColdWallet,
|
||||
topBar: ManageTokensTopBarUM? = this.topBar,
|
||||
): ManageTokensUM {
|
||||
return when (this) {
|
||||
is ManageContent -> copy(
|
||||
|
|
@ -65,6 +66,7 @@ internal sealed class ManageTokensUM {
|
|||
isSavingInProgress = isSavingInProgress,
|
||||
scrollToTop = scrollToTop,
|
||||
needToInteractWithColdWallet = needToInteractWithColdWallet,
|
||||
topBar = topBar,
|
||||
)
|
||||
is ReadContent -> copy(
|
||||
search = search,
|
||||
|
|
@ -72,6 +74,7 @@ internal sealed class ManageTokensUM {
|
|||
isInitialBatchLoading = isInitialBatchLoading,
|
||||
isNextBatchLoading = isNextBatchLoading,
|
||||
scrollToTop = scrollToTop,
|
||||
topBar = topBar,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,13 +3,22 @@ package com.tangem.features.managetokens.model
|
|||
import arrow.core.getOrElse
|
||||
import com.arkivanov.decompose.router.slot.SlotNavigation
|
||||
import com.arkivanov.decompose.router.slot.activate
|
||||
import com.tangem.blockchain.common.Blockchain
|
||||
import com.tangem.common.ui.account.toUM
|
||||
import com.tangem.core.decompose.di.ModelScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.core.decompose.model.ParamsContainer
|
||||
import com.tangem.core.decompose.ui.UiMessageSender
|
||||
import com.tangem.core.ui.extensions.TextReference
|
||||
import com.tangem.core.ui.extensions.resourceReference
|
||||
import com.tangem.core.ui.extensions.wrappedList
|
||||
import com.tangem.core.ui.message.DialogMessage
|
||||
import com.tangem.core.ui.message.EventMessageAction
|
||||
import com.tangem.core.ui.message.SnackbarMessage
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier
|
||||
import com.tangem.domain.managetokens.GetSupportedNetworksUseCase
|
||||
import com.tangem.domain.models.account.AccountStatus
|
||||
import com.tangem.domain.models.network.Network
|
||||
import com.tangem.features.managetokens.component.AddCustomTokenMode
|
||||
import com.tangem.features.managetokens.component.CustomTokenSelectorComponent
|
||||
|
|
@ -25,10 +34,12 @@ import com.tangem.features.managetokens.entity.item.SelectableItemUM
|
|||
import com.tangem.features.managetokens.impl.R
|
||||
import com.tangem.features.managetokens.utils.mapper.toCurrencyNetworkModel
|
||||
import com.tangem.features.managetokens.utils.mapper.toDerivationPathModel
|
||||
import com.tangem.lib.crypto.derivation.AccountNodeRecognizer
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
import kotlinx.collections.immutable.toImmutableList
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.flow.update
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
|
@ -38,6 +49,8 @@ internal class CustomTokenSelectorModel @Inject constructor(
|
|||
override val dispatchers: CoroutineDispatcherProvider,
|
||||
private val getSupportedNetworksUseCase: GetSupportedNetworksUseCase,
|
||||
private val messageSender: UiMessageSender,
|
||||
private val singleAccountStatusListSupplier: SingleAccountStatusListSupplier,
|
||||
private val accountsFeatureToggles: AccountsFeatureToggles,
|
||||
paramsContainer: ParamsContainer,
|
||||
) : Model() {
|
||||
|
||||
|
|
@ -146,9 +159,8 @@ internal class CustomTokenSelectorModel @Inject constructor(
|
|||
return derivationPaths
|
||||
}
|
||||
|
||||
private suspend fun getSupportedNetworks(mode: AddCustomTokenMode): List<Network> = when (mode) {
|
||||
is AddCustomTokenMode.Account -> TODO("Account")
|
||||
is AddCustomTokenMode.Wallet -> getSupportedNetworksUseCase(mode.userWalletId).getOrElse { e ->
|
||||
private suspend fun getSupportedNetworks(mode: AddCustomTokenMode): List<Network> {
|
||||
return getSupportedNetworksUseCase(mode.userWalletId).getOrElse { e ->
|
||||
val message = SnackbarMessage(message = resourceReference(R.string.common_unknown_error))
|
||||
messageSender.send(message)
|
||||
|
||||
|
|
@ -168,7 +180,60 @@ internal class CustomTokenSelectorModel @Inject constructor(
|
|||
fun selectCustomDerivationPath(value: SelectedDerivationPath) {
|
||||
when (params) {
|
||||
is NetworkSelector -> return
|
||||
is DerivationPathSelector -> params.onDerivationPathSelected(value)
|
||||
is DerivationPathSelector -> if (accountsFeatureToggles.isFeatureEnabled) {
|
||||
params.checkAccountDerivation(value)
|
||||
} else {
|
||||
params.onDerivationPathSelected(value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun DerivationPathSelector.checkAccountDerivation(derivationPath: SelectedDerivationPath) =
|
||||
modelScope.launch {
|
||||
val accountName = derivationPath.id
|
||||
?.let { Blockchain.fromId(it.rawId.value) }?.let(::AccountNodeRecognizer)
|
||||
?.let { recognizer -> derivationPath.value.value?.let { recognizer.recognize(it) } }
|
||||
?.let { accountNode ->
|
||||
fun AccountStatus.CryptoPortfolio.sameNodeAndNotMain() = !this.account.isMainAccount &&
|
||||
this.account.derivationIndex.value.toLong() == accountNode
|
||||
|
||||
val accounts = singleAccountStatusListSupplier(mode.userWalletId)
|
||||
.first().accountStatuses
|
||||
val account = accounts.find {
|
||||
when (it) {
|
||||
is AccountStatus.CryptoPortfolio -> it.sameNodeAndNotMain()
|
||||
}
|
||||
}
|
||||
val accountName = when (account) {
|
||||
is AccountStatus.CryptoPortfolio -> account.account.accountName.toUM()
|
||||
null -> null
|
||||
}
|
||||
accountName
|
||||
}
|
||||
|
||||
if (accountName == null) {
|
||||
onDerivationPathSelected(derivationPath)
|
||||
} else {
|
||||
showAccountNameExist(
|
||||
accountName = accountName.value,
|
||||
onClick = { onDerivationPathSelected(derivationPath) },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun showAccountNameExist(accountName: TextReference, onClick: () -> Unit) {
|
||||
val firstAction = EventMessageAction(
|
||||
title = resourceReference(R.string.common_got_it),
|
||||
onClick = onClick,
|
||||
)
|
||||
val dialogMessage = DialogMessage(
|
||||
title = resourceReference(R.string.custom_token_another_account_dialog_title),
|
||||
message = resourceReference(
|
||||
R.string.custom_token_another_account_dialog_description,
|
||||
wrappedList(accountName),
|
||||
),
|
||||
firstActionBuilder = { firstAction },
|
||||
)
|
||||
messageSender.send(dialogMessage)
|
||||
}
|
||||
}
|
||||
|
|
@ -17,6 +17,7 @@ import com.tangem.core.ui.event.triggeredEvent
|
|||
import com.tangem.core.ui.extensions.resourceReference
|
||||
import com.tangem.core.ui.extensions.stringReference
|
||||
import com.tangem.core.ui.message.SnackbarMessage
|
||||
import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier
|
||||
import com.tangem.features.managetokens.analytics.CustomTokenAnalyticsEvent
|
||||
import com.tangem.features.managetokens.analytics.ManageTokensAnalyticEvent
|
||||
import com.tangem.features.managetokens.component.ManageTokensComponent
|
||||
|
|
@ -40,13 +41,14 @@ import kotlinx.coroutines.launch
|
|||
import timber.log.Timber
|
||||
import javax.inject.Inject
|
||||
|
||||
@Suppress("LongParameterList")
|
||||
@Suppress("LongParameterList", "LargeClass")
|
||||
@ModelScoped
|
||||
internal class ManageTokensModel @Inject constructor(
|
||||
override val dispatchers: CoroutineDispatcherProvider,
|
||||
private val router: Router,
|
||||
private val messageSender: UiMessageSender,
|
||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||
private val singleAccountStatusListSupplier: SingleAccountStatusListSupplier,
|
||||
manageTokensListManagerFactory: ManageTokensListManager.Factory,
|
||||
manageTokensUseCasesFacadeFactory: ManageTokensUseCasesFacade.Factory,
|
||||
paramsContainer: ParamsContainer,
|
||||
|
|
@ -86,6 +88,7 @@ internal class ManageTokensModel @Inject constructor(
|
|||
modelScope.launch {
|
||||
manageTokensListManager.launchPagination(isCollapsed = true)
|
||||
}
|
||||
checkIsSupportAddCustomTokens()
|
||||
}
|
||||
|
||||
fun reloadList() {
|
||||
|
|
@ -105,16 +108,34 @@ internal class ManageTokensModel @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private fun getTopBarInitialState(): ManageTokensTopBarUM = when (params.mode) {
|
||||
is ManageTokensMode.Wallet -> manageContentTopBar()
|
||||
is ManageTokensMode.Account -> ManageTokensTopBarUM.ReadContent(
|
||||
title = resourceReference(id = R.string.main_manage_tokens),
|
||||
onBackButtonClick = router::pop,
|
||||
)
|
||||
ManageTokensMode.None -> ManageTokensTopBarUM.ReadContent(
|
||||
title = resourceReference(R.string.common_search_tokens),
|
||||
onBackButtonClick = router::pop,
|
||||
)
|
||||
}
|
||||
|
||||
private fun manageContentTopBar() = ManageTokensTopBarUM.ManageContent(
|
||||
title = resourceReference(id = R.string.main_manage_tokens),
|
||||
onBackButtonClick = router::pop,
|
||||
endButton = TopAppBarButtonUM.Icon(
|
||||
iconRes = R.drawable.ic_plus_24,
|
||||
onClicked = ::navigateToAddCustomToken,
|
||||
),
|
||||
)
|
||||
|
||||
private fun createReadContentModel(): ManageTokensUM.ReadContent {
|
||||
return ManageTokensUM.ReadContent(
|
||||
popBack = router::pop,
|
||||
isInitialBatchLoading = true,
|
||||
isNextBatchLoading = false,
|
||||
items = getLoadingItems(),
|
||||
topBar = ManageTokensTopBarUM.ReadContent(
|
||||
title = resourceReference(R.string.common_search_tokens),
|
||||
onBackButtonClick = router::pop,
|
||||
),
|
||||
topBar = getTopBarInitialState(),
|
||||
search = SearchBarUM(
|
||||
placeholderText = resourceReference(R.string.common_search),
|
||||
query = "",
|
||||
|
|
@ -132,14 +153,7 @@ internal class ManageTokensModel @Inject constructor(
|
|||
isInitialBatchLoading = true,
|
||||
isNextBatchLoading = false,
|
||||
items = getLoadingItems(),
|
||||
topBar = ManageTokensTopBarUM.ManageContent(
|
||||
title = resourceReference(id = R.string.main_manage_tokens),
|
||||
onBackButtonClick = router::pop,
|
||||
endButton = TopAppBarButtonUM.Icon(
|
||||
iconRes = R.drawable.ic_plus_24,
|
||||
onClicked = ::navigateToAddCustomToken,
|
||||
),
|
||||
),
|
||||
topBar = getTopBarInitialState(),
|
||||
search = SearchBarUM(
|
||||
placeholderText = resourceReference(R.string.common_search),
|
||||
query = "",
|
||||
|
|
@ -174,6 +188,20 @@ internal class ManageTokensModel @Inject constructor(
|
|||
.launchIn(modelScope)
|
||||
}
|
||||
|
||||
private fun checkIsSupportAddCustomTokens() {
|
||||
when (val mode = params.mode) {
|
||||
is ManageTokensMode.Account -> modelScope.launch {
|
||||
val mainAccount = singleAccountStatusListSupplier(mode.accountId.userWalletId).first().mainAccount
|
||||
if (mode.accountId == mainAccount.account.accountId) {
|
||||
state.update { it.copySealed(topBar = manageContentTopBar()) }
|
||||
}
|
||||
}
|
||||
ManageTokensMode.None,
|
||||
is ManageTokensMode.Wallet,
|
||||
-> Unit // use init state
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateItems(items: ImmutableList<CurrencyItemUM>) {
|
||||
val updatedState = state.updateAndGet { state ->
|
||||
state.copySealed(
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ import com.tangem.core.ui.utils.WindowInsetsZero
|
|||
import com.tangem.core.ui.utils.rememberHideKeyboardNestedScrollConnection
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
import com.tangem.features.managetokens.component.ManageTokensComponent
|
||||
import com.tangem.features.managetokens.component.ManageTokensMode
|
||||
import com.tangem.features.managetokens.component.ManageTokensSource
|
||||
import com.tangem.features.managetokens.component.preview.PreviewManageTokensComponent
|
||||
import com.tangem.features.managetokens.entity.item.CurrencyItemUM
|
||||
|
|
@ -442,20 +443,23 @@ private class PreviewManageTokensComponentProvider : PreviewParameterProvider<Ma
|
|||
showTangemIcon = true,
|
||||
params = ManageTokensComponent.Params(
|
||||
source = ManageTokensSource.ONBOARDING,
|
||||
userWalletId = UserWalletId("0x"),
|
||||
mode = ManageTokensMode.Wallet(UserWalletId("0x")),
|
||||
),
|
||||
),
|
||||
PreviewManageTokensComponent(
|
||||
isLoading = false,
|
||||
showTangemIcon = true,
|
||||
params = ManageTokensComponent.Params(source = ManageTokensSource.ONBOARDING, userWalletId = null),
|
||||
params = ManageTokensComponent.Params(
|
||||
source = ManageTokensSource.ONBOARDING,
|
||||
mode = ManageTokensMode.None,
|
||||
),
|
||||
),
|
||||
PreviewManageTokensComponent(
|
||||
isLoading = false,
|
||||
showTangemIcon = false,
|
||||
params = ManageTokensComponent.Params(
|
||||
source = ManageTokensSource.ONBOARDING,
|
||||
userWalletId = UserWalletId("0x"),
|
||||
mode = ManageTokensMode.Wallet(UserWalletId("0x")),
|
||||
),
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ import com.tangem.core.ui.message.DialogMessage
|
|||
import com.tangem.core.ui.message.EventMessageAction
|
||||
import com.tangem.core.ui.message.SnackbarMessage
|
||||
import com.tangem.core.ui.message.bottomSheetMessage
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
import com.tangem.domain.card.common.util.cardTypesResolver
|
||||
import com.tangem.domain.demo.IsDemoCardUseCase
|
||||
import com.tangem.domain.models.scan.CardDTO
|
||||
|
|
@ -81,6 +82,7 @@ internal class WalletSettingsModel @Inject constructor(
|
|||
private val isUpgradeWalletNotificationEnabledUseCase: IsUpgradeWalletNotificationEnabledUseCase,
|
||||
private val dismissUpgradeWalletNotificationUseCase: DismissUpgradeWalletNotificationUseCase,
|
||||
private val unlockHotWalletContextualUseCase: UnlockHotWalletContextualUseCase,
|
||||
private val accountsFeatureToggles: AccountsFeatureToggles,
|
||||
) : Model() {
|
||||
|
||||
val params: WalletSettingsComponent.Params = paramsContainer.require()
|
||||
|
|
@ -173,6 +175,7 @@ internal class WalletSettingsModel @Inject constructor(
|
|||
isUpgradeNotificationEnabled: Boolean,
|
||||
accountList: List<WalletSettingsAccountsUM>,
|
||||
): PersistentList<WalletSettingsItemUM> {
|
||||
val accountsFeatureEnabled = accountsFeatureToggles.isFeatureEnabled
|
||||
val isMultiCurrency = when (userWallet) {
|
||||
is UserWallet.Cold -> userWallet.isMultiCurrency
|
||||
is UserWallet.Hot -> true
|
||||
|
|
@ -188,7 +191,7 @@ internal class WalletSettingsModel @Inject constructor(
|
|||
is UserWallet.Cold -> userWallet.scanResponse.card.backupStatus == CardDTO.BackupStatus.NoBackup
|
||||
is UserWallet.Hot -> false
|
||||
},
|
||||
isManageTokensAvailable = isMultiCurrency,
|
||||
isManageTokensAvailable = !accountsFeatureEnabled && isMultiCurrency,
|
||||
isNFTFeatureEnabled = isMultiCurrency,
|
||||
isNFTEnabled = isNFTEnabled,
|
||||
onCheckedNFTChange = ::onCheckedNFTChange,
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import com.tangem.core.ui.components.block.model.BlockUM
|
|||
import com.tangem.core.ui.components.label.entity.LabelStyle
|
||||
import com.tangem.core.ui.components.label.entity.LabelUM
|
||||
import com.tangem.core.ui.extensions.resourceReference
|
||||
import com.tangem.domain.models.PortfolioId
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.feature.walletsettings.analytics.Settings
|
||||
import com.tangem.feature.walletsettings.entity.WalletSettingsAccountsUM
|
||||
|
|
@ -207,7 +208,7 @@ internal class ItemsBuilder @Inject constructor(
|
|||
iconRes = R.drawable.ic_tether_24,
|
||||
onClick = {
|
||||
analyticsEventHandler.send(Settings.ButtonManageTokens)
|
||||
router.push(AppRoute.ManageTokens(Source.SETTINGS, userWalletId))
|
||||
router.push(AppRoute.ManageTokens(Source.SETTINGS, PortfolioId(userWalletId)))
|
||||
},
|
||||
).let(::add)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,11 +10,9 @@ import com.tangem.domain.models.wallet.UserWallet
|
|||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
import com.tangem.domain.models.wallet.isLocked
|
||||
import com.tangem.domain.nft.analytics.NFTAnalyticsEvent
|
||||
import com.tangem.domain.redux.ReduxStateHolder
|
||||
import com.tangem.domain.settings.ShouldShowMarketsTooltipUseCase
|
||||
import com.tangem.domain.tokens.GetCryptoCurrencyActionsUseCase
|
||||
import com.tangem.domain.tokens.GetSingleCryptoCurrencyStatusUseCase
|
||||
import com.tangem.domain.tokens.TokensAction
|
||||
import com.tangem.domain.tokens.model.TokenActionsState
|
||||
import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase
|
||||
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
|
||||
|
|
@ -39,8 +37,6 @@ internal interface WalletContentClickIntents {
|
|||
|
||||
fun onDetailsClick()
|
||||
|
||||
fun onManageTokensClick()
|
||||
|
||||
fun onOrganizeTokensClick()
|
||||
|
||||
fun onDismissMarketsOnboarding()
|
||||
|
|
@ -81,7 +77,6 @@ internal class WalletContentClickIntentsImplementor @Inject constructor(
|
|||
private val getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase,
|
||||
private val shouldShowMarketsTooltipUseCase: ShouldShowMarketsTooltipUseCase,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
private val reduxStateHolder: ReduxStateHolder,
|
||||
private val walletEventSender: WalletEventSender,
|
||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||
private val hotWalletFeatureToggles: HotWalletFeatureToggles,
|
||||
|
|
@ -122,11 +117,6 @@ internal class WalletContentClickIntentsImplementor @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
override fun onManageTokensClick() {
|
||||
reduxStateHolder.dispatch(action = TokensAction.SetArgs.ManageAccess)
|
||||
router.openManageTokensScreen(userWalletId = stateHolder.getSelectedWalletId())
|
||||
}
|
||||
|
||||
override fun onOrganizeTokensClick() {
|
||||
router.openOrganizeTokensScreen(userWalletId = stateHolder.getSelectedWalletId())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ package com.tangem.feature.wallet.presentation.router
|
|||
import com.arkivanov.decompose.router.slot.SlotNavigation
|
||||
import com.arkivanov.decompose.router.slot.activate
|
||||
import com.tangem.common.routing.AppRoute
|
||||
import com.tangem.common.routing.AppRoute.ManageTokens.Source
|
||||
import com.tangem.common.routing.AppRouter
|
||||
import com.tangem.core.decompose.di.ModelScoped
|
||||
import com.tangem.core.navigation.url.UrlOpener
|
||||
|
|
@ -86,10 +85,6 @@ internal class DefaultWalletRouter @Inject constructor(
|
|||
return router.stack.lastOrNull() is AppRoute.Wallet
|
||||
}
|
||||
|
||||
override fun openManageTokensScreen(userWalletId: UserWalletId) {
|
||||
router.push(AppRoute.ManageTokens(Source.SETTINGS, userWalletId))
|
||||
}
|
||||
|
||||
override fun openScanFailedDialog(onTryAgain: () -> Unit) {
|
||||
reduxStateHolder.dispatchDialogShow(StateDialog.ScanFailsDialog(StateDialog.ScanFailsSource.MAIN, onTryAgain))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,9 +49,6 @@ internal interface InnerWalletRouter {
|
|||
/** Is wallet last screen */
|
||||
fun isWalletLastScreen(): Boolean
|
||||
|
||||
/** Open manage tokens screen */
|
||||
fun openManageTokensScreen(userWalletId: UserWalletId)
|
||||
|
||||
/** Open scan failed dialog */
|
||||
fun openScanFailedDialog(onTryAgain: () -> Unit)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue