1
+import 'package:cake_wallet/core/wallet_name_validator.dart';
2
import 'package:cake_wallet/entities/generate_name.dart';
2
-import 'package:cw_core/wallet_type.dart';
3
-import 'package:cake_wallet/view_model/wallet_restore_view_model.dart';
4
-import 'package:flutter/cupertino.dart';
5
-import 'package:flutter/material.dart';
6
-import 'package:cake_wallet/utils/show_pop_up.dart';
7
-import 'package:cake_wallet/src/screens/seed_language/widgets/seed_language_picker.dart';
8
-import 'package:cake_wallet/src/widgets/seed_widget.dart';
3
+import 'package:cake_wallet/entities/seed_type.dart';
4
+import 'package:cake_wallet/generated/i18n.dart';
5
import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
6
import 'package:cake_wallet/src/widgets/blockchain_height_widget.dart';
11
-import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
12
-import 'package:cake_wallet/generated/i18n.dart';
13
-import 'package:cake_wallet/core/wallet_name_validator.dart';
7
+import 'package:cake_wallet/src/widgets/picker.dart';
8
+import 'package:cake_wallet/src/widgets/seed_language_picker.dart';
9
+import 'package:cake_wallet/src/widgets/seed_widget.dart';
10
import 'package:cake_wallet/themes/extensions/send_page_theme.dart';
11
+import 'package:cake_wallet/utils/show_pop_up.dart';
12
+import 'package:cw_core/wallet_type.dart';
13
+import 'package:flutter/material.dart';
14
+import 'package:polyseed/polyseed.dart';
15
16
class WalletRestoreFromSeedForm extends StatefulWidget {
17
WalletRestoreFromSeedForm(
34
final void Function(String)? onLanguageChange;
35
36
@override
37
- WalletRestoreFromSeedFormState createState() =>
38
- WalletRestoreFromSeedFormState('English');
37
+ WalletRestoreFromSeedFormState createState() => WalletRestoreFromSeedFormState('English');
38
}
39
40
class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
43
blockchainHeightKey = GlobalKey<BlockchainHeightState>(),
44
formKey = GlobalKey<FormState>(),
45
languageController = TextEditingController(),
47
- nameTextEditingController = TextEditingController();
46
+ nameTextEditingController = TextEditingController(),
47
+ seedTypeController = TextEditingController();
48
49
final GlobalKey<SeedWidgetState> seedWidgetStateKey;
50
final GlobalKey<BlockchainHeightState> blockchainHeightKey;
51
final TextEditingController languageController;
52
final TextEditingController nameTextEditingController;
53
+ final TextEditingController seedTypeController;
54
final GlobalKey<FormState> formKey;
55
String language;
56
+ bool isPolyseed = false;
57
58
@override
59
void initState() {
60
_setLanguageLabel(language);
61
+ _setSeedType(SeedType.defaultSeedType);
62
super.initState();
63
}
64
65
+ void onSeedChange(String seed) {
66
+ if (widget.type == WalletType.monero && Polyseed.isValidSeed(seed)) {
67
+ final lang = PolyseedLang.getByPhrase(seed);
68
+
69
+ _changeSeedType(SeedType.polyseed);
70
+ _changeLanguage(lang.nameEnglish);
71
+ }
72
+ widget.onSeedChange?.call(seed);
73
+ }
74
+
75
@override
76
Widget build(BuildContext context) {
77
return Container(
78
padding: EdgeInsets.only(left: 24, right: 24),
79
child: Column(children: [
80
Form(
68
- key: formKey,
69
- child: Stack(
70
- alignment: Alignment.centerRight,
71
- children: [
72
- BaseTextFormField(
73
- controller: nameTextEditingController,
74
- hintText: S.of(context).wallet_name,
75
- suffixIcon: IconButton(
76
- onPressed: () async {
77
- final rName = await generateName();
78
- FocusManager.instance.primaryFocus?.unfocus();
81
+ key: formKey,
82
+ child: Stack(
83
+ alignment: Alignment.centerRight,
84
+ children: [
85
+ BaseTextFormField(
86
+ controller: nameTextEditingController,
87
+ hintText: S.of(context).wallet_name,
88
+ suffixIcon: IconButton(
89
+ onPressed: () async {
90
+ final rName = await generateName();
91
+ FocusManager.instance.primaryFocus?.unfocus();
92
80
- setState(() {
81
- nameTextEditingController.text = rName;
82
- nameTextEditingController.selection =
83
- TextSelection.fromPosition(TextPosition(
84
- offset: nameTextEditingController.text.length));
85
- });
86
- },
87
- icon: Container(
88
- padding: const EdgeInsets.all(8),
89
- decoration: BoxDecoration(
90
- borderRadius: BorderRadius.circular(6.0),
91
- color: Theme.of(context).hintColor,
92
- ),
93
- width: 34,
94
- height: 34,
95
- child: Image.asset(
96
- 'assets/images/refresh_icon.png',
97
- color: Theme.of(context).extension<SendPageTheme>()!.textFieldButtonIconColor,
93
+ setState(() {
94
+ nameTextEditingController.text = rName;
95
+ nameTextEditingController.selection = TextSelection.fromPosition(
96
+ TextPosition(offset: nameTextEditingController.text.length));
97
+ });
98
+ },
99
+ icon: Container(
100
+ padding: const EdgeInsets.all(8),
101
+ decoration: BoxDecoration(
102
+ borderRadius: BorderRadius.circular(6.0),
103
+ color: Theme.of(context).hintColor,
104
+ ),
105
+ width: 34,
106
+ height: 34,
107
+ child: Image.asset(
108
+ 'assets/images/refresh_icon.png',
109
+ color: Theme.of(context)
110
+ .extension<SendPageTheme>()!
111
+ .textFieldButtonIconColor,
112
+ ),
113
+ ),
114
),
115
+ validator: WalletNameValidator(),
116
),
100
- ),
101
- validator: WalletNameValidator(),
102
- ),
103
- ],
104
- )),
117
+ ],
118
+ )),
119
Container(height: 20),
120
SeedWidget(
121
key: seedWidgetStateKey,
122
language: language,
123
type: widget.type,
110
- onSeedChange: widget.onSeedChange),
124
+ onSeedChange: onSeedChange),
125
+ if (widget.type == WalletType.monero)
126
+ GestureDetector(
127
+ onTap: () async {
128
+ await showPopUp<void>(
129
+ context: context,
130
+ builder: (_) => Picker(
131
+ items: SeedType.all,
132
+ selectedAtIndex: isPolyseed ? 1 : 0,
133
+ mainAxisAlignment: MainAxisAlignment.start,
134
+ onItemSelected: _changeSeedType,
135
+ isSeparated: false,
136
+ ));
137
+ },
138
+ child: Container(
139
+ color: Colors.transparent,
140
+ padding: EdgeInsets.only(top: 20.0),
141
+ child: IgnorePointer(
142
+ child: BaseTextFormField(
143
+ controller: seedTypeController,
144
+ enableInteractiveSelection: false,
145
+ readOnly: true)))),
146
if (widget.displayLanguageSelector)
147
GestureDetector(
148
onTap: () async {
149
await showPopUp<void>(
150
context: context,
151
builder: (_) => SeedLanguagePicker(
117
- selected: language, onItemSelected: _changeLanguage));
152
+ selected: language,
153
+ onItemSelected: _changeLanguage,
154
+ seedType: isPolyseed ? SeedType.polyseed : SeedType.legacy,
155
+ ));
156
},
157
child: Container(
158
color: Colors.transparent,
162
controller: languageController,
163
enableInteractiveSelection: false,
164
readOnly: true)))),
127
- if (widget.displayBlockHeightSelector)
165
+ if (!isPolyseed && widget.displayBlockHeightSelector)
166
BlockchainHeightWidget(
167
focusNode: widget.blockHeightFocusNode,
168
key: blockchainHeightKey,
169
onHeightOrDateEntered: widget.onHeightOrDateEntered,
132
- hasDatePicker: widget.type == WalletType.monero)
170
+ hasDatePicker: widget.type == WalletType.monero),
171
]));
172
}
173
174
void _changeLanguage(String language) {
175
+ final setLang = isPolyseed ? "POLYSEED_$language" : language;
176
setState(() {
138
- this.language = language;
139
- seedWidgetStateKey.currentState!.changeSeedLanguage(language);
140
- _setLanguageLabel(language);
141
- widget.onLanguageChange?.call(language);
177
+ this.language = setLang;
178
+ seedWidgetStateKey.currentState!.changeSeedLanguage(setLang);
179
+ _setLanguageLabel(setLang);
180
+ widget.onLanguageChange?.call(setLang);
181
});
182
}
183
184
void _setLanguageLabel(String language) =>
146
- languageController.text = '$language (Seed language)';
185
+ languageController.text = '${language.replaceAll("POLYSEED_", "")} (Seed language)';
186
+
187
+ void _changeSeedType(SeedType item) {
188
+ _setSeedType(item);
189
+ _changeLanguage('English');
190
+ }
191
+
192
+ void _setSeedType(SeedType item) {
193
+ setState(() => isPolyseed = item == SeedType.polyseed);
194
+ seedTypeController.text = item.toString();
195
+ }
196
}