Merge pull request #58 from cake-tech/CWA-210-rework-send-screen
Cwa 210 rework send screen
Before Width: | Height: | Size: 956 B After Width: | Height: | Size: 1.1 KiB |
BIN
assets/images/2.0x/to_icon.png
Normal file
After Width: | Height: | Size: 235 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
BIN
assets/images/3.0x/to_icon.png
Normal file
After Width: | Height: | Size: 267 B |
BIN
assets/images/birthday_cake.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 665 B After Width: | Height: | Size: 638 B |
BIN
assets/images/to_icon.png
Normal file
After Width: | Height: | Size: 173 B |
|
@ -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 => "种子";
|
||||
|
|
|
@ -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';
|
||||
}
|
22
lib/src/domain/common/template.dart
Normal 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;
|
||||
}
|
|
@ -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 = '';
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
273
lib/src/screens/send/send_template_page.dart
Normal 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;
|
||||
}
|
||||
}
|
100
lib/src/screens/send/widgets/confirm_sending_alert.dart
Normal 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,
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
105
lib/src/screens/send/widgets/sending_alert.dart
Normal 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,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
76
lib/src/screens/send/widgets/template_tile.dart
Normal 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
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
|
|
48
lib/src/stores/send_template/send_template_store.dart
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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(
|
||||
|
|
21
pubspec.lock
|
@ -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:
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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" : "समय की पाबंदी",
|
||||
|
|
|
@ -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" : "禁止タイムアウト",
|
||||
|
|
|
@ -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" : "타임 아웃 금지",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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" : "禁止超时",
|
||||
|
|