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
}