Merge pull request #58 from cake-tech/CWA-210-rework-send-screen

Cwa 210 rework send screen
This commit is contained in:
Oleksandr Sobol 2020-05-12 16:20:33 +03:00 committed by GitHub
commit 38d7dbcb33
37 changed files with 1348 additions and 329 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 956 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 665 B

After

Width:  |  Height:  |  Size: 638 B

BIN
assets/images/to_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 B

View file

@ -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 => "опіювати адресу";
@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 => "种子";

View file

@ -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()));
}

View file

@ -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,

View file

@ -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';
}

View file

@ -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;
}

View file

@ -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 = '';
});
}
});

View file

@ -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;
}
}

View file

@ -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,
),
)
],
)
],
);
}
}

View file

@ -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,
),
),
),
),
),
)
],
);
}
);
}
}

View file

@ -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
),
),
),
],
),
),
),
);
}
}

View file

@ -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));

View file

@ -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;
}
}

View file

@ -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,
);

View file

@ -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),

View file

@ -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(

View file

@ -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(

View file

@ -232,6 +232,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.7"
dotted_border:
dependency: "direct main"
description:
name: dotted_border
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.5"
encrypt:
dependency: "direct main"
description:
@ -525,6 +532,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.4"
path_drawing:
dependency: transitive
description:
name: path_drawing
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.1"
path_parsing:
dependency: transitive
description:
name: path_parsing
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.4"
path_provider:
dependency: "direct main"
description:

View file

@ -49,6 +49,7 @@ dependencies:
package_info: ^0.4.0+13
devicelocale: ^0.2.1
auto_size_text: ^2.1.0
dotted_border: ^1.0.5
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.

View file

@ -189,6 +189,14 @@
"send_estimated_fee" : "Geschätzte Gebühr:",
"send_priority" : "Derzeit ist die Gebühr auf festgelegt ${transactionPriority} priorität.\nDie Transaktionspriorität kann in den Einstellungen angepasst werden",
"send_creating_transaction" : "Transaktion erstellen",
"send_templates" : "Vorlagen",
"send_new" : "Neu",
"send_amount" : "Menge:",
"send_fee" : "Gebühr:",
"send_name" : "Name",
"send_got_it" : "Ich habs",
"send_sending" : "Senden...",
"send_success" : "Ihr Monero wurde erfolgreich gesendet",
"settings_title" : "die Einstellungen",
@ -295,6 +303,7 @@
"error_text_minimal_limit" : "Handel für ${provider} wird nicht erstellt. Menge ist weniger als minimal: ${min} ${currency}",
"error_text_maximum_limit" : "Handel für ${provider} wird nicht erstellt. Menge ist mehr als maximal: ${max} ${currency}",
"error_text_limits_loading_failed" : "Handel für ${provider} wird nicht erstellt. Das Laden der Limits ist fehlgeschlagen",
"error_text_template" : "Vorlagenname und Adresse dürfen nicht enthalten ` , ' \" symbole\nund muss zwischen 1 und 106 Zeichen lang sein",
"auth_store_ban_timeout" : "Auszeit verbieten",

View file

@ -189,6 +189,14 @@
"send_estimated_fee" : "Estimated fee:",
"send_priority" : "Currently the fee is set at ${transactionPriority} priority.\nTransaction priority can be adjusted in the settings",
"send_creating_transaction" : "Creating transaction",
"send_templates" : "Templates",
"send_new" : "New",
"send_amount" : "Amount:",
"send_fee" : "Fee:",
"send_name" : "Name",
"send_got_it" : "Got it",
"send_sending" : "Sending...",
"send_success" : "Your Monero was successfully sent",
"settings_title" : "Settings",
@ -295,6 +303,7 @@
"error_text_minimal_limit" : "Trade for ${provider} is not created. Amount is less then minimal: ${min} ${currency}",
"error_text_maximum_limit" : "Trade for ${provider} is not created. Amount is more then maximum: ${max} ${currency}",
"error_text_limits_loading_failed" : "Trade for ${provider} is not created. Limits loading failed",
"error_text_template" : "Template name and address can't contain ` , ' \" symbols\nand must be between 1 and 106 characters long",
"auth_store_ban_timeout" : "ban_timeout",

View file

@ -189,6 +189,14 @@
"send_estimated_fee" : "Tarifa estimada:",
"send_priority" : "Actualmente la tarifa se establece en ${transactionPriority} prioridad.\nLa prioridad de la transacción se puede ajustar en la configuración",
"send_creating_transaction" : "Creando transacción",
"send_templates" : "Plantillas",
"send_new" : "Nuevo",
"send_amount" : "Cantidad:",
"send_fee" : "Cuota:",
"send_name" : "Nombre",
"send_got_it" : "Entendido",
"send_sending" : "Enviando...",
"send_success" : "Su Monero fue enviado con éxito",
"settings_title" : "Configuraciones",
@ -295,6 +303,7 @@
"error_text_minimal_limit" : "El comercio por ${provider} no se crea. La cantidad es menos que mínima: ${min} ${currency}",
"error_text_maximum_limit" : "El comercio por ${provider} no se crea. La cantidad es más que el máximo: ${max} ${currency}",
"error_text_limits_loading_failed" : "El comercio por ${provider} no se crea. Límites de carga fallidos",
"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",
"auth_store_ban_timeout" : "prohibición de tiempo de espera",

View file

@ -189,6 +189,14 @@
"send_estimated_fee" : "अनुमानित शुल्क:",
"send_priority" : "वर्तमान में शुल्क निर्धारित है ${transactionPriority} प्राथमिकता.\nलेन-देन की प्राथमिकता को सेटिंग्स में समायोजित किया जा सकता है",
"send_creating_transaction" : "लेन-देन बनाना",
"send_templates" : "टेम्पलेट्स",
"send_new" : "नया",
"send_amount" : "रकम:",
"send_fee" : "शुल्क:",
"send_name" : "नाम",
"send_got_it" : "समझ गया",
"send_sending" : "भेजना...",
"send_success" : "आपका Monero सफलतापूर्वक भेजा गया",
"settings_title" : "सेटिंग्स",
@ -295,6 +303,7 @@
"error_text_minimal_limit" : "व्यापार ${provider} के लिए नहीं बनाया गया है। राशि कम है तो न्यूनतम: ${min} ${currency}",
"error_text_maximum_limit" : "व्यापार ${provider} के लिए नहीं बनाया गया है। राशि अधिक है तो अधिकतम: ${max} ${currency}",
"error_text_limits_loading_failed" : "व्यापार ${provider} के लिए नहीं बनाया गया है। लोडिंग की सीमाएं विफल रहीं",
"error_text_template" : "टेम्प्लेट का नाम और पता नहीं हो सकता ` , ' \" प्रतीकों\nऔर 1 और 106 वर्णों के बीच लंबा होना चाहिए",
"auth_store_ban_timeout" : "समय की पाबंदी",

View file

@ -189,6 +189,14 @@
"send_estimated_fee" : "見積手数料:",
"send_priority" : "現在、料金は ${transactionPriority} 優先度.\nトランザクションの優先度は設定で調整できます",
"send_creating_transaction" : "トランザクションを作成する",
"send_templates" : "テンプレート",
"send_new" : "新着",
"send_amount" : "量:",
"send_fee" : "費用:",
"send_name" : "名前",
"send_got_it" : "とった",
"send_sending" : "送信...",
"send_success" : "Moneroが送信されました",
"settings_title" : "設定",
@ -295,6 +303,7 @@
"error_text_minimal_limit" : "${provider} の取引は作成されません。 金額は最小額より少ない: ${min} ${currency}",
"error_text_maximum_limit" : "${provider} の取引は作成されません。 金額は最大値を超えています: ${max} ${currency}",
"error_text_limits_loading_failed" : "${provider} の取引は作成されません。 制限の読み込みに失敗しました",
"error_text_template" : "テンプレートの名前とアドレスに含めることはできません ` , ' \" シンボル\n1〜106文字の長さである必要があります",
"auth_store_ban_timeout" : "禁止タイムアウト",

View file

@ -189,6 +189,14 @@
"send_estimated_fee" : "예상 수수료:",
"send_priority" : "현재 수수료는 ${transactionPriority} 우선 순위.\n거래 우선 순위는 설정에서 조정할 수 있습니다",
"send_creating_transaction" : "거래 생성",
"send_templates" : "템플릿",
"send_new" : "새로운",
"send_amount" : "양:",
"send_fee" : "회비:",
"send_name" : "이름",
"send_got_it" : "알았다",
"send_sending" : "배상...",
"send_success" : "Monero가 성공적으로 전송되었습니다",
"settings_title" : "설정",
@ -295,6 +303,7 @@
"error_text_minimal_limit" : "거래 ${provider} 가 생성되지 않습니다. 금액이 최소보다 적습니다. ${min} ${currency}",
"error_text_maximum_limit" : "거래 ${provider} 가 생성되지 않습니다. 금액이 최대 값보다 많습니다. ${max} ${currency}",
"error_text_limits_loading_failed" : "거래 ${provider} 가 생성되지 않습니다. 로딩 실패",
"error_text_template" : "템플릿 이름과 주소는 포함 할 수 없습니다 ` , ' \" 기호 \n1 ~ 106 자 사이 여야합니다",
"auth_store_ban_timeout" : "타임 아웃 금지",

View file

@ -189,6 +189,14 @@
"send_estimated_fee" : "Geschatte vergoeding:",
"send_priority" : "Momenteel is de vergoeding vastgesteld op ${transactionPriority} prioriteit.\nTransactieprioriteit kan worden aangepast in de instellingen",
"send_creating_transaction" : "Transactie maken",
"send_templates" : "Sjablonen",
"send_new" : "Nieuw",
"send_amount" : "Bedrag:",
"send_fee" : "Vergoeding:",
"send_name" : "Naam",
"send_got_it" : "Ik snap het",
"send_sending" : "Bezig met verzenden...",
"send_success" : "Uw Monero is succesvol verzonden",
"settings_title" : "Instellingen",
@ -295,6 +303,7 @@
"error_text_minimal_limit" : "Ruil voor ${provider} is niet gemaakt. Bedrag is minder dan minimaal: ${min} ${currency}",
"error_text_maximum_limit" : "Ruil voor ${provider} is niet gemaakt. Bedrag is meer dan maximaal: ${max} ${currency}",
"error_text_limits_loading_failed" : "Ruil voor ${provider} is niet gemaakt. Beperkingen laden mislukt",
"error_text_template" : "Sjabloonnaam en -adres mogen niet bevatten ` , ' \" symbolen\nen moet tussen de 1 en 106 tekens lang zijn",
"auth_store_ban_timeout" : "time-out verbieden",

View file

@ -58,7 +58,7 @@
"exchange" : "Wymieniać się",
"clear" : "Jasny",
"clear" : "Wyczyść",
"change_exchange_provider" : "Zmień dostawcę programu Exchange",
"you_will_send" : "Wyślesz",
"you_will_get" : "Dostaniesz",
@ -189,6 +189,14 @@
"send_estimated_fee" : "Szacowana opłata:",
"send_priority" : "Obecnie opłata ustalona jest na ${transactionPriority} priorytet.\nPriorytet transakcji można zmienić w ustawieniach",
"send_creating_transaction" : "Tworzenie transakcji",
"send_templates" : "Szablony",
"send_new" : "Nowy",
"send_amount" : "Ilość:",
"send_fee" : "Opłata:",
"send_name" : "Imię",
"send_got_it" : "Rozumiem",
"send_sending" : "Wysyłanie...",
"send_success" : "Twoje Monero zostało pomyślnie wysłane",
"settings_title" : "Ustawienia",
@ -295,6 +303,7 @@
"error_text_minimal_limit" : "Wymiana dla ${provider} nie została utworzona. Kwota jest mniejsza niż minimalna: ${min} ${currency}",
"error_text_maximum_limit" : "Wymiana dla ${provider} nie została utworzona. Kwota jest większa niż maksymalna: ${max} ${currency}",
"error_text_limits_loading_failed" : "Wymiana dla ${provider} nie została utworzona. Ładowanie limitów nie powiodło się",
"error_text_template" : "Nazwa i adres szablonu nie mogą zawierać ` , ' \" symbolika\ni musi mieć od 1 do 106 znaków",
"auth_store_ban_timeout" : "przekroczenie limitu czasu",

View file

@ -189,6 +189,14 @@
"send_estimated_fee" : "Taxa estimada:",
"send_priority" : "Atualmente, a taxa está definida para a prioridade: ${transactionPriority}.\nA prioridade da transação pode ser ajustada nas configurações",
"send_creating_transaction" : "Criando transação",
"send_templates" : "Modelos",
"send_new" : "Novo",
"send_amount" : "Montante:",
"send_fee" : "Taxa:",
"send_name" : "Nome",
"send_got_it" : "Entendi",
"send_sending" : "Enviando...",
"send_success" : "Seu Monero foi enviado com sucesso",
"settings_title" : "Configurações",
@ -295,6 +303,7 @@
"error_text_minimal_limit" : "A troca por ${provider} não é criada. O valor é menor que o mínimo: ${min} ${currency}",
"error_text_maximum_limit" : "A troca por ${provider} não é criada. O valor é superior ao máximo: ${max} ${currency}",
"error_text_limits_loading_failed" : "A troca por ${provider} não é criada. Falha no carregamento dos limites",
"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",
"auth_store_ban_timeout" : "ban_timeout",

View file

@ -189,6 +189,14 @@
"send_estimated_fee" : "Предполагаемая комиссия:",
"send_priority" : "Комиссия установлена в зависимости от приоритета: ${transactionPriority}.\nПриоритет транзакции может быть изменён в настройках",
"send_creating_transaction" : "Создать транзакцию",
"send_templates" : "Шаблоны",
"send_new" : "Новый",
"send_amount" : "Сумма:",
"send_fee" : "Комиссия:",
"send_name" : "Имя",
"send_got_it" : "Понял",
"send_sending" : "Отправка...",
"send_success" : "Ваш Monero был успешно отправлен",
"settings_title" : "Настройки",
@ -295,6 +303,7 @@
"error_text_minimal_limit" : "Сделка для ${provider} не создана. Сумма меньше минимальной: ${min} ${currency}",
"error_text_maximum_limit" : "Сделка для ${provider} не создана. Сумма больше максимальной: ${max} ${currency}",
"error_text_limits_loading_failed" : "Сделка для ${provider} не создана. Ошибка загрузки лимитов",
"error_text_template" : "Имя и адрес шаблона не может содержать ` , ' \" символы\nи должно быть от 1 до 106 символов в длину",
"auth_store_ban_timeout" : "ban_timeout",

View file

@ -189,6 +189,14 @@
"send_estimated_fee" : "Ймовірна комісія:",
"send_priority" : "Комісія встановлена в залежності від пріоритету: ${transactionPriority}.\nПріоритет транзакції може бути змінений в налаштуваннях",
"send_creating_transaction" : "Створити транзакцію",
"send_templates" : "Шаблони",
"send_new" : "Новий",
"send_amount" : "Сума:",
"send_fee" : "Комісія:",
"send_name" : "Ім'я",
"send_got_it" : "Зрозумів",
"send_sending" : "Відправлення...",
"send_success" : "Ваш Monero успішно надісланий",
"settings_title" : "Налаштування",
@ -287,7 +295,7 @@
"error_text_payment_id" : "Ідентифікатор платежу може містити від 16 до 64 символів в hex",
"error_text_xmr" : "Значення XMR не може перевищувати доступний баланс.\nКількість цифр після коми повинно бути меншим або дорівнювати 12",
"error_text_fiat" : "Значення суми не може перевищувати доступний баланс.\nКількість цифр після коми повинно бути меншим або дорівнювати 2",
"error_text_subaddress_name" : "Ім'я субадреси не може містити ` , ' \" символи\nі може бути від 1 до 32 символів в довжину",
"error_text_subaddress_name" : "Ім'я субадреси не може містити ` , ' \" символи\nі може бути від 1 до 20 символів в довжину",
"error_text_amount" : "Баланс може містити тільки цифри",
"error_text_wallet_name" : "Ім'я гаманця може містити тільки букви, цифри\nі повинно бути від 1 до 15 символів в довжину",
"error_text_keys" : "Ключі гаманця можуть містити тільки 64 символів в hex",
@ -295,6 +303,7 @@
"error_text_minimal_limit" : "Операція для ${provider} не створена. Сума менша мінімальної: ${min} ${currency}",
"error_text_maximum_limit" : "Операція для ${provider} не створена. Сума більше максимальної: ${max} ${currency}",
"error_text_limits_loading_failed" : "Операція для ${provider} не створена. Помилка завантаження лімітів",
"error_text_template" : "Ім'я та адреса шаблону не може містити ` , ' \" символи\nі може бути від 1 до 106 символів в довжину",
"auth_store_ban_timeout" : "ban_timeout",

View file

@ -189,6 +189,14 @@
"send_estimated_fee" : "预估费用:",
"send_priority" : "目前,费用设置为 ${transactionPriority} 优先.\n交易优先级可以在设置中进行调整",
"send_creating_transaction" : "创建交易",
"send_templates" : "範本",
"send_new" : "新",
"send_amount" : "量:",
"send_fee" : "費用:",
"send_name" : "名稱",
"send_got_it" : "得到它了",
"send_sending" : "正在發送...",
"send_success" : "你Monero已成功發送",
"settings_title" : "设定值",
@ -295,6 +303,7 @@
"error_text_minimal_limit" : "未創建 ${provider} 交易。 金額少於最小值:${min} ${currency}",
"error_text_maximum_limit" : "未創建 ${provider} 交易。 金額大於最大值:${max} ${currency}",
"error_text_limits_loading_failed" : "未創建 ${provider} 交易。 限制加載失敗",
"error_text_template" : "模板名稱和地址不能包含`' \" 符号\n并且必须在1到106个字符之间",
"auth_store_ban_timeout" : "禁止超时",