mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-17 05:41:29 +02:00
Merge pull request #58 from cake-tech/CWA-210-rework-send-screen
Cwa 210 rework send screen
This commit is contained in:
+209
-2
@@ -80,6 +80,7 @@ class S implements WidgetsLocalizations {
|
||||
String get error_text_node_port => "Node port can only contain numbers between 0 and 65535";
|
||||
String get error_text_payment_id => "Payment ID can only contain from 16 to 64 chars in hex";
|
||||
String get error_text_subaddress_name => "Subaddress name can't contain ` , ' \" symbols\nand must be between 1 and 20 characters long";
|
||||
String get error_text_template => "Template name and address can't contain ` , ' \" symbols\nand must be between 1 and 106 characters long";
|
||||
String get error_text_wallet_name => "Wallet name can only contain letters, numbers\nand must be between 1 and 15 characters long";
|
||||
String get error_text_xmr => "XMR value can't exceed available balance.\nThe number of fraction digits must be less or equal to 12";
|
||||
String get estimated => "Estimated";
|
||||
@@ -169,12 +170,20 @@ class S implements WidgetsLocalizations {
|
||||
String get seed_share => "Share seed";
|
||||
String get seed_title => "Seed";
|
||||
String get send => "Send";
|
||||
String get send_amount => "Amount:";
|
||||
String get send_creating_transaction => "Creating transaction";
|
||||
String get send_error_currency => "Currency can only contain numbers";
|
||||
String get send_error_minimum_value => "Minimum value of amount is 0.01";
|
||||
String get send_estimated_fee => "Estimated fee:";
|
||||
String get send_fee => "Fee:";
|
||||
String get send_got_it => "Got it";
|
||||
String get send_monero_address => "Monero address";
|
||||
String get send_name => "Name";
|
||||
String get send_new => "New";
|
||||
String get send_payment_id => "Payment ID (optional)";
|
||||
String get send_sending => "Sending...";
|
||||
String get send_success => "Your Monero was successfully sent";
|
||||
String get send_templates => "Templates";
|
||||
String get send_title => "Send Monero";
|
||||
String get send_xmr => "Send XMR";
|
||||
String get send_your_wallet => "Your wallet";
|
||||
@@ -342,6 +351,8 @@ class $de extends S {
|
||||
@override
|
||||
String get transaction_sent => "Transaktion gesendet!";
|
||||
@override
|
||||
String get send_fee => "Gebühr:";
|
||||
@override
|
||||
String get password => "Passwort";
|
||||
@override
|
||||
String get you_will_get => "Sie erhalten";
|
||||
@@ -354,6 +365,8 @@ class $de extends S {
|
||||
@override
|
||||
String get share_address => "Adresse teilen ";
|
||||
@override
|
||||
String get send_templates => "Vorlagen";
|
||||
@override
|
||||
String get please_try_to_connect_to_another_node => "Bitte versuchen Sie, eine Verbindung zu einem anderen Knoten herzustellen";
|
||||
@override
|
||||
String get trade_state_traded => "Handeln";
|
||||
@@ -378,6 +391,8 @@ class $de extends S {
|
||||
@override
|
||||
String get seed_language_portuguese => "Portugiesisch";
|
||||
@override
|
||||
String get send_new => "Neu";
|
||||
@override
|
||||
String get setup_pin => "PIN einrichten";
|
||||
@override
|
||||
String get transaction_details_recipient_address => "Empfängeradresse";
|
||||
@@ -392,6 +407,8 @@ class $de extends S {
|
||||
@override
|
||||
String get trade_state_trading => "Handel";
|
||||
@override
|
||||
String get send_sending => "Senden...";
|
||||
@override
|
||||
String get error_text_address => "Die Walletadresse muss dem Typ entsprechen\nder Kryptowährung";
|
||||
@override
|
||||
String get send_your_wallet => "Deine Geldbörse";
|
||||
@@ -522,6 +539,8 @@ class $de extends S {
|
||||
@override
|
||||
String get paste => "Einfügen";
|
||||
@override
|
||||
String get send_got_it => "Ich habs";
|
||||
@override
|
||||
String get widgets_or => "oder";
|
||||
@override
|
||||
String get remove => "Löschen";
|
||||
@@ -530,12 +549,16 @@ class $de extends S {
|
||||
@override
|
||||
String get yesterday => "Gestern";
|
||||
@override
|
||||
String get send_amount => "Menge:";
|
||||
@override
|
||||
String get expired => "Abgelaufen";
|
||||
@override
|
||||
String get transaction_priority_regular => "Regulär";
|
||||
@override
|
||||
String get trade_details_created_at => "Hergestellt in";
|
||||
@override
|
||||
String get send_success => "Ihr Monero wurde erfolgreich gesendet";
|
||||
@override
|
||||
String get settings_wallets => "Brieftaschen";
|
||||
@override
|
||||
String get settings_only_transactions => "Nur Transaktionen";
|
||||
@@ -558,6 +581,8 @@ class $de extends S {
|
||||
@override
|
||||
String get nodes => "Knoten";
|
||||
@override
|
||||
String get error_text_template => "Vorlagenname und Adresse dürfen nicht enthalten ` , ' \" symbole\nund muss zwischen 1 und 106 Zeichen lang sein";
|
||||
@override
|
||||
String get seed_share => "Teilen Sie Seed";
|
||||
@override
|
||||
String get widgets_restore_from_blockheight => "Aus Blockhöhe wiederherstellen";
|
||||
@@ -698,6 +723,8 @@ class $de extends S {
|
||||
@override
|
||||
String get restore_active_seed => "Aktives Seed";
|
||||
@override
|
||||
String get send_name => "Name";
|
||||
@override
|
||||
String get settings_personal => "persönlich";
|
||||
@override
|
||||
String get seed_title => "Seed";
|
||||
@@ -934,6 +961,8 @@ class $hi extends S {
|
||||
@override
|
||||
String get transaction_sent => "भेजा गया लेन-देन";
|
||||
@override
|
||||
String get send_fee => "शुल्क:";
|
||||
@override
|
||||
String get password => "पारण शब्द";
|
||||
@override
|
||||
String get you_will_get => "आपको मिल जायेगा";
|
||||
@@ -946,6 +975,8 @@ class $hi extends S {
|
||||
@override
|
||||
String get share_address => "पता साझा करें";
|
||||
@override
|
||||
String get send_templates => "टेम्पलेट्स";
|
||||
@override
|
||||
String get please_try_to_connect_to_another_node => "कृपया दूसरे नोड से कनेक्ट करने का प्रयास करें";
|
||||
@override
|
||||
String get trade_state_traded => "ट्रेडेड";
|
||||
@@ -970,6 +1001,8 @@ class $hi extends S {
|
||||
@override
|
||||
String get seed_language_portuguese => "पुर्तगाली";
|
||||
@override
|
||||
String get send_new => "नया";
|
||||
@override
|
||||
String get setup_pin => "पिन सेट करें";
|
||||
@override
|
||||
String get transaction_details_recipient_address => "प्राप्तकर्ता का पता";
|
||||
@@ -984,6 +1017,8 @@ class $hi extends S {
|
||||
@override
|
||||
String get trade_state_trading => "व्यापार";
|
||||
@override
|
||||
String get send_sending => "भेजना...";
|
||||
@override
|
||||
String get error_text_address => "वॉलेट पता प्रकार के अनुरूप होना चाहिए\nक्रिप्टोकरेंसी का";
|
||||
@override
|
||||
String get send_your_wallet => "आपका बटुआ";
|
||||
@@ -1114,6 +1149,8 @@ class $hi extends S {
|
||||
@override
|
||||
String get paste => "पेस्ट करें";
|
||||
@override
|
||||
String get send_got_it => "समझ गया";
|
||||
@override
|
||||
String get widgets_or => "या";
|
||||
@override
|
||||
String get remove => "हटाना";
|
||||
@@ -1122,12 +1159,16 @@ class $hi extends S {
|
||||
@override
|
||||
String get yesterday => "बिता कल";
|
||||
@override
|
||||
String get send_amount => "रकम:";
|
||||
@override
|
||||
String get expired => "समय सीमा समाप्त";
|
||||
@override
|
||||
String get transaction_priority_regular => "नियमित";
|
||||
@override
|
||||
String get trade_details_created_at => "पर बनाया गया";
|
||||
@override
|
||||
String get send_success => "आपका Monero सफलतापूर्वक भेजा गया";
|
||||
@override
|
||||
String get settings_wallets => "पर्स";
|
||||
@override
|
||||
String get settings_only_transactions => "केवल लेन-देन";
|
||||
@@ -1150,6 +1191,8 @@ class $hi extends S {
|
||||
@override
|
||||
String get nodes => "नोड्स";
|
||||
@override
|
||||
String get error_text_template => "टेम्प्लेट का नाम और पता नहीं हो सकता ` , ' \" प्रतीकों\nऔर 1 और 106 वर्णों के बीच लंबा होना चाहिए";
|
||||
@override
|
||||
String get seed_share => "बीज साझा करें";
|
||||
@override
|
||||
String get widgets_restore_from_blockheight => "ब्लॉकचेन से पुनर्स्थापित करें";
|
||||
@@ -1290,6 +1333,8 @@ class $hi extends S {
|
||||
@override
|
||||
String get restore_active_seed => "सक्रिय बीज";
|
||||
@override
|
||||
String get send_name => "नाम";
|
||||
@override
|
||||
String get settings_personal => "निजी";
|
||||
@override
|
||||
String get seed_title => "बीज";
|
||||
@@ -1526,6 +1571,8 @@ class $ru extends S {
|
||||
@override
|
||||
String get transaction_sent => "Tранзакция отправлена!";
|
||||
@override
|
||||
String get send_fee => "Комиссия:";
|
||||
@override
|
||||
String get password => "Пароль";
|
||||
@override
|
||||
String get you_will_get => "Вы получите";
|
||||
@@ -1538,6 +1585,8 @@ class $ru extends S {
|
||||
@override
|
||||
String get share_address => "Поделиться адресом";
|
||||
@override
|
||||
String get send_templates => "Шаблоны";
|
||||
@override
|
||||
String get please_try_to_connect_to_another_node => "Пожалуйста, попробуйте подключиться к другой ноде";
|
||||
@override
|
||||
String get trade_state_traded => "Сделка завершена";
|
||||
@@ -1562,6 +1611,8 @@ class $ru extends S {
|
||||
@override
|
||||
String get seed_language_portuguese => "Португальский";
|
||||
@override
|
||||
String get send_new => "Новый";
|
||||
@override
|
||||
String get setup_pin => "Настроить PIN";
|
||||
@override
|
||||
String get transaction_details_recipient_address => "Адрес получателя";
|
||||
@@ -1576,6 +1627,8 @@ class $ru extends S {
|
||||
@override
|
||||
String get trade_state_trading => "Совершение сделки";
|
||||
@override
|
||||
String get send_sending => "Отправка...";
|
||||
@override
|
||||
String get error_text_address => "Адрес кошелька должен соответствовать типу\nкриптовалюты";
|
||||
@override
|
||||
String get send_your_wallet => "Ваш кошелёк";
|
||||
@@ -1706,6 +1759,8 @@ class $ru extends S {
|
||||
@override
|
||||
String get paste => "Вставить";
|
||||
@override
|
||||
String get send_got_it => "Понял";
|
||||
@override
|
||||
String get widgets_or => "или";
|
||||
@override
|
||||
String get remove => "Удалить";
|
||||
@@ -1714,12 +1769,16 @@ class $ru extends S {
|
||||
@override
|
||||
String get yesterday => "Вчера";
|
||||
@override
|
||||
String get send_amount => "Сумма:";
|
||||
@override
|
||||
String get expired => "Истекает";
|
||||
@override
|
||||
String get transaction_priority_regular => "Обычный";
|
||||
@override
|
||||
String get trade_details_created_at => "Создано";
|
||||
@override
|
||||
String get send_success => "Ваш Monero был успешно отправлен";
|
||||
@override
|
||||
String get settings_wallets => "Кошельки";
|
||||
@override
|
||||
String get settings_only_transactions => "Транзакции";
|
||||
@@ -1742,6 +1801,8 @@ class $ru extends S {
|
||||
@override
|
||||
String get nodes => "Ноды";
|
||||
@override
|
||||
String get error_text_template => "Имя и адрес шаблона не может содержать ` , ' \" символы\nи должно быть от 1 до 106 символов в длину";
|
||||
@override
|
||||
String get seed_share => "Поделиться мнемонической фразой";
|
||||
@override
|
||||
String get widgets_restore_from_blockheight => "Восстановить на высоте блока";
|
||||
@@ -1882,6 +1943,8 @@ class $ru extends S {
|
||||
@override
|
||||
String get restore_active_seed => "Активная мнемоническая фраза";
|
||||
@override
|
||||
String get send_name => "Имя";
|
||||
@override
|
||||
String get settings_personal => "Персональные";
|
||||
@override
|
||||
String get seed_title => "Мнемоническая фраза";
|
||||
@@ -2118,6 +2181,8 @@ class $ko extends S {
|
||||
@override
|
||||
String get transaction_sent => "거래가 전송되었습니다!";
|
||||
@override
|
||||
String get send_fee => "회비:";
|
||||
@override
|
||||
String get password => "암호";
|
||||
@override
|
||||
String get you_will_get => "당신은 얻을 것이다";
|
||||
@@ -2130,6 +2195,8 @@ class $ko extends S {
|
||||
@override
|
||||
String get share_address => "주소 공유";
|
||||
@override
|
||||
String get send_templates => "템플릿";
|
||||
@override
|
||||
String get please_try_to_connect_to_another_node => "다른 노드에 연결을 시도하십시오";
|
||||
@override
|
||||
String get trade_state_traded => "거래";
|
||||
@@ -2154,6 +2221,8 @@ class $ko extends S {
|
||||
@override
|
||||
String get seed_language_portuguese => "포르투갈 인";
|
||||
@override
|
||||
String get send_new => "새로운";
|
||||
@override
|
||||
String get setup_pin => "설정 PIN";
|
||||
@override
|
||||
String get transaction_details_recipient_address => "받는 사람 주소";
|
||||
@@ -2168,6 +2237,8 @@ class $ko extends S {
|
||||
@override
|
||||
String get trade_state_trading => "거래";
|
||||
@override
|
||||
String get send_sending => "배상...";
|
||||
@override
|
||||
String get error_text_address => "지갑 주소는 유형과 일치해야합니다\n암호 화폐";
|
||||
@override
|
||||
String get send_your_wallet => "지갑";
|
||||
@@ -2298,6 +2369,8 @@ class $ko extends S {
|
||||
@override
|
||||
String get paste => "풀";
|
||||
@override
|
||||
String get send_got_it => "알았다";
|
||||
@override
|
||||
String get widgets_or => "또는";
|
||||
@override
|
||||
String get remove => "없애다";
|
||||
@@ -2306,12 +2379,16 @@ class $ko extends S {
|
||||
@override
|
||||
String get yesterday => "어제";
|
||||
@override
|
||||
String get send_amount => "양:";
|
||||
@override
|
||||
String get expired => "만료";
|
||||
@override
|
||||
String get transaction_priority_regular => "정규병";
|
||||
@override
|
||||
String get trade_details_created_at => "에 작성";
|
||||
@override
|
||||
String get send_success => "Monero가 성공적으로 전송되었습니다";
|
||||
@override
|
||||
String get settings_wallets => "지갑";
|
||||
@override
|
||||
String get settings_only_transactions => "거래 만";
|
||||
@@ -2334,6 +2411,8 @@ class $ko extends S {
|
||||
@override
|
||||
String get nodes => "노드";
|
||||
@override
|
||||
String get error_text_template => "템플릿 이름과 주소는 포함 할 수 없습니다 ` , ' \" 기호 \n1 ~ 106 자 사이 여야합니다";
|
||||
@override
|
||||
String get seed_share => "시드 공유";
|
||||
@override
|
||||
String get widgets_restore_from_blockheight => "블록 높이에서 복원";
|
||||
@@ -2474,6 +2553,8 @@ class $ko extends S {
|
||||
@override
|
||||
String get restore_active_seed => "활성 종자";
|
||||
@override
|
||||
String get send_name => "이름";
|
||||
@override
|
||||
String get settings_personal => "개인적인";
|
||||
@override
|
||||
String get seed_title => "씨";
|
||||
@@ -2710,6 +2791,8 @@ class $pt extends S {
|
||||
@override
|
||||
String get transaction_sent => "Transação enviada!";
|
||||
@override
|
||||
String get send_fee => "Taxa:";
|
||||
@override
|
||||
String get password => "Senha";
|
||||
@override
|
||||
String get you_will_get => "Você receberá";
|
||||
@@ -2722,6 +2805,8 @@ class $pt extends S {
|
||||
@override
|
||||
String get share_address => "Compartilhar endereço";
|
||||
@override
|
||||
String get send_templates => "Modelos";
|
||||
@override
|
||||
String get please_try_to_connect_to_another_node => "Por favor, tente conectar-se a outro nó";
|
||||
@override
|
||||
String get trade_state_traded => "Troca realizada";
|
||||
@@ -2746,6 +2831,8 @@ class $pt extends S {
|
||||
@override
|
||||
String get seed_language_portuguese => "Português";
|
||||
@override
|
||||
String get send_new => "Novo";
|
||||
@override
|
||||
String get setup_pin => "Configurar PIN";
|
||||
@override
|
||||
String get transaction_details_recipient_address => "Endereço do destinatário";
|
||||
@@ -2760,6 +2847,8 @@ class $pt extends S {
|
||||
@override
|
||||
String get trade_state_trading => "Em andamento";
|
||||
@override
|
||||
String get send_sending => "Enviando...";
|
||||
@override
|
||||
String get error_text_address => "O endereço da carteira deve corresponder à\ncriptomoeda selecionada";
|
||||
@override
|
||||
String get send_your_wallet => "Sua carteira";
|
||||
@@ -2890,6 +2979,8 @@ class $pt extends S {
|
||||
@override
|
||||
String get paste => "Colar";
|
||||
@override
|
||||
String get send_got_it => "Entendi";
|
||||
@override
|
||||
String get widgets_or => "ou";
|
||||
@override
|
||||
String get remove => "Remover";
|
||||
@@ -2898,12 +2989,16 @@ class $pt extends S {
|
||||
@override
|
||||
String get yesterday => "Ontem";
|
||||
@override
|
||||
String get send_amount => "Montante:";
|
||||
@override
|
||||
String get expired => "Expirada";
|
||||
@override
|
||||
String get transaction_priority_regular => "Regular";
|
||||
@override
|
||||
String get trade_details_created_at => "Criada em";
|
||||
@override
|
||||
String get send_success => "Seu Monero foi enviado com sucesso";
|
||||
@override
|
||||
String get settings_wallets => "Carteiras";
|
||||
@override
|
||||
String get settings_only_transactions => "Somente transações";
|
||||
@@ -2926,6 +3021,8 @@ class $pt extends S {
|
||||
@override
|
||||
String get nodes => "Nós";
|
||||
@override
|
||||
String get error_text_template => "O nome e o endereço do modelo não podem conter os símbolos ` , ' \" \ne deve ter entre 1 e 106 caracteres";
|
||||
@override
|
||||
String get seed_share => "Compartilhar semente";
|
||||
@override
|
||||
String get widgets_restore_from_blockheight => "Restaurar a partir de altura do bloco";
|
||||
@@ -3066,6 +3163,8 @@ class $pt extends S {
|
||||
@override
|
||||
String get restore_active_seed => "Semente ativa";
|
||||
@override
|
||||
String get send_name => "Nome";
|
||||
@override
|
||||
String get settings_personal => "Pessoal";
|
||||
@override
|
||||
String get seed_title => "Semente";
|
||||
@@ -3302,6 +3401,8 @@ class $uk extends S {
|
||||
@override
|
||||
String get transaction_sent => "Tранзакцію відправлено!";
|
||||
@override
|
||||
String get send_fee => "Комісія:";
|
||||
@override
|
||||
String get password => "Пароль";
|
||||
@override
|
||||
String get you_will_get => "Ви отримаєте";
|
||||
@@ -3314,6 +3415,8 @@ class $uk extends S {
|
||||
@override
|
||||
String get share_address => "Поділитися адресою";
|
||||
@override
|
||||
String get send_templates => "Шаблони";
|
||||
@override
|
||||
String get please_try_to_connect_to_another_node => "Будь ласка, спробуйте підключитися до іншого вузлу";
|
||||
@override
|
||||
String get trade_state_traded => "Операція виконана";
|
||||
@@ -3338,6 +3441,8 @@ class $uk extends S {
|
||||
@override
|
||||
String get seed_language_portuguese => "Португальська";
|
||||
@override
|
||||
String get send_new => "Новий";
|
||||
@override
|
||||
String get setup_pin => "Встановити PIN";
|
||||
@override
|
||||
String get transaction_details_recipient_address => "Адреса отримувача";
|
||||
@@ -3352,6 +3457,8 @@ class $uk extends S {
|
||||
@override
|
||||
String get trade_state_trading => "Виконання операції";
|
||||
@override
|
||||
String get send_sending => "Відправлення...";
|
||||
@override
|
||||
String get error_text_address => "Адреса гаманця повинна відповідати типу\nкриптовалюти";
|
||||
@override
|
||||
String get send_your_wallet => "Ваш гаманець";
|
||||
@@ -3378,7 +3485,7 @@ class $uk extends S {
|
||||
@override
|
||||
String get copy_address => "Cкопіювати адресу";
|
||||
@override
|
||||
String get error_text_subaddress_name => "Ім'я субадреси не може містити ` , ' \" символи\nі може бути від 1 до 32 символів в довжину";
|
||||
String get error_text_subaddress_name => "Ім'я субадреси не може містити ` , ' \" символи\nі може бути від 1 до 20 символів в довжину";
|
||||
@override
|
||||
String get incorrect_seed => "Введений текст невірний.";
|
||||
@override
|
||||
@@ -3482,6 +3589,8 @@ class $uk extends S {
|
||||
@override
|
||||
String get paste => "Вставити";
|
||||
@override
|
||||
String get send_got_it => "Зрозумів";
|
||||
@override
|
||||
String get widgets_or => "або";
|
||||
@override
|
||||
String get remove => "Видалити";
|
||||
@@ -3490,12 +3599,16 @@ class $uk extends S {
|
||||
@override
|
||||
String get yesterday => "Вчора";
|
||||
@override
|
||||
String get send_amount => "Сума:";
|
||||
@override
|
||||
String get expired => "Закінчується";
|
||||
@override
|
||||
String get transaction_priority_regular => "Звичайний";
|
||||
@override
|
||||
String get trade_details_created_at => "Створено";
|
||||
@override
|
||||
String get send_success => "Ваш Monero успішно надісланий";
|
||||
@override
|
||||
String get settings_wallets => "Гаманці";
|
||||
@override
|
||||
String get settings_only_transactions => "Транзакції";
|
||||
@@ -3518,6 +3631,8 @@ class $uk extends S {
|
||||
@override
|
||||
String get nodes => "Вузли";
|
||||
@override
|
||||
String get error_text_template => "Ім'я та адреса шаблону не може містити ` , ' \" символи\nі може бути від 1 до 106 символів в довжину";
|
||||
@override
|
||||
String get seed_share => "Поділитися мнемонічною фразою";
|
||||
@override
|
||||
String get widgets_restore_from_blockheight => "Відновити на висоті блоку";
|
||||
@@ -3658,6 +3773,8 @@ class $uk extends S {
|
||||
@override
|
||||
String get restore_active_seed => "Активна мнемонічна фраза";
|
||||
@override
|
||||
String get send_name => "Ім'я";
|
||||
@override
|
||||
String get settings_personal => "Персональні";
|
||||
@override
|
||||
String get seed_title => "Мнемонічна фраза";
|
||||
@@ -3894,6 +4011,8 @@ class $ja extends S {
|
||||
@override
|
||||
String get transaction_sent => "トランザクションが送信されました!";
|
||||
@override
|
||||
String get send_fee => "費用:";
|
||||
@override
|
||||
String get password => "パスワード";
|
||||
@override
|
||||
String get you_will_get => "あなたが取得します";
|
||||
@@ -3906,6 +4025,8 @@ class $ja extends S {
|
||||
@override
|
||||
String get share_address => "住所を共有する";
|
||||
@override
|
||||
String get send_templates => "テンプレート";
|
||||
@override
|
||||
String get please_try_to_connect_to_another_node => "別のノードに接続してみてください";
|
||||
@override
|
||||
String get trade_state_traded => "取引済み";
|
||||
@@ -3930,6 +4051,8 @@ class $ja extends S {
|
||||
@override
|
||||
String get seed_language_portuguese => "ポルトガル語";
|
||||
@override
|
||||
String get send_new => "新着";
|
||||
@override
|
||||
String get setup_pin => "PINのセットアップ";
|
||||
@override
|
||||
String get transaction_details_recipient_address => "受取人の住所";
|
||||
@@ -3944,6 +4067,8 @@ class $ja extends S {
|
||||
@override
|
||||
String get trade_state_trading => "トレーディング";
|
||||
@override
|
||||
String get send_sending => "送信...";
|
||||
@override
|
||||
String get error_text_address => "ウォレットアドレスは、\n暗号通貨";
|
||||
@override
|
||||
String get send_your_wallet => "あなたの財布";
|
||||
@@ -4074,6 +4199,8 @@ class $ja extends S {
|
||||
@override
|
||||
String get paste => "ペースト";
|
||||
@override
|
||||
String get send_got_it => "とった";
|
||||
@override
|
||||
String get widgets_or => "または";
|
||||
@override
|
||||
String get remove => "削除する";
|
||||
@@ -4082,12 +4209,16 @@ class $ja extends S {
|
||||
@override
|
||||
String get yesterday => "昨日";
|
||||
@override
|
||||
String get send_amount => "量:";
|
||||
@override
|
||||
String get expired => "期限切れ";
|
||||
@override
|
||||
String get transaction_priority_regular => "レギュラー";
|
||||
@override
|
||||
String get trade_details_created_at => "で作成";
|
||||
@override
|
||||
String get send_success => "Moneroが送信されました";
|
||||
@override
|
||||
String get settings_wallets => "財布";
|
||||
@override
|
||||
String get settings_only_transactions => "トランザクションのみ";
|
||||
@@ -4110,6 +4241,8 @@ class $ja extends S {
|
||||
@override
|
||||
String get nodes => "ノード";
|
||||
@override
|
||||
String get error_text_template => "テンプレートの名前とアドレスに含めることはできません ` , ' \" シンボル\n1〜106文字の長さである必要があります";
|
||||
@override
|
||||
String get seed_share => "シードを共有する";
|
||||
@override
|
||||
String get widgets_restore_from_blockheight => "ブロックの高さから復元";
|
||||
@@ -4250,6 +4383,8 @@ class $ja extends S {
|
||||
@override
|
||||
String get restore_active_seed => "アクティブシード";
|
||||
@override
|
||||
String get send_name => "名前";
|
||||
@override
|
||||
String get settings_personal => "パーソナル";
|
||||
@override
|
||||
String get seed_title => "シード";
|
||||
@@ -4490,6 +4625,8 @@ class $pl extends S {
|
||||
@override
|
||||
String get transaction_sent => "Transakcja wysłana!";
|
||||
@override
|
||||
String get send_fee => "Opłata:";
|
||||
@override
|
||||
String get password => "Hasło";
|
||||
@override
|
||||
String get you_will_get => "Dostaniesz";
|
||||
@@ -4502,6 +4639,8 @@ class $pl extends S {
|
||||
@override
|
||||
String get share_address => "Udostępnij adres";
|
||||
@override
|
||||
String get send_templates => "Szablony";
|
||||
@override
|
||||
String get please_try_to_connect_to_another_node => "Spróbuj połączyć się z innym węzłem";
|
||||
@override
|
||||
String get trade_state_traded => "Handlowane";
|
||||
@@ -4526,6 +4665,8 @@ class $pl extends S {
|
||||
@override
|
||||
String get seed_language_portuguese => "Portugalski";
|
||||
@override
|
||||
String get send_new => "Nowy";
|
||||
@override
|
||||
String get setup_pin => "Ustaw PIN";
|
||||
@override
|
||||
String get transaction_details_recipient_address => "Adres odbiorcy";
|
||||
@@ -4540,6 +4681,8 @@ class $pl extends S {
|
||||
@override
|
||||
String get trade_state_trading => "Handlowy";
|
||||
@override
|
||||
String get send_sending => "Wysyłanie...";
|
||||
@override
|
||||
String get error_text_address => "Wallet address must correspond to the type\nof cryptocurrency";
|
||||
@override
|
||||
String get send_your_wallet => "Twój portfel";
|
||||
@@ -4670,6 +4813,8 @@ class $pl extends S {
|
||||
@override
|
||||
String get paste => "Pasta";
|
||||
@override
|
||||
String get send_got_it => "Rozumiem";
|
||||
@override
|
||||
String get widgets_or => "lub";
|
||||
@override
|
||||
String get remove => "Usunąć";
|
||||
@@ -4678,12 +4823,16 @@ class $pl extends S {
|
||||
@override
|
||||
String get yesterday => "Wczoraj";
|
||||
@override
|
||||
String get send_amount => "Ilość:";
|
||||
@override
|
||||
String get expired => "Przedawniony";
|
||||
@override
|
||||
String get transaction_priority_regular => "Regularny";
|
||||
@override
|
||||
String get trade_details_created_at => "Utworzono w";
|
||||
@override
|
||||
String get send_success => "Twoje Monero zostało pomyślnie wysłane";
|
||||
@override
|
||||
String get settings_wallets => "Portfele";
|
||||
@override
|
||||
String get settings_only_transactions => "Tylko transakcje";
|
||||
@@ -4706,6 +4855,8 @@ class $pl extends S {
|
||||
@override
|
||||
String get nodes => "Węzły";
|
||||
@override
|
||||
String get error_text_template => "Nazwa i adres szablonu nie mogą zawierać ` , ' \" symbolika\ni musi mieć od 1 do 106 znaków";
|
||||
@override
|
||||
String get seed_share => "Udostępnij ziarno";
|
||||
@override
|
||||
String get widgets_restore_from_blockheight => "Przywróć z wysokości bloku";
|
||||
@@ -4846,6 +4997,8 @@ class $pl extends S {
|
||||
@override
|
||||
String get restore_active_seed => "Aktywne nasiona";
|
||||
@override
|
||||
String get send_name => "Imię";
|
||||
@override
|
||||
String get settings_personal => "Osobisty";
|
||||
@override
|
||||
String get seed_title => "Ziarno";
|
||||
@@ -4964,7 +5117,7 @@ class $pl extends S {
|
||||
@override
|
||||
String get settings_change_language => "Zmień język";
|
||||
@override
|
||||
String get clear => "Jasny";
|
||||
String get clear => "Wyczyść";
|
||||
@override
|
||||
String get settings_change_pin => "Zmień PIN";
|
||||
@override
|
||||
@@ -5082,6 +5235,8 @@ class $es extends S {
|
||||
@override
|
||||
String get transaction_sent => "Transacción enviada!";
|
||||
@override
|
||||
String get send_fee => "Cuota:";
|
||||
@override
|
||||
String get password => "Contraseña";
|
||||
@override
|
||||
String get you_will_get => "Conseguirás";
|
||||
@@ -5094,6 +5249,8 @@ class $es extends S {
|
||||
@override
|
||||
String get share_address => "Compartir dirección";
|
||||
@override
|
||||
String get send_templates => "Plantillas";
|
||||
@override
|
||||
String get please_try_to_connect_to_another_node => "Intenta conectarte a otro nodo";
|
||||
@override
|
||||
String get trade_state_traded => "Negociado";
|
||||
@@ -5118,6 +5275,8 @@ class $es extends S {
|
||||
@override
|
||||
String get seed_language_portuguese => "Portugués";
|
||||
@override
|
||||
String get send_new => "Nuevo";
|
||||
@override
|
||||
String get setup_pin => "PIN de configuración";
|
||||
@override
|
||||
String get transaction_details_recipient_address => "Dirección del receptor";
|
||||
@@ -5132,6 +5291,8 @@ class $es extends S {
|
||||
@override
|
||||
String get trade_state_trading => "Comercio";
|
||||
@override
|
||||
String get send_sending => "Enviando...";
|
||||
@override
|
||||
String get error_text_address => "La dirección de la billetera debe corresponder al tipo \nde criptomoneda";
|
||||
@override
|
||||
String get send_your_wallet => "Tu billetera";
|
||||
@@ -5262,6 +5423,8 @@ class $es extends S {
|
||||
@override
|
||||
String get paste => "Pegar";
|
||||
@override
|
||||
String get send_got_it => "Entendido";
|
||||
@override
|
||||
String get widgets_or => "o";
|
||||
@override
|
||||
String get remove => "Retirar";
|
||||
@@ -5270,12 +5433,16 @@ class $es extends S {
|
||||
@override
|
||||
String get yesterday => "Ayer";
|
||||
@override
|
||||
String get send_amount => "Cantidad:";
|
||||
@override
|
||||
String get expired => "Muerto";
|
||||
@override
|
||||
String get transaction_priority_regular => "Regular";
|
||||
@override
|
||||
String get trade_details_created_at => "Creado en";
|
||||
@override
|
||||
String get send_success => "Su Monero fue enviado con éxito";
|
||||
@override
|
||||
String get settings_wallets => "Carteras";
|
||||
@override
|
||||
String get settings_only_transactions => "Solo transacciones";
|
||||
@@ -5298,6 +5465,8 @@ class $es extends S {
|
||||
@override
|
||||
String get nodes => "Nodos";
|
||||
@override
|
||||
String get error_text_template => "El nombre y la dirección de la plantilla no pueden contener símbolos ` , '\" \ny debe tener entre 1 y 106 caracteres de longitud";
|
||||
@override
|
||||
String get seed_share => "Compartir semillas";
|
||||
@override
|
||||
String get widgets_restore_from_blockheight => "Restaurar desde blockheight";
|
||||
@@ -5438,6 +5607,8 @@ class $es extends S {
|
||||
@override
|
||||
String get restore_active_seed => "Semilla activa";
|
||||
@override
|
||||
String get send_name => "Nombre";
|
||||
@override
|
||||
String get settings_personal => "Personal";
|
||||
@override
|
||||
String get seed_title => "Semilla";
|
||||
@@ -5674,6 +5845,8 @@ class $nl extends S {
|
||||
@override
|
||||
String get transaction_sent => "Transactie verzonden!";
|
||||
@override
|
||||
String get send_fee => "Vergoeding:";
|
||||
@override
|
||||
String get password => "Wachtwoord";
|
||||
@override
|
||||
String get you_will_get => "Je zult krijgen";
|
||||
@@ -5686,6 +5859,8 @@ class $nl extends S {
|
||||
@override
|
||||
String get share_address => "Deel adres";
|
||||
@override
|
||||
String get send_templates => "Sjablonen";
|
||||
@override
|
||||
String get please_try_to_connect_to_another_node => "Probeer verbinding te maken met een ander knooppunt";
|
||||
@override
|
||||
String get trade_state_traded => "Traded";
|
||||
@@ -5710,6 +5885,8 @@ class $nl extends S {
|
||||
@override
|
||||
String get seed_language_portuguese => "Portugees";
|
||||
@override
|
||||
String get send_new => "Nieuw";
|
||||
@override
|
||||
String get setup_pin => "PIN instellen";
|
||||
@override
|
||||
String get transaction_details_recipient_address => "Adres van de ontvanger";
|
||||
@@ -5724,6 +5901,8 @@ class $nl extends S {
|
||||
@override
|
||||
String get trade_state_trading => "Handel";
|
||||
@override
|
||||
String get send_sending => "Bezig met verzenden...";
|
||||
@override
|
||||
String get error_text_address => "Portemonnee-adres moet overeenkomen met het type\nvan cryptocurrency";
|
||||
@override
|
||||
String get send_your_wallet => "Uw portemonnee";
|
||||
@@ -5854,6 +6033,8 @@ class $nl extends S {
|
||||
@override
|
||||
String get paste => "Plakken";
|
||||
@override
|
||||
String get send_got_it => "Ik snap het";
|
||||
@override
|
||||
String get widgets_or => "of";
|
||||
@override
|
||||
String get remove => "Verwijderen";
|
||||
@@ -5862,12 +6043,16 @@ class $nl extends S {
|
||||
@override
|
||||
String get yesterday => "Gisteren";
|
||||
@override
|
||||
String get send_amount => "Bedrag:";
|
||||
@override
|
||||
String get expired => "Verlopen";
|
||||
@override
|
||||
String get transaction_priority_regular => "Regelmatig";
|
||||
@override
|
||||
String get trade_details_created_at => "Gemaakt bij";
|
||||
@override
|
||||
String get send_success => "Uw Monero is succesvol verzonden";
|
||||
@override
|
||||
String get settings_wallets => "Portemonnee";
|
||||
@override
|
||||
String get settings_only_transactions => "Alleen transacties";
|
||||
@@ -5890,6 +6075,8 @@ class $nl extends S {
|
||||
@override
|
||||
String get nodes => "Knooppunten";
|
||||
@override
|
||||
String get error_text_template => "Sjabloonnaam en -adres mogen niet bevatten ` , ' \" symbolen\nen moet tussen de 1 en 106 tekens lang zijn";
|
||||
@override
|
||||
String get seed_share => "Deel zaad";
|
||||
@override
|
||||
String get widgets_restore_from_blockheight => "Herstel vanaf blockheight";
|
||||
@@ -6030,6 +6217,8 @@ class $nl extends S {
|
||||
@override
|
||||
String get restore_active_seed => "Actief zaad";
|
||||
@override
|
||||
String get send_name => "Naam";
|
||||
@override
|
||||
String get settings_personal => "Persoonlijk";
|
||||
@override
|
||||
String get seed_title => "Zaad";
|
||||
@@ -6266,6 +6455,8 @@ class $zh extends S {
|
||||
@override
|
||||
String get transaction_sent => "交易已发送";
|
||||
@override
|
||||
String get send_fee => "費用:";
|
||||
@override
|
||||
String get password => "密码";
|
||||
@override
|
||||
String get you_will_get => "你会得到";
|
||||
@@ -6278,6 +6469,8 @@ class $zh extends S {
|
||||
@override
|
||||
String get share_address => "分享地址";
|
||||
@override
|
||||
String get send_templates => "範本";
|
||||
@override
|
||||
String get please_try_to_connect_to_another_node => "请尝试连接到另一个节点";
|
||||
@override
|
||||
String get trade_state_traded => "交易";
|
||||
@@ -6302,6 +6495,8 @@ class $zh extends S {
|
||||
@override
|
||||
String get seed_language_portuguese => "葡萄牙語";
|
||||
@override
|
||||
String get send_new => "新";
|
||||
@override
|
||||
String get setup_pin => "设定PIN码";
|
||||
@override
|
||||
String get transaction_details_recipient_address => "收件人地址";
|
||||
@@ -6316,6 +6511,8 @@ class $zh extends S {
|
||||
@override
|
||||
String get trade_state_trading => "贸易";
|
||||
@override
|
||||
String get send_sending => "正在發送...";
|
||||
@override
|
||||
String get error_text_address => "钱包地址必须与类型对应\n加密货币";
|
||||
@override
|
||||
String get send_your_wallet => "你的钱包";
|
||||
@@ -6446,6 +6643,8 @@ class $zh extends S {
|
||||
@override
|
||||
String get paste => "糊";
|
||||
@override
|
||||
String get send_got_it => "得到它了";
|
||||
@override
|
||||
String get widgets_or => "要么";
|
||||
@override
|
||||
String get remove => "去掉";
|
||||
@@ -6454,12 +6653,16 @@ class $zh extends S {
|
||||
@override
|
||||
String get yesterday => "昨天";
|
||||
@override
|
||||
String get send_amount => "量:";
|
||||
@override
|
||||
String get expired => "已过期";
|
||||
@override
|
||||
String get transaction_priority_regular => "定期";
|
||||
@override
|
||||
String get trade_details_created_at => "创建于";
|
||||
@override
|
||||
String get send_success => "你Monero已成功發送";
|
||||
@override
|
||||
String get settings_wallets => "皮夹";
|
||||
@override
|
||||
String get settings_only_transactions => "仅交易";
|
||||
@@ -6482,6 +6685,8 @@ class $zh extends S {
|
||||
@override
|
||||
String get nodes => "节点";
|
||||
@override
|
||||
String get error_text_template => "模板名稱和地址不能包含`,' \" 符号\n并且必须在1到106个字符之间";
|
||||
@override
|
||||
String get seed_share => "分享种子";
|
||||
@override
|
||||
String get widgets_restore_from_blockheight => "从块高还原";
|
||||
@@ -6622,6 +6827,8 @@ class $zh extends S {
|
||||
@override
|
||||
String get restore_active_seed => "活性種子";
|
||||
@override
|
||||
String get send_name => "名稱";
|
||||
@override
|
||||
String get settings_personal => "个人";
|
||||
@override
|
||||
String get seed_title => "种子";
|
||||
|
||||
+7
-1
@@ -21,6 +21,7 @@ import 'package:cake_wallet/src/stores/login/login_store.dart';
|
||||
import 'package:cake_wallet/src/stores/balance/balance_store.dart';
|
||||
import 'package:cake_wallet/src/stores/sync/sync_store.dart';
|
||||
import 'package:cake_wallet/src/stores/wallet/wallet_store.dart';
|
||||
import 'package:cake_wallet/src/stores/send_template/send_template_store.dart';
|
||||
import 'package:cake_wallet/src/screens/root/root.dart';
|
||||
import 'package:cake_wallet/src/stores/authentication/authentication_store.dart';
|
||||
import 'package:cake_wallet/src/stores/settings/settings_store.dart';
|
||||
@@ -32,6 +33,7 @@ import 'package:cake_wallet/src/domain/common/default_settings_migration.dart';
|
||||
import 'package:cake_wallet/src/domain/common/fiat_currency.dart';
|
||||
import 'package:cake_wallet/src/domain/common/transaction_priority.dart';
|
||||
import 'package:cake_wallet/src/domain/common/wallet_type.dart';
|
||||
import 'package:cake_wallet/src/domain/common/template.dart';
|
||||
import 'package:cake_wallet/src/domain/services/wallet_service.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/src/domain/common/language.dart';
|
||||
@@ -48,6 +50,7 @@ void main() async {
|
||||
Hive.registerAdapter(TradeAdapter(), 3);
|
||||
Hive.registerAdapter(WalletInfoAdapter(), 4);
|
||||
Hive.registerAdapter(WalletTypeAdapter(), 5);
|
||||
Hive.registerAdapter(TemplateAdapter(), 6);
|
||||
|
||||
final secureStorage = FlutterSecureStorage();
|
||||
final transactionDescriptionsBoxKey = await getEncryptionKey(
|
||||
@@ -65,6 +68,7 @@ void main() async {
|
||||
final trades =
|
||||
await Hive.openBox<Trade>(Trade.boxName, encryptionKey: tradesBoxKey);
|
||||
final walletInfoSource = await Hive.openBox<WalletInfo>(WalletInfo.boxName);
|
||||
final templates = await Hive.openBox<Template>(Template.boxName);
|
||||
|
||||
final sharedPreferences = await SharedPreferences.getInstance();
|
||||
final walletService = WalletService();
|
||||
@@ -101,6 +105,7 @@ void main() async {
|
||||
final loginStore = LoginStore(
|
||||
sharedPreferences: sharedPreferences, walletsService: walletListService);
|
||||
final seedLanguageStore = SeedLanguageStore();
|
||||
final sendTemplateStore = SendTemplateStore(templateSource: templates);
|
||||
|
||||
setReactions(
|
||||
settingsStore: settingsStore,
|
||||
@@ -126,7 +131,8 @@ void main() async {
|
||||
Provider(create: (_) => nodes),
|
||||
Provider(create: (_) => transactionDescriptions),
|
||||
Provider(create: (_) => trades),
|
||||
Provider(create: (_) => seedLanguageStore)
|
||||
Provider(create: (_) => seedLanguageStore),
|
||||
Provider(create: (_) => sendTemplateStore),
|
||||
], child: CakeWalletApp()));
|
||||
}
|
||||
|
||||
|
||||
@@ -87,6 +87,7 @@ import 'package:cake_wallet/src/screens/seed/create_seed_page.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/create_dashboard_page.dart';
|
||||
import 'package:cake_wallet/src/screens/welcome/create_welcome_page.dart';
|
||||
import 'package:cake_wallet/src/screens/new_wallet/new_wallet_type_page.dart';
|
||||
import 'package:cake_wallet/src/screens/send/send_template_page.dart';
|
||||
|
||||
class Router {
|
||||
static Route<dynamic> generateRoute(
|
||||
@@ -235,6 +236,16 @@ class Router {
|
||||
transactionDescriptions: transactionDescriptions)),
|
||||
], child: SendPage()));
|
||||
|
||||
case Routes.sendTemplate:
|
||||
return CupertinoPageRoute<void>(
|
||||
builder: (_) => Provider(
|
||||
create: (_) => SendStore(
|
||||
walletService: walletService,
|
||||
priceStore: priceStore,
|
||||
transactionDescriptions: transactionDescriptions),
|
||||
child: SendTemplatePage())
|
||||
);
|
||||
|
||||
case Routes.receive:
|
||||
return CupertinoPageRoute<void>(
|
||||
fullscreenDialog: true,
|
||||
|
||||
@@ -44,4 +44,5 @@ class Routes {
|
||||
static const faq = '/faq';
|
||||
static const changeLanguage = '/change_language';
|
||||
static const newWalletType = '/new_wallet_type';
|
||||
static const sendTemplate = '/send_template';
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
import 'package:hive/hive.dart';
|
||||
|
||||
part 'template.g.dart';
|
||||
|
||||
@HiveType()
|
||||
class Template extends HiveObject {
|
||||
Template({this.name, this.address, this.cryptoCurrency, this.amount});
|
||||
|
||||
static const boxName = 'Template';
|
||||
|
||||
@HiveField(0)
|
||||
String name;
|
||||
|
||||
@HiveField(1)
|
||||
String address;
|
||||
|
||||
@HiveField(2)
|
||||
String cryptoCurrency;
|
||||
|
||||
@HiveField(3)
|
||||
String amount;
|
||||
}
|
||||
+328
-309
@@ -17,22 +17,55 @@ import 'package:cake_wallet/src/stores/send/send_store.dart';
|
||||
import 'package:cake_wallet/src/stores/send/sending_state.dart';
|
||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||
import 'package:cake_wallet/src/domain/common/crypto_currency.dart';
|
||||
import 'package:cake_wallet/src/domain/common/balance_display_mode.dart';
|
||||
import 'package:cake_wallet/src/domain/common/calculate_estimated_fee.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/src/domain/common/sync_status.dart';
|
||||
import 'package:cake_wallet/src/stores/sync/sync_store.dart';
|
||||
import 'package:cake_wallet/src/widgets/top_panel.dart';
|
||||
import 'package:dotted_border/dotted_border.dart';
|
||||
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
|
||||
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
|
||||
import 'package:cake_wallet/src/screens/send/widgets/confirm_sending_alert.dart';
|
||||
import 'package:cake_wallet/src/screens/send/widgets/sending_alert.dart';
|
||||
import 'package:cake_wallet/src/screens/send/widgets/template_tile.dart';
|
||||
import 'package:cake_wallet/src/stores/send_template/send_template_store.dart';
|
||||
|
||||
class SendPage extends BasePage {
|
||||
@override
|
||||
String get title => S.current.send_title;
|
||||
|
||||
@override
|
||||
bool get isModalBackButton => true;
|
||||
Color get backgroundColor => PaletteDark.menuList;
|
||||
|
||||
@override
|
||||
bool get resizeToAvoidBottomPadding => false;
|
||||
|
||||
@override
|
||||
Widget trailing(context) {
|
||||
final sendStore = Provider.of<SendStore>(context);
|
||||
|
||||
return Container(
|
||||
height: 32,
|
||||
width: 82,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||
color: PaletteDark.menuHeader
|
||||
),
|
||||
child: ButtonTheme(
|
||||
minWidth: double.minPositive,
|
||||
child: FlatButton(
|
||||
onPressed: () => sendStore.clear(),
|
||||
child: Text(
|
||||
S.of(context).clear,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 10.0,
|
||||
color: Colors.blue),
|
||||
)),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget body(BuildContext context) => SendForm();
|
||||
}
|
||||
@@ -44,7 +77,6 @@ class SendForm extends StatefulWidget {
|
||||
|
||||
class SendFormState extends State<SendForm> {
|
||||
final _addressController = TextEditingController();
|
||||
final _paymentIdController = TextEditingController();
|
||||
final _cryptoAmountController = TextEditingController();
|
||||
final _fiatAmountController = TextEditingController();
|
||||
|
||||
@@ -75,14 +107,11 @@ class SendFormState extends State<SendForm> {
|
||||
await showDialog<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text(S.of(context).openalias_alert_title),
|
||||
content: Text(S.of(context).openalias_alert_content(sendStore.recordName)),
|
||||
actions: <Widget>[
|
||||
FlatButton(
|
||||
child: Text(S.of(context).ok),
|
||||
onPressed: () => Navigator.of(context).pop())
|
||||
],
|
||||
return AlertWithOneAction(
|
||||
alertTitle: S.of(context).openalias_alert_title,
|
||||
alertContent: S.of(context).openalias_alert_content(sendStore.recordName),
|
||||
buttonText: S.of(context).ok,
|
||||
buttonAction: () => Navigator.of(context).pop()
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -96,92 +125,20 @@ class SendFormState extends State<SendForm> {
|
||||
final balanceStore = Provider.of<BalanceStore>(context);
|
||||
final walletStore = Provider.of<WalletStore>(context);
|
||||
final syncStore = Provider.of<SyncStore>(context);
|
||||
final sendTemplateStore = Provider.of<SendTemplateStore>(context);
|
||||
|
||||
_setEffects(context);
|
||||
|
||||
return ScrollableWithBottomSection(
|
||||
contentPadding: EdgeInsets.all(0),
|
||||
return Container(
|
||||
color: PaletteDark.historyPanel,
|
||||
child: ScrollableWithBottomSection(
|
||||
contentPadding: EdgeInsets.only(bottom: 24),
|
||||
content: Column(
|
||||
children: [
|
||||
Container(
|
||||
padding: EdgeInsets.only(left: 38, right: 30),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).backgroundColor,
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Palette.shadowGrey,
|
||||
blurRadius: 10,
|
||||
offset: Offset(0, 12),
|
||||
)
|
||||
],
|
||||
border: Border(
|
||||
top: BorderSide(
|
||||
width: 1,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.subtitle
|
||||
.backgroundColor))),
|
||||
child: SizedBox(
|
||||
height: 56,
|
||||
width: double.infinity,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
Observer(builder: (_) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text(S.of(context).send_your_wallet,
|
||||
style: TextStyle(
|
||||
fontSize: 12, color: Palette.lightViolet)),
|
||||
Text(walletStore.name,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.overline
|
||||
.color,
|
||||
height: 1.25)),
|
||||
]);
|
||||
}),
|
||||
Observer(builder: (context) {
|
||||
final savedDisplayMode = settingsStore.balanceDisplayMode;
|
||||
final availableBalance =
|
||||
savedDisplayMode == BalanceDisplayMode.hiddenBalance
|
||||
? '---'
|
||||
: balanceStore.unlockedBalance;
|
||||
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text(S.of(context).xmr_available_balance,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.overline
|
||||
.backgroundColor,
|
||||
)),
|
||||
Text(availableBalance,
|
||||
style: TextStyle(
|
||||
fontSize: 22,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.overline
|
||||
.color,
|
||||
height: 1.1)),
|
||||
]);
|
||||
})
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Form(
|
||||
key: _formKey,
|
||||
child: Container(
|
||||
padding:
|
||||
EdgeInsets.only(left: 38, right: 33, top: 10, bottom: 30),
|
||||
children: <Widget>[
|
||||
TopPanel(
|
||||
color: PaletteDark.menuList,
|
||||
widget: Form(
|
||||
key: _formKey,
|
||||
child: Column(children: <Widget>[
|
||||
AddressTextField(
|
||||
controller: _addressController,
|
||||
@@ -190,19 +147,16 @@ class SendFormState extends State<SendForm> {
|
||||
onURIScanned: (uri) {
|
||||
var address = '';
|
||||
var amount = '';
|
||||
var paymentId = '';
|
||||
|
||||
if (uri != null) {
|
||||
address = uri.path;
|
||||
amount = uri.queryParameters['tx_amount'];
|
||||
paymentId = uri.queryParameters['tx_payment_id'];
|
||||
} else {
|
||||
address = uri.toString();
|
||||
}
|
||||
|
||||
_addressController.text = address;
|
||||
_cryptoAmountController.text = amount;
|
||||
_paymentIdController.text = paymentId;
|
||||
},
|
||||
options: [
|
||||
AddressTextFieldOption.qrCode,
|
||||
@@ -214,102 +168,104 @@ class SendFormState extends State<SendForm> {
|
||||
return sendStore.errorMessage;
|
||||
},
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
child: TextFormField(
|
||||
style: TextStyle(
|
||||
fontSize: 14.0,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.overline
|
||||
.backgroundColor),
|
||||
controller: _paymentIdController,
|
||||
decoration: InputDecoration(
|
||||
hintStyle: TextStyle(
|
||||
fontSize: 14.0,
|
||||
color: Theme.of(context).hintColor),
|
||||
hintText: S.of(context).send_payment_id,
|
||||
focusedBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Palette.cakeGreen, width: 2.0)),
|
||||
enabledBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Theme.of(context).focusColor,
|
||||
width: 1.0))),
|
||||
validator: (value) {
|
||||
sendStore.validatePaymentID(value);
|
||||
return sendStore.errorMessage;
|
||||
}),
|
||||
Observer(
|
||||
builder: (_) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
child: TextFormField(
|
||||
style: TextStyle(
|
||||
fontSize: 16.0,
|
||||
color: Colors.white
|
||||
),
|
||||
controller: _cryptoAmountController,
|
||||
keyboardType: TextInputType.numberWithOptions(
|
||||
signed: false, decimal: true),
|
||||
inputFormatters: [
|
||||
BlacklistingTextInputFormatter(
|
||||
RegExp('[\\-|\\ |\\,]'))
|
||||
],
|
||||
decoration: InputDecoration(
|
||||
prefixIcon: Padding(
|
||||
padding: EdgeInsets.only(top: 12),
|
||||
child: Text('XMR:',
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.white,
|
||||
)),
|
||||
),
|
||||
suffixIcon: Padding(
|
||||
padding: EdgeInsets.only(
|
||||
bottom: 5
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
width: MediaQuery.of(context).size.width/2,
|
||||
alignment: Alignment.centerLeft,
|
||||
child: Text(
|
||||
' / ' + balanceStore.unlockedBalance,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
color: PaletteDark.walletCardText
|
||||
)
|
||||
),
|
||||
),
|
||||
Container(
|
||||
height: 32,
|
||||
width: 32,
|
||||
margin: EdgeInsets.only(left: 12, bottom: 7, top: 4),
|
||||
decoration: BoxDecoration(
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
borderRadius: BorderRadius.all(Radius.circular(6))
|
||||
),
|
||||
child: InkWell(
|
||||
onTap: () => sendStore.setSendAll(),
|
||||
child: Center(
|
||||
child: Text(S.of(context).all,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 9,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: PaletteDark.walletCardText
|
||||
)
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
hintStyle: TextStyle(
|
||||
fontSize: 16.0,
|
||||
color: Colors.white),
|
||||
hintText: '0.0000',
|
||||
focusedBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
width: 1.0)),
|
||||
enabledBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
width: 1.0))),
|
||||
validator: (value) {
|
||||
sendStore.validateXMR(
|
||||
value, balanceStore.unlockedBalance);
|
||||
return sendStore.errorMessage;
|
||||
}),
|
||||
);
|
||||
}
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
child: TextFormField(
|
||||
style: TextStyle(
|
||||
fontSize: 18.0,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.overline
|
||||
.color),
|
||||
controller: _cryptoAmountController,
|
||||
keyboardType: TextInputType.numberWithOptions(
|
||||
signed: false, decimal: true),
|
||||
inputFormatters: [
|
||||
BlacklistingTextInputFormatter(
|
||||
RegExp('[\\-|\\ |\\,]'))
|
||||
],
|
||||
decoration: InputDecoration(
|
||||
prefixIcon: Padding(
|
||||
padding: EdgeInsets.only(top: 12),
|
||||
child: Text('XMR:',
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.overline
|
||||
.color,
|
||||
)),
|
||||
),
|
||||
suffixIcon: Container(
|
||||
width: 1,
|
||||
padding: EdgeInsets.only(top: 0),
|
||||
child: Center(
|
||||
child: InkWell(
|
||||
onTap: () => sendStore.setSendAll(),
|
||||
child: Text(S.of(context).all,
|
||||
style: TextStyle(
|
||||
fontSize: 10,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.overline
|
||||
.decorationColor))),
|
||||
),
|
||||
),
|
||||
hintStyle: TextStyle(
|
||||
fontSize: 18.0,
|
||||
color: Theme.of(context).hintColor),
|
||||
hintText: '0.0000',
|
||||
focusedBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Palette.cakeGreen, width: 2.0)),
|
||||
enabledBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Theme.of(context).focusColor,
|
||||
width: 1.0))),
|
||||
validator: (value) {
|
||||
sendStore.validateXMR(
|
||||
value, balanceStore.unlockedBalance);
|
||||
return sendStore.errorMessage;
|
||||
}),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
child: TextFormField(
|
||||
style: TextStyle(
|
||||
fontSize: 18.0,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.overline
|
||||
.color),
|
||||
fontSize: 16.0,
|
||||
color: Colors.white),
|
||||
controller: _fiatAmountController,
|
||||
keyboardType: TextInputType.numberWithOptions(
|
||||
signed: false, decimal: true),
|
||||
@@ -323,123 +279,188 @@ class SendFormState extends State<SendForm> {
|
||||
child: Text(
|
||||
'${settingsStore.fiatCurrency.toString()}:',
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.overline
|
||||
.color,
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.white,
|
||||
)),
|
||||
),
|
||||
hintStyle: TextStyle(
|
||||
fontSize: 18.0,
|
||||
color: Theme.of(context).hintColor),
|
||||
fontSize: 16.0,
|
||||
color: PaletteDark.walletCardText),
|
||||
hintText: '0.00',
|
||||
focusedBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Palette.cakeGreen, width: 2.0)),
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
width: 1.0)),
|
||||
enabledBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Theme.of(context).focusColor,
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
width: 1.0)))),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 12.0, bottom: 10),
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
Text(S.of(context).send_estimated_fee,
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.overline
|
||||
.backgroundColor,
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Colors.white,
|
||||
)),
|
||||
Text(
|
||||
'${calculateEstimatedFee(priority: settingsStore.transactionPriority)} XMR',
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.overline
|
||||
.backgroundColor,
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Colors.white,
|
||||
))
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: Text(
|
||||
S.of(context).send_priority(
|
||||
settingsStore.transactionPriority.toString()),
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.subtitle
|
||||
.color,
|
||||
height: 1.3)),
|
||||
),
|
||||
)
|
||||
]),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
top: 32,
|
||||
left: 24,
|
||||
bottom: 24
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
S.of(context).send_templates,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: PaletteDark.walletCardText
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
height: 40,
|
||||
width: double.infinity,
|
||||
padding: EdgeInsets.only(left: 24),
|
||||
child: Observer(
|
||||
builder: (_) {
|
||||
final itemCount = sendTemplateStore.templates.length + 1;
|
||||
|
||||
return ListView.builder(
|
||||
scrollDirection: Axis.horizontal,
|
||||
itemCount: itemCount,
|
||||
itemBuilder: (context, index) {
|
||||
|
||||
if (index == 0) {
|
||||
return GestureDetector(
|
||||
onTap: () => Navigator.of(context)
|
||||
.pushNamed(Routes.sendTemplate, arguments: sendStore),
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(right: 10),
|
||||
child: DottedBorder(
|
||||
borderType: BorderType.RRect,
|
||||
dashPattern: [8, 4],
|
||||
color: PaletteDark.menuList,
|
||||
strokeWidth: 2,
|
||||
radius: Radius.circular(20),
|
||||
child: Container(
|
||||
height: 40,
|
||||
width: 75,
|
||||
padding: EdgeInsets.only(left: 10, right: 10),
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(20)),
|
||||
color: Colors.transparent,
|
||||
),
|
||||
child: Text(
|
||||
S.of(context).send_new,
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: PaletteDark.walletCardText
|
||||
),
|
||||
),
|
||||
)
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
index -= 1;
|
||||
|
||||
final template = sendTemplateStore.templates[index];
|
||||
|
||||
return TemplateTile(
|
||||
name: template.name,
|
||||
amount: template.amount,
|
||||
cryptoCurrency: template.cryptoCurrency,
|
||||
onTap: () {
|
||||
_addressController.text = template.address;
|
||||
_cryptoAmountController.text = template.amount;
|
||||
getOpenaliasRecord(context);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
bottomSectionPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24),
|
||||
bottomSection: Observer(builder: (_) {
|
||||
return LoadingPrimaryButton(
|
||||
onPressed: syncStore.status is SyncedSyncStatus
|
||||
? () async {
|
||||
// Hack. Don't ask me.
|
||||
FocusScope.of(context).requestFocus(FocusNode());
|
||||
// Hack. Don't ask me.
|
||||
FocusScope.of(context).requestFocus(FocusNode());
|
||||
|
||||
if (_formKey.currentState.validate()) {
|
||||
await showDialog<void>(
|
||||
context: context,
|
||||
builder: (dialogContext) {
|
||||
return AlertDialog(
|
||||
title: Text(
|
||||
S.of(context).send_creating_transaction),
|
||||
content: Text(S.of(context).confirm_sending),
|
||||
actions: <Widget>[
|
||||
FlatButton(
|
||||
child: Text(S.of(context).send),
|
||||
onPressed: () async {
|
||||
await Navigator.of(dialogContext)
|
||||
.popAndPushNamed(Routes.auth,
|
||||
arguments: (bool
|
||||
isAuthenticatedSuccessfully,
|
||||
AuthPageState auth) {
|
||||
if (!isAuthenticatedSuccessfully) {
|
||||
return;
|
||||
}
|
||||
if (_formKey.currentState.validate()) {
|
||||
await showDialog<void>(
|
||||
context: context,
|
||||
builder: (dialogContext) {
|
||||
return AlertWithTwoActions(
|
||||
alertTitle: S.of(context).send_creating_transaction,
|
||||
alertContent: S.of(context).confirm_sending,
|
||||
leftButtonText: S.of(context).send,
|
||||
rightButtonText: S.of(context).cancel,
|
||||
actionLeftButton: () async {
|
||||
await Navigator.of(dialogContext)
|
||||
.popAndPushNamed(Routes.auth,
|
||||
arguments: (bool
|
||||
isAuthenticatedSuccessfully,
|
||||
AuthPageState auth) {
|
||||
if (!isAuthenticatedSuccessfully) {
|
||||
return;
|
||||
}
|
||||
|
||||
Navigator.of(auth.context).pop();
|
||||
Navigator.of(auth.context).pop();
|
||||
|
||||
sendStore.createTransaction(
|
||||
address: _addressController.text,
|
||||
paymentId:
|
||||
_paymentIdController.text);
|
||||
});
|
||||
}),
|
||||
FlatButton(
|
||||
child: Text(S.of(context).cancel),
|
||||
onPressed: () =>
|
||||
Navigator.of(context).pop())
|
||||
],
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
: null,
|
||||
sendStore.createTransaction(
|
||||
address: _addressController.text,
|
||||
paymentId: '');
|
||||
});
|
||||
},
|
||||
actionRightButton: () =>
|
||||
Navigator.of(context).pop()
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
: null,
|
||||
text: S.of(context).send,
|
||||
color: Theme.of(context).accentTextTheme.button.backgroundColor,
|
||||
textColor: Theme.of(context).primaryTextTheme.button.color,
|
||||
color: Colors.blue,
|
||||
textColor: Colors.white,
|
||||
isLoading: sendStore.state is CreatingTransaction ||
|
||||
sendStore.state is TransactionCommiting);
|
||||
}));
|
||||
sendStore.state is TransactionCommiting,
|
||||
isDisabled: !(syncStore.status is SyncedSyncStatus),
|
||||
);
|
||||
}),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _setEffects(BuildContext context) {
|
||||
@@ -461,6 +482,20 @@ class SendFormState extends State<SendForm> {
|
||||
}
|
||||
});
|
||||
|
||||
reaction((_) => sendStore.address, (String address) {
|
||||
if (address != _addressController.text) {
|
||||
_addressController.text = address;
|
||||
}
|
||||
});
|
||||
|
||||
_addressController.addListener(() {
|
||||
final address = _addressController.text;
|
||||
|
||||
if (sendStore.address != address) {
|
||||
sendStore.changeAddress(address);
|
||||
}
|
||||
});
|
||||
|
||||
_fiatAmountController.addListener(() {
|
||||
final fiatAmount = _fiatAmountController.text;
|
||||
|
||||
@@ -483,14 +518,11 @@ class SendFormState extends State<SendForm> {
|
||||
showDialog<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text(S.of(context).error),
|
||||
content: Text(state.error),
|
||||
actions: <Widget>[
|
||||
FlatButton(
|
||||
child: Text(S.of(context).ok),
|
||||
onPressed: () => Navigator.of(context).pop())
|
||||
],
|
||||
return AlertWithOneAction(
|
||||
alertTitle: S.of(context).error,
|
||||
alertContent: state.error,
|
||||
buttonText: S.of(context).ok,
|
||||
buttonAction: () => Navigator.of(context).pop()
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -501,23 +533,25 @@ class SendFormState extends State<SendForm> {
|
||||
showDialog<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text(S.of(context).confirm_sending),
|
||||
content: Text(S.of(context).commit_transaction_amount_fee(
|
||||
sendStore.pendingTransaction.amount,
|
||||
sendStore.pendingTransaction.fee)),
|
||||
actions: <Widget>[
|
||||
FlatButton(
|
||||
child: Text(S.of(context).ok),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
sendStore.commitTransaction();
|
||||
}),
|
||||
FlatButton(
|
||||
child: Text(S.of(context).cancel),
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
)
|
||||
],
|
||||
return ConfirmSendingAlert(
|
||||
alertTitle: S.of(context).confirm_sending,
|
||||
amount: S.of(context).send_amount,
|
||||
amountValue: sendStore.pendingTransaction.amount,
|
||||
fee: S.of(context).send_fee,
|
||||
feeValue: sendStore.pendingTransaction.fee,
|
||||
leftButtonText: S.of(context).ok,
|
||||
rightButtonText: S.of(context).cancel,
|
||||
actionLeftButton: () {
|
||||
Navigator.of(context).pop();
|
||||
sendStore.commitTransaction();
|
||||
showDialog<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return SendingAlert(sendStore: sendStore);
|
||||
}
|
||||
);
|
||||
},
|
||||
actionRightButton: () => Navigator.of(context).pop()
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -525,23 +559,8 @@ class SendFormState extends State<SendForm> {
|
||||
|
||||
if (state is TransactionCommitted) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
showDialog<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text(S.of(context).sending),
|
||||
content: Text(S.of(context).transaction_sent),
|
||||
actions: <Widget>[
|
||||
FlatButton(
|
||||
child: Text(S.of(context).ok),
|
||||
onPressed: () {
|
||||
_addressController.text = '';
|
||||
_cryptoAmountController.text = '';
|
||||
Navigator.of(context)..pop()..pop();
|
||||
})
|
||||
],
|
||||
);
|
||||
});
|
||||
_addressController.text = '';
|
||||
_cryptoAmountController.text = '';
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -0,0 +1,273 @@
|
||||
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
import 'package:mobx/mobx.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:cake_wallet/palette.dart';
|
||||
import 'package:cake_wallet/src/widgets/address_text_field.dart';
|
||||
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
||||
import 'package:cake_wallet/src/stores/settings/settings_store.dart';
|
||||
import 'package:cake_wallet/src/stores/balance/balance_store.dart';
|
||||
import 'package:cake_wallet/src/stores/send/send_store.dart';
|
||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/src/widgets/top_panel.dart';
|
||||
import 'package:cake_wallet/src/stores/send_template/send_template_store.dart';
|
||||
|
||||
class SendTemplatePage extends BasePage {
|
||||
@override
|
||||
String get title => S.current.send_title;
|
||||
|
||||
@override
|
||||
Color get backgroundColor => PaletteDark.menuList;
|
||||
|
||||
@override
|
||||
bool get resizeToAvoidBottomPadding => false;
|
||||
|
||||
@override
|
||||
Widget body(BuildContext context) => SendTemplateForm();
|
||||
}
|
||||
|
||||
class SendTemplateForm extends StatefulWidget {
|
||||
@override
|
||||
SendTemplateFormState createState() => SendTemplateFormState();
|
||||
}
|
||||
|
||||
class SendTemplateFormState extends State<SendTemplateForm> {
|
||||
final _nameController = TextEditingController();
|
||||
final _addressController = TextEditingController();
|
||||
final _cryptoAmountController = TextEditingController();
|
||||
final _fiatAmountController = TextEditingController();
|
||||
|
||||
final _formKey = GlobalKey<FormState>();
|
||||
|
||||
bool _effectsInstalled = false;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_nameController.dispose();
|
||||
_addressController.dispose();
|
||||
_cryptoAmountController.dispose();
|
||||
_fiatAmountController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final settingsStore = Provider.of<SettingsStore>(context);
|
||||
final balanceStore = Provider.of<BalanceStore>(context);
|
||||
final sendStore = Provider.of<SendStore>(context);
|
||||
sendStore.settingsStore = settingsStore;
|
||||
final sendTemplateStore = Provider.of<SendTemplateStore>(context);
|
||||
|
||||
_setEffects(context);
|
||||
|
||||
return Container(
|
||||
color: PaletteDark.historyPanel,
|
||||
child: ScrollableWithBottomSection(
|
||||
contentPadding: EdgeInsets.only(bottom: 24),
|
||||
content: Column(
|
||||
children: <Widget>[
|
||||
TopPanel(
|
||||
color: PaletteDark.menuList,
|
||||
widget: Form(
|
||||
key: _formKey,
|
||||
child: Column(children: <Widget>[
|
||||
TextFormField(
|
||||
style: TextStyle(
|
||||
fontSize: 16.0,
|
||||
color: Colors.white),
|
||||
controller: _nameController,
|
||||
decoration: InputDecoration(
|
||||
hintStyle: TextStyle(
|
||||
fontSize: 16.0,
|
||||
color: PaletteDark.walletCardText),
|
||||
hintText: S.of(context).send_name,
|
||||
focusedBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
width: 1.0)),
|
||||
enabledBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
width: 1.0))),
|
||||
validator: (value) {
|
||||
sendTemplateStore.validateTemplate(value);
|
||||
return sendTemplateStore.errorMessage;
|
||||
},
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 20),
|
||||
child: AddressTextField(
|
||||
controller: _addressController,
|
||||
placeholder: S.of(context).send_monero_address,
|
||||
onURIScanned: (uri) {
|
||||
var address = '';
|
||||
var amount = '';
|
||||
|
||||
if (uri != null) {
|
||||
address = uri.path;
|
||||
amount = uri.queryParameters['tx_amount'];
|
||||
} else {
|
||||
address = uri.toString();
|
||||
}
|
||||
|
||||
_addressController.text = address;
|
||||
_cryptoAmountController.text = amount;
|
||||
},
|
||||
options: [
|
||||
AddressTextFieldOption.qrCode,
|
||||
AddressTextFieldOption.addressBook
|
||||
],
|
||||
validator: (value) {
|
||||
sendTemplateStore.validateTemplate(value);
|
||||
return sendTemplateStore.errorMessage;
|
||||
},
|
||||
),
|
||||
),
|
||||
Observer(
|
||||
builder: (_) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
child: TextFormField(
|
||||
style: TextStyle(
|
||||
fontSize: 16.0,
|
||||
color: Colors.white
|
||||
),
|
||||
controller: _cryptoAmountController,
|
||||
keyboardType: TextInputType.numberWithOptions(
|
||||
signed: false, decimal: true),
|
||||
inputFormatters: [
|
||||
BlacklistingTextInputFormatter(
|
||||
RegExp('[\\-|\\ |\\,]'))
|
||||
],
|
||||
decoration: InputDecoration(
|
||||
prefixIcon: Padding(
|
||||
padding: EdgeInsets.only(top: 12),
|
||||
child: Text('XMR:',
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.white,
|
||||
)),
|
||||
),
|
||||
hintStyle: TextStyle(
|
||||
fontSize: 16.0,
|
||||
color: Colors.white),
|
||||
hintText: '0.0000',
|
||||
focusedBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
width: 1.0)),
|
||||
enabledBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
width: 1.0))),
|
||||
),
|
||||
);
|
||||
}
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
child: TextFormField(
|
||||
style: TextStyle(
|
||||
fontSize: 16.0,
|
||||
color: Colors.white),
|
||||
controller: _fiatAmountController,
|
||||
keyboardType: TextInputType.numberWithOptions(
|
||||
signed: false, decimal: true),
|
||||
inputFormatters: [
|
||||
BlacklistingTextInputFormatter(
|
||||
RegExp('[\\-|\\ |\\,]'))
|
||||
],
|
||||
decoration: InputDecoration(
|
||||
prefixIcon: Padding(
|
||||
padding: EdgeInsets.only(top: 12),
|
||||
child: Text(
|
||||
'${settingsStore.fiatCurrency.toString()}:',
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.white,
|
||||
)),
|
||||
),
|
||||
hintStyle: TextStyle(
|
||||
fontSize: 16.0,
|
||||
color: PaletteDark.walletCardText),
|
||||
hintText: '0.00',
|
||||
focusedBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
width: 1.0)),
|
||||
enabledBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
width: 1.0)))),
|
||||
),
|
||||
]),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
bottomSectionPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24),
|
||||
bottomSection: PrimaryButton(
|
||||
onPressed: () {
|
||||
if (_formKey.currentState.validate()) {
|
||||
sendTemplateStore.addTemplate(
|
||||
name: _nameController.text,
|
||||
address: _addressController.text,
|
||||
cryptoCurrency: 'XMR',
|
||||
amount: _cryptoAmountController.text
|
||||
);
|
||||
sendTemplateStore.update();
|
||||
Navigator.of(context).pop();
|
||||
}
|
||||
},
|
||||
text: S.of(context).save,
|
||||
color: Colors.blue,
|
||||
textColor: Colors.white
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _setEffects(BuildContext context) {
|
||||
if (_effectsInstalled) {
|
||||
return;
|
||||
}
|
||||
|
||||
final sendStore = Provider.of<SendStore>(context);
|
||||
|
||||
reaction((_) => sendStore.fiatAmount, (String amount) {
|
||||
if (amount != _fiatAmountController.text) {
|
||||
_fiatAmountController.text = amount;
|
||||
}
|
||||
});
|
||||
|
||||
reaction((_) => sendStore.cryptoAmount, (String amount) {
|
||||
if (amount != _cryptoAmountController.text) {
|
||||
_cryptoAmountController.text = amount;
|
||||
}
|
||||
});
|
||||
|
||||
_fiatAmountController.addListener(() {
|
||||
final fiatAmount = _fiatAmountController.text;
|
||||
|
||||
if (sendStore.fiatAmount != fiatAmount) {
|
||||
sendStore.changeFiatAmount(fiatAmount);
|
||||
}
|
||||
});
|
||||
|
||||
_cryptoAmountController.addListener(() {
|
||||
final cryptoAmount = _cryptoAmountController.text;
|
||||
|
||||
if (sendStore.cryptoAmount != cryptoAmount) {
|
||||
sendStore.changeCryptoAmount(cryptoAmount);
|
||||
}
|
||||
});
|
||||
|
||||
_effectsInstalled = true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cake_wallet/src/widgets/base_alert_dialog.dart';
|
||||
|
||||
class ConfirmSendingAlert extends BaseAlertDialog {
|
||||
ConfirmSendingAlert({
|
||||
@required this.alertTitle,
|
||||
@required this.amount,
|
||||
@required this.amountValue,
|
||||
@required this.fee,
|
||||
@required this.feeValue,
|
||||
@required this.leftButtonText,
|
||||
@required this.rightButtonText,
|
||||
@required this.actionLeftButton,
|
||||
@required this.actionRightButton,
|
||||
this.alertBarrierDismissible = true
|
||||
});
|
||||
|
||||
final String alertTitle;
|
||||
final String amount;
|
||||
final String amountValue;
|
||||
final String fee;
|
||||
final String feeValue;
|
||||
final String leftButtonText;
|
||||
final String rightButtonText;
|
||||
final VoidCallback actionLeftButton;
|
||||
final VoidCallback actionRightButton;
|
||||
final bool alertBarrierDismissible;
|
||||
|
||||
@override
|
||||
String get titleText => alertTitle;
|
||||
|
||||
@override
|
||||
String get leftActionButtonText => leftButtonText;
|
||||
@override
|
||||
String get rightActionButtonText => rightButtonText;
|
||||
@override
|
||||
VoidCallback get actionLeft => actionLeftButton;
|
||||
@override
|
||||
VoidCallback get actionRight => actionRightButton;
|
||||
@override
|
||||
bool get barrierDismissible => alertBarrierDismissible;
|
||||
|
||||
@override
|
||||
Widget content(BuildContext context) {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
amount,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Colors.white,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
amountValue,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Colors.white,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
fee,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Colors.white,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
feeValue,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Colors.white,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
import 'dart:ui';
|
||||
import 'package:cake_wallet/palette.dart';
|
||||
import 'package:cake_wallet/src/stores/send/sending_state.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
||||
import 'package:cake_wallet/src/stores/send/send_store.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
|
||||
class SendingAlert extends StatefulWidget {
|
||||
SendingAlert({@required this.sendStore});
|
||||
|
||||
final SendStore sendStore;
|
||||
|
||||
@override
|
||||
SendingAlertState createState() => SendingAlertState(sendStore);
|
||||
}
|
||||
|
||||
class SendingAlertState extends State<SendingAlert> {
|
||||
SendingAlertState(this.sendStore);
|
||||
|
||||
final SendStore sendStore;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Observer(
|
||||
builder: (_) {
|
||||
final state = sendStore.state;
|
||||
|
||||
if (state is TransactionCommitted) {
|
||||
return Stack(
|
||||
children: <Widget>[
|
||||
Container(
|
||||
color: PaletteDark.historyPanel,
|
||||
child: Center(
|
||||
child: Image.asset(
|
||||
'assets/images/birthday_cake.png'),
|
||||
),
|
||||
),
|
||||
Center(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(top: 220, left: 24, right: 24),
|
||||
child: Text(
|
||||
S.of(context).send_success,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.white,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
left: 24,
|
||||
right: 24,
|
||||
bottom: 24,
|
||||
child: PrimaryButton(
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
text: S.of(context).send_got_it,
|
||||
color: Colors.blue,
|
||||
textColor: Colors.white
|
||||
)
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return Stack(
|
||||
children: <Widget>[
|
||||
Container(
|
||||
color: PaletteDark.historyPanel,
|
||||
child: Center(
|
||||
child: Image.asset(
|
||||
'assets/images/birthday_cake.png'),
|
||||
),
|
||||
),
|
||||
BackdropFilter(
|
||||
filter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(color: PaletteDark.historyPanel.withOpacity(0.25)),
|
||||
child: Center(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(top: 220),
|
||||
child: Text(
|
||||
S.of(context).send_sending,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.white,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cake_wallet/palette.dart';
|
||||
|
||||
class TemplateTile extends StatelessWidget {
|
||||
TemplateTile({
|
||||
@required this.name,
|
||||
@required this.amount,
|
||||
@required this.cryptoCurrency,
|
||||
@required this.onTap
|
||||
});
|
||||
|
||||
final String name;
|
||||
final String amount;
|
||||
final String cryptoCurrency;
|
||||
final VoidCallback onTap;
|
||||
|
||||
final toIcon = Image.asset('assets/images/to_icon.png');
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
padding: EdgeInsets.only(right: 10),
|
||||
child: GestureDetector(
|
||||
onTap: onTap,
|
||||
child: Container(
|
||||
height: 40,
|
||||
padding: EdgeInsets.only(left: 24, right: 24),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(20)),
|
||||
color: PaletteDark.menuList
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
amount,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Colors.white
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 5),
|
||||
child: Text(
|
||||
cryptoCurrency,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Colors.white
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 5),
|
||||
child: toIcon,
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 5),
|
||||
child: Text(
|
||||
name,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Colors.white
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -45,6 +45,9 @@ abstract class SendStoreBase with Store {
|
||||
@observable
|
||||
String cryptoAmount;
|
||||
|
||||
@observable
|
||||
String address;
|
||||
|
||||
@observable
|
||||
bool isValid;
|
||||
|
||||
@@ -157,6 +160,18 @@ abstract class SendStoreBase with Store {
|
||||
}
|
||||
}
|
||||
|
||||
@action
|
||||
void changeAddress(String address) {
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
@action
|
||||
void clear() {
|
||||
address = '';
|
||||
cryptoAmount = '';
|
||||
fiatAmount = '';
|
||||
}
|
||||
|
||||
Future<bool> isOpenaliasRecord(String name) async {
|
||||
final _openaliasRecord = await OpenaliasRecord
|
||||
.fetchAddressAndName(OpenaliasRecord.formatDomainName(name));
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
import 'dart:async';
|
||||
import 'package:mobx/mobx.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:cake_wallet/src/domain/common/template.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
|
||||
part 'send_template_store.g.dart';
|
||||
|
||||
class SendTemplateStore = SendTemplateBase with _$SendTemplateStore;
|
||||
|
||||
abstract class SendTemplateBase with Store {
|
||||
SendTemplateBase({this.templateSource}) {
|
||||
templates = ObservableList<Template>();
|
||||
update();
|
||||
}
|
||||
|
||||
@observable
|
||||
ObservableList<Template> templates;
|
||||
|
||||
@observable
|
||||
bool isValid;
|
||||
|
||||
@observable
|
||||
String errorMessage;
|
||||
|
||||
Box<Template> templateSource;
|
||||
|
||||
@action
|
||||
void update() =>
|
||||
templates.replaceRange(0, templates.length, templateSource.values.toList());
|
||||
|
||||
@action
|
||||
Future addTemplate({String name, String address, String cryptoCurrency, String amount}) async {
|
||||
final template = Template(name: name, address: address,
|
||||
cryptoCurrency: cryptoCurrency, amount: amount);
|
||||
await templateSource.add(template);
|
||||
}
|
||||
|
||||
@action
|
||||
Future remove({Template template}) async => await template.delete();
|
||||
|
||||
void validateTemplate(String value) {
|
||||
const pattern = '''^[^`,'"]{1,106}\$''';
|
||||
final regExp = RegExp(pattern);
|
||||
isValid = regExp.hasMatch(value);
|
||||
errorMessage = isValid ? null : S.current.error_text_template;
|
||||
}
|
||||
}
|
||||
@@ -40,6 +40,10 @@ class AddressTextField extends StatelessWidget {
|
||||
enabled: isActive,
|
||||
controller: controller,
|
||||
focusNode: focusNode,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.white
|
||||
),
|
||||
decoration: InputDecoration(
|
||||
suffixIcon: SizedBox(
|
||||
width: prefixIconWidth * options.length +
|
||||
@@ -58,9 +62,9 @@ class AddressTextField extends StatelessWidget {
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(8),
|
||||
decoration: BoxDecoration(
|
||||
color: Palette.wildDarkBlueWithOpacity,
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
borderRadius:
|
||||
BorderRadius.all(Radius.circular(8))),
|
||||
BorderRadius.all(Radius.circular(6))),
|
||||
child: Image.asset('assets/images/qr_code_icon.png')),
|
||||
))
|
||||
],
|
||||
@@ -76,11 +80,11 @@ class AddressTextField extends StatelessWidget {
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(8),
|
||||
decoration: BoxDecoration(
|
||||
color: Palette.wildDarkBlueWithOpacity,
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
borderRadius:
|
||||
BorderRadius.all(Radius.circular(8))),
|
||||
BorderRadius.all(Radius.circular(6))),
|
||||
child: Image.asset(
|
||||
'assets/images/address_book_icon.png')),
|
||||
'assets/images/open_book.png')),
|
||||
))
|
||||
],
|
||||
if (this
|
||||
@@ -95,9 +99,9 @@ class AddressTextField extends StatelessWidget {
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(8),
|
||||
decoration: BoxDecoration(
|
||||
color: Palette.wildDarkBlueWithOpacity,
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
borderRadius:
|
||||
BorderRadius.all(Radius.circular(8))),
|
||||
BorderRadius.all(Radius.circular(6))),
|
||||
child: Image.asset(
|
||||
'assets/images/receive_icon_raw.png')),
|
||||
))
|
||||
@@ -105,13 +109,18 @@ class AddressTextField extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
),
|
||||
hintStyle: TextStyle(color: Theme.of(context).hintColor),
|
||||
hintStyle: TextStyle(
|
||||
fontSize: 16,
|
||||
color: PaletteDark.walletCardText
|
||||
),
|
||||
hintText: placeholder ?? S.current.widgets_address,
|
||||
focusedBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(color: Palette.cakeGreen, width: 2.0)),
|
||||
borderSide: BorderSide(
|
||||
color: PaletteDark.walletCardSubAddressField,
|
||||
width: 1.0)),
|
||||
enabledBorder: UnderlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(color: Theme.of(context).focusColor, width: 1.0)),
|
||||
BorderSide(color: PaletteDark.walletCardSubAddressField, width: 1.0)),
|
||||
),
|
||||
validator: validator,
|
||||
);
|
||||
|
||||
@@ -138,7 +138,7 @@ class BaseAlertDialog extends StatelessWidget {
|
||||
Container(
|
||||
width: 300,
|
||||
height: 77,
|
||||
padding: EdgeInsets.all(24),
|
||||
padding: EdgeInsets.only(left: 24, right: 24),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(24),
|
||||
|
||||
@@ -238,7 +238,6 @@ class SeedWidgetState extends State<SeedWidget> {
|
||||
fit: FlexFit.tight,
|
||||
flex: 1,
|
||||
child: TopPanel(
|
||||
height: null,
|
||||
color: PaletteDark.menuList,
|
||||
widget: SingleChildScrollView(
|
||||
child: Column(
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class TopPanel extends StatelessWidget {
|
||||
TopPanel({@required this.height, @required this.color, @required this.widget});
|
||||
TopPanel({@required this.color, @required this.widget});
|
||||
|
||||
final double height;
|
||||
final Color color;
|
||||
final Widget widget;
|
||||
|
||||
@@ -11,7 +10,6 @@ class TopPanel extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
width: double.infinity,
|
||||
height: height ?? double.infinity,
|
||||
padding: EdgeInsets.all(24),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.only(
|
||||
|
||||
Reference in New Issue
Block a user