CW-277-Allow-editing-nodes (#827)

* allow editing nodes * fix buttons size * fix comments

Serhii committed Mar 15, 2023 at 15:24 UTC f458e5b34974c6cde45a1928aad70b0b2ed049c2
29 files changed +150 -85
lib/di.dart
+7 -3
@@ -515,10 +515,14 @@ Future setup(
515 _nodeSource,
516 type ?? getIt.get<AppStore>().wallet!.type,
517 getIt.get<SettingsStore>(),
518 + getIt.get<NodeListViewModel>()
519 ));
520
520 - getIt.registerFactory(
521 - () => NodeCreateOrEditPage(getIt.get<NodeCreateOrEditViewModel>()));
521 + getIt.registerFactoryParam<NodeCreateOrEditPage, Node?, bool?>(
522 + (Node? editingNode, bool? isSelected) => NodeCreateOrEditPage(
523 + nodeCreateOrEditViewModel: getIt.get<NodeCreateOrEditViewModel>(),
524 + editingNode: editingNode,
525 + isSelected: isSelected));
526
527 getIt.registerFactory(() => OnRamperPage(
528 settingsStore: getIt.get<AppStore>().settingsStore,
@@ -796,7 +800,7 @@ Future setup(
800 return IoniaMoreOptionsPage(giftCard);
801 });
802
799 - getIt.registerFactoryParam<IoniaCustomRedeemViewModel, IoniaGiftCard, void>((IoniaGiftCard giftCard, _)
803 + getIt.registerFactoryParam<IoniaCustomRedeemViewModel, IoniaGiftCard, void>((IoniaGiftCard giftCard, _)
804 => IoniaCustomRedeemViewModel(giftCard: giftCard, ioniaService: getIt.get<IoniaService>()));
805
806 getIt.registerFactoryParam<IoniaCustomRedeemPage, List, void>((List args, _){
lib/router.dart
+5 -1
@@ -82,6 +82,7 @@ import 'package:cake_wallet/src/screens/ionia/cards/ionia_payment_status_page.da
82 import 'package:cake_wallet/anypay/any_pay_payment_committed_info.dart';
83 import 'package:cake_wallet/ionia/ionia_any_pay_payment_info.dart';
84 import 'package:cw_core/crypto_currency.dart';
85 +import 'package:cw_core/node.dart';
86
87 late RouteSettings currentRouteSettings;
88
@@ -307,8 +308,11 @@ Route<dynamic> createRoute(RouteSettings settings) {
308 builder: (_) => getIt.get<OtherSettingsPage>());
309
310 case Routes.newNode:
311 + final args = settings.arguments as Map<String, dynamic>?;
312 return CupertinoPageRoute<void>(
311 - builder: (_) => getIt.get<NodeCreateOrEditPage>());
313 + builder: (_) => getIt.get<NodeCreateOrEditPage>(
314 + param1: args?['editingNode'] as Node?,
315 + param2: args?['isSelected'] as bool?));
316
317 case Routes.login:
318 return CupertinoPageRoute<void>(
lib/src/screens/nodes/node_create_or_edit_page.dart
+8 -3
@@ -2,6 +2,7 @@ import 'package:cake_wallet/core/execution_state.dart';
2 import 'package:cake_wallet/src/screens/nodes/widgets/node_form.dart';
3 import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
4 import 'package:cake_wallet/utils/show_pop_up.dart';
5 +import 'package:cw_core/node.dart';
6 import 'package:flutter/material.dart';
7 import 'package:flutter/cupertino.dart';
8 import 'package:flutter_mobx/flutter_mobx.dart';
@@ -13,7 +14,7 @@ import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
14 import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart';
15
16 class NodeCreateOrEditPage extends BasePage {
16 - NodeCreateOrEditPage(this.nodeCreateOrEditViewModel)
17 + NodeCreateOrEditPage({required this.nodeCreateOrEditViewModel,this.editingNode, this.isSelected})
18 : _formKey = GlobalKey<FormState>(),
19 _addressController = TextEditingController(),
20 _portController = TextEditingController(),
@@ -62,9 +63,11 @@ class NodeCreateOrEditPage extends BasePage {
63 final TextEditingController _passwordController;
64
65 @override
65 - String get title => S.current.node_new;
66 + String get title => editingNode != null ? S.current.edit_node : S.current.node_new;
67
68 final NodeCreateOrEditViewModel nodeCreateOrEditViewModel;
69 + final Node? editingNode;
70 + final bool? isSelected;
71
72 @override
73 Widget body(BuildContext context) {
@@ -108,6 +111,7 @@ class NodeCreateOrEditPage extends BasePage {
111 content: NodeForm(
112 formKey: _formKey,
113 nodeViewModel: nodeCreateOrEditViewModel,
114 + editingNode: editingNode,
115 ),
116 bottomSectionPadding: EdgeInsets.only(bottom: 24),
117 bottomSection: Observer(
@@ -140,7 +144,8 @@ class NodeCreateOrEditPage extends BasePage {
144 return;
145 }
146
143 - await nodeCreateOrEditViewModel.save();
147 + await nodeCreateOrEditViewModel.save(
148 + editingNode: editingNode, saveAsCurrent: isSelected ?? false);
149 Navigator.of(context).pop();
150 },
151 text: S.of(context).save,
lib/src/screens/nodes/widgets/node_form.dart
+22 -26
@@ -3,6 +3,8 @@ import 'package:cake_wallet/core/node_port_validator.dart';
3 import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
4 import 'package:cake_wallet/src/widgets/standard_checkbox.dart';
5 import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart';
6 +import 'package:cw_core/node.dart';
7 +import 'package:cw_haven/api/signatures.dart';
8 import 'package:flutter/material.dart';
9 import 'package:flutter_mobx/flutter_mobx.dart';
10 import 'package:cake_wallet/generated/i18n.dart';
@@ -12,22 +14,20 @@ class NodeForm extends StatelessWidget {
14 NodeForm({
15 required this.nodeViewModel,
16 required this.formKey,
15 - }) : _addressController = TextEditingController(),
16 - _portController = TextEditingController(),
17 - _loginController = TextEditingController(),
18 - _passwordController = TextEditingController() {
19 - reaction((_) => nodeViewModel.address, (String address) {
20 - if (address != _addressController.text) {
21 - _addressController.text = address;
22 - }
23 - });
24 -
25 - reaction((_) => nodeViewModel.port, (String port) {
26 - if (port != _portController.text) {
27 - _portController.text = port;
28 - }
29 - });
30 -
17 + this.editingNode,
18 + }) : _addressController = TextEditingController(text: editingNode?.uri.host.toString()),
19 + _portController = TextEditingController(text: editingNode?.uri.port.toString()),
20 + _loginController = TextEditingController(text: editingNode?.login),
21 + _passwordController = TextEditingController(text: editingNode?.password) {
22 + if (editingNode != null) {
23 + nodeViewModel
24 + ..setAddress((editingNode!.uri.host.toString()))
25 + ..setPort((editingNode!.uri.port.toString()))
26 + ..setPassword((editingNode!.password.toString()))
27 + ..setLogin((editingNode!.login.toString()))
28 + ..setSSL((editingNode!.isSSL))
29 + ..setTrusted((editingNode!.trusted));
30 + }
31 if (nodeViewModel.hasAuthCredentials) {
32 reaction((_) => nodeViewModel.login, (String login) {
33 if (login != _loginController.text) {
@@ -42,18 +42,15 @@ class NodeForm extends StatelessWidget {
42 });
43 }
44
45 - _addressController
46 - .addListener(() => nodeViewModel.address = _addressController.text);
47 - _portController
48 - .addListener(() => nodeViewModel.port = _portController.text);
49 - _loginController
50 - .addListener(() => nodeViewModel.login = _loginController.text);
51 - _passwordController
52 - .addListener(() => nodeViewModel.password = _passwordController.text);
45 + _addressController.addListener(() => nodeViewModel.address = _addressController.text);
46 + _portController.addListener(() => nodeViewModel.port = _portController.text);
47 + _loginController.addListener(() => nodeViewModel.login = _loginController.text);
48 + _passwordController.addListener(() => nodeViewModel.password = _passwordController.text);
49 }
50
51 final NodeCreateOrEditViewModel nodeViewModel;
52 final GlobalKey<FormState> formKey;
53 + final Node? editingNode;
54
55 final TextEditingController _addressController;
56 final TextEditingController _portController;
@@ -84,8 +81,7 @@ class NodeForm extends StatelessWidget {
81 child: BaseTextFormField(
82 controller: _portController,
83 hintText: S.of(context).node_port,
87 - keyboardType: TextInputType.numberWithOptions(
88 - signed: false, decimal: false),
84 + keyboardType: TextInputType.numberWithOptions(signed: false, decimal: false),
85 validator: NodePortValidator(),
86 ))
87 ],
lib/src/screens/settings/connection_sync_page.dart
+35 -27
@@ -2,7 +2,6 @@ import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arro
2 import 'package:cake_wallet/utils/show_pop_up.dart';
3 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
4 import 'package:cw_core/node.dart';
5 -import 'package:cw_core/wallet_type.dart';
5 import 'package:flutter/material.dart';
6 import 'package:flutter/cupertino.dart';
7 import 'package:flutter_mobx/flutter_mobx.dart';
@@ -90,12 +89,12 @@ class ConnectionSyncPage extends BasePage {
89
90 final dismissibleRow = Slidable(
91 key: Key('${node.keyIndex}'),
93 - startActionPane: _actionPane(context, node),
94 - endActionPane: _actionPane(context, node),
92 + startActionPane: _actionPane(context, node, isSelected),
93 + endActionPane: _actionPane(context, node, isSelected),
94 child: nodeListRow,
95 );
96
98 - return isSelected ? nodeListRow : dismissibleRow;
97 + return dismissibleRow;
98 },
99 ),
100 );
@@ -124,33 +123,42 @@ class ConnectionSyncPage extends BasePage {
123 );
124 }
125
127 - ActionPane _actionPane(BuildContext context, Node node) => ActionPane(
126 + ActionPane _actionPane(BuildContext context, Node node, bool isSelected) => ActionPane(
127 motion: const ScrollMotion(),
129 - extentRatio: 0.3,
128 + extentRatio: isSelected ? 0.3 : 0.6,
129 children: [
131 - SlidableAction(
132 - onPressed: (context) async {
133 - final confirmed = await showPopUp<bool>(
134 - context: context,
135 - builder: (BuildContext context) {
136 - return AlertWithTwoActions(
137 - alertTitle: S.of(context).remove_node,
138 - alertContent: S.of(context).remove_node_message,
139 - rightButtonText: S.of(context).remove,
140 - leftButtonText: S.of(context).cancel,
141 - actionRightButton: () => Navigator.pop(context, true),
142 - actionLeftButton: () => Navigator.pop(context, false));
143 - }) ??
144 - false;
130 + if (!isSelected)
131 + SlidableAction(
132 + onPressed: (context) async {
133 + final confirmed = await showPopUp<bool>(
134 + context: context,
135 + builder: (BuildContext context) {
136 + return AlertWithTwoActions(
137 + alertTitle: S.of(context).remove_node,
138 + alertContent: S.of(context).remove_node_message,
139 + rightButtonText: S.of(context).remove,
140 + leftButtonText: S.of(context).cancel,
141 + actionRightButton: () => Navigator.pop(context, true),
142 + actionLeftButton: () => Navigator.pop(context, false));
143 + }) ??
144 + false;
145
146 - if (confirmed) {
147 - await nodeListViewModel.delete(node);
148 - }
149 - },
150 - backgroundColor: Colors.red,
146 + if (confirmed) {
147 + await nodeListViewModel.delete(node);
148 + }
149 + },
150 + backgroundColor: Colors.red,
151 + foregroundColor: Colors.white,
152 + icon: CupertinoIcons.delete,
153 + label: S.of(context).delete,
154 + ),
155 + SlidableAction(
156 + onPressed: (_) => Navigator.of(context).pushNamed(Routes.newNode,
157 + arguments: {'editingNode': node, 'isSelected': isSelected}),
158 + backgroundColor: Colors.blue,
159 foregroundColor: Colors.white,
152 - icon: CupertinoIcons.delete,
153 - label: S.of(context).delete,
160 + icon: Icons.edit,
161 + label: S.of(context).edit,
162 ),
163 ],
164 );
lib/view_model/node_list/node_create_or_edit_view_model.dart
+27 -2
@@ -5,13 +5,16 @@ import 'package:mobx/mobx.dart';
5 import 'package:cw_core/node.dart';
6 import 'package:cw_core/wallet_type.dart';
7
8 +import 'node_list_view_model.dart';
9 +
10 part 'node_create_or_edit_view_model.g.dart';
11
12 class NodeCreateOrEditViewModel = NodeCreateOrEditViewModelBase
13 with _$NodeCreateOrEditViewModel;
14
15 abstract class NodeCreateOrEditViewModelBase with Store {
14 - NodeCreateOrEditViewModelBase(this._nodeSource, this._walletType, this._settingsStore)
16 + NodeCreateOrEditViewModelBase(this._nodeSource, this._walletType, this._settingsStore,
17 + this.nodeListViewModel)
18 : state = InitialExecutionState(),
19 connectionState = InitialExecutionState(),
20 useSSL = false,
@@ -65,6 +68,7 @@ abstract class NodeCreateOrEditViewModelBase with Store {
68 final WalletType _walletType;
69 final Box<Node> _nodeSource;
70 final SettingsStore _settingsStore;
71 + final NodeListViewModel nodeListViewModel;
72
73 @action
74 void reset() {
@@ -77,9 +81,30 @@ abstract class NodeCreateOrEditViewModelBase with Store {
81 }
82
83 @action
80 - Future<void> save({bool saveAsCurrent = false}) async {
84 + void setPort (String val) => port = val;
85 +
86 + @action
87 + void setAddress (String val) => address = val;
88 +
89 + @action
90 + void setLogin (String val) => login = val;
91 +
92 + @action
93 + void setPassword (String val) => password = val;
94 +
95 + @action
96 + void setSSL (bool val) => useSSL = val;
97 +
98 + @action
99 + void setTrusted (bool val) => trusted = val;
100 +
101 + @action
102 + Future<void> save({Node? editingNode, bool saveAsCurrent = false}) async {
103 try {
104 state = IsExecutingState();
105 + if (editingNode != null) {
106 + await nodeListViewModel.delete(editingNode);
107 + }
108 final node =
109 Node(uri: uri, type: _walletType, login: login, password: password,
110 useSSL: useSSL, trusted: trusted);
res/values/strings_ar.arb
+2 -1
@@ -682,5 +682,6 @@
682 "send_to_this_address" : "أرسل ${currency} ${tag}إلى هذا العنوان",
683 "arrive_in_this_address" : "سيصل ${currency} ${tag}إلى هذا العنوان",
684 "do_not_send": "لا ترسل",
685 - "error_dialog_content": "عفوًا ، لقد حصلنا على بعض الخطأ.\n\nيرجى إرسال تقرير التعطل إلى فريق الدعم لدينا لتحسين التطبيق."
685 + "error_dialog_content": "عفوًا ، لقد حصلنا على بعض الخطأ.\n\nيرجى إرسال تقرير التعطل إلى فريق الدعم لدينا لتحسين التطبيق.",
686 + "edit_node": "تحرير العقدة"
687 }
res/values/strings_bg.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "Send ${currency} ${tag}to this address",
685 "arrive_in_this_address" : "${currency} ${tag}ще отидат на този адрес",
686 "do_not_send": "Не изпращай",
687 - "error_dialog_content": "Получихме грешка.\n\nМоля, изпратете доклада до нашия отдел поддръжка, за да подобрим приложението."
687 + "error_dialog_content": "Получихме грешка.\n\nМоля, изпратете доклада до нашия отдел поддръжка, за да подобрим приложението.",
688 + "edit_node": "Редактиране на възел"
689 }
res/values/strings_cs.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "Poslat ${currency} ${tag}na tuto adresu",
685 "arrive_in_this_address" : "${currency} ${tag}přijde na tuto adresu",
686 "do_not_send": "Neodesílat",
687 - "error_dialog_content": "Nastala chyba.\n\nProsím odešlete zprávu o chybě naší podpoře, aby mohli zajistit opravu."
687 + "error_dialog_content": "Nastala chyba.\n\nProsím odešlete zprávu o chybě naší podpoře, aby mohli zajistit opravu.",
688 + "edit_node": "Upravit uzel"
689 }
res/values/strings_de.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "Senden Sie ${currency} ${tag}an diese Adresse",
685 "arrive_in_this_address" : "${currency} ${tag}wird an dieser Adresse ankommen",
686 "do_not_send": "Nicht senden",
687 - "error_dialog_content": "Hoppla, wir haben einen Fehler.\n\nBitte senden Sie den Absturzbericht an unser Support-Team, um die Anwendung zu verbessern."
687 + "error_dialog_content": "Hoppla, wir haben einen Fehler.\n\nBitte senden Sie den Absturzbericht an unser Support-Team, um die Anwendung zu verbessern.",
688 + "edit_node": "Knoten bearbeiten"
689 }
res/values/strings_en.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "Send ${currency} ${tag}to this address",
685 "arrive_in_this_address" : "${currency} ${tag}will arrive in this address",
686 "do_not_send": "Don't send",
687 - "error_dialog_content": "Oops, we got some error.\n\nPlease send the crash report to our support team to make the application better."
687 + "error_dialog_content": "Oops, we got some error.\n\nPlease send the crash report to our support team to make the application better.",
688 + "edit_node": "Edit Node"
689 }
res/values/strings_es.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "Enviar ${currency} ${tag}a esta dirección",
685 "arrive_in_this_address" : "${currency} ${tag}llegará a esta dirección",
686 "do_not_send": "no enviar",
687 - "error_dialog_content": "Vaya, tenemos un error.\n\nEnvíe el informe de bloqueo a nuestro equipo de soporte para mejorar la aplicación."
687 + "error_dialog_content": "Vaya, tenemos un error.\n\nEnvíe el informe de bloqueo a nuestro equipo de soporte para mejorar la aplicación.",
688 + "edit_node": "Edit Node"
689 }
res/values/strings_fr.arb
+2 -1
@@ -682,5 +682,6 @@
682 "send_to_this_address" : "Envoyez ${currency} ${tag}à cette adresse",
683 "arrive_in_this_address" : "${currency} ${tag}arrivera à cette adresse",
684 "do_not_send": "N'envoyez pas",
685 - "error_dialog_content": "Oups, nous avons eu une erreur.\n\nVeuillez envoyer le rapport de plantage à notre équipe d'assistance pour améliorer l'application."
685 + "error_dialog_content": "Oups, nous avons eu une erreur.\n\nVeuillez envoyer le rapport de plantage à notre équipe d'assistance pour améliorer l'application.",
686 + "edit_node": "Modifier le nœud"
687 }
res/values/strings_hi.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "इस पते पर ${currency} ${tag}भेजें",
685 "arrive_in_this_address" : "${currency} ${tag}इस पते पर पहुंचेंगे",
686 "do_not_send": "मत भेजो",
687 - "error_dialog_content": "ओह, हमसे कुछ गड़बड़ी हुई है.\n\nएप्लिकेशन को बेहतर बनाने के लिए कृपया क्रैश रिपोर्ट हमारी सहायता टीम को भेजें।"
687 + "error_dialog_content": "ओह, हमसे कुछ गड़बड़ी हुई है.\n\nएप्लिकेशन को बेहतर बनाने के लिए कृपया क्रैश रिपोर्ट हमारी सहायता टीम को भेजें।",
688 + "edit_node": "नोड संपादित करें"
689 }
res/values/strings_hr.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "Pošaljite ${currency} ${tag}na ovu adresu",
685 "arrive_in_this_address" : "${currency} ${tag}će stići na ovu adresu",
686 "do_not_send": "Ne šalji",
687 - "error_dialog_content": "Ups, imamo grešku.\n\nPošaljite izvješće o padu našem timu za podršku kako bismo poboljšali aplikaciju."
687 + "error_dialog_content": "Ups, imamo grešku.\n\nPošaljite izvješće o padu našem timu za podršku kako bismo poboljšali aplikaciju.",
688 + "edit_node": "Uredi čvor"
689 }
res/values/strings_id.arb
+2 -1
@@ -666,5 +666,6 @@
666 "unmatched_currencies": "Mata uang dompet Anda saat ini tidak cocok dengan yang ditandai QR",
667 "orbot_running_alert": "Pastikan Orbot sedang berjalan sebelum menghubungkan ke node ini.",
668 "contact_list_contacts": "Kontak",
669 - "contact_list_wallets": "Dompet Saya"
669 + "contact_list_wallets": "Dompet Saya",
670 + "edit_node": "Sunting Node"
671 }
res/values/strings_it.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "Invia ${currency} ${tag}a questo indirizzo",
685 "arrive_in_this_address" : "${currency} ${tag}arriverà a questo indirizzo",
686 "do_not_send": "Non inviare",
687 - "error_dialog_content": "Ups, imamo grešku.\n\nPošaljite izvješće o padu našem timu za podršku kako bismo poboljšali aplikaciju."
687 + "error_dialog_content": "Spiacenti, abbiamo riscontrato un errore.\n\nSi prega di inviare il rapporto sull'arresto anomalo al nostro team di supporto per migliorare l'applicazione.",
688 + "edit_node": "Modifica nodo"
689 }
res/values/strings_ja.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "${currency} ${tag}をこのアドレスに送金",
685 "arrive_in_this_address" : "${currency} ${tag}はこの住所に到着します",
686 "do_not_send": "送信しない",
687 - "error_dialog_content": "Spiacenti, abbiamo riscontrato un errore.\n\nSi prega di inviare il rapporto sull'arresto anomalo al nostro team di supporto per migliorare l'applicazione."
687 + "error_dialog_content": "エラーが発生しました。\n\nアプリケーションを改善するために、クラッシュ レポートをサポート チームに送信してください。",
688 + "edit_node": "ノードを編集"
689 }
res/values/strings_ko.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "이 주소로 ${currency} ${tag}송금",
685 "arrive_in_this_address" : "${currency} ${tag}이(가) 이 주소로 도착합니다",
686 "do_not_send": "보내지 마세요",
687 - "error_dialog_content": "죄송합니다. 오류가 발생했습니다.\n\n응용 프로그램을 개선하려면 지원 팀에 충돌 보고서를 보내주십시오."
687 + "error_dialog_content": "죄송합니다. 오류가 발생했습니다.\n\n응용 프로그램을 개선하려면 지원 팀에 충돌 보고서를 보내주십시오.",
688 + "edit_node": "노드 편집"
689 }
res/values/strings_my.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "ဤလိပ်စာသို့ ${currency} ${tag}သို့ ပို့ပါ။",
685 "arrive_in_this_address" : "${currency} ${tag}ဤလိပ်စာသို့ ရောက်ရှိပါမည်။",
686 "do_not_send": "မပို့ပါနှင့်",
687 - "error_dialog_content": "အိုး၊ ကျွန်ုပ်တို့တွင် အမှားအယွင်းအချို့ရှိသည်။\n\nအပလီကေးရှင်းကို ပိုမိုကောင်းမွန်စေရန်အတွက် ပျက်စီးမှုအစီရင်ခံစာကို ကျွန်ုပ်တို့၏ပံ့ပိုးကူညီရေးအဖွဲ့ထံ ပေးပို့ပါ။"
687 + "error_dialog_content": "အိုး၊ ကျွန်ုပ်တို့တွင် အမှားအယွင်းအချို့ရှိသည်။\n\nအပလီကေးရှင်းကို ပိုမိုကောင်းမွန်စေရန်အတွက် ပျက်စီးမှုအစီရင်ခံစာကို ကျွန်ုပ်တို့၏ပံ့ပိုးကူညီရေးအဖွဲ့ထံ ပေးပို့ပါ။",
688 + "edit_node": "Node ကို တည်းဖြတ်ပါ။"
689 }
res/values/strings_nl.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "Stuur ${currency} ${tag}naar dit adres",
685 "arrive_in_this_address" : "${currency} ${tag}komt aan op dit adres",
686 "do_not_send": "Niet sturen",
687 - "error_dialog_content": "Oeps, er is een fout opgetreden.\n\nStuur het crashrapport naar ons ondersteuningsteam om de applicatie te verbeteren."
687 + "error_dialog_content": "Oeps, er is een fout opgetreden.\n\nStuur het crashrapport naar ons ondersteuningsteam om de applicatie te verbeteren.",
688 + "edit_node": "Knooppunt bewerken"
689 }
res/values/strings_pl.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "Wyślij ${currency} ${tag}na ten adres",
685 "arrive_in_this_address" : "${currency} ${tag}dotrze na ten adres",
686 "do_not_send": "Nie wysyłaj",
687 - "error_dialog_content": "Ups, wystąpił błąd.\n\nPrześlij raport o awarii do naszego zespołu wsparcia, aby ulepszyć aplikację."
687 + "error_dialog_content": "Ups, wystąpił błąd.\n\nPrześlij raport o awarii do naszego zespołu wsparcia, aby ulepszyć aplikację.",
688 + "edit_node": "Edytuj węzeł"
689 }
res/values/strings_pt.arb
+2 -1
@@ -683,5 +683,6 @@
683 "send_to_this_address" : "Envie ${currency} ${tag}para este endereço",
684 "arrive_in_this_address" : "${currency} ${tag}chegará neste endereço",
685 "do_not_send": "não envie",
686 - "error_dialog_content": "Ops, houve algum erro.\n\nPor favor, envie o relatório de falha para nossa equipe de suporte para melhorar o aplicativo."
686 + "error_dialog_content": "Ops, houve algum erro.\n\nPor favor, envie o relatório de falha para nossa equipe de suporte para melhorar o aplicativo.",
687 + "edit_node": "Editar nó"
688 }
res/values/strings_ru.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "Отправить ${currency} ${tag}на этот адрес",
685 "arrive_in_this_address" : "${currency} ${tag}придет на этот адрес",
686 "do_not_send": "Не отправлять",
687 - "error_dialog_content": "Ой, у нас какая-то ошибка.\n\nПожалуйста, отправьте отчет о сбое в нашу службу поддержки, чтобы сделать приложение лучше."
687 + "error_dialog_content": "Ой, у нас какая-то ошибка.\n\nПожалуйста, отправьте отчет о сбое в нашу службу поддержки, чтобы сделать приложение лучше.",
688 + "edit_node": "Редактировать узел"
689 }
res/values/strings_th.arb
+2 -1
@@ -682,5 +682,6 @@
682 "send_to_this_address" : "ส่ง ${currency} ${tag}ไปยังที่อยู่นี้",
683 "arrive_in_this_address" : "${currency} ${tag}จะมาถึงที่อยู่นี้",
684 "do_not_send": "อย่าส่ง",
685 - "error_dialog_content": "อ๊ะ เราพบข้อผิดพลาดบางอย่าง\n\nโปรดส่งรายงานข้อขัดข้องไปยังทีมสนับสนุนของเราเพื่อปรับปรุงแอปพลิเคชันให้ดียิ่งขึ้น"
685 + "error_dialog_content": "อ๊ะ เราพบข้อผิดพลาดบางอย่าง\n\nโปรดส่งรายงานข้อขัดข้องไปยังทีมสนับสนุนของเราเพื่อปรับปรุงแอปพลิเคชันให้ดียิ่งขึ้น",
686 + "edit_node": "แก้ไขโหนด"
687 }
res/values/strings_tr.arb
+2 -1
@@ -684,5 +684,6 @@
684 "send_to_this_address" : "Bu adrese ${currency} ${tag}gönder",
685 "arrive_in_this_address" : "${currency} ${tag}bu adrese ulaşacak",
686 "do_not_send": "Gönderme",
687 - "error_dialog_content": "Hay aksi, bir hatamız var.\n\nUygulamayı daha iyi hale getirmek için lütfen kilitlenme raporunu destek ekibimize gönderin."
687 + "error_dialog_content": "Hay aksi, bir hatamız var.\n\nUygulamayı daha iyi hale getirmek için lütfen kilitlenme raporunu destek ekibimize gönderin.",
688 + "edit_node": "Düğümü Düzenle"
689 }
res/values/strings_uk.arb
+2 -1
@@ -683,5 +683,6 @@
683 "send_to_this_address" : "Надіслати ${currency} ${tag}на цю адресу",
684 "arrive_in_this_address" : "${currency} ${tag}надійде на цю адресу",
685 "do_not_send": "Не надсилайте",
686 - "error_dialog_content": "На жаль, ми отримали помилку.\n\nБудь ласка, надішліть звіт про збій нашій команді підтримки, щоб покращити додаток."
686 + "error_dialog_content": "На жаль, ми отримали помилку.\n\nБудь ласка, надішліть звіт про збій нашій команді підтримки, щоб покращити додаток.",
687 + "edit_node": "Редагувати вузол"
688 }
res/values/strings_ur.arb
+2 -1
@@ -685,5 +685,6 @@
685 "send_to_this_address" : "اس پتے پر ${currency} ${tag} بھیجیں۔",
686 "arrive_in_this_address" : "${currency} ${tag}اس پتے پر پہنچے گا۔",
687 "do_not_send" : "مت بھیجیں۔",
688 - "error_dialog_content" : "افوہ، ہمیں کچھ خرابی ملی۔\n\nایپلی کیشن کو بہتر بنانے کے لیے براہ کرم کریش رپورٹ ہماری سپورٹ ٹیم کو بھیجیں۔"
688 + "error_dialog_content" : "افوہ، ہمیں کچھ خرابی ملی۔\n\nایپلی کیشن کو بہتر بنانے کے لیے براہ کرم کریش رپورٹ ہماری سپورٹ ٹیم کو بھیجیں۔",
689 + "edit_node": "نوڈ میں ترمیم کریں۔"
690 }
res/values/strings_zh.arb
+2 -1
@@ -682,5 +682,6 @@
682 "send_to_this_address" : "发送 ${currency} ${tag}到这个地址",
683 "arrive_in_this_address" : "${currency} ${tag}将到达此地址",
684 "do_not_send": "不要发送",
685 - "error_dialog_content": "糟糕,我们遇到了一些错误。\n\n请将崩溃报告发送给我们的支持团队,以改进应用程序。"
685 + "error_dialog_content": "糟糕,我们遇到了一些错误。\n\n请将崩溃报告发送给我们的支持团队,以改进应用程序。",
686 + "edit_node": "编辑节点"
687 }