Skip to content

Commit 5d81630

Browse files
committed
Refactor form builder and wallet creation components
- Move `showExtra` parameter from form builder view model to view - Add wallet name collision check in Monero wallet info - Improve MobX state management in create wallet view - Fix screen titles not updating (or updating in wrong order) - Drop FormBuilder dependency on AbstractView (it doesn't play well when nested with mobx)
1 parent d81b60c commit 5d81630

9 files changed

+23
-15
lines changed

lib/coins/monero/wallet_info.dart

+6
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ class MoneroWalletInfo extends CoinWalletInfo {
7777
}
7878
Monero.wPtrList.clear();
7979
final basePath = p.dirname(walletName);
80+
if (File(p.join(basePath, newName)).existsSync()) {
81+
throw Exception(Coin.L.error_wallet_name_already_exists);
82+
}
83+
if (File(p.join(basePath, "$newName.keys")).existsSync()) {
84+
throw Exception(Coin.L.error_wallet_name_already_exists);
85+
}
8086
File(walletName).copySync(p.join(basePath, newName));
8187
File("$walletName.keys").copySync(p.join(basePath, "$newName.keys"));
8288
// Copy and delete later, if anything throws below we end up with copied walled,

lib/l10n/app_en.arb

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"error_ur_tag_unsupported": "Unable to handle {urTag}",
4040
"error_wallet_doesnt_exist": "Given wallet doesn't exist {walletName}",
4141
"error_wallet_is_null_no_indication_of_failure": "Wallet creation failed, and status indicated failure but message was empty",
42+
"error_wallet_name_already_exists": "Wallet with this name already exists",
4243
"error_wallet_name_empty": "Wallet name is empty",
4344
"error_wallet_name_unchanged": "Wallet wasn't renamed because the name is not different",
4445
"export_key_images": "Export key images",

lib/view_model/create_wallet_view_model.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ abstract class CreateWalletViewModelBase with ViewModel, Store {
3737
bool showExtra = false;
3838

3939
@override
40+
@observable
4041
late String screenName = screenNameOriginal;
4142

4243
@computed
@@ -224,7 +225,6 @@ abstract class CreateWalletViewModelBase with ViewModel, Store {
224225
}
225226

226227
Future<void> titleUpdate(final String? suggestedTitle) async {
227-
await Future.delayed(Duration.zero); // don't do it on build();
228228
screenName = suggestedTitle ?? screenNameOriginal;
229229
}
230230
}

lib/view_model/form_builder_view_model.dart

-4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ abstract class FormBuilderViewModelBase with ViewModel, Store {
1414
final void Function(String? suggestedTitle)? onLabelChange,
1515
final void Function(bool val)? toggleIsPinSet,
1616
required final bool isPinSet,
17-
required this.showExtra,
1817
}) : _onLabelChange = onLabelChange,
1918
_toggleIsPinSet = toggleIsPinSet,
2019
_isPinSet = isPinSet;
@@ -49,7 +48,4 @@ abstract class FormBuilderViewModelBase with ViewModel, Store {
4948
_isPinSet = val;
5049
toggleIsPinSet(val);
5150
}
52-
53-
@observable
54-
bool showExtra;
5551
}

lib/views/create_wallet.dart

+4-2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class CreateWallet extends AbstractView {
6464

6565
@override
6666
Widget? body(final BuildContext context) {
67+
final _ = viewModel.showExtra; // force rebuild in mobx
6768
if (viewModel.selectedCoin == null) {
6869
return _selectCoin(context);
6970
}
@@ -80,14 +81,14 @@ class CreateWallet extends AbstractView {
8081
Padding(
8182
padding: const EdgeInsets.symmetric(horizontal: 24),
8283
child: FormBuilder(
84+
showExtra: viewModel.showExtra,
8385
viewModel: FormBuilderViewModel(
8486
formElements: viewModel.currentForm!,
8587
scaffoldContext: context,
8688
isPinSet: viewModel.isPinSet,
8789
toggleIsPinSet: (final bool val) {
8890
viewModel.isPinSet = val;
8991
},
90-
showExtra: viewModel.showExtra,
9192
onLabelChange: viewModel.titleUpdate,
9293
),
9394
),
@@ -99,6 +100,7 @@ class CreateWallet extends AbstractView {
99100
@override
100101
Widget? bottomNavigationBar(final BuildContext context) {
101102
if (!viewModel.isPinSet) return null;
103+
final _ = viewModel.showExtra; // force rebuild in mobx
102104
return SafeArea(
103105
child: Column(
104106
mainAxisSize: MainAxisSize.min,
@@ -115,7 +117,7 @@ class CreateWallet extends AbstractView {
115117
text: L.advanced_options,
116118
icon: null,
117119
onPressed: () {
118-
viewModel.showExtra = true;
120+
viewModel.showExtra = !viewModel.showExtra;
119121
},
120122
backgroundColor: const WidgetStatePropertyAll(Colors.transparent),
121123
),

lib/views/open_wallet.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ class OpenWallet extends AbstractView {
2222
mainAxisAlignment: MainAxisAlignment.center,
2323
children: [
2424
FormBuilder(
25+
showExtra: false,
2526
viewModel: FormBuilderViewModel(
2627
formElements: [
2728
viewModel.walletPassword,
2829
],
2930
scaffoldContext: context,
3031
isPinSet: false,
31-
showExtra: false,
3232
toggleIsPinSet: (final bool val) {},
3333
onLabelChange: (final String? _) {},
3434
),

lib/views/security_backup.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ class SecurityBackup extends AbstractView {
3535
Widget? body(final BuildContext context) {
3636
if (viewModel.isLocked) {
3737
return FormBuilder(
38+
showExtra: true,
3839
viewModel: FormBuilderViewModel(
3940
formElements: viewModel.form,
4041
scaffoldContext: context,
4142
isPinSet: !viewModel.isLocked,
42-
showExtra: true,
4343
onLabelChange: null,
4444
),
4545
);

lib/views/wallet_edit.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ class WalletEdit extends AbstractView {
2323
children: [
2424
const Spacer(),
2525
FormBuilder(
26+
showExtra: true,
2627
viewModel: FormBuilderViewModel(
2728
formElements: viewModel.form,
2829
scaffoldContext: context,
2930
isPinSet: false,
30-
showExtra: true,
3131
onLabelChange: (final _) {},
3232
),
3333
),

lib/views/widgets/form_builder.dart

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'dart:async';
22

3+
import 'package:cupcake/l10n/app_localizations.dart';
34
import 'package:cupcake/utils/alerts/widget_minimal.dart';
45
import 'package:cupcake/utils/config.dart';
56
import 'package:cupcake/utils/form/pin_form_element.dart';
@@ -8,19 +9,21 @@ import 'package:cupcake/utils/form/string_form_element.dart';
89
import 'package:cupcake/utils/random_name.dart';
910
import 'package:cupcake/utils/secure_storage.dart';
1011
import 'package:cupcake/view_model/form_builder_view_model.dart';
11-
import 'package:cupcake/views/abstract.dart';
1212
import 'package:cupcake/views/widgets/buttons/long_primary.dart';
1313
import 'package:cupcake/views/widgets/numerical_keyboard/main.dart';
1414
import 'package:flutter/material.dart';
1515
import 'package:flutter_mobx/flutter_mobx.dart';
1616
import 'package:local_auth/local_auth.dart';
1717

18-
class FormBuilder extends AbstractView {
19-
FormBuilder({super.key, required this.viewModel});
18+
class FormBuilder extends StatelessWidget {
19+
FormBuilder({super.key, required this.viewModel, required this.showExtra});
20+
21+
late AppLocalizations L;
2022

21-
@override
2223
final FormBuilderViewModel viewModel;
2324

25+
final bool showExtra;
26+
2427
String? lastSuggestedTitle = DateTime.now().toIso8601String();
2528
void _onLabelChange(final String? suggestedTitle) {
2629
if (suggestedTitle == lastSuggestedTitle) return;
@@ -41,6 +44,7 @@ class FormBuilder extends AbstractView {
4144

4245
@override
4346
Widget build(final BuildContext context) {
47+
L = AppLocalizations.of(context)!;
4448
return Observer(
4549
builder: (final context) => _build(context),
4650
);
@@ -160,7 +164,6 @@ class FormBuilder extends AbstractView {
160164
);
161165
}
162166
_onLabelChange(null);
163-
final showExtra = viewModel.showExtra;
164167
final List<Widget> children = [];
165168
for (final e in viewModel.formElements) {
166169
if (e is StringFormElement) {

0 commit comments

Comments
 (0)