Fixes
M committed
Sep 28, 2020 at 18:47 UTC
e3678d2cf91e06d3ec0e32142e5c48ef80899f5f
32 files changed
+481
-903
lib/core/contact_service.dart
deleted
-38
@@ -1,38 +0,0 @@
1
-import 'package:hive/hive.dart';
2
-import 'package:cake_wallet/store/contact_list_store.dart';
3
-import 'package:cake_wallet/entities/contact.dart';
4
-
5
-class ContactService {
6
- ContactService(this.contactSource, this.contactListStore) {
7
- _forceUpdateContactListStore();
8
- }
9
-
10
- final Box<Contact> contactSource;
11
- final ContactListStore contactListStore;
12
-
13
- Future add(Contact contact) async {
14
- await contactSource.add(contact);
15
- // contactListStore.contacts.add(contact);
16
- }
17
-
18
- Future update(Contact contact) async {
19
- await contact.save();
20
- final index = contactListStore.contacts.indexOf(contact) ?? -1;
21
-
22
- if (index >= 0) {
23
- _forceUpdateContactListStore();
24
- } else {
25
- // contactListStore.contacts.add(contact);
26
- }
27
- }
28
-
29
- Future delete(Contact contact) async {
30
- await contact.delete();
31
- contactListStore.contacts.remove(contact);
32
- }
33
-
34
- void _forceUpdateContactListStore() {
35
- contactListStore.contacts.clear();
36
- // contactListStore.contacts.addAll(contactSource.values);
37
- }
38
-}
lib/di.dart
+8
-23
@@ -1,5 +1,4 @@
1
import 'package:cake_wallet/bitcoin/bitcoin_wallet_service.dart';
2
-import 'package:cake_wallet/core/contact_service.dart';
2
import 'package:cake_wallet/core/wallet_service.dart';
3
import 'package:cake_wallet/entities/biometric_auth.dart';
4
import 'package:cake_wallet/entities/contact_record.dart';
@@ -8,22 +7,22 @@ import 'package:cake_wallet/entities/contact.dart';
7
import 'package:cake_wallet/entities/node.dart';
8
import 'package:cake_wallet/exchange/trade.dart';
9
11
-// import 'package:cake_wallet/src/domain/services/wallet_service.dart';
10
import 'package:cake_wallet/src/screens/contact/contact_list_page.dart';
11
import 'package:cake_wallet/src/screens/contact/contact_page.dart';
12
import 'package:cake_wallet/src/screens/exchange_trade/exchange_confirm_page.dart';
13
import 'package:cake_wallet/src/screens/exchange_trade/exchange_trade_page.dart';
14
+import 'package:cake_wallet/src/screens/faq/faq_page.dart';
15
import 'package:cake_wallet/src/screens/nodes/node_create_or_edit_page.dart';
16
import 'package:cake_wallet/src/screens/nodes/nodes_list_page.dart';
17
import 'package:cake_wallet/src/screens/rescan/rescan_page.dart';
18
import 'package:cake_wallet/src/screens/seed/wallet_seed_page.dart';
19
import 'package:cake_wallet/src/screens/send/send_template_page.dart';
20
+import 'package:cake_wallet/src/screens/settings/change_language.dart';
21
import 'package:cake_wallet/src/screens/settings/settings.dart';
22
import 'package:cake_wallet/src/screens/setup_pin_code/setup_pin_code.dart';
23
import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart';
24
import 'package:cake_wallet/src/screens/exchange/exchange_page.dart';
25
import 'package:cake_wallet/src/screens/exchange/exchange_template_page.dart';
26
-import 'package:cake_wallet/store/contact_list_store.dart';
26
import 'package:cake_wallet/store/node_list_store.dart';
27
import 'package:cake_wallet/store/settings_store.dart';
28
import 'package:cake_wallet/core/auth_service.dart';
@@ -38,10 +37,7 @@ import 'package:cake_wallet/src/screens/receive/receive_page.dart';
37
import 'package:cake_wallet/src/screens/send/send_page.dart';
38
import 'package:cake_wallet/src/screens/subaddress/address_edit_or_create_page.dart';
39
import 'package:cake_wallet/src/screens/wallet_list/wallet_list_page.dart';
41
-import 'package:cake_wallet/store/theme_changer_store.dart';
40
import 'package:cake_wallet/store/wallet_list_store.dart';
43
-import 'package:cake_wallet/utils/mobx.dart';
44
-import 'package:cake_wallet/theme_changer.dart';
41
import 'package:cake_wallet/view_model/contact_list/contact_list_view_model.dart';
42
import 'package:cake_wallet/view_model/contact_list/contact_view_model.dart';
43
import 'package:cake_wallet/view_model/exchange/exchange_trade_view_model.dart';
@@ -62,11 +58,9 @@ import 'package:cake_wallet/view_model/wallet_keys_view_model.dart';
58
import 'package:cake_wallet/view_model/wallet_list/wallet_list_view_model.dart';
59
import 'package:cake_wallet/view_model/wallet_seed_view_model.dart';
60
import 'package:cake_wallet/view_model/exchange/exchange_view_model.dart';
65
-import 'package:flutter/foundation.dart';
61
import 'package:flutter/widgets.dart';
62
import 'package:get_it/get_it.dart';
63
import 'package:hive/hive.dart';
69
-import 'package:mobx/mobx.dart';
64
import 'package:shared_preferences/shared_preferences.dart';
65
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
66
import 'package:cake_wallet/view_model/wallet_restoration_from_seed_vm.dart';
@@ -104,17 +98,13 @@ Future setup(
98
getIt.registerSingleton<FlutterSecureStorage>(FlutterSecureStorage());
99
getIt.registerSingleton(AuthenticationStore());
100
getIt.registerSingleton<WalletListStore>(WalletListStore());
107
- getIt.registerSingleton(ContactListStore());
101
getIt.registerSingleton(NodeListStoreBase.instance);
102
getIt.registerSingleton<SettingsStore>(settingsStore);
103
getIt.registerSingleton<AppStore>(AppStore(
104
authenticationStore: getIt.get<AuthenticationStore>(),
105
walletList: getIt.get<WalletListStore>(),
106
settingsStore: getIt.get<SettingsStore>(),
114
- contactListStore: getIt.get<ContactListStore>(),
107
nodeListStore: getIt.get<NodeListStore>()));
116
- getIt.registerSingleton<ContactService>(
117
- ContactService(contactSource, getIt.get<AppStore>().contactListStore));
108
getIt.registerSingleton<TradesStore>(TradesStore(
109
tradesSource: tradesSource, settingsStore: getIt.get<SettingsStore>()));
110
getIt.registerSingleton<TradeFilterStore>(TradeFilterStore());
@@ -285,14 +275,10 @@ Future setup(
275
getIt.registerFactory(() => WalletKeysPage(getIt.get<WalletKeysViewModel>()));
276
277
getIt.registerFactoryParam<ContactViewModel, ContactRecord, void>(
288
- (ContactRecord contact, _) => ContactViewModel(
289
- contactSource, getIt.get<AppStore>().wallet,
290
- contact: contact));
278
+ (ContactRecord contact, _) =>
279
+ ContactViewModel(contactSource, contact: contact));
280
292
- getIt.registerFactory(() => ContactListViewModel(
293
- getIt.get<AppStore>().contactListStore,
294
- getIt.get<ContactService>(),
295
- contactSource));
281
+ getIt.registerFactory(() => ContactListViewModel(contactSource));
282
283
getIt.registerFactoryParam<ContactListPage, bool, void>(
284
(bool isEditable, _) => ContactListPage(getIt.get<ContactListViewModel>(),
@@ -366,9 +352,8 @@ Future setup(
352
getIt.registerFactory(() => RescanViewModel(getIt.get<AppStore>().wallet));
353
354
getIt.registerFactory(() => RescanPage(getIt.get<RescanViewModel>()));
369
-}
355
371
-void setupThemeChangerStore(ThemeChanger themeChanger) {
372
- getIt.registerSingleton<ThemeChangerStore>(
373
- ThemeChangerStore(themeChanger: themeChanger));
356
+ getIt.registerFactory(() => FaqPage(getIt.get<SettingsStore>()));
357
+
358
+ getIt.registerFactory(() => LanguageListPage(getIt.get<SettingsStore>()));
359
}
lib/entities/language.dart
deleted
-38
@@ -1,38 +0,0 @@
1
-import 'package:flutter/material.dart';
2
-import 'package:devicelocale/devicelocale.dart';
3
-import 'package:intl/intl.dart';
4
-
5
-const Map<String, String> languages = {
6
- 'en': 'English',
7
- 'de': 'Deutsch (German)',
8
- 'es': 'Español (Spanish)',
9
- 'hi': 'हिंदी (Hindi)',
10
- 'ja': '日本 (Japanese)',
11
- 'ko': '한국어 (Korean)',
12
- 'nl': 'Nederlands (Dutch)',
13
- 'pl': 'Polski (Polish)',
14
- 'pt': 'Português (Portuguese)',
15
- 'ru': 'Русский (Russian)',
16
- 'uk': 'Українська (Ukrainian)',
17
- 'zh': '中文 (Chinese)'
18
-};
19
-
20
-class Language with ChangeNotifier {
21
- Language(this._currentLanguage);
22
-
23
- String _currentLanguage;
24
-
25
- String getCurrentLanguage() => _currentLanguage;
26
-
27
- void setCurrentLanguage(String language) {
28
- _currentLanguage = language;
29
- notifyListeners();
30
- }
31
-
32
- static Future<String> localeDetection() async {
33
- var locale = await Devicelocale.currentLocale;
34
- locale = Intl.shortLocale(locale);
35
-
36
- return languages.keys.contains(locale) ? locale : 'en';
37
- }
38
-}
\ No newline at end of file
lib/entities/language_service.dart
new
+26
@@ -0,0 +1,26 @@
1
+import 'package:devicelocale/devicelocale.dart';
2
+import 'package:intl/intl.dart';
3
+
4
+class LanguageService {
5
+ static const Map<String, String> list = {
6
+ 'en': 'English',
7
+ 'de': 'Deutsch (German)',
8
+ 'es': 'Español (Spanish)',
9
+ 'hi': 'हिंदी (Hindi)',
10
+ 'ja': '日本 (Japanese)',
11
+ 'ko': '한국어 (Korean)',
12
+ 'nl': 'Nederlands (Dutch)',
13
+ 'pl': 'Polski (Polish)',
14
+ 'pt': 'Português (Portuguese)',
15
+ 'ru': 'Русский (Russian)',
16
+ 'uk': 'Українська (Ukrainian)',
17
+ 'zh': '中文 (Chinese)'
18
+ };
19
+
20
+ static Future<String> localeDetection() async {
21
+ var locale = await Devicelocale.currentLocale;
22
+ locale = Intl.shortLocale(locale);
23
+
24
+ return list.keys.contains(locale) ? locale : 'en';
25
+ }
26
+}
lib/entities/node.dart
+21
-17
@@ -61,24 +61,28 @@ class Node extends HiveObject with Keyable {
61
}
62
63
Future<bool> requestMoneroNode() async {
64
- Map<String, dynamic> resBody;
65
-
66
- if (login != null && password != null) {
67
- final digestRequest = DigestRequest();
68
- final response = await digestRequest.request(
69
- uri: uri, login: login, password: password);
70
- resBody = response.data as Map<String, dynamic>;
71
- } else {
72
- final url = Uri.http(uri, '/json_rpc');
73
- final headers = {'Content-type': 'application/json'};
74
- final body =
75
- json.encode({'jsonrpc': '2.0', 'id': '0', 'method': 'get_info'});
76
- final response =
77
- await http.post(url.toString(), headers: headers, body: body);
78
- resBody = json.decode(response.body) as Map<String, dynamic>;
79
- }
64
+ try {
65
+ Map<String, dynamic> resBody;
66
+
67
+ if (login != null && password != null) {
68
+ final digestRequest = DigestRequest();
69
+ final response = await digestRequest.request(
70
+ uri: uri, login: login, password: password);
71
+ resBody = response.data as Map<String, dynamic>;
72
+ } else {
73
+ final url = Uri.http(uri, '/json_rpc');
74
+ final headers = {'Content-type': 'application/json'};
75
+ final body =
76
+ json.encode({'jsonrpc': '2.0', 'id': '0', 'method': 'get_info'});
77
+ final response =
78
+ await http.post(url.toString(), headers: headers, body: body);
79
+ resBody = json.decode(response.body) as Map<String, dynamic>;
80
+ }
81
81
- return !(resBody['result']['offline'] as bool);
82
+ return !(resBody['result']['offline'] as bool);
83
+ } catch (_) {
84
+ return false;
85
+ }
86
}
87
88
Future<bool> requestBitcoinElectrumServer() async {
lib/entities/record.dart
+2
-1
@@ -5,6 +5,7 @@ import 'package:hive/hive.dart';
5
6
abstract class Record<T extends HiveObject> with Keyable {
7
Record(this._source, this.original) {
8
+ key = original.key;
9
_listener?.cancel();
10
_listener = _source.watch(key: original.key).listen((event) {
11
if (!event.deleted) {
@@ -16,7 +17,7 @@ abstract class Record<T extends HiveObject> with Keyable {
17
toBind(original);
18
}
19
19
- dynamic get key => original.key;
20
+ dynamic key;
21
22
@override
23
dynamic get keyIndex => key;
lib/main.dart
+39
-154
@@ -1,66 +1,30 @@
1
-import 'package:cake_wallet/entities/fs_migration.dart';
2
-import 'package:cake_wallet/entities/transaction_description.dart';
3
-import 'package:cake_wallet/entities/transaction_description.dart';
4
-import 'package:cake_wallet/reactions/bootstrap.dart';
5
-import 'package:cake_wallet/routes.dart';
6
-import 'package:cake_wallet/store/app_store.dart';
7
-import 'package:cake_wallet/store/authentication_store.dart';
8
-import 'package:cake_wallet/core/auth_service.dart';
9
-import 'package:cake_wallet/bitcoin/bitcoin_wallet_service.dart';
10
-import 'package:cake_wallet/monero/monero_wallet_service.dart';
11
-import 'package:cake_wallet/core/wallet_creation_service.dart';
1
+import 'package:flutter/material.dart';
2
+import 'package:flutter/services.dart';
3
+import 'package:hive/hive.dart';
4
import 'package:cake_wallet/di.dart';
13
-import 'package:cake_wallet/view_model/wallet_new_vm.dart';
14
-import 'package:flutter_localizations/flutter_localizations.dart';
15
-import 'package:get_it/get_it.dart';
5
import 'package:path_provider/path_provider.dart';
6
import 'package:shared_preferences/shared_preferences.dart';
7
+import 'package:flutter_localizations/flutter_localizations.dart';
8
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
19
-import 'package:provider/provider.dart';
20
-import 'package:flutter/material.dart';
21
-import 'package:flutter/services.dart';
22
-import 'package:hive/hive.dart';
9
+import 'package:flutter_mobx/flutter_mobx.dart';
10
import 'package:cw_monero/wallet.dart' as monero_wallet;
11
import 'package:cake_wallet/router.dart';
25
-import 'theme_changer.dart';
26
-import 'themes.dart';
12
+import 'package:cake_wallet/routes.dart';
13
+import 'package:cake_wallet/generated/i18n.dart';
14
+import 'package:cake_wallet/reactions/bootstrap.dart';
15
+import 'package:cake_wallet/store/app_store.dart';
16
+import 'package:cake_wallet/store/authentication_store.dart';
17
+import 'package:cake_wallet/entities/transaction_description.dart';
18
import 'package:cake_wallet/entities/get_encryption_key.dart';
19
import 'package:cake_wallet/entities/contact.dart';
20
import 'package:cake_wallet/entities/node.dart';
21
import 'package:cake_wallet/entities/wallet_info.dart';
31
-import 'package:cake_wallet/exchange/trade.dart';
32
-
33
-// import 'package:cake_wallet/monero/transaction_description.dart';
34
-import 'package:cake_wallet/src/reactions/set_reactions.dart';
35
-
36
-// import 'package:cake_wallet/src/stores/login/login_store.dart';
37
-// import 'package:cake_wallet/src/stores/balance/balance_store.dart';
38
-// import 'package:cake_wallet/src/stores/sync/sync_store.dart';
39
-// import 'package:cake_wallet/src/stores/wallet/wallet_store.dart';
40
-// import 'package:cake_wallet/src/stores/send_template/send_template_store.dart';
41
-// import 'package:cake_wallet/src/stores/exchange_template/exchange_template_store.dart';
42
-import 'package:cake_wallet/src/screens/root/root.dart';
43
-
44
-//import 'package:cake_wallet/src/stores/authentication/authentication_store.dart';
45
-// import 'package:cake_wallet/src/stores/settings/settings_store.dart';
46
-// import 'package:cake_wallet/src/stores/price/price_store.dart';
47
-// import 'package:cake_wallet/src/domain/services/user_service.dart';
48
-// import 'package:cake_wallet/src/domain/services/wallet_list_service.dart';
49
-import 'package:cake_wallet/entities/balance_display_mode.dart';
22
import 'package:cake_wallet/entities/default_settings_migration.dart';
51
-import 'package:cake_wallet/entities/fiat_currency.dart';
52
-import 'package:cake_wallet/entities/transaction_priority.dart';
23
import 'package:cake_wallet/entities/wallet_type.dart';
24
import 'package:cake_wallet/entities/template.dart';
25
+import 'package:cake_wallet/exchange/trade.dart';
26
import 'package:cake_wallet/exchange/exchange_template.dart';
56
-
57
-// import 'package:cake_wallet/src/domain/services/wallet_service.dart';
58
-// import 'package:cake_wallet/src/domain/services/fiat_convertation_service.dart';
59
-import 'package:cake_wallet/generated/i18n.dart';
60
-import 'package:cake_wallet/entities/language.dart';
61
-// import 'package:cake_wallet/src/stores/seed_language/seed_language_store.dart';
62
-
63
-bool isThemeChangerRegistered = false;
27
+import 'package:cake_wallet/src/screens/root/root.dart';
28
29
final navigatorKey = GlobalKey<NavigatorState>();
30
@@ -94,41 +58,6 @@ void main() async {
58
final templates = await Hive.openBox<Template>(Template.boxName);
59
final exchangeTemplates =
60
await Hive.openBox<ExchangeTemplate>(ExchangeTemplate.boxName);
97
-
98
- // final sharedPreferences = await SharedPreferences.getInstance();
99
- // final walletService = WalletService();
100
- // final fiatConvertationService = FiatConvertationService();
101
- // final walletListService = WalletListService(
102
- // secureStorage: secureStorage,
103
- // walletInfoSource: walletInfoSource,
104
- // walletService: walletService,
105
- // sharedPreferences: sharedPreferences);
106
- // final userService = UserService(
107
- // sharedPreferences: sharedPreferences, secureStorage: secureStorage);
108
- // final settingsStore = await SettingsStoreBase.load(
109
- // nodes: nodes,
110
- // sharedPreferences: sharedPreferences,
111
- // initialFiatCurrency: FiatCurrency.usd,
112
- // initialTransactionPriority: TransactionPriority.slow,
113
- // initialBalanceDisplayMode: BalanceDisplayMode.availableBalance);
114
- // final priceStore = PriceStore();
115
- // final walletStore =
116
- // WalletStore(walletService: walletService, settingsStore: settingsStore);
117
- // final syncStore = SyncStore(walletService: walletService);
118
- // final balanceStore = BalanceStore(
119
- // walletService: walletService,
120
- // settingsStore: settingsStore,
121
- // priceStore: priceStore);
122
- // final loginStore = LoginStore(
123
- // sharedPreferences: sharedPreferences, walletsService: walletListService);
124
- // final seedLanguageStore = SeedLanguageStore();
125
- // final sendTemplateStore = SendTemplateStore(templateSource: templates);
126
- // final exchangeTemplateStore =
127
- // ExchangeTemplateStore(templateSource: exchangeTemplates);
128
-
129
- // final walletCreationService = WalletCreationService();
130
- // final authService = AuthService();
131
-
61
await initialSetup(
62
sharedPreferences: await SharedPreferences.getInstance(),
63
nodes: nodes,
@@ -139,15 +68,7 @@ void main() async {
68
templates: templates,
69
exchangeTemplates: exchangeTemplates,
70
initialMigrationVersion: 4);
142
-// setReactions(
143
-// settingsStore: settingsStore,
144
-// priceStore: priceStore,
145
-// syncStore: syncStore,
146
-// walletStore: walletStore,
147
-// walletService: walletService,
148
-// // authenticationStore: authenticationStore,
149
-// loginStore: loginStore);
150
- runApp(CakeWalletApp());
71
+ runApp(App());
72
}
73
74
Future<void> initialSetup(
@@ -178,63 +99,25 @@ Future<void> initialSetup(
99
monero_wallet.onStartup();
100
}
101
181
-class CakeWalletApp extends StatelessWidget {
182
- CakeWalletApp() {
102
+class App extends StatelessWidget {
103
+ App() {
104
SystemChrome.setPreferredOrientations(
105
[DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);
106
}
107
187
-
108
@override
109
Widget build(BuildContext context) {
190
- //final settingsStore = Provider.of<SettingsStore>(context);
110
final settingsStore = getIt.get<AppStore>().settingsStore;
111
193
- return ChangeNotifierProvider<ThemeChanger>(
194
- create: (_) => ThemeChanger(
195
- settingsStore.isDarkTheme ? Themes.darkTheme : Themes.lightTheme),
196
- child: ChangeNotifierProvider<Language>(
197
- create: (_) => Language(settingsStore.languageCode),
198
- child: MaterialAppWithTheme()));
199
- }
200
-}
201
-
202
-class MaterialAppWithTheme extends StatelessWidget {
203
- MaterialAppWithTheme();
204
-
205
- @override
206
- Widget build(BuildContext context) {
207
- // final sharedPreferences = Provider.of<SharedPreferences>(context);
208
- // final walletService = Provider.of<WalletService>(context);
209
- // final walletListService = Provider.of<WalletListService>(context);
210
- // final userService = Provider.of<UserService>(context);
211
- // final settingsStore = Provider.of<SettingsStore>(context);
212
- // final priceStore = Provider.of<PriceStore>(context);
213
- // final walletStore = Provider.of<WalletStore>(context);
214
- // final syncStore = Provider.of<SyncStore>(context);
215
- // final balanceStore = Provider.of<BalanceStore>(context);
216
- final theme = Provider.of<ThemeChanger>(context);
217
- final currentLanguage = Provider.of<Language>(context);
218
- // final contacts = Provider.of<Box<Contact>>(context);
219
- // final nodes = Provider.of<Box<Node>>(context);
220
- // final trades = Provider.of<Box<Trade>>(context);
221
- // final transactionDescriptions =
222
- // Provider.of<Box<TransactionDescription>>(context);
223
-
224
- if (!isThemeChangerRegistered) {
225
- setupThemeChangerStore(theme);
226
- isThemeChangerRegistered = true;
112
+ if (settingsStore.theme == null) {
113
+ settingsStore.isDarkTheme = false;
114
}
115
229
- /*final statusBarColor =
230
- settingsStore.isDarkTheme ? Colors.black : Colors.white;*/
231
- final _settingsStore = getIt.get<AppStore>().settingsStore;
232
-
116
final statusBarColor = Colors.transparent;
117
final statusBarBrightness =
235
- _settingsStore.isDarkTheme ? Brightness.light : Brightness.dark;
118
+ settingsStore.isDarkTheme ? Brightness.light : Brightness.dark;
119
final statusBarIconBrightness =
237
- _settingsStore.isDarkTheme ? Brightness.light : Brightness.dark;
120
+ settingsStore.isDarkTheme ? Brightness.light : Brightness.dark;
121
final authenticationStore = getIt.get<AuthenticationStore>();
122
final initialRoute = authenticationStore.state == AuthenticationState.denied
123
? Routes.welcome
@@ -245,22 +128,24 @@ class MaterialAppWithTheme extends StatelessWidget {
128
statusBarBrightness: statusBarBrightness,
129
statusBarIconBrightness: statusBarIconBrightness));
130
248
- return Root(
249
- authenticationStore: authenticationStore,
250
- child: MaterialApp(
251
- navigatorKey: navigatorKey,
252
- debugShowCheckedModeBanner: false,
253
- theme: theme.getTheme(),
254
- localizationsDelegates: [
255
- S.delegate,
256
- GlobalCupertinoLocalizations.delegate,
257
- GlobalMaterialLocalizations.delegate,
258
- GlobalWidgetsLocalizations.delegate,
259
- ],
260
- supportedLocales: S.delegate.supportedLocales,
261
- locale: Locale(currentLanguage.getCurrentLanguage()),
262
- onGenerateRoute: (settings) => Router.generateRoute(settings),
263
- initialRoute: initialRoute,
264
- ));
131
+ return Observer(builder: (BuildContext context) {
132
+ return Root(
133
+ authenticationStore: authenticationStore,
134
+ child: MaterialApp(
135
+ navigatorKey: navigatorKey,
136
+ debugShowCheckedModeBanner: false,
137
+ theme: settingsStore.theme,
138
+ localizationsDelegates: [
139
+ S.delegate,
140
+ GlobalCupertinoLocalizations.delegate,
141
+ GlobalMaterialLocalizations.delegate,
142
+ GlobalWidgetsLocalizations.delegate,
143
+ ],
144
+ supportedLocales: S.delegate.supportedLocales,
145
+ locale: Locale(settingsStore.languageCode),
146
+ onGenerateRoute: (settings) => Router.generateRoute(settings),
147
+ initialRoute: initialRoute,
148
+ ));
149
+ });
150
}
151
}
lib/router.dart
+5
-4
@@ -252,8 +252,8 @@ class Router {
252
253
case Routes.addressBookAddContact:
254
return CupertinoPageRoute<void>(
255
- builder: (_) =>
256
- getIt.get<ContactPage>(param1: settings.arguments as ContactRecord));
255
+ builder: (_) => getIt.get<ContactPage>(
256
+ param1: settings.arguments as ContactRecord));
257
258
case Routes.showKeys:
259
return MaterialPageRoute<void>(
@@ -297,10 +297,11 @@ class Router {
297
return MaterialPageRoute<void>(builder: (_) => getIt.get<RescanPage>());
298
299
case Routes.faq:
300
- return MaterialPageRoute<void>(builder: (_) => FaqPage());
300
+ return MaterialPageRoute<void>(builder: (_) => getIt.get<FaqPage>());
301
302
case Routes.changeLanguage:
303
- return MaterialPageRoute<void>(builder: (_) => ChangeLanguage());
303
+ return MaterialPageRoute<void>(
304
+ builder: (_) => getIt.get<LanguageListPage>());
305
306
default:
307
return MaterialPageRoute<void>(
lib/src/reactions/set_reactions.dart
deleted
-98
@@ -1,98 +0,0 @@
1
-// import 'dart:async';
2
-// import 'package:flutter/foundation.dart';
3
-// import 'package:mobx/mobx.dart';
4
-// import 'package:cake_wallet/entities/node.dart';
5
-// import 'package:cake_wallet/entities/sync_status.dart';
6
-// import 'package:cake_wallet/src/domain/services/wallet_service.dart';
7
-// import 'package:cake_wallet/src/start_updating_price.dart';
8
-// import 'package:cake_wallet/src/stores/sync/sync_store.dart';
9
-// import 'package:cake_wallet/src/stores/wallet/wallet_store.dart';
10
-// import 'package:cake_wallet/src/stores/settings/settings_store.dart';
11
-// import 'package:cake_wallet/src/stores/price/price_store.dart';
12
-// import 'package:cake_wallet/src/stores/authentication/authentication_store.dart';
13
-// import 'package:cake_wallet/src/stores/login/login_store.dart';
14
-//
15
-// Timer _reconnectionTimer;
16
-// ReactionDisposer _connectToNodeDisposer;
17
-// ReactionDisposer _onSyncStatusChangeDisposer;
18
-// ReactionDisposer _onCurrentWalletChangeDisposer;
19
-//
20
-// void setReactions(
21
-// {@required SettingsStore settingsStore,
22
-// @required PriceStore priceStore,
23
-// @required SyncStore syncStore,
24
-// @required WalletStore walletStore,
25
-// @required WalletService walletService,
26
-// // @required AuthenticationStore authenticationStore,
27
-// @required LoginStore loginStore}) {
28
-// connectToNode(settingsStore: settingsStore, walletStore: walletStore);
29
-// onSyncStatusChange(
30
-// syncStore: syncStore,
31
-// walletStore: walletStore,
32
-// settingsStore: settingsStore);
33
-// onCurrentWalletChange(
34
-// walletStore: walletStore,
35
-// settingsStore: settingsStore,
36
-// priceStore: priceStore);
37
-// autorun((_) async {
38
-// // if (authenticationStore.state == AuthenticationState.allowed) {
39
-// // await loginStore.loadCurrentWallet();
40
-// // authenticationStore.state = AuthenticationState.readyToLogin;
41
-// // }
42
-// });
43
-// }
44
-//
45
-// void connectToNode({SettingsStore settingsStore, WalletStore walletStore}) {
46
-// _connectToNodeDisposer?.call();
47
-//
48
-// _connectToNodeDisposer = reaction((_) => settingsStore.node,
49
-// (Node node) async => await walletStore.connectToNode(node: node));
50
-// }
51
-//
52
-// void onCurrentWalletChange(
53
-// {WalletStore walletStore,
54
-// SettingsStore settingsStore,
55
-// PriceStore priceStore}) {
56
-// _onCurrentWalletChangeDisposer?.call();
57
-//
58
-// reaction((_) => walletStore.name, (String _) {
59
-// walletStore.connectToNode(node: settingsStore.node);
60
-// startUpdatingPrice(settingsStore: settingsStore, priceStore: priceStore);
61
-// });
62
-// }
63
-//
64
-// void onSyncStatusChange(
65
-// {SyncStore syncStore,
66
-// WalletStore walletStore,
67
-// SettingsStore settingsStore}) {
68
-// // _onSyncStatusChangeDisposer?.call();
69
-//
70
-// // reaction((_) => syncStore.status, (SyncStatus status) async {
71
-// // if (status is ConnectedSyncStatus) {
72
-// // await walletStore.startSync();
73
-// // }
74
-//
75
-// // // Reconnect to the node if the app is not started sync after 30 seconds
76
-// // if (status is StartingSyncStatus) {
77
-// // startReconnectionObserver(syncStore: syncStore, walletStore: walletStore);
78
-// // }
79
-// // });
80
-// }
81
-//
82
-// void startReconnectionObserver({SyncStore syncStore, WalletStore walletStore}) {
83
-// if (_reconnectionTimer != null) {
84
-// _reconnectionTimer.cancel();
85
-// }
86
-//
87
-// _reconnectionTimer = Timer.periodic(Duration(minutes: 1), (_) async {
88
-// try {
89
-// final isConnected = await walletStore.isConnected();
90
-//
91
-// if (!isConnected) {
92
-// await walletStore.reconnect();
93
-// }
94
-// } catch (e) {
95
-// print(e);
96
-// }
97
-// });
98
-// }
lib/src/screens/base_page.dart
+20
-24
@@ -1,14 +1,22 @@
1
import 'package:flutter/cupertino.dart';
2
import 'package:flutter/material.dart';
3
-import 'package:cake_wallet/src/widgets/nav_bar.dart';
4
-import 'package:provider/provider.dart';
5
-import 'package:cake_wallet/themes.dart';
6
-import 'package:cake_wallet/theme_changer.dart';
3
import 'package:cake_wallet/palette.dart';
4
+import 'package:cake_wallet/di.dart';
5
+import 'package:cake_wallet/store/settings_store.dart';
6
+import 'package:cake_wallet/src/widgets/nav_bar.dart';
7
8
enum AppBarStyle { regular, withShadow, transparent }
9
10
abstract class BasePage extends StatelessWidget {
11
+ BasePage()
12
+ : _scaffoldKey = GlobalKey<ScaffoldState>(),
13
+ _closeButtonImage = Image.asset('assets/images/close_button.png'),
14
+ _closeButtonImageDarkTheme =
15
+ Image.asset('assets/images/close_button_dark_theme.png');
16
+ final GlobalKey<ScaffoldState> _scaffoldKey;
17
+ final Image _closeButtonImage;
18
+ final Image _closeButtonImageDarkTheme;
19
+
20
String get title => null;
21
22
bool get isModalBackButton => false;
@@ -29,11 +37,7 @@ abstract class BasePage extends StatelessWidget {
37
38
Widget Function(BuildContext, Widget) get rootWrapper => null;
39
32
- final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
33
-
34
- final _closeButtonImage = Image.asset('assets/images/close_button.png');
35
- final _closeButtonImageDarkTheme =
36
- Image.asset('assets/images/close_button_dark_theme.png');
40
+ bool get _isDarkTheme => getIt.get<SettingsStore>().isDarkTheme;
41
42
void onOpenEndDrawer() => _scaffoldKey.currentState.openEndDrawer();
43
@@ -45,12 +49,9 @@ abstract class BasePage extends StatelessWidget {
49
}
50
51
final _backButton = Image.asset('assets/images/back_arrow.png',
48
- color: titleColor ?? Theme.of(context).primaryTextTheme.title.color);
49
-
50
- final _themeChanger = Provider.of<ThemeChanger>(context);
51
- final _closeButton = _themeChanger.getTheme() == Themes.darkTheme
52
- ? _closeButtonImageDarkTheme
53
- : _closeButtonImage;
52
+ color: titleColor ?? Theme.of(context).primaryTextTheme.title.color);
53
+ final _closeButton =
54
+ _isDarkTheme ? _closeButtonImageDarkTheme : _closeButtonImage;
55
56
return SizedBox(
57
height: 37,
@@ -77,7 +78,7 @@ abstract class BasePage extends StatelessWidget {
78
fontWeight: FontWeight.bold,
79
fontFamily: 'Poppins',
80
color: titleColor ??
80
- Theme.of(context).primaryTextTheme.title.color),
81
+ Theme.of(context).primaryTextTheme.title.color),
82
);
83
}
84
@@ -86,10 +87,8 @@ abstract class BasePage extends StatelessWidget {
87
Widget floatingActionButton(BuildContext context) => null;
88
89
ObstructingPreferredSizeWidget appBar(BuildContext context) {
89
- final _themeChanger = Provider.of<ThemeChanger>(context);
90
- final _isDarkTheme = _themeChanger.getTheme() == Themes.darkTheme;
91
- final appBarColor = _isDarkTheme
92
- ? backgroundDarkColor : backgroundLightColor;
90
+ final appBarColor =
91
+ _isDarkTheme ? backgroundDarkColor : backgroundLightColor;
92
93
switch (appBarStyle) {
94
case AppBarStyle.regular:
@@ -131,9 +130,6 @@ abstract class BasePage extends StatelessWidget {
130
131
@override
132
Widget build(BuildContext context) {
134
- final _themeChanger = Provider.of<ThemeChanger>(context);
135
- final _isDarkTheme = _themeChanger.getTheme() == Themes.darkTheme;
136
-
133
final root = Scaffold(
134
key: _scaffoldKey,
135
backgroundColor:
@@ -142,7 +138,7 @@ abstract class BasePage extends StatelessWidget {
138
extendBodyBehindAppBar: extendBodyBehindAppBar,
139
endDrawer: endDrawer,
140
appBar: appBar(context),
145
- body: body(context), //SafeArea(child: ),
141
+ body: body(context),
142
floatingActionButton: floatingActionButton(context));
143
144
return rootWrapper?.call(context, root) ?? root;
lib/src/screens/contact/contact_list_page.dart
+4
-4
@@ -164,10 +164,10 @@ class ContactListPage extends BasePage {
164
final isDelete =
165
await showAlertDialog(context) ?? false;
166
167
- // if (isDelete) {
168
- // await contactListViewModel
169
- // .delete(contact);
170
- // }
167
+ if (isDelete) {
168
+ await contactListViewModel
169
+ .delete(contact);
170
+ }
171
},
172
),
173
],
lib/src/screens/dashboard/create_dashboard_page.dart
deleted
-33
@@ -1,33 +0,0 @@
1
-import 'package:flutter/material.dart';
2
-import 'package:hive/hive.dart';
3
-import 'package:provider/provider.dart';
4
-import 'package:cake_wallet/exchange/trade.dart';
5
-// import 'package:cake_wallet/monero/transaction_description.dart';
6
-// import 'package:cake_wallet/src/domain/services/wallet_service.dart';
7
-// import 'package:cake_wallet/src/screens/dashboard/dashboard_page.dart';
8
-// import 'package:cake_wallet/src/stores/action_list/action_list_store.dart';
9
-// import 'package:cake_wallet/src/stores/action_list/trade_filter_store.dart';
10
-// import 'package:cake_wallet/src/stores/action_list/transaction_filter_store.dart';
11
-// import 'package:cake_wallet/src/stores/price/price_store.dart';
12
-// import 'package:cake_wallet/src/stores/settings/settings_store.dart';
13
-// import 'package:cake_wallet/src/stores/wallet/wallet_store.dart';
14
-
15
-// FIXME: Remove me.
16
-
17
-// Widget createDashboardPage(
18
-// {@required WalletService walletService,
19
-// @required PriceStore priceStore,
20
-// @required Box<TransactionDescription> transactionDescriptions,
21
-// @required SettingsStore settingsStore,
22
-// @required Box<Trade> trades,
23
-// @required WalletStore walletStore}) =>
24
-// Provider(
25
-// create: (_) => ActionListStore(
26
-// walletService: walletService,
27
-// settingsStore: settingsStore,
28
-// priceStore: priceStore,
29
-// tradesSource: trades,
30
-// transactionFilterStore: TransactionFilterStore(),
31
-// tradeFilterStore: TradeFilterStore(walletStore: walletStore),
32
-// transactionDescriptions: transactionDescriptions),
33
-// child: DashboardPage());
lib/src/screens/dashboard/dashboard_page.dart
+1
-1
@@ -105,7 +105,7 @@ class DashboardPage extends BasePage {
105
Container(
106
padding: EdgeInsets.only(left: 45, right: 45, bottom: 24),
107
child: Row(
108
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
108
+ mainAxisAlignment: MainAxisAlignment.spaceAround,
109
children: <Widget>[
110
ActionButton(
111
image: sendImage,
lib/src/screens/dashboard/widgets/balance_page.dart
+35
-38
@@ -11,44 +11,41 @@ class BalancePage extends StatelessWidget {
11
Widget build(BuildContext context) {
12
return Container(
13
padding: EdgeInsets.all(24),
14
- child: Center(
15
- child: Container(
16
- height: 160,
17
- child: Column(
18
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
19
- crossAxisAlignment: CrossAxisAlignment.center,
20
- children: <Widget>[
21
- Observer(builder: (_) {
22
- return Text(
23
- dashboardViewModel.balanceViewModel.currency.toString(),
24
- style: TextStyle(
25
- fontSize: 40,
26
- fontWeight: FontWeight.bold,
27
- color: Theme.of(context).indicatorColor,
28
- height: 1),
29
- );
30
- }),
31
- Observer(builder: (_) {
32
- return Text(dashboardViewModel.balanceViewModel.cryptoBalance,
33
- style: TextStyle(
34
- fontSize: 54,
35
- fontWeight: FontWeight.bold,
36
- color: Colors.white,
37
- height: 1),
38
- textAlign: TextAlign.center);
39
- }),
40
- Observer(builder: (_) {
41
- return Text(dashboardViewModel.balanceViewModel.fiatBalance,
42
- style: TextStyle(
43
- fontSize: 18,
44
- fontWeight: FontWeight.w500,
45
- color: Theme.of(context).indicatorColor,
46
- height: 1),
47
- textAlign: TextAlign.center);
48
- }),
49
- ],
50
- ),
51
- ),
14
+ child: Column(
15
+ mainAxisAlignment: MainAxisAlignment.center,
16
+ crossAxisAlignment: CrossAxisAlignment.center,
17
+ children: <Widget>[
18
+ Observer(builder: (_) {
19
+ return Text(
20
+ dashboardViewModel.balanceViewModel.currency.toString(),
21
+ style: TextStyle(
22
+ fontSize: 40,
23
+ fontWeight: FontWeight.bold,
24
+ color: Theme.of(context).indicatorColor,
25
+ height: 1),
26
+ );
27
+ }),
28
+ SizedBox(height: 10),
29
+ Observer(builder: (_) {
30
+ return Text(dashboardViewModel.balanceViewModel.cryptoBalance,
31
+ style: TextStyle(
32
+ fontSize: 54,
33
+ fontWeight: FontWeight.bold,
34
+ color: Colors.white,
35
+ height: 1),
36
+ textAlign: TextAlign.center);
37
+ }),
38
+ SizedBox(height: 10),
39
+ Observer(builder: (_) {
40
+ return Text(dashboardViewModel.balanceViewModel.fiatBalance,
41
+ style: TextStyle(
42
+ fontSize: 18,
43
+ fontWeight: FontWeight.w500,
44
+ color: Theme.of(context).indicatorColor,
45
+ height: 1),
46
+ textAlign: TextAlign.center);
47
+ }),
48
+ ],
49
),
50
);
51
}
lib/src/screens/exchange/widgets/exchange_card.dart
+5
-5
@@ -146,11 +146,11 @@ class ExchangeCardState extends State<ExchangeCard> {
146
textAlign: TextAlign.left,
147
keyboardType: TextInputType.numberWithOptions(
148
signed: false, decimal: true),
149
- inputFormatters: [
150
- LengthLimitingTextInputFormatter(15),
151
- BlacklistingTextInputFormatter(
152
- RegExp('[\\-|\\ |\\,]'))
153
- ],
149
+ // inputFormatters: [
150
+ // LengthLimitingTextInputFormatter(15),
151
+ // BlacklistingTextInputFormatter(
152
+ // RegExp('[\\-|\\ |\\,]'))
153
+ // ],
154
hintText: '0.0000',
155
borderColor: widget.borderColor,
156
textStyle: TextStyle(
lib/src/screens/faq/faq_item.dart
new
+61
@@ -0,0 +1,61 @@
1
+import 'package:flutter/material.dart';
2
+import 'package:cake_wallet/palette.dart';
3
+
4
+class FAQItem extends StatefulWidget {
5
+ FAQItem(this.title, this.text);
6
+
7
+ final String title;
8
+ final String text;
9
+
10
+ @override
11
+ State<StatefulWidget> createState() => FAQItemState();
12
+}
13
+
14
+class FAQItemState extends State<FAQItem> {
15
+ bool isActive;
16
+
17
+ @override
18
+ void initState() {
19
+ isActive = false;
20
+ super.initState();
21
+ }
22
+
23
+ @override
24
+ Widget build(BuildContext context) {
25
+ final addIcon =
26
+ Icon(Icons.add, color: Theme.of(context).primaryTextTheme.title.color);
27
+ final removeIcon = Icon(Icons.remove, color: Palette.blueCraiola);
28
+ final icon = isActive ? removeIcon : addIcon;
29
+ final color = isActive
30
+ ? Palette.blueCraiola
31
+ : Theme.of(context).primaryTextTheme.title.color;
32
+
33
+ return ListTileTheme(
34
+ contentPadding: EdgeInsets.fromLTRB(0, 6, 24, 6),
35
+ child: ExpansionTile(
36
+ title: Text(widget.title,
37
+ style: TextStyle(
38
+ fontSize: 14, fontWeight: FontWeight.w500, color: color)),
39
+ trailing: icon,
40
+ onExpansionChanged: (value) => setState(() => isActive = value),
41
+ children: <Widget>[
42
+ Row(mainAxisAlignment: MainAxisAlignment.start, children: <Widget>[
43
+ Expanded(
44
+ child: Container(
45
+ padding: EdgeInsets.only(
46
+ right: 24.0,
47
+ ),
48
+ child: Text(
49
+ widget.text,
50
+ style: TextStyle(
51
+ fontSize: 14,
52
+ fontWeight: FontWeight.normal,
53
+ color: Theme.of(context).primaryTextTheme.title.color),
54
+ ),
55
+ ))
56
+ ])
57
+ ],
58
+ ),
59
+ );
60
+ }
61
+}
lib/src/screens/faq/faq_page.dart
+15
-123
@@ -1,46 +1,30 @@
1
import 'dart:convert';
2
-import 'package:cake_wallet/palette.dart';
3
-import 'package:cake_wallet/src/widgets/standard_list.dart';
2
import 'package:flutter/material.dart';
3
import 'package:flutter/services.dart';
6
-import 'package:provider/provider.dart';
4
import 'package:cake_wallet/generated/i18n.dart';
8
-import 'package:cake_wallet/store/settings_store.dart';
5
+import 'package:cake_wallet/src/screens/faq/faq_item.dart';
6
import 'package:cake_wallet/src/screens/base_page.dart';
7
+import 'package:cake_wallet/src/widgets/standard_list.dart';
8
+import 'package:cake_wallet/store/settings_store.dart';
9
10
class FaqPage extends BasePage {
12
- @override
13
- String get title => S.current.faq;
11
+ FaqPage(this.settingsStore);
12
15
- @override
16
- Widget body(BuildContext context) => FaqForm();
17
-}
13
+ final SettingsStore settingsStore;
14
19
-class FaqForm extends StatefulWidget {
15
@override
21
- FaqFormState createState() => FaqFormState();
22
-}
16
+ String get title => S.current.faq;
17
24
-class FaqFormState extends State<FaqForm> {
25
- List<Icon> icons;
26
- List<Color> colors;
27
- bool isLoaded = false;
18
+ String get path => 'assets/faq/faq_' + settingsStore.languageCode + '.json';
19
20
@override
30
- Widget build(BuildContext context) {
31
- final addIcon = Icon(Icons.add, color: Theme.of(context).primaryTextTheme.title.color);
32
- final removeIcon = Icon(Icons.remove, color: Palette.blueCraiola);
33
-
21
+ Widget body(BuildContext context) {
22
return Container(
23
padding: EdgeInsets.only(top: 12, left: 24),
24
child: FutureBuilder(
25
builder: (context, snapshot) {
26
final faqItems = jsonDecode(snapshot.data.toString()) as List;
27
40
- if (snapshot.hasData) {
41
- setIconsAndColors(context, faqItems.length, addIcon);
42
- }
43
-
28
return SingleChildScrollView(
29
child: Column(
30
children: <Widget>[
@@ -49,112 +33,20 @@ class FaqFormState extends State<FaqForm> {
33
shrinkWrap: true,
34
physics: NeverScrollableScrollPhysics(),
35
itemBuilder: (BuildContext context, int index) {
52
- final itemTitle = faqItems[index]["question"].toString();
53
- final itemChild = faqItems[index]["answer"].toString();
36
+ final title = faqItems[index]["question"].toString();
37
+ final text = faqItems[index]["answer"].toString();
38
55
- return ListTileTheme(
56
- contentPadding: EdgeInsets.fromLTRB(0, 6, 24, 6),
57
- child: ExpansionTile(
58
- title: Text(
59
- itemTitle,
60
- style: TextStyle(
61
- fontSize: 14,
62
- fontWeight: FontWeight.w500,
63
- color: colors[index]
64
- ),
65
- ),
66
- trailing: icons[index],
67
- onExpansionChanged: (value) {
68
- setState(() {
69
- if (value) {
70
- icons[index] = removeIcon;
71
- colors[index] = Palette.blueCraiola;
72
- } else {
73
- icons[index] = addIcon;
74
- colors[index] = Theme.of(context).primaryTextTheme.title.color;
75
- }
76
- });
77
- },
78
- children: <Widget>[
79
- Row(
80
- mainAxisAlignment: MainAxisAlignment.start,
81
- children: <Widget>[
82
- Expanded(
83
- child: Container(
84
- padding: EdgeInsets.only(
85
- right: 24.0,
86
- ),
87
- child: Text(
88
- itemChild,
89
- style: TextStyle(
90
- fontSize: 14,
91
- fontWeight: FontWeight.normal,
92
- color: Theme.of(context).primaryTextTheme.title.color
93
- ),
94
- ),
95
- ))
96
- ],
97
- )
98
- ],
99
- ),
100
- );
39
+ return FAQItem(title, text);
40
},
102
- separatorBuilder: (_, __) =>
103
- StandardListSeparator(),
104
- itemCount: faqItems == null ? 0 : faqItems.length,
41
+ separatorBuilder: (_, __) => StandardListSeparator(),
42
+ itemCount: faqItems?.length ?? 0,
43
)
44
],
45
),
46
);
47
},
110
- future: rootBundle.loadString(getFaqPath(context)),
48
+ future: rootBundle.loadString(path),
49
),
50
);
51
}
114
-
115
- void setIconsAndColors(BuildContext context, int index, Icon icon) {
116
- if (isLoaded) {
117
- return;
118
- }
119
-
120
- icons = List.generate(index, (int i) => icon);
121
- colors = List.generate(index, (int i) => Theme.of(context).primaryTextTheme.title.color);
122
-
123
- isLoaded = true;
124
- }
125
-
126
- String getFaqPath(BuildContext context) {
127
- // FIXME: FIXME
128
- // final settingsStore = Provider.of<SettingsStore>(context);
129
- //
130
- // switch (settingsStore.languageCode) {
131
- // case 'en':
132
- // return 'assets/faq/faq_en.json';
133
- // case 'uk':
134
- // return 'assets/faq/faq_uk.json';
135
- // case 'ru':
136
- // return 'assets/faq/faq_ru.json';
137
- // case 'es':
138
- // return 'assets/faq/faq_es.json';
139
- // case 'ja':
140
- // return 'assets/faq/faq_ja.json';
141
- // case 'ko':
142
- // return 'assets/faq/faq_ko.json';
143
- // case 'hi':
144
- // return 'assets/faq/faq_hi.json';
145
- // case 'de':
146
- // return 'assets/faq/faq_de.json';
147
- // case 'zh':
148
- // return 'assets/faq/faq_zh.json';
149
- // case 'pt':
150
- // return 'assets/faq/faq_pt.json';
151
- // case 'pl':
152
- // return 'assets/faq/faq_pl.json';
153
- // case 'nl':
154
- // return 'assets/faq/faq_nl.json';
155
- // default:
156
- // return 'assets/faq/faq_en.json';
157
- // }
158
- return '';
159
- }
160
-}
\ No newline at end of file
52
+}
lib/src/screens/send/send_page.dart
+147
-152
@@ -1,4 +1,5 @@
1
import 'dart:ui';
2
+
3
// import 'package:cake_wallet/src/domain/common/transaction_priority.dart';
4
import 'package:cake_wallet/core/execution_state.dart';
5
import 'package:cake_wallet/src/screens/base_page.dart';
@@ -20,6 +21,7 @@ import 'package:dotted_border/dotted_border.dart';
21
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
22
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
23
import 'package:cake_wallet/src/screens/send/widgets/confirm_sending_alert.dart';
24
+
25
// import 'package:cake_wallet/src/screens/send/widgets/sending_alert.dart';
26
import 'package:cake_wallet/src/widgets/template_tile.dart';
27
import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
@@ -70,8 +72,7 @@ class SendPage extends BasePage {
72
decoration: BoxDecoration(
73
borderRadius: BorderRadius.only(
74
bottomLeft: Radius.circular(24),
73
- bottomRight: Radius.circular(24)
74
- ),
75
+ bottomRight: Radius.circular(24)),
76
gradient: LinearGradient(colors: [
77
Theme.of(context).primaryTextTheme.subhead.color,
78
Theme.of(context).primaryTextTheme.subhead.decorationColor,
@@ -106,10 +107,14 @@ class SendPage extends BasePage {
107
AddressTextFieldOption.qrCode,
108
AddressTextFieldOption.addressBook
109
],
109
- buttonColor:
110
- Theme.of(context).primaryTextTheme.display1.color,
111
- borderColor:
112
- Theme.of(context).primaryTextTheme.headline.color,
110
+ buttonColor: Theme.of(context)
111
+ .primaryTextTheme
112
+ .display1
113
+ .color,
114
+ borderColor: Theme.of(context)
115
+ .primaryTextTheme
116
+ .headline
117
+ .color,
118
textStyle: TextStyle(
119
fontSize: 14,
120
fontWeight: FontWeight.w500,
@@ -123,83 +128,76 @@ class SendPage extends BasePage {
128
.decorationColor),
129
validator: sendViewModel.addressValidator,
130
),
126
- Observer(builder: (_) {
127
- return Padding(
128
- padding: const EdgeInsets.only(top: 20),
129
- child: BaseTextFormField(
130
- controller: _cryptoAmountController,
131
- keyboardType: TextInputType.numberWithOptions(
132
- signed: false, decimal: true),
133
- inputFormatters: [
134
- BlacklistingTextInputFormatter(
135
- RegExp('[\\-|\\ |\\,]'))
136
- ],
137
- prefixIcon: Padding(
138
- padding: EdgeInsets.only(top: 9),
139
- child:
140
- Text(sendViewModel.currency.title + ':',
141
- style: TextStyle(
142
- fontSize: 16,
143
- fontWeight: FontWeight.w600,
144
- color: Colors.white,
145
- )),
146
- ),
147
- suffixIcon: Container(
148
- height: 32,
149
- width: 32,
150
- margin: EdgeInsets.only(
151
- left: 14, top: 4, bottom: 10),
152
- decoration: BoxDecoration(
153
- color: Theme.of(context)
154
- .primaryTextTheme
155
- .display1
156
- .color,
157
- borderRadius: BorderRadius.all(
158
- Radius.circular(6))),
159
- child: InkWell(
160
- onTap: () =>
161
- sendViewModel.setSendAll(),
162
- child: Center(
163
- child: Text(S.of(context).all,
164
- textAlign: TextAlign.center,
165
- style: TextStyle(
166
- fontSize: 12,
167
- fontWeight: FontWeight.bold,
168
- color: Theme.of(context)
169
- .primaryTextTheme
170
- .display1
171
- .decorationColor)),
172
- ),
173
- ),
174
- ),
175
- hintText: '0.0000',
176
- borderColor: Theme.of(context)
177
- .primaryTextTheme
178
- .headline
179
- .color,
180
- textStyle: TextStyle(
181
- fontSize: 14,
182
- fontWeight: FontWeight.w500,
183
- color: Colors.white),
184
- placeholderTextStyle: TextStyle(
131
+ Padding(
132
+ padding: const EdgeInsets.only(top: 20),
133
+ child: BaseTextFormField(
134
+ controller: _cryptoAmountController,
135
+ keyboardType: TextInputType.numberWithOptions(
136
+ signed: false, decimal: true),
137
+ prefixIcon: Padding(
138
+ padding: EdgeInsets.only(top: 9),
139
+ child:
140
+ Text(sendViewModel.currency.title + ':',
141
+ style: TextStyle(
142
+ fontSize: 16,
143
+ fontWeight: FontWeight.w600,
144
+ color: Colors.white,
145
+ )),
146
+ ),
147
+ suffixIcon: Container(
148
+ height: 32,
149
+ width: 32,
150
+ margin: EdgeInsets.only(
151
+ left: 14, top: 4, bottom: 10),
152
+ decoration: BoxDecoration(
153
color: Theme.of(context)
154
.primaryTextTheme
187
- .headline
188
- .decorationColor,
189
- fontWeight: FontWeight.w500,
190
- fontSize: 14),
191
- validator: sendViewModel.amountValidator));
192
- }),
155
+ .display1
156
+ .color,
157
+ borderRadius: BorderRadius.all(
158
+ Radius.circular(6))),
159
+ child: InkWell(
160
+ onTap: () => sendViewModel.setSendAll(),
161
+ child: Center(
162
+ child: Text(S.of(context).all,
163
+ textAlign: TextAlign.center,
164
+ style: TextStyle(
165
+ fontSize: 12,
166
+ fontWeight: FontWeight.bold,
167
+ color: Theme.of(context)
168
+ .primaryTextTheme
169
+ .display1
170
+ .decorationColor)),
171
+ ),
172
+ ),
173
+ ),
174
+ hintText: '0.0000',
175
+ borderColor: Theme.of(context)
176
+ .primaryTextTheme
177
+ .headline
178
+ .color,
179
+ textStyle: TextStyle(
180
+ fontSize: 14,
181
+ fontWeight: FontWeight.w500,
182
+ color: Colors.white),
183
+ placeholderTextStyle: TextStyle(
184
+ color: Theme.of(context)
185
+ .primaryTextTheme
186
+ .headline
187
+ .decorationColor,
188
+ fontWeight: FontWeight.w500,
189
+ fontSize: 14),
190
+ validator: sendViewModel.amountValidator)),
191
Observer(
192
builder: (_) => Padding(
195
- padding: EdgeInsets.only(top: 10),
196
- child: Row(
197
- mainAxisSize: MainAxisSize.max,
198
- mainAxisAlignment:
199
- MainAxisAlignment.spaceBetween,
200
- children: <Widget>[
201
- Expanded(
202
- child: Text(
193
+ padding: EdgeInsets.only(top: 10),
194
+ child: Row(
195
+ mainAxisSize: MainAxisSize.max,
196
+ mainAxisAlignment:
197
+ MainAxisAlignment.spaceBetween,
198
+ children: <Widget>[
199
+ Expanded(
200
+ child: Text(
201
S.of(context).available_balance + ':',
202
style: TextStyle(
203
fontSize: 12,
@@ -209,29 +207,25 @@ class SendPage extends BasePage {
207
.headline
208
.decorationColor),
209
)),
212
- Text(
213
- sendViewModel.balance,
214
- style: TextStyle(
215
- fontSize: 12,
216
- fontWeight: FontWeight.w600,
217
- color: Theme.of(context)
218
- .primaryTextTheme
219
- .headline
220
- .decorationColor),
221
- )
222
- ],
223
- ),
224
- )),
210
+ Text(
211
+ sendViewModel.balance,
212
+ style: TextStyle(
213
+ fontSize: 12,
214
+ fontWeight: FontWeight.w600,
215
+ color: Theme.of(context)
216
+ .primaryTextTheme
217
+ .headline
218
+ .decorationColor),
219
+ )
220
+ ],
221
+ ),
222
+ )),
223
Padding(
224
padding: const EdgeInsets.only(top: 20),
225
child: BaseTextFormField(
226
controller: _fiatAmountController,
227
keyboardType: TextInputType.numberWithOptions(
228
signed: false, decimal: true),
231
- inputFormatters: [
232
- BlacklistingTextInputFormatter(
233
- RegExp('[\\-|\\ |\\,]'))
234
- ],
229
prefixIcon: Padding(
230
padding: EdgeInsets.only(top: 9),
231
child: Text(sendViewModel.fiat.title + ':',
@@ -260,51 +254,51 @@ class SendPage extends BasePage {
254
)),
255
Observer(
256
builder: (_) => GestureDetector(
263
- onTap: () =>
264
- _setTransactionPriority(context),
265
- child: Container(
266
- padding: EdgeInsets.only(top: 24),
267
- child: Row(
268
- mainAxisAlignment:
269
- MainAxisAlignment.spaceBetween,
270
- children: <Widget>[
271
- Text(S.of(context).send_estimated_fee,
272
- style: TextStyle(
273
- fontSize: 12,
274
- fontWeight: FontWeight.w500,
275
- //color: Theme.of(context).primaryTextTheme.display2.color,
276
- color: Colors.white)),
277
- Container(
278
- child: Row(
279
- children: <Widget>[
280
- Text(
281
- sendViewModel.estimatedFee
282
- .toString() +
283
- ' ' +
284
- sendViewModel
285
- .currency.title,
286
- style: TextStyle(
287
- fontSize: 12,
288
- fontWeight:
289
- FontWeight.w600,
290
- //color: Theme.of(context).primaryTextTheme.display2.color,
291
- color: Colors.white)),
292
- Padding(
293
- padding:
294
- EdgeInsets.only(left: 5),
295
- child: Icon(
296
- Icons.arrow_forward_ios,
297
- size: 12,
298
- color: Colors.white,
299
- ),
300
- )
301
- ],
302
- ),
303
- )
304
- ],
305
- ),
306
- ),
307
- ))
257
+ onTap: () =>
258
+ _setTransactionPriority(context),
259
+ child: Container(
260
+ padding: EdgeInsets.only(top: 24),
261
+ child: Row(
262
+ mainAxisAlignment:
263
+ MainAxisAlignment.spaceBetween,
264
+ children: <Widget>[
265
+ Text(S.of(context).send_estimated_fee,
266
+ style: TextStyle(
267
+ fontSize: 12,
268
+ fontWeight: FontWeight.w500,
269
+ //color: Theme.of(context).primaryTextTheme.display2.color,
270
+ color: Colors.white)),
271
+ Container(
272
+ child: Row(
273
+ children: <Widget>[
274
+ Text(
275
+ sendViewModel.estimatedFee
276
+ .toString() +
277
+ ' ' +
278
+ sendViewModel
279
+ .currency.title,
280
+ style: TextStyle(
281
+ fontSize: 12,
282
+ fontWeight:
283
+ FontWeight.w600,
284
+ //color: Theme.of(context).primaryTextTheme.display2.color,
285
+ color: Colors.white)),
286
+ Padding(
287
+ padding:
288
+ EdgeInsets.only(left: 5),
289
+ child: Icon(
290
+ Icons.arrow_forward_ios,
291
+ size: 12,
292
+ color: Colors.white,
293
+ ),
294
+ )
295
+ ],
296
+ ),
297
+ )
298
+ ],
299
+ ),
300
+ ),
301
+ ))
302
],
303
),
304
)
@@ -358,7 +352,7 @@ class SendPage extends BasePage {
352
alignment: Alignment.center,
353
decoration: BoxDecoration(
354
borderRadius:
361
- BorderRadius.all(Radius.circular(20)),
355
+ BorderRadius.all(Radius.circular(20)),
356
color: Colors.transparent,
357
),
358
child: Text(
@@ -427,13 +421,12 @@ class SendPage extends BasePage {
421
)
422
],
423
),
430
- bottomSectionPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24),
424
+ bottomSectionPadding:
425
+ EdgeInsets.only(left: 24, right: 24, bottom: 24),
426
bottomSection: Observer(builder: (_) {
427
return LoadingPrimaryButton(
428
onPressed: () {
434
- if (_formKey.currentState.validate()) {
435
-
436
- }
429
+ if (_formKey.currentState.validate()) {}
430
},
431
text: S.of(context).send,
432
color: Theme.of(context).accentTextTheme.body2.color,
@@ -441,10 +434,9 @@ class SendPage extends BasePage {
434
isLoading: sendViewModel.state is IsExecutingState ||
435
sendViewModel.state is TransactionCommitting,
436
isDisabled:
444
- false // FIXME !(syncStore.status is SyncedSyncStatus),
445
- );
446
- })
447
- ),
437
+ false // FIXME !(syncStore.status is SyncedSyncStatus),
438
+ );
439
+ })),
440
);
441
}
442
@@ -514,7 +506,7 @@ class SendPage extends BasePage {
506
alertTitle: S.of(context).confirm_sending,
507
amount: S.of(context).send_amount,
508
amountValue:
517
- sendViewModel.pendingTransaction.amountFormatted,
509
+ sendViewModel.pendingTransaction.amountFormatted,
510
fee: S.of(context).send_fee,
511
feeValue: sendViewModel.pendingTransaction.feeFormatted,
512
leftButtonText: S.of(context).ok,
@@ -565,7 +557,10 @@ class SendPage extends BasePage {
557
onPressed: () =>
558
Navigator.of(context).pop(),
559
text: S.of(context).send_got_it,
568
- color: Theme.of(context).accentTextTheme.body2.color,
560
+ color: Theme.of(context)
561
+ .accentTextTheme
562
+ .body2
563
+ .color,
564
textColor: Colors.white))
565
],
566
);
lib/src/screens/settings/change_language.dart
+48
-48
@@ -1,67 +1,67 @@
1
import 'package:cake_wallet/src/screens/settings/widgets/language_row.dart';
2
import 'package:cake_wallet/src/widgets/standard_list.dart';
3
+import 'package:cake_wallet/store/settings_store.dart';
4
+import 'package:cake_wallet/utils/show_pop_up.dart';
5
import 'package:flutter/material.dart';
6
import 'package:flutter/cupertino.dart';
7
+import 'package:flutter_mobx/flutter_mobx.dart';
8
import 'package:provider/provider.dart';
9
import 'package:cake_wallet/generated/i18n.dart';
7
-import 'package:cake_wallet/entities/language.dart';
10
+import 'package:cake_wallet/entities/language_service.dart';
11
+
12
// import 'package:cake_wallet/src/stores/settings/settings_store.dart';
13
import 'package:cake_wallet/src/screens/base_page.dart';
14
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
15
12
-// FIXME: FIXME
16
+class LanguageListPage extends BasePage {
17
+ LanguageListPage(this.settingsStore);
18
+
19
+ final SettingsStore settingsStore;
20
14
-class ChangeLanguage extends BasePage {
21
@override
22
String get title => S.current.settings_change_language;
23
24
@override
25
Widget body(BuildContext context) {
20
- // final settingsStore = Provider.of<SettingsStore>(context);
21
- // final currentLanguage = Provider.of<Language>(context);
22
- //
23
- // return Container(
24
- // padding: EdgeInsets.only(top: 10.0),
25
- // child: SectionStandardList(
26
- // sectionCount: 1,
27
- // context: context,
28
- // itemCounter: (int sectionIndex) => languages.values.length,
29
- // itemBuilder: (_, sectionIndex, index) {
30
- // final item = languages.values.elementAt(index);
31
- // final code = languages.keys.elementAt(index);
32
- //
33
- // final isCurrent = settingsStore.languageCode == null
34
- // ? false
35
- // : code == settingsStore.languageCode;
36
- //
37
- // return LanguageRow(
38
- // title: item,
39
- // isSelected: isCurrent,
40
- // handler: (context) async {
41
- // if (!isCurrent) {
42
- // await showPopUp<void>(
43
- // context: context,
44
- // builder: (BuildContext context) {
45
- // return AlertWithTwoActions(
46
- // alertTitle: S.of(context).change_language,
47
- // alertContent: S.of(context).change_language_to(item),
48
- // rightButtonText: S.of(context).change,
49
- // leftButtonText: S.of(context).cancel,
50
- // actionRightButton: () {
51
- // settingsStore.saveLanguageCode(
52
- // languageCode: code);
53
- // currentLanguage.setCurrentLanguage(code);
54
- // Navigator.of(context).pop();
55
- // },
56
- // actionLeftButton: () => Navigator.of(context).pop()
57
- // );
58
- // });
59
- // }
60
- // },
61
- // );
62
- // },
63
- // )
64
- // );
26
+ return Container(
27
+ padding: EdgeInsets.only(top: 10.0),
28
+ child: SectionStandardList(
29
+ sectionCount: 1,
30
+ context: context,
31
+ itemCounter: (int sectionIndex) => LanguageService.list.values.length,
32
+ itemBuilder: (_, sectionIndex, index) {
33
+ return Observer(builder: (BuildContext context) {
34
+ final item = LanguageService.list.values.elementAt(index);
35
+ final code = LanguageService.list.keys.elementAt(index);
36
+ final isCurrent = code == settingsStore.languageCode ?? false;
37
+
38
+ return LanguageRow(
39
+ title: item,
40
+ isSelected: isCurrent,
41
+ handler: (context) async {
42
+ if (!isCurrent) {
43
+ await showPopUp<void>(
44
+ context: context,
45
+ builder: (BuildContext context) {
46
+ return AlertWithTwoActions(
47
+ alertTitle: S.of(context).change_language,
48
+ alertContent:
49
+ S.of(context).change_language_to(item),
50
+ rightButtonText: S.of(context).change,
51
+ leftButtonText: S.of(context).cancel,
52
+ actionRightButton: () {
53
+ settingsStore.languageCode = code;
54
+ Navigator.of(context).pop();
55
+ },
56
+ actionLeftButton: () =>
57
+ Navigator.of(context).pop());
58
+ });
59
+ }
60
+ },
61
+ );
62
+ });
63
+ },
64
+ ));
65
66
return null;
67
}
lib/src/widgets/alert_close_button.dart
+1
-1
@@ -8,7 +8,7 @@ class AlertCloseButton extends StatelessWidget {
8
@override
9
Widget build(BuildContext context) {
10
return Positioned(
11
- bottom: 24,
11
+ bottom: 60,
12
child: GestureDetector(
13
onTap: () => Navigator.of(context).pop(),
14
child: Container(
lib/store/app_store.dart
-4
@@ -4,7 +4,6 @@ import 'package:cake_wallet/store/wallet_list_store.dart';
4
import 'package:cake_wallet/store/authentication_store.dart';
5
import 'package:cake_wallet/store/settings_store.dart';
6
import 'package:cake_wallet/store/node_list_store.dart';
7
-import 'package:cake_wallet/store/contact_list_store.dart';
7
8
part 'app_store.g.dart';
9
@@ -15,7 +14,6 @@ abstract class AppStoreBase with Store {
14
{this.authenticationStore,
15
this.walletList,
16
this.settingsStore,
18
- this.contactListStore,
17
this.nodeListStore});
18
19
AuthenticationStore authenticationStore;
@@ -27,7 +25,5 @@ abstract class AppStoreBase with Store {
25
26
SettingsStore settingsStore;
27
30
- ContactListStore contactListStore;
31
-
28
NodeListStore nodeListStore;
29
}
lib/store/contact_list_store.dart
deleted
-12
@@ -1,12 +0,0 @@
1
-import 'package:mobx/mobx.dart';
2
-import 'package:cake_wallet/entities/contact_record.dart';
3
-
4
-part 'contact_list_store.g.dart';
5
-
6
-class ContactListStore = ContactListStoreBase with _$ContactListStore;
7
-
8
-abstract class ContactListStoreBase with Store {
9
- ContactListStoreBase() : contacts = ObservableList<ContactRecord>();
10
-
11
- final ObservableList<ContactRecord> contacts;
12
-}
lib/store/settings_store.dart
+15
-9
@@ -1,5 +1,7 @@
1
import 'package:cake_wallet/entities/preferences_key.dart';
2
+import 'package:cake_wallet/themes.dart';
3
import 'package:flutter/foundation.dart';
4
+import 'package:flutter/material.dart';
5
import 'package:hive/hive.dart';
6
import 'package:mobx/mobx.dart';
7
import 'package:package_info/package_info.dart';
@@ -7,7 +9,7 @@ import 'package:devicelocale/devicelocale.dart';
9
import 'package:cake_wallet/di.dart';
10
import 'package:cake_wallet/entities/wallet_type.dart';
11
import 'package:shared_preferences/shared_preferences.dart';
10
-import 'package:cake_wallet/entities/language.dart';
12
+import 'package:cake_wallet/entities/language_service.dart';
13
import 'package:cake_wallet/entities/balance_display_mode.dart';
14
import 'package:cake_wallet/entities/fiat_currency.dart';
15
import 'package:cake_wallet/entities/node.dart';
@@ -29,7 +31,7 @@ abstract class SettingsStoreBase with Store {
31
@required bool initialDarkTheme,
32
@required int initialPinLength,
33
@required String initialLanguageCode,
32
- @required String initialCurrentLocale,
34
+ // @required String initialCurrentLocale,
35
@required this.appVersion,
36
@required Map<WalletType, Node> nodes,
37
this.actionlistDisplayMode}) {
@@ -41,7 +43,6 @@ abstract class SettingsStoreBase with Store {
43
isDarkTheme = initialDarkTheme;
44
pinCodeLength = initialPinLength;
45
languageCode = initialLanguageCode;
44
- currentLocale = initialCurrentLocale;
46
currentNode = nodes[WalletType.monero];
47
this.nodes = ObservableMap<WalletType, Node>.of(nodes);
48
_sharedPreferences = sharedPreferences;
@@ -59,6 +60,10 @@ abstract class SettingsStoreBase with Store {
60
61
reaction((_) => currentNode,
62
(Node node) => _saveCurrentNode(node, WalletType.monero));
63
+
64
+ reaction((_) => languageCode,
65
+ (String languageCode) => sharedPreferences.setString(
66
+ PreferencesKey.currentLanguageCode, languageCode));
67
}
68
69
static const defaultPinLength = 4;
@@ -91,9 +96,11 @@ abstract class SettingsStoreBase with Store {
96
@observable
97
Node currentNode;
98
94
- String languageCode;
99
+ @computed
100
+ ThemeData get theme => isDarkTheme ? Themes.darkTheme : Themes.lightTheme;
101
96
- String currentLocale;
102
+ @observable
103
+ String languageCode;
104
105
String appVersion;
106
@@ -135,8 +142,7 @@ abstract class SettingsStoreBase with Store {
142
defaultPinLength;
143
final savedLanguageCode =
144
sharedPreferences.getString(PreferencesKey.currentLanguageCode) ??
138
- await Language.localeDetection();
139
- final initialCurrentLocale = await Devicelocale.currentLocale;
145
+ await LanguageService.localeDetection();
146
final nodeId = sharedPreferences.getInt(PreferencesKey.currentNodeIdKey);
147
final bitcoinElectrumServerId = sharedPreferences
148
.getInt(PreferencesKey.currentBitcoinElectrumSererIdKey);
@@ -159,8 +165,8 @@ abstract class SettingsStoreBase with Store {
165
initialDarkTheme: savedDarkTheme,
166
actionlistDisplayMode: actionListDisplayMode,
167
initialPinLength: pinLength,
162
- initialLanguageCode: savedLanguageCode,
163
- initialCurrentLocale: initialCurrentLocale);
168
+ initialLanguageCode: savedLanguageCode
169
+ );
170
}
171
172
Future<void> _saveCurrentNode(Node node, WalletType walletType) async {
lib/store/theme_changer_store.dart
deleted
-13
@@ -1,13 +0,0 @@
1
-import 'package:cake_wallet/theme_changer.dart';
2
-import 'package:mobx/mobx.dart';
3
-
4
-part 'theme_changer_store.g.dart';
5
-
6
-class ThemeChangerStore = ThemeChangerStoreBase with _$ThemeChangerStore;
7
-
8
-abstract class ThemeChangerStoreBase with Store {
9
- ThemeChangerStoreBase({this.themeChanger});
10
-
11
- @observable
12
- ThemeChanger themeChanger;
13
-}
\ No newline at end of file
lib/theme_changer.dart
deleted
-16
@@ -1,16 +0,0 @@
1
-import 'package:flutter/material.dart';
2
-
3
-class ThemeChanger with ChangeNotifier {
4
-
5
- ThemeChanger(this._themeData);
6
-
7
- ThemeData _themeData;
8
-
9
- ThemeData getTheme() => _themeData;
10
-
11
- void setTheme(ThemeData theme){
12
- _themeData = theme;
13
-
14
- notifyListeners();
15
- }
16
-}
\ No newline at end of file
lib/utils/date_formatter.dart
+1
-1
@@ -4,7 +4,7 @@ import 'package:cake_wallet/store/settings_store.dart';
4
5
class DateFormatter {
6
static String get currentLocalFormat {
7
- final isUSA = getIt.get<SettingsStore>().currentLocale == 'en_US';
7
+ final isUSA = getIt.get<SettingsStore>().languageCode.toLowerCase() == 'en';
8
final format = isUSA ? 'yyyy.MM.dd, HH:mm' : 'dd.MM.yyyy, HH:mm';
9
10
return format;
lib/utils/mobx.dart
+4
-2
@@ -84,7 +84,8 @@ extension MobxBindable<T extends Keyable> on Box<T> {
84
return;
85
}
86
87
- dest.acceptBoxChange(event, transformed: transform(event.value as T));
87
+ dest.acceptBoxChange(event,
88
+ transformed: event.deleted ? null : transform(event.value as T));
89
});
90
}
91
}
@@ -111,7 +112,8 @@ extension HiveBindable<T extends Keyable> on ObservableList<T> {
112
}
113
114
final value = change.newValue as T;
114
- controller.add(EntityChange(value, type));
115
+ controller.add(EntityChange(value, type,
116
+ key: type == ChangeType.delete ? change.index : value.keyIndex));
117
});
118
});
119
lib/view_model/contact_list/contact_list_view_model.dart
+7
-17
@@ -1,9 +1,7 @@
1
import 'dart:async';
2
-import 'package:cake_wallet/entities/contact_record.dart';
2
import 'package:hive/hive.dart';
3
import 'package:mobx/mobx.dart';
5
-import 'package:cake_wallet/core/contact_service.dart';
6
-import 'package:cake_wallet/store/contact_list_store.dart';
4
+import 'package:cake_wallet/entities/contact_record.dart';
5
import 'package:cake_wallet/entities/contact.dart';
6
import 'package:cake_wallet/utils/mobx.dart';
7
@@ -13,24 +11,16 @@ class ContactListViewModel = ContactListViewModelBase
11
with _$ContactListViewModel;
12
13
abstract class ContactListViewModelBase with Store {
16
- ContactListViewModelBase(
17
- this.addressBookStore, this.contactService, this.contactSource) {
18
- _subscription = contactSource.bindToListWithTransform(addressBookStore.contacts,
19
- (Contact contact) => ContactRecord(contactSource, contact),
14
+ ContactListViewModelBase(this.contactSource)
15
+ : contacts = ObservableList<ContactRecord>() {
16
+ _subscription = contactSource.bindToListWithTransform(
17
+ contacts, (Contact contact) => ContactRecord(contactSource, contact),
18
initialFire: true);
19
}
20
23
- final ContactListStore addressBookStore;
24
- final ContactService contactService;
21
final Box<Contact> contactSource;
26
-
27
- ObservableList<ContactRecord> get contacts => addressBookStore.contacts;
28
-
22
+ final ObservableList<ContactRecord> contacts;
23
StreamSubscription<BoxEvent> _subscription;
24
31
- void dispose() {
32
- // _subscription.cancel();
33
- }
34
-
35
- Future<void> delete(Contact contact) async => contactService.delete(contact);
25
+ Future<void> delete(ContactRecord contact) async => contact.original.delete();
26
}
lib/view_model/contact_list/contact_view_model.dart
+2
-7
@@ -3,7 +3,6 @@ import 'package:hive/hive.dart';
3
import 'package:mobx/mobx.dart';
4
import 'package:cake_wallet/core/execution_state.dart';
5
import 'package:cake_wallet/core/wallet_base.dart';
6
-import 'package:cake_wallet/core/contact_service.dart';
6
import 'package:cake_wallet/entities/contact.dart';
7
import 'package:cake_wallet/entities/crypto_currency.dart';
8
@@ -12,13 +11,13 @@ part 'contact_view_model.g.dart';
11
class ContactViewModel = ContactViewModelBase with _$ContactViewModel;
12
13
abstract class ContactViewModelBase with Store {
15
- ContactViewModelBase(this._contacts, this._wallet, {ContactRecord contact})
14
+ ContactViewModelBase(this._contacts, {ContactRecord contact})
15
: state = InitialExecutionState(),
16
currencies = CryptoCurrency.all,
17
_contact = contact {
18
name = _contact?.name;
19
address = _contact?.address;
21
- currency = _contact?.type; //_wallet.currency;
20
+ currency = _contact?.type;
21
}
22
23
@observable
@@ -40,7 +39,6 @@ abstract class ContactViewModelBase with Store {
39
(address?.isNotEmpty ?? false);
40
41
final List<CryptoCurrency> currencies;
43
- final WalletBase _wallet;
42
final Box<Contact> _contacts;
43
final ContactRecord _contact;
44
@@ -60,10 +58,7 @@ abstract class ContactViewModelBase with Store {
58
_contact.address = address;
59
_contact.type = currency;
60
await _contact.save();
63
- // await _contacts.put(_contact.key, _contact);
61
} else {
65
- // final contact = ContactRecordBase.create(_contacts, name, address, currency);
66
- // await contact.save();
62
await _contacts
63
.add(Contact(name: name, address: address, type: currency));
64
}
lib/view_model/send/send_view_model.dart
+5
-3
@@ -70,15 +70,17 @@ abstract class SendViewModelBase with Store {
70
71
@computed
72
String get balance {
73
+ String balance = '0.0';
74
+
75
if (_wallet is MoneroWallet) {
74
- _wallet.balance.formattedUnlockedBalance;
76
+ balance = _wallet.balance.formattedUnlockedBalance as String ?? '';
77
}
78
79
if (_wallet is BitcoinWallet) {
78
- _wallet.balance.confirmedFormatted;
80
+ balance = _wallet.balance.confirmedFormatted as String ?? '';
81
}
82
81
- return '0.0';
83
+ return balance;
84
}
85
86
@computed
lib/view_model/settings/settings_view_model.dart
+8
-16
@@ -1,27 +1,24 @@
1
-import 'package:cake_wallet/core/wallet_base.dart';
2
-import 'package:cake_wallet/entities/biometric_auth.dart';
3
-import 'package:cake_wallet/entities/wallet_type.dart';
4
-import 'package:cake_wallet/di.dart';
5
-import 'package:cake_wallet/store/theme_changer_store.dart';
6
-import 'package:cake_wallet/themes.dart';
7
-import 'package:cake_wallet/view_model/settings/version_list_item.dart';
1
import 'package:flutter/cupertino.dart';
2
import 'package:mobx/mobx.dart';
3
+import 'package:package_info/package_info.dart';
4
import 'package:cake_wallet/routes.dart';
5
import 'package:cake_wallet/generated/i18n.dart';
6
+import 'package:cake_wallet/core/wallet_base.dart';
7
import 'package:cake_wallet/store/settings_store.dart';
8
+import 'package:cake_wallet/entities/biometric_auth.dart';
9
+import 'package:cake_wallet/entities/wallet_type.dart';
10
import 'package:cake_wallet/entities/balance_display_mode.dart';
11
import 'package:cake_wallet/entities/fiat_currency.dart';
12
import 'package:cake_wallet/entities/node.dart';
13
import 'package:cake_wallet/entities/transaction_priority.dart';
14
import 'package:cake_wallet/entities/action_list_display_mode.dart';
18
-import 'package:cake_wallet/src/screens/auth/auth_page.dart';
15
+import 'package:cake_wallet/view_model/settings/version_list_item.dart';
16
import 'package:cake_wallet/view_model/settings/link_list_item.dart';
17
import 'package:cake_wallet/view_model/settings/picker_list_item.dart';
18
import 'package:cake_wallet/view_model/settings/regular_list_item.dart';
19
import 'package:cake_wallet/view_model/settings/settings_list_item.dart';
20
import 'package:cake_wallet/view_model/settings/switcher_list_item.dart';
24
-import 'package:package_info/package_info.dart';
21
+import 'package:cake_wallet/src/screens/auth/auth_page.dart';
22
23
part 'settings_view_model.g.dart';
24
@@ -111,13 +108,8 @@ abstract class SettingsViewModelBase with Store {
108
SwitcherListItem(
109
title: S.current.settings_dark_mode,
110
value: () => _settingsStore.isDarkTheme,
114
- onValueChange: (_, bool value) {
115
- _settingsStore.isDarkTheme = value;
116
- getIt
117
- .get<ThemeChangerStore>()
118
- .themeChanger
119
- .setTheme(value ? Themes.darkTheme : Themes.lightTheme);
120
- })
111
+ onValueChange: (_, bool value) =>
112
+ _settingsStore.isDarkTheme = value)
113
],
114
[
115
LinkListItem(
test/widget_test.dart
+1
-1
@@ -13,7 +13,7 @@ import 'package:cake_wallet/main.dart';
13
void main() {
14
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
15
// Build our app and trigger a frame.
16
- await tester.pumpWidget(CakeWalletApp());
16
+ await tester.pumpWidget(App());
17
18
// Verify that our counter starts at 0.
19
expect(find.text('0'), findsOneWidget);