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);