Updated on 2026-08-14

This commit is contained in:
Tangem 2025-05-12 18:48:54 +03:00
commit e6a322bb77
25 changed files with 620 additions and 262 deletions

View file

@ -534,13 +534,13 @@
<string name="nft_details_base_information">Basisinformationen</string>
<string name="nft_details_chain">Netzwerk</string>
<string name="nft_details_contract_address">Vertragsadresse</string>
<string name="nft_details_info_chain">Kontrollabschnitt</string>
<string name="nft_details_info_contract_address">Kontrollabschnitt</string>
<string name="nft_details_info_rarity_label">Kontrollabschnitt</string>
<string name="nft_details_info_rarity_rank">Kontrollabschnitt</string>
<string name="nft_details_info_token_address">Kontrollabschnitt</string>
<string name="nft_details_info_token_id">Kontrollabschnitt</string>
<string name="nft_details_info_token_standard">Kontrollabschnitt</string>
<string name="nft_details_info_chain">Chain ist die Blockchain, in der das NFT existiert.</string>
<string name="nft_details_info_contract_address">Die Vertragsadresse ist eine eindeutige Kennung für den Smart Contract, der die Token auf der Blockchain verwaltet.</string>
<string name="nft_details_info_rarity_label">Eine Bezeichnung, die beschreibt, wie selten das NFT ist. Je niedriger der Wert, desto einzigartiger das NFT.</string>
<string name="nft_details_info_rarity_rank">Die Position eines NFT im Seltenheitsranking unter anderen Token. Je höher der Rang, desto seltener und wertvoller ist das NFT.</string>
<string name="nft_details_info_token_address">Die Token-Adresse ist eine eindeutige Kennung für das Token in der Blockchain und ermöglicht die Verfolgung von Transaktionen und Eigentumsverhältnissen</string>
<string name="nft_details_info_token_id">Die Token-ID ist eine eindeutige Kennung, die jedem Token zugewiesen wird und es von anderen in der Sammlung unterscheidet.</string>
<string name="nft_details_info_token_standard">Der Token-Standard definiert, um welche Art von Token es sich handelt und wie es mit verschiedenen Wallets und Plattformen funktioniert</string>
<string name="nft_details_last_sale_price">Letzter Verkaufspreis</string>
<string name="nft_details_rarity_label">Raritätsetikett</string>
<string name="nft_details_rarity_rank">Seltenheitsgrad</string>
@ -553,7 +553,7 @@
<string name="nft_receive_available_section_title">Verfügbar</string>
<string name="nft_receive_choose_network">Netzwerk auswählen</string>
<string name="nft_receive_title">NFT erhalten</string>
<string name="nft_receive_unavailable_asset_warning_message">Du hast dieses Netzwerk noch nicht hinzugefügt. Um NFTs zu empfangen, füge es zum Hauptbildschirm hinzu!</string>
<string name="nft_receive_unavailable_asset_warning_message">Du hast dieses Netzwerk noch nicht hinzugefügt. Um NFTs zu erhalten, füge es Deinem Portfolio hinzu.</string>
<string name="nft_receive_unavailable_asset_warning_title">Netzwerk nicht hinzugefügt</string>
<string name="nft_receive_unavailable_section_title">Nicht hinzugefügt</string>
<string name="nft_send">NFT senden</string>
@ -1250,7 +1250,7 @@
<string name="wc_alert_connection_timeout_description">Zeitüberschreitungsfehler. Bitte versuche es später erneut.</string>
<string name="wc_alert_connection_timeout_title">WalletConnect konnte nicht hergestellt werden</string>
<string name="wc_alert_domain_issues_description">Diese Domäne kann nicht verifiziert werden. Überprüfe die Anfrage sorgfältig und bestätige diese dann.</string>
<string name="wc_alert_session_disconnected_description">Geh zurück zu Deinem Browser und stell erneut eine Verbindung über WalletConnect her.</string>
<string name="wc_alert_session_disconnected_description">Bitte kehre zu Deinem Browser zurück und stellen die Verbindung über WalletConnect erneut her.</string>
<string name="wc_alert_session_disconnected_title">WalletConnect-Sitzung wurde getrennt</string>
<string name="wc_alert_unknown_error_description">Fehlercode: %s. Wenn das Problem weiterhin besteht, wende Dich bitte an unseren Support.</string>
<string name="wc_alert_unknown_error_title">Wir haben einen unbekannten Fehler festgestellt.</string>
@ -1258,8 +1258,9 @@
<string name="wc_alert_unsupported_networks_title">Nicht unterstützte Netzwerke</string>
<string name="wc_alert_verified_domain_description">Tangem unterstützt ein erforderliches Netzwerk um %s.</string>
<string name="wc_alert_verified_domain_title">Verifizierte Domain</string>
<string name="wc_alert_wrong_card_description">Falsche Karte oder falscher Ring in der Tangem-App ausgewählt</string>
<string name="wc_alert_wrong_card_description">Falsche Karte oder falscher Ring in der App ausgewählt</string>
<string name="wc_alert_wrong_card_title">Wir haben eine Art Problem</string>
<string name="wc_common_address">Vertragsadresse</string>
<string name="wc_common_connect">Verbinden</string>
<string name="wc_common_network">Netzwerk</string>
<string name="wc_common_networks">Netzwerke</string>
@ -1286,6 +1287,7 @@
<string name="wc_notification_security_risk_title">Bekanntes Sicherheitsrisiko</string>
<string name="wc_request_from">Anfrage von</string>
<string name="wc_signature_type">Art der Signatur</string>
<string name="wc_transaction_info_to_title">An</string>
<string name="wc_transaction_request">Transaktionsanfrage</string>
<string name="wc_transaction_request_title">Transaktionsanfrage</string>
<string name="wc_wallet_connect">Wallet verbinden</string>

View file

@ -527,13 +527,13 @@
<string name="nft_details_base_information">基本情報</string>
<string name="nft_details_chain">チェーン</string>
<string name="nft_details_contract_address">コントラクトアドレス</string>
<string name="nft_details_info_chain">スタブ</string>
<string name="nft_details_info_contract_address">スタブ</string>
<string name="nft_details_info_rarity_label">スタブ</string>
<string name="nft_details_info_rarity_rank">スタブ</string>
<string name="nft_details_info_token_address">スタブ</string>
<string name="nft_details_info_token_id">スタブ</string>
<string name="nft_details_info_token_standard">スタブ</string>
<string name="nft_details_info_chain">チェーンは、NFTが存在するブロックチェーンです。</string>
<string name="nft_details_info_contract_address">コントラクトアドレスは、ブロックチェーン上のトークンを管理するスマートコントラクトの識別子です。</string>
<string name="nft_details_info_rarity_label">NFTの希少性を示すラベル。数値が低いほどユニークなNFTであることを示します。</string>
<string name="nft_details_info_rarity_rank">他のトークンの中での希少性ランキングにおけるNFTの位置。ランクが高ければ高いほど、NFTの希少性と価値は高くなります。</string>
<string name="nft_details_info_token_address">トークンアドレスは、ブロックチェーン上のトークンの識別子であり、取引と所有権の追跡を可能にします</string>
<string name="nft_details_info_token_id">トークンIDは、各トークンに割り当てられる識別子であり、コレクション内の他のトークンと区別されます</string>
<string name="nft_details_info_token_standard">トークン標準は、トークンの種類と、さまざまなウォレットやプラットフォームでどのように機能するかを定義します</string>
<string name="nft_details_last_sale_price">最終販売価格</string>
<string name="nft_details_rarity_label">レアリティ・ラベル</string>
<string name="nft_details_rarity_rank">レアリティ・ランク</string>
@ -546,7 +546,7 @@
<string name="nft_receive_available_section_title">利用可能</string>
<string name="nft_receive_choose_network">ネットワークを選択</string>
<string name="nft_receive_title">NFTを受け取る</string>
<string name="nft_receive_unavailable_asset_warning_message">このネットワークはまだ追加されていません。NFTの受け取りを開始するには、メイン画面に追加してください。</string>
<string name="nft_receive_unavailable_asset_warning_message">このネットワークはまだ追加されていません。NFTを受け取るには、ポートフォリオに追加してください。</string>
<string name="nft_receive_unavailable_asset_warning_title">ネットワークが追加されていません</string>
<string name="nft_receive_unavailable_section_title">未追加</string>
<string name="nft_send">NFTを送信する</string>
@ -1234,7 +1234,7 @@
<string name="wc_alert_connection_timeout_description">タイムアウトエラーが発生しました。しばらくしてからもう一度お試しください。</string>
<string name="wc_alert_connection_timeout_title">WalletConnectを確立できませんでした</string>
<string name="wc_alert_domain_issues_description">このドメインは検証できません。承認前にリクエスト内容をよく確認してください。</string>
<string name="wc_alert_session_disconnected_description">ブラウザに戻り、WalletConnect経由で再接続してください。</string>
<string name="wc_alert_session_disconnected_description">ブラウザに戻り、WalletConnect経由で再接続してください。</string>
<string name="wc_alert_session_disconnected_title">WalletConnectセッションが接続解除されました</string>
<string name="wc_alert_unknown_error_description">エラーコード: %s 。問題が解決しない場合は、お気軽にサポートまでお問い合わせください。</string>
<string name="wc_alert_unknown_error_title">不明なエラーが発生しました</string>
@ -1242,7 +1242,7 @@
<string name="wc_alert_unsupported_networks_title">サポートされていないネットワーク</string>
<string name="wc_alert_verified_domain_description">Tangemは%sで必要なネットワークをサポートします。</string>
<string name="wc_alert_verified_domain_title">検証済みドメイン</string>
<string name="wc_alert_wrong_card_description">Tangemアプリで誤ったカードまたはリングが選択されました</string>
<string name="wc_alert_wrong_card_description">アプリで間違ったカードまたはリングが選択されました</string>
<string name="wc_alert_wrong_card_title">問題が起きています</string>
<string name="wc_common_address">アドレス</string>
<string name="wc_common_connect">接続する</string>

View file

@ -167,6 +167,7 @@
<string name="common_network_fee_title">Сетевая комиссия</string>
<string name="common_network_fee_warning_content">Сумма отправки будет уменьшена на %1$s (%2$s) для покрытия выбранного уровня комиссии</string>
<string name="common_next">Далее</string>
<string name="common_nft">NFT</string>
<string name="common_no">Нет</string>
<string name="common_no_address">Нет адреса</string>
<string name="common_now">Сейчас</string>
@ -189,6 +190,7 @@
<string name="common_search">Поиск</string>
<string name="common_search_tokens">Поиск токенов</string>
<string name="common_second_no_param">сек</string>
<string name="common_see_all">Показать всё</string>
<string name="common_seed_phrase">Seed-фраза</string>
<string name="common_select_action">Выберите действие</string>
<string name="common_sell">Продать</string>
@ -311,6 +313,7 @@
<string name="express_exchange_status_receiving">Ожидание депозита</string>
<string name="express_exchange_status_receiving_active">Ожидаем пополнения...</string>
<string name="express_exchange_status_refunded">Возвращено</string>
<string name="express_exchange_status_refunding">Возврат средств</string>
<string name="express_exchange_status_sending">Отправляем </string>
<string name="express_exchange_status_sending_active">Отправка средств...</string>
<string name="express_exchange_status_sent">Отправлено</string>
@ -450,6 +453,9 @@
<string name="markets_sort_by_top_gainers_title">Лидеры роста</string>
<string name="markets_sort_by_top_losers_title">Лидеры падения</string>
<string name="markets_sort_by_trending_title">В тренде</string>
<string name="markets_staking_banner_description_placeholder">Стейкинг — простой способ получать доход с вашей криптовалюты. %s</string>
<string name="markets_staking_banner_description_show_more">Показать больше</string>
<string name="markets_staking_banner_title">Получайте до %s APY</string>
<string name="markets_token_details_about_token_title">О %s</string>
<plurals name="markets_token_details_amount_exchanges">
<item quantity="one">%d биржа</item>
@ -521,6 +527,51 @@
<string name="markets_tooltip_message">Потяните вверх или коснитесь поисковой строки, чтобы добавить токены напрямую из рынка</string>
<string name="markets_tooltip_title">Добавить токены</string>
<string name="nfc_error_unavailable">Функция NFC недоступна на вашем устройстве</string>
<string name="nft_about_title">Об NFT</string>
<string name="nft_asset">NFT</string>
<plurals name="nft_collections_count">
<item quantity="one">NFT</item>
<item quantity="few">NFT</item>
<item quantity="many">NFT</item>
<item quantity="other">NFT</item>
</plurals>
<string name="nft_collections_empty_description">Здесь будут отображаться NFT, полученные на ваш кошелёк</string>
<string name="nft_collections_empty_title">У вас ещё нет коллекций</string>
<string name="nft_collections_receive">Получить NFT</string>
<string name="nft_collections_title">NFT коллекции</string>
<string name="nft_collections_warning_subtitle">Часть данных может не отобразиться</string>
<string name="nft_collections_warning_title">Не удалось загрузить данные</string>
<string name="nft_details_base_information">Базовая информация</string>
<string name="nft_details_chain">Сеть</string>
<string name="nft_details_contract_address">Адрес контракта</string>
<string name="nft_details_info_chain">Сеть — это блокчейн, на котором существует NFT.</string>
<string name="nft_details_info_contract_address">Адрес контракта — уникальный код, который идентифицирует смарт-контракт, управляющий токенами в блокчейне</string>
<string name="nft_details_info_rarity_label">Метка, которая описывает, насколько редким является NFT. Чем ниже значение, тем уникальнее NFT.</string>
<string name="nft_details_info_rarity_rank">Позиция NFT в рейтинге редкости среди других токенов. Чем выше ранг, тем реже и ценнее NFT.</string>
<string name="nft_details_info_token_address">Адрес токена — это уникальный идентификатор токена в блокчейне, который позволяет отслеживать транзакции и владение им.</string>
<string name="nft_details_info_token_id">ID токена — уникальный идентификатор, присваиваемый каждому токену, который отличает его от других в коллекции</string>
<string name="nft_details_info_token_standard">Стандарт токена определяет его тип и как он работает с различными кошельками и платформами</string>
<string name="nft_details_last_sale_price">Последняя цена продажи</string>
<string name="nft_details_rarity_label">Метка уникальности</string>
<string name="nft_details_rarity_rank">Ранг редкости</string>
<string name="nft_details_token_address">Адрес токена</string>
<string name="nft_details_token_id">ID токена</string>
<string name="nft_details_token_standard">Стандарт токена</string>
<string name="nft_details_traits">Черты</string>
<string name="nft_empty_search">Нет результатов. Пожалуйста, попробуйте другой запрос.</string>
<string name="nft_no_collection">Нет коллекции</string>
<string name="nft_receive_available_section_title">Доступно</string>
<string name="nft_receive_choose_network">Выберите сеть</string>
<string name="nft_receive_title">Получить NFT</string>
<string name="nft_receive_unavailable_asset_warning_message">Вы ещё не добавили эту сеть. Чтобы получать NFT, добавьте её в ваш портфель.</string>
<string name="nft_receive_unavailable_asset_warning_title">Сеть не добавлена</string>
<string name="nft_receive_unavailable_section_title">Не добавлено</string>
<string name="nft_send">Отправить NFT</string>
<string name="nft_traits_title">Черты</string>
<string name="nft_wallet_count">%1$d NFTs в %2$d коллекциях</string>
<string name="nft_wallet_receive_nft">Нажмите здесь, чтобы получить первую NFT</string>
<string name="nft_wallet_title">NFT коллекции</string>
<string name="nft_wallet_unable_to_load">Невозможно загрузить данные</string>
<string name="no_account_generic">Чтобы использовать сеть %1$s, вы должны оплатить резерв аккаунта (%2$s %3$s), который блокируется и не используется в вашем балансе</string>
<string name="no_account_polkadot">Аккаунт получателя не активирован. Отправьте %s или более для активации аккаунта.</string>
<string name="no_account_send_to_create">Для создания аккаунта отправьте средства на этот адрес</string>
@ -1024,6 +1075,8 @@
<string name="transaction_history_transaction_validator">валидатор: %s</string>
<string name="transfer_min_amount_error">Минимум %s</string>
<string name="transfer_notification_invalid_minimum_transaction_amount_text">Минимальная сумма транзакции равна %1$s.</string>
<string name="tron_will_be_send_token_fee_description">Комиссии сети Tron для популярных токенов могут быть выше. Стейкинг TRX может помочь снизить расходы на транзакции.</string>
<string name="tron_will_be_send_token_fee_title">Экономьте на Tron комиссиях</string>
<string name="try_to_load_data_again_button_title">Попробовать снова</string>
<string name="twin_error_same_card">Вы отсканировали ту же карту. Для создания twin-кошелька вам необходимо отсканировать карту с номером %d</string>
<string name="twin_error_wrong_twin">Вы отсканировали не ту twin-карту. Пожалуйста, попробуйте отсканировать другую</string>
@ -1184,6 +1237,20 @@
<string name="warning_testnet_card_message">Это Testnet карта. Он не может обрабатывать транзакции и используется только в целях тестирования и разработки.</string>
<string name="warning_testnet_card_title">Только для целей тестирования</string>
<string name="warning_token_balance_not_updated">Возможно, баланс устарел. Обновите страницу.</string>
<string name="wc_alert_session_disconnected_description">Пожалуйста, вернитесь в браузер и выполните повторное подключение через WalletConnect.</string>
<string name="wc_alert_wrong_card_description">Выбрана не верная карта или кольцо</string>
<string name="wc_common_address">Адрес</string>
<string name="wc_common_connect">Подключение</string>
<string name="wc_connection_reqeust_can_view_balance">Посмотреть баланс кошелька и его активность</string>
<string name="wc_connection_request">Запрос на подключение</string>
<string name="wc_contents">Вложение</string>
<string name="wc_copy_data_button_text">Копировать данные</string>
<string name="wc_request_from">Запрос от</string>
<string name="wc_signature_type">Тип подписи</string>
<string name="wc_transaction_info_to_title">На</string>
<string name="wc_transaction_request">Запрос транзакции</string>
<string name="wc_transaction_request_title">Запрос транзакции</string>
<string name="wc_wallet_connect">Подключение кошелька</string>
<string name="welcome_interrupted_backup_alert_discard">Отказаться</string>
<string name="welcome_interrupted_backup_alert_message">Вы не закончили резервное копирование. Хотите продолжить?</string>
<string name="welcome_interrupted_backup_alert_resume">Да, возобновить</string>

View file

@ -535,13 +535,13 @@
<string name="nft_details_base_information">Base information</string>
<string name="nft_details_chain">Chain</string>
<string name="nft_details_contract_address">Contract Address</string>
<string name="nft_details_info_chain">stub</string>
<string name="nft_details_info_contract_address">stub</string>
<string name="nft_details_info_rarity_label">stub</string>
<string name="nft_details_info_rarity_rank">stub</string>
<string name="nft_details_info_token_address">stub</string>
<string name="nft_details_info_token_id">stub</string>
<string name="nft_details_info_token_standard">stub</string>
<string name="nft_details_info_chain">Chain is the blockchain where the NFT exists.</string>
<string name="nft_details_info_contract_address">The contract address is a unique identifier for the smart contract that governs the tokens on the blockchain</string>
<string name="nft_details_info_rarity_label">A label that describes how rare the NFT is. The lower the value, the more unique the NFT.</string>
<string name="nft_details_info_rarity_rank">The position of an NFT in the rarity ranking among other tokens. The higher the rank, the rarer and more valuable the NFT.</string>
<string name="nft_details_info_token_address">The token address is a unique identifier for the token on the blockchain, allowing tracking of transactions and ownership</string>
<string name="nft_details_info_token_id">The token ID is a unique identifier assigned to each token, distinguishing it from others in the collection</string>
<string name="nft_details_info_token_standard">Token standard defines what type of token it is and how it works with different wallets and platforms</string>
<string name="nft_details_last_sale_price">Last sale price</string>
<string name="nft_details_rarity_label">Rarity label</string>
<string name="nft_details_rarity_rank">Rarity rank</string>
@ -554,7 +554,7 @@
<string name="nft_receive_available_section_title">Available</string>
<string name="nft_receive_choose_network">Choose network</string>
<string name="nft_receive_title">Receive NFT</string>
<string name="nft_receive_unavailable_asset_warning_message">You haven\'t added this network yet. To start receiving NFTs, add it to the main screen!</string>
<string name="nft_receive_unavailable_asset_warning_message">You haven\'t added this network yet. To receive NFTs, add it to your portfolio.</string>
<string name="nft_receive_unavailable_asset_warning_title">Network not added</string>
<string name="nft_receive_unavailable_section_title">Not Added</string>
<string name="nft_send">Send NFT</string>
@ -1121,7 +1121,7 @@
<string name="visa_onboarding_in_progress_issuer_description">This wont take long. Were completing the activation.</string>
<string name="visa_onboarding_in_progress_title">Getting everything ready!</string>
<string name="visa_onboarding_other_wallet">Other wallet</string>
<string name="visa_onboarding_pin_code_description">Set up a 4-digit code. It will be used for payments.</string>
<string name="visa_onboarding_pin_code_description">Set up a 4-digit code.\nIt will be used for payments.</string>
<string name="visa_onboarding_pin_code_navigation_title">PIN code</string>
<string name="visa_onboarding_pin_code_title">Create PIN Code</string>
<string name="visa_onboarding_pin_not_accepted">PIN was not accepted. Try again or use a different code.</string>
@ -1295,7 +1295,7 @@
<string name="wc_alert_connection_timeout_description">Timeout error. Please, try again later.</string>
<string name="wc_alert_connection_timeout_title">Failed to establish WalletConnect</string>
<string name="wc_alert_domain_issues_description">This domain cannot be verified. Check the request carefully approving.</string>
<string name="wc_alert_session_disconnected_description">Go back to your browser and connect via WalletConnect again.</string>
<string name="wc_alert_session_disconnected_description">Please return to your browser and reconnect via WalletConnect.</string>
<string name="wc_alert_session_disconnected_title">WalletConnect session was disconnected</string>
<string name="wc_alert_unknown_error_description">Error code: %s. If the problem persists — feel free to contact our support.</string>
<string name="wc_alert_unknown_error_title">We\'ve encountered unknown error</string>
@ -1303,8 +1303,9 @@
<string name="wc_alert_unsupported_networks_title">Unsuported networks</string>
<string name="wc_alert_verified_domain_description">Tangem support a required network by %s.</string>
<string name="wc_alert_verified_domain_title">Verified domain</string>
<string name="wc_alert_wrong_card_description">Wrong card or ring selected in Tangem App</string>
<string name="wc_alert_wrong_card_description">Wrong card or ring selected in the App</string>
<string name="wc_alert_wrong_card_title">We\'ve got some kind of problem</string>
<string name="wc_allow_to_spend">Allow to spend</string>
<string name="wc_common_address">Address</string>
<string name="wc_common_connect">Connect</string>
<string name="wc_common_network">Network</string>
@ -1320,6 +1321,7 @@
<string name="wc_connections">Connections</string>
<string name="wc_contents">Contents</string>
<string name="wc_copy_data_button_text">Copy data</string>
<string name="wc_custom_allowance_title">Custom allowance</string>
<string name="wc_disconnect_all">Disconnect all</string>
<string name="wc_disconnect_all_alert_desc">Text about discnected all dApps</string>
<string name="wc_disconnect_all_alert_title">Disconect All dApps</string>

View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="13dp"
android:height="13dp"
android:viewportWidth="13"
android:viewportHeight="13">
<path
android:pathData="M11.149,0.969C10.775,0.595 10.169,0.595 9.795,0.969L8.567,2.197L10.803,4.433L12.031,3.205C12.405,2.831 12.405,2.225 12.031,1.851L11.149,0.969Z"
android:fillColor="#919191"/>
<path
android:pathData="M9.893,5.342L7.657,3.106L1.047,9.716C0.899,9.865 0.803,10.058 0.775,10.267L0.524,12.153C0.499,12.34 0.659,12.5 0.847,12.476L2.733,12.224C2.941,12.196 3.135,12.101 3.283,11.952L9.893,5.342Z"
android:fillColor="#919191"/>
</vector>

View file

@ -20,7 +20,7 @@ internal class WcSignTransactionComponent(
if (content != null) {
WcSignTransactionModalBottomSheetContent(
state = content,
state = content.transaction,
onClickTransactionRequest = transactionInfoOnClick,
)
}

View file

@ -18,7 +18,7 @@ internal class WcSignTransactionRequestInfoComponent(
val content = model.uiState.collectAsStateWithLifecycle().value
if (content != null) {
TransactionRequestInfoContent(content)
TransactionRequestInfoContent(content.transactionRequestInfo)
}
}
}

View file

@ -1,56 +0,0 @@
package com.tangem.features.walletconnect.transaction.entity
import androidx.annotation.DrawableRes
import androidx.compose.runtime.Immutable
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.core.ui.extensions.TextReference
import kotlinx.collections.immutable.ImmutableList
@Immutable
internal data class WcSignTransactionUM(
val actions: WcTransactionActionsUM,
val transaction: WcTransactionUM,
val transactionRequestInfo: WcTransactionRequestInfoUM,
) : TangemBottomSheetConfigContent
@Immutable
internal data class WcTransactionUM(
val appName: String,
val appIcon: String,
val isVerified: Boolean,
val appSubtitle: String,
val walletName: String,
val networkInfo: WcNetworkInfoUM,
val addressText: String? = null,
val networkFee: String? = null,
val isLoading: Boolean = false,
)
@Immutable
internal data class WcTransactionRequestInfoUM(
val blocks: ImmutableList<WcTransactionRequestBlockUM>,
)
@Immutable
internal data class WcTransactionRequestBlockUM(
val info: ImmutableList<WcTransactionRequestInfoItemUM>,
)
@Immutable
internal data class WcTransactionRequestInfoItemUM(
val title: TextReference,
val description: String = "",
)
@Immutable
internal data class WcTransactionActionsUM(
val onDismiss: () -> Unit,
val onSign: () -> Unit,
val onCopy: () -> Unit,
)
@Immutable
internal data class WcNetworkInfoUM(
val name: String,
@DrawableRes val iconRes: Int,
)

View file

@ -0,0 +1,31 @@
package com.tangem.features.walletconnect.transaction.entity.approve
import androidx.annotation.DrawableRes
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.features.walletconnect.transaction.entity.common.WcNetworkInfoUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionAppInfoContentUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoUM
internal data class WcApproveTransactionUM(
val transaction: WcApproveTransactionItemUM,
val transactionRequestInfo: WcTransactionRequestInfoUM,
val customAllowance: WcCustomAllowanceUM,
)
internal data class WcApproveTransactionItemUM(
val onDismiss: () -> Unit,
val onSend: () -> Unit,
val appInfo: WcTransactionAppInfoContentUM,
val spendAllowance: WcSpendAllowanceUM? = null,
val walletName: String,
val networkInfo: WcNetworkInfoUM,
val networkFee: String? = null,
val isLoading: Boolean = false,
) : TangemBottomSheetConfigContent
internal data class WcCustomAllowanceUM(
@DrawableRes val networkIconRes: Int,
val tokenIconUrl: String,
val amountText: String,
val isUnlimited: Boolean,
)

View file

@ -0,0 +1,6 @@
package com.tangem.features.walletconnect.transaction.entity.approve
internal data class WcSpendAllowanceUM(
val amountText: String,
val tokenImageUrl: String,
)

View file

@ -0,0 +1,8 @@
package com.tangem.features.walletconnect.transaction.entity.common
import androidx.annotation.DrawableRes
internal data class WcNetworkInfoUM(
val name: String,
@DrawableRes val iconRes: Int,
)

View file

@ -0,0 +1,10 @@
package com.tangem.features.walletconnect.transaction.entity.common
import androidx.compose.runtime.Immutable
@Immutable
internal data class WcTransactionActionsUM(
val onDismiss: () -> Unit,
val onSign: () -> Unit,
val onCopy: () -> Unit,
)

View file

@ -0,0 +1,8 @@
package com.tangem.features.walletconnect.transaction.entity.common
internal data class WcTransactionAppInfoContentUM(
val appName: String,
val appIcon: String,
val isVerified: Boolean,
val appSubtitle: String,
)

View file

@ -0,0 +1,19 @@
package com.tangem.features.walletconnect.transaction.entity.common
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.core.ui.extensions.TextReference
import kotlinx.collections.immutable.ImmutableList
internal data class WcTransactionRequestInfoUM(
val blocks: ImmutableList<WcTransactionRequestBlockUM>,
val onCopy: () -> Unit,
) : TangemBottomSheetConfigContent
internal data class WcTransactionRequestBlockUM(
val info: ImmutableList<WcTransactionRequestInfoItemUM>,
)
internal data class WcTransactionRequestInfoItemUM(
val title: TextReference,
val description: String = "",
)

View file

@ -0,0 +1,21 @@
package com.tangem.features.walletconnect.transaction.entity.sign
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.features.walletconnect.transaction.entity.common.WcNetworkInfoUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionAppInfoContentUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoUM
internal data class WcSignTransactionUM(
val transaction: WcSignTransactionItemUM,
val transactionRequestInfo: WcTransactionRequestInfoUM,
)
internal data class WcSignTransactionItemUM(
val onDismiss: () -> Unit,
val onSign: () -> Unit,
val appInfo: WcTransactionAppInfoContentUM,
val walletName: String,
val networkInfo: WcNetworkInfoUM,
val addressText: String? = null,
val isLoading: Boolean = false,
) : TangemBottomSheetConfigContent

View file

@ -11,8 +11,8 @@ import com.tangem.domain.walletconnect.usecase.method.WcSignState
import com.tangem.domain.walletconnect.usecase.method.WcSignStep
import com.tangem.domain.walletconnect.usecase.method.WcSignUseCase
import com.tangem.features.walletconnect.transaction.components.WcSignTransactionContainerComponent
import com.tangem.features.walletconnect.transaction.entity.WcSignTransactionUM
import com.tangem.features.walletconnect.transaction.entity.WcTransactionActionsUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM
import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransactionUM
import com.tangem.features.walletconnect.transaction.utils.toUM
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.MutableStateFlow
@ -58,7 +58,7 @@ internal class WcSignTransactionModel @Inject constructor(
}
fun dismiss() {
_uiState.value?.actions?.onDismiss?.invoke() ?: router.pop()
_uiState.value?.transaction?.onDismiss?.invoke() ?: router.pop()
}
private fun signingIsDone(signState: WcSignState<*>): Boolean {

View file

@ -0,0 +1,174 @@
package com.tangem.features.walletconnect.transaction.ui.approve
import android.content.res.Configuration
import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.HorizontalDivider
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.tooling.preview.Devices
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig
import com.tangem.core.ui.components.bottomsheets.modal.TangemModalBottomSheet
import com.tangem.core.ui.components.bottomsheets.modal.TangemModalBottomSheetTitle
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.features.walletconnect.connections.ui.WcAppInfoItem
import com.tangem.features.walletconnect.impl.R
import com.tangem.features.walletconnect.transaction.entity.approve.WcApproveTransactionItemUM
import com.tangem.features.walletconnect.transaction.entity.approve.WcSpendAllowanceUM
import com.tangem.features.walletconnect.transaction.entity.common.WcNetworkInfoUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionAppInfoContentUM
import com.tangem.features.walletconnect.transaction.ui.common.*
@Composable
internal fun WcApproveTransactionModalBottomSheetContent(
state: WcApproveTransactionItemUM,
onClickTransactionRequest: () -> Unit,
) {
Column(
modifier = Modifier
.padding(horizontal = TangemTheme.dimens.spacing16),
) {
Column(
modifier = Modifier
.clip(RoundedCornerShape(TangemTheme.dimens.radius14))
.background(color = TangemTheme.colors.background.action)
.fillMaxWidth()
.animateContentSize(),
) {
WcSmallTitleItem(R.string.wc_request_from)
WcAppInfoItem(
iconUrl = state.appInfo.appIcon,
title = state.appInfo.appName,
subtitle = state.appInfo.appSubtitle,
isVerified = state.appInfo.isVerified,
)
DividerWithPadding(start = 0.dp, end = 0.dp)
WcTransactionRequestItem(
iconRes = R.drawable.ic_doc_new_24,
modifier = Modifier
.fillMaxWidth()
.clickable { onClickTransactionRequest() }
.padding(TangemTheme.dimens.spacing12),
)
}
Column(modifier = Modifier.padding(top = TangemTheme.dimens.spacing16)) {
if (state.spendAllowance != null) {
WcSpendAllowanceItem(state.spendAllowance)
Spacer(Modifier.height(TangemTheme.dimens.spacing16))
}
WcApproveTransactionItems(state)
WcTransactionRequestButtons(
modifier = Modifier.padding(vertical = TangemTheme.dimens.spacing16),
onDismiss = state.onDismiss,
onClickActiveButton = state.onSend,
activeButtonText = resourceReference(R.string.common_send),
isLoading = state.isLoading,
)
}
}
}
@Composable
private fun WcApproveTransactionItems(state: WcApproveTransactionItemUM) {
Column(
modifier = Modifier
.clip(RoundedCornerShape(TangemTheme.dimens.radius14))
.background(color = TangemTheme.colors.background.action)
.fillMaxWidth()
.animateContentSize(),
) {
val itemsModifier = Modifier
.fillMaxWidth()
.padding(TangemTheme.dimens.spacing12)
DividerWithPadding(start = 0.dp, end = 0.dp)
WcWalletItem(
modifier = itemsModifier,
walletName = state.walletName,
)
DividerWithPadding(start = TangemTheme.dimens.spacing40, end = TangemTheme.dimens.spacing12)
WcNetworkItem(
modifier = itemsModifier,
networkInfo = state.networkInfo,
)
if (!state.networkFee.isNullOrEmpty()) {
DividerWithPadding(start = TangemTheme.dimens.spacing40, end = TangemTheme.dimens.spacing12)
WcNetworkFeeItem(
modifier = itemsModifier,
networkFeeText = state.networkFee,
)
}
}
}
@Composable
internal fun DividerWithPadding(start: Dp, end: Dp) {
HorizontalDivider(
modifier = Modifier.padding(
start = start,
end = end,
),
thickness = TangemTheme.dimens.size1,
color = TangemTheme.colors.stroke.primary,
)
}
@Composable
@Preview(showBackground = true, device = Devices.PIXEL_7_PRO)
@Preview(showBackground = true, device = Devices.PIXEL_7_PRO, uiMode = Configuration.UI_MODE_NIGHT_YES)
private fun WcApproveTransactionBottomSheetPreview(
@PreviewParameter(WcApproveTransactionStateProvider::class) state: WcApproveTransactionItemUM,
) {
TangemThemePreview {
TangemModalBottomSheet<WcApproveTransactionItemUM>(
config = TangemBottomSheetConfig(
isShown = true,
onDismissRequest = {},
content = state,
),
containerColor = TangemTheme.colors.background.tertiary,
title = {
TangemModalBottomSheetTitle(
title = resourceReference(R.string.wallet_connect_title),
endIconRes = R.drawable.ic_close_24,
onEndClick = {},
startIconRes = null,
onStartClick = {},
)
},
content = {
WcApproveTransactionModalBottomSheetContent(state = state, onClickTransactionRequest = {})
},
)
}
}
private class WcApproveTransactionStateProvider : CollectionPreviewParameterProvider<WcApproveTransactionItemUM>(
listOf(
WcApproveTransactionItemUM(
onDismiss = {},
onSend = {},
appInfo = WcTransactionAppInfoContentUM(
appName = "React App",
appIcon = "",
isVerified = true,
appSubtitle = "react-app.walletconnect.com",
),
spendAllowance = WcSpendAllowanceUM(amountText = "Unlimited USDT", tokenImageUrl = ""),
walletName = "Tangem 2.0",
networkInfo = WcNetworkInfoUM(name = "Ethereum", iconRes = R.drawable.img_eth_22),
networkFee = "~ 0.22 $",
),
),
)

View file

@ -0,0 +1,88 @@
package com.tangem.features.walletconnect.transaction.ui.approve
import androidx.compose.animation.AnimatedContent
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import com.tangem.features.walletconnect.impl.R
import androidx.compose.ui.res.painterResource
import coil.compose.AsyncImage
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.walletconnect.transaction.entity.approve.WcSpendAllowanceUM
import com.tangem.features.walletconnect.transaction.ui.common.WcSmallTitleItem
@Composable
internal fun WcSpendAllowanceItem(spendAllowance: WcSpendAllowanceUM, modifier: Modifier = Modifier) {
Column(
modifier = modifier
.clip(RoundedCornerShape(TangemTheme.dimens.radius14))
.background(TangemTheme.colors.background.action)
.fillMaxWidth()
.padding(
end = TangemTheme.dimens.spacing12,
bottom = TangemTheme.dimens.spacing12,
),
) {
WcSmallTitleItem(R.string.wc_allow_to_spend)
Spacer(modifier = Modifier.height(TangemTheme.dimens.spacing8))
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.fillMaxWidth(),
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.weight(1f),
) {
AsyncImage(
model = spendAllowance.tokenImageUrl,
modifier = Modifier
.size(TangemTheme.dimens.size24)
.clip(CircleShape),
contentDescription = null,
)
Spacer(modifier = Modifier.width(TangemTheme.dimens.spacing12))
AnimatedContent(
targetState = spendAllowance.amountText,
label = "Animate Spend allowance text",
) { amount ->
Text(
text = amount,
style = TangemTheme.typography.body1,
color = TangemTheme.colors.text.primary1,
)
}
}
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.End,
) {
Text(
text = stringResourceSafe(R.string.manage_tokens_edit),
style = TangemTheme.typography.body1,
color = TangemTheme.colors.text.tertiary,
)
Spacer(modifier = Modifier.width(TangemTheme.dimens.spacing8))
Icon(
painter = painterResource(id = R.drawable.ic_edit_new_24),
contentDescription = null,
tint = TangemTheme.colors.icon.informative,
)
}
}
}
}

View file

@ -27,19 +27,16 @@ import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.features.walletconnect.impl.R
import com.tangem.features.walletconnect.transaction.entity.*
import com.tangem.features.walletconnect.transaction.entity.WcNetworkInfoUM
import com.tangem.features.walletconnect.transaction.entity.WcSignTransactionUM
import com.tangem.features.walletconnect.transaction.entity.WcTransactionActionsUM
import com.tangem.features.walletconnect.transaction.entity.WcTransactionRequestInfoUM
import com.tangem.features.walletconnect.transaction.entity.WcTransactionUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestBlockUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoItemUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoUM
import kotlinx.collections.immutable.persistentListOf
private const val MIN_HEIGHT_SCREEN_PERCENT = 0.35f
private const val MAX_HEIGHT_SCREEN_PERCENT = 0.75f
@Composable
internal fun TransactionRequestInfoContent(state: WcSignTransactionUM) {
internal fun TransactionRequestInfoContent(state: WcTransactionRequestInfoUM) {
val screenHeight = LocalConfiguration.current.screenHeightDp
val minHeight = (screenHeight * MIN_HEIGHT_SCREEN_PERCENT).dp
val maxHeight = (screenHeight * MAX_HEIGHT_SCREEN_PERCENT).dp
@ -55,7 +52,7 @@ internal fun TransactionRequestInfoContent(state: WcSignTransactionUM) {
.fillMaxWidth(),
contentPadding = PaddingValues(top = TangemTheme.dimens.spacing8, bottom = TangemTheme.dimens.spacing70),
) {
items(state.transactionRequestInfo.blocks) { block ->
items(state.blocks) { block ->
Column(
modifier = Modifier
.fillMaxWidth()
@ -98,7 +95,7 @@ internal fun TransactionRequestInfoContent(state: WcSignTransactionUM) {
.padding(bottom = TangemTheme.dimens.spacing20)
.fillMaxWidth(),
text = stringResourceSafe(R.string.wc_copy_data_button_text),
onClick = state.actions.onCopy,
onClick = state.onCopy,
iconResId = R.drawable.ic_copy_24,
)
}
@ -108,10 +105,10 @@ internal fun TransactionRequestInfoContent(state: WcSignTransactionUM) {
@Preview(showBackground = true, device = Devices.PIXEL_7_PRO)
@Preview(showBackground = true, device = Devices.PIXEL_7_PRO, uiMode = Configuration.UI_MODE_NIGHT_YES)
private fun WcSignTransactionRequestInfoBottomSheetPreview(
@PreviewParameter(WcSignTransactionStateProvider::class) state: WcSignTransactionUM,
@PreviewParameter(WcSignTransactionStateProvider::class) state: WcTransactionRequestInfoUM,
) {
TangemThemePreview {
TangemModalBottomSheet<WcSignTransactionUM>(
TangemModalBottomSheet<WcTransactionRequestInfoUM>(
config = TangemBottomSheetConfig(
isShown = true,
onDismissRequest = {},
@ -134,86 +131,56 @@ private fun WcSignTransactionRequestInfoBottomSheetPreview(
}
}
private class WcSignTransactionStateProvider : CollectionPreviewParameterProvider<WcSignTransactionUM>(
private class WcSignTransactionStateProvider : CollectionPreviewParameterProvider<WcTransactionRequestInfoUM>(
listOf(
WcSignTransactionUM(
transaction = WcTransactionUM(
appName = "React App",
appIcon = "",
isVerified = true,
appSubtitle = "react-app.walletconnect.com",
walletName = "Tangem 2.0",
networkInfo = WcNetworkInfoUM(name = "Ethereum", iconRes = R.drawable.img_eth_22),
),
transactionRequestInfo = WcTransactionRequestInfoUM(
blocks = persistentListOf(
WcTransactionRequestBlockUM(
persistentListOf(
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.wc_signature_type),
description = "personal_sign",
),
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.wc_contents),
description = "Hello! My name is John Dow. test@tange.com",
),
WcTransactionRequestInfoUM(
blocks = persistentListOf(
WcTransactionRequestBlockUM(
persistentListOf(
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.wc_signature_type),
description = "personal_sign",
),
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.wc_contents),
description = "Hello! My name is John Dow. test@tange.com",
),
),
),
),
actions = WcTransactionActionsUM(
onDismiss = {},
onSign = {},
onCopy = {},
),
onCopy = {},
),
WcSignTransactionUM(
transaction = WcTransactionUM(
appName = "React App",
appIcon = "",
isVerified = true,
appSubtitle = "react-app.walletconnect.com",
walletName = "Tangem 2.0",
networkInfo = WcNetworkInfoUM(name = "Ethereum", iconRes = R.drawable.img_eth_22),
addressText = "0x345FF...34FA",
networkFee = "~ 0.22 $",
),
transactionRequestInfo = WcTransactionRequestInfoUM(
blocks = persistentListOf(
WcTransactionRequestBlockUM(
persistentListOf(
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.wc_signature_type),
description = "personal_sign",
),
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.wc_contents),
description = "Hello! My name is John Dow. test@tange.com",
),
WcTransactionRequestInfoUM(
blocks = persistentListOf(
WcTransactionRequestBlockUM(
persistentListOf(
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.wc_signature_type),
description = "personal_sign",
),
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.wc_contents),
description = "Hello! My name is John Dow. test@tange.com",
),
),
WcTransactionRequestBlockUM(
persistentListOf(
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.wc_transaction_info_to_title),
),
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.settings_wallet_name_title),
description = "Bob",
),
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.wc_common_wallet),
description = "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826",
),
),
WcTransactionRequestBlockUM(
persistentListOf(
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.wc_transaction_info_to_title),
),
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.settings_wallet_name_title),
description = "Bob",
),
WcTransactionRequestInfoItemUM(
title = resourceReference(R.string.wc_common_wallet),
description = "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826",
),
),
),
),
actions = WcTransactionActionsUM(
onDismiss = {},
onSign = {},
onCopy = {},
),
onCopy = {},
),
),
)

View file

@ -1,5 +1,6 @@
package com.tangem.features.walletconnect.transaction.ui.common
import androidx.compose.animation.AnimatedContent
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.Icon
@ -48,11 +49,16 @@ internal fun WcNetworkFeeItem(networkFeeText: String, modifier: Modifier = Modif
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.End,
) {
Text(
text = networkFeeText,
style = TangemTheme.typography.body1,
color = TangemTheme.colors.text.tertiary,
)
AnimatedContent(
targetState = networkFeeText,
label = "Animate Network fee text",
) { fee ->
Text(
text = fee,
style = TangemTheme.typography.body1,
color = TangemTheme.colors.text.tertiary,
)
}
Spacer(modifier = Modifier.width(TangemTheme.dimens.spacing6))
Icon(
modifier = Modifier

View file

@ -14,7 +14,7 @@ import androidx.compose.ui.res.painterResource
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.walletconnect.impl.R
import com.tangem.features.walletconnect.transaction.entity.WcNetworkInfoUM
import com.tangem.features.walletconnect.transaction.entity.common.WcNetworkInfoUM
@Composable
internal fun WcNetworkItem(networkInfo: WcNetworkInfoUM, modifier: Modifier = Modifier) {

View file

@ -1,5 +1,6 @@
package com.tangem.features.walletconnect.transaction.ui.common
import androidx.annotation.StringRes
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
@ -7,15 +8,14 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.walletconnect.impl.R
@Composable
fun RequestFromItem(modifier: Modifier = Modifier) {
fun WcSmallTitleItem(@StringRes textRex: Int, modifier: Modifier = Modifier) {
Text(
modifier = modifier
.fillMaxWidth()
.padding(top = TangemTheme.dimens.spacing12, start = TangemTheme.dimens.spacing12),
text = stringResourceSafe(R.string.wc_request_from),
text = stringResourceSafe(textRex),
color = TangemTheme.colors.text.tertiary,
style = TangemTheme.typography.subtitle2,
)

View file

@ -7,15 +7,18 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.tangem.core.ui.components.PrimaryButtonIconEnd
import com.tangem.core.ui.components.SecondaryButton
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.walletconnect.impl.R
@Composable
internal fun WcTransactionRequestButtons(
activeButtonText: TextReference,
isLoading: Boolean,
onDismiss: () -> Unit,
onSign: () -> Unit,
onClickActiveButton: () -> Unit,
modifier: Modifier = Modifier,
) {
Row(modifier = modifier, horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing8)) {
@ -30,8 +33,8 @@ internal fun WcTransactionRequestButtons(
modifier = Modifier
.fillMaxWidth()
.weight(1f),
text = stringResourceSafe(R.string.common_sign),
onClick = onSign,
text = activeButtonText.resolveReference(),
onClick = onClickActiveButton,
iconResId = R.drawable.ic_tangem_24,
showProgress = isLoading,
)

View file

@ -26,32 +26,33 @@ import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.features.walletconnect.connections.ui.WcAppInfoItem
import com.tangem.features.walletconnect.impl.R
import com.tangem.features.walletconnect.transaction.entity.*
import com.tangem.features.walletconnect.transaction.entity.common.WcNetworkInfoUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionAppInfoContentUM
import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransactionItemUM
import com.tangem.features.walletconnect.transaction.ui.common.*
import kotlinx.collections.immutable.persistentListOf
@Composable
internal fun WcSignTransactionModalBottomSheetContent(
state: WcSignTransactionUM,
state: WcSignTransactionItemUM,
onClickTransactionRequest: () -> Unit,
) {
Column(
modifier = Modifier
.padding(horizontal = TangemTheme.dimens.spacing16),
.padding(horizontal = 16.dp),
) {
Column(
modifier = Modifier
.clip(RoundedCornerShape(TangemTheme.dimens.radius14))
.clip(RoundedCornerShape(14.dp))
.background(color = TangemTheme.colors.background.action)
.fillMaxWidth()
.animateContentSize(),
) {
RequestFromItem()
WcSmallTitleItem(R.string.wc_request_from)
WcAppInfoItem(
iconUrl = state.transaction.appIcon,
title = state.transaction.appName,
subtitle = state.transaction.appSubtitle,
isVerified = state.transaction.isVerified,
iconUrl = state.appInfo.appIcon,
title = state.appInfo.appName,
subtitle = state.appInfo.appSubtitle,
isVerified = state.appInfo.isVerified,
)
DividerWithPadding(start = 0.dp, end = 0.dp)
WcTransactionRequestItem(
@ -59,69 +60,63 @@ internal fun WcSignTransactionModalBottomSheetContent(
modifier = Modifier
.fillMaxWidth()
.clickable { onClickTransactionRequest() }
.padding(TangemTheme.dimens.spacing12),
.padding(12.dp),
)
}
Column(modifier = Modifier.padding(top = TangemTheme.dimens.spacing16)) {
Column(modifier = Modifier.padding(top = 16.dp)) {
WcSignTransactionItems(state)
WcTransactionRequestButtons(
modifier = Modifier.padding(vertical = TangemTheme.dimens.spacing16),
onDismiss = state.actions.onDismiss,
onSign = state.actions.onSign,
isLoading = state.transaction.isLoading,
modifier = Modifier.padding(vertical = 16.dp),
onDismiss = state.onDismiss,
onClickActiveButton = state.onSign,
activeButtonText = resourceReference(R.string.common_sign),
isLoading = state.isLoading,
)
}
}
}
@Composable
private fun WcSignTransactionItems(state: WcSignTransactionUM) {
private fun WcSignTransactionItems(state: WcSignTransactionItemUM) {
Column(
modifier = Modifier
.clip(RoundedCornerShape(TangemTheme.dimens.radius14))
.clip(RoundedCornerShape(14.dp))
.background(color = TangemTheme.colors.background.action)
.fillMaxWidth()
.animateContentSize(),
) {
val itemsModifier = Modifier
.fillMaxWidth()
.padding(TangemTheme.dimens.spacing12)
.padding(12.dp)
DividerWithPadding(start = 0.dp, end = 0.dp)
WcWalletItem(
modifier = itemsModifier,
walletName = state.transaction.walletName,
walletName = state.walletName,
)
DividerWithPadding(start = TangemTheme.dimens.spacing40, end = TangemTheme.dimens.spacing12)
DividerWithPadding(start = 40.dp, end = 12.dp)
WcNetworkItem(
modifier = itemsModifier,
networkInfo = state.transaction.networkInfo,
networkInfo = state.networkInfo,
)
if (!state.transaction.addressText.isNullOrEmpty()) {
DividerWithPadding(start = TangemTheme.dimens.spacing40, end = TangemTheme.dimens.spacing12)
if (!state.addressText.isNullOrEmpty()) {
DividerWithPadding(start = 40.dp, end = 12.dp)
WcAddressItem(
modifier = itemsModifier,
addressText = state.transaction.addressText,
)
}
if (!state.transaction.networkFee.isNullOrEmpty()) {
DividerWithPadding(start = TangemTheme.dimens.spacing40, end = TangemTheme.dimens.spacing12)
WcNetworkFeeItem(
modifier = itemsModifier,
networkFeeText = state.transaction.networkFee,
addressText = state.addressText,
)
}
}
}
@Composable
private fun DividerWithPadding(start: Dp, end: Dp) {
internal fun DividerWithPadding(start: Dp, end: Dp) {
HorizontalDivider(
modifier = Modifier.padding(
start = start,
end = end,
),
thickness = TangemTheme.dimens.size1,
thickness = 1.dp,
color = TangemTheme.colors.stroke.primary,
)
}
@ -130,10 +125,10 @@ private fun DividerWithPadding(start: Dp, end: Dp) {
@Preview(showBackground = true, device = Devices.PIXEL_7_PRO)
@Preview(showBackground = true, device = Devices.PIXEL_7_PRO, uiMode = Configuration.UI_MODE_NIGHT_YES)
private fun WcSignTransactionBottomSheetPreview(
@PreviewParameter(WcSignTransactionStateProvider::class) state: WcSignTransactionUM,
@PreviewParameter(WcSignTransactionStateProvider::class) state: WcSignTransactionItemUM,
) {
TangemThemePreview {
TangemModalBottomSheet<WcSignTransactionUM>(
TangemModalBottomSheet<WcSignTransactionItemUM>(
config = TangemBottomSheetConfig(
isShown = true,
onDismissRequest = {},
@ -156,41 +151,32 @@ private fun WcSignTransactionBottomSheetPreview(
}
}
private class WcSignTransactionStateProvider : CollectionPreviewParameterProvider<WcSignTransactionUM>(
private class WcSignTransactionStateProvider : CollectionPreviewParameterProvider<WcSignTransactionItemUM>(
listOf(
WcSignTransactionUM(
transaction = WcTransactionUM(
WcSignTransactionItemUM(
onDismiss = {},
onSign = {},
appInfo = WcTransactionAppInfoContentUM(
appName = "React App",
appIcon = "",
isVerified = true,
appSubtitle = "react-app.walletconnect.com",
walletName = "Tangem 2.0",
networkInfo = WcNetworkInfoUM(name = "Ethereum", iconRes = R.drawable.img_eth_22),
),
transactionRequestInfo = WcTransactionRequestInfoUM(persistentListOf()),
actions = WcTransactionActionsUM(
onDismiss = {},
onSign = {},
onCopy = {},
),
walletName = "Tangem 2.0",
networkInfo = WcNetworkInfoUM(name = "Ethereum", iconRes = R.drawable.img_eth_22),
),
WcSignTransactionUM(
transaction = WcTransactionUM(
WcSignTransactionItemUM(
onDismiss = {},
onSign = {},
appInfo = WcTransactionAppInfoContentUM(
appName = "React App",
appIcon = "",
isVerified = true,
appSubtitle = "react-app.walletconnect.com",
walletName = "Tangem 2.0",
networkInfo = WcNetworkInfoUM(name = "Ethereum", iconRes = R.drawable.img_eth_22),
addressText = "0x345FF...34FA",
networkFee = "~ 0.22 $",
),
transactionRequestInfo = WcTransactionRequestInfoUM(persistentListOf()),
actions = WcTransactionActionsUM(
onDismiss = {},
onSign = {},
onCopy = {},
),
walletName = "Tangem 2.0",
addressText = "0x345FF...34FA",
networkInfo = WcNetworkInfoUM(name = "Ethereum", iconRes = R.drawable.img_eth_22),
),
),
)

View file

@ -11,13 +11,9 @@ import com.tangem.domain.walletconnect.usecase.method.WcSignState
import com.tangem.domain.walletconnect.usecase.method.WcSignStep
import com.tangem.domain.walletconnect.usecase.method.WcSignUseCase
import com.tangem.features.walletconnect.impl.R
import com.tangem.features.walletconnect.transaction.entity.WcNetworkInfoUM
import com.tangem.features.walletconnect.transaction.entity.WcSignTransactionUM
import com.tangem.features.walletconnect.transaction.entity.WcTransactionActionsUM
import com.tangem.features.walletconnect.transaction.entity.WcTransactionRequestBlockUM
import com.tangem.features.walletconnect.transaction.entity.WcTransactionRequestInfoItemUM
import com.tangem.features.walletconnect.transaction.entity.WcTransactionRequestInfoUM
import com.tangem.features.walletconnect.transaction.entity.WcTransactionUM
import com.tangem.features.walletconnect.transaction.entity.common.*
import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransactionItemUM
import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransactionUM
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
@ -47,12 +43,15 @@ private fun WcMessageSignUseCase.signTypedDataToUM(
signModel: WcMessageSignUseCase.SignModel,
actions: WcTransactionActionsUM,
) = WcSignTransactionUM(
actions = actions,
transaction = WcTransactionUM(
appName = session.sdkModel.appMetaData.name,
appIcon = session.sdkModel.appMetaData.url,
isVerified = session.securityStatus == CheckDAppResult.SAFE,
appSubtitle = session.sdkModel.appMetaData.description,
transaction = WcSignTransactionItemUM(
onDismiss = actions.onDismiss,
onSign = actions.onSign,
appInfo = WcTransactionAppInfoContentUM(
appName = session.sdkModel.appMetaData.name,
appIcon = session.sdkModel.appMetaData.url,
isVerified = session.securityStatus == CheckDAppResult.SAFE,
appSubtitle = session.sdkModel.appMetaData.description,
),
walletName = session.wallet.name,
networkInfo = WcNetworkInfoUM(
name = network.name,
@ -62,7 +61,7 @@ private fun WcMessageSignUseCase.signTypedDataToUM(
isLoading = signState.domainStep == WcSignStep.Signing,
),
transactionRequestInfo = WcTransactionRequestInfoUM(
buildList {
blocks = buildList {
add(createInfoBlockUM(rawSdkRequest, signModel))
(method as? WcEthMethod.SignTypedData)?.params?.message?.to?.let { to ->
add(
@ -84,6 +83,7 @@ private fun WcMessageSignUseCase.signTypedDataToUM(
)
}
}.toImmutableList(),
onCopy = actions.onCopy,
),
)
@ -92,12 +92,15 @@ private fun WcMessageSignUseCase.messageSignToUM(
signModel: WcMessageSignUseCase.SignModel,
actions: WcTransactionActionsUM,
) = WcSignTransactionUM(
actions = actions,
transaction = WcTransactionUM(
appName = session.sdkModel.appMetaData.name,
appIcon = session.sdkModel.appMetaData.url,
isVerified = session.securityStatus == CheckDAppResult.SAFE,
appSubtitle = session.sdkModel.appMetaData.description,
transaction = WcSignTransactionItemUM(
onDismiss = actions.onDismiss,
onSign = actions.onSign,
appInfo = WcTransactionAppInfoContentUM(
appName = session.sdkModel.appMetaData.name,
appIcon = session.sdkModel.appMetaData.url,
isVerified = session.securityStatus == CheckDAppResult.SAFE,
appSubtitle = session.sdkModel.appMetaData.description,
),
walletName = session.wallet.name,
networkInfo = WcNetworkInfoUM(
name = network.name,
@ -107,6 +110,7 @@ private fun WcMessageSignUseCase.messageSignToUM(
),
transactionRequestInfo = WcTransactionRequestInfoUM(
persistentListOf(createInfoBlockUM(rawSdkRequest, signModel)),
onCopy = actions.onCopy,
),
)