diff --git a/lib/palette.dart b/lib/palette.dart index 809c4f085..3988a53ef 100644 --- a/lib/palette.dart +++ b/lib/palette.dart @@ -90,6 +90,8 @@ class PaletteDark { static const Color distantBlue = Color.fromRGBO(72, 85, 131, 1.0); static const Color moderateVioletBlue = Color.fromRGBO(62, 73, 113, 1.0); static const Color deepVioletBlue = Color.fromRGBO(52, 66, 104, 1.0); + static const Color lightPurpleBlue = Color.fromRGBO(120, 133, 170, 1.0); + static const Color indicatorVioletBlue = Color.fromRGBO(59, 72, 119, 1.0); // FIXME: Rename. static const Color eee = Color.fromRGBO(236, 239, 245, 1.0); diff --git a/lib/src/domain/common/language.dart b/lib/src/domain/common/language.dart index 7d2860978..16e1d1a6a 100644 --- a/lib/src/domain/common/language.dart +++ b/lib/src/domain/common/language.dart @@ -30,7 +30,7 @@ class Language with ChangeNotifier { } static Future localeDetection() async { - String locale = await Devicelocale.currentLocale; + var locale = await Devicelocale.currentLocale; locale = Intl.shortLocale(locale); return languages.keys.contains(locale) ? locale : 'en'; diff --git a/lib/src/screens/disclaimer/disclaimer_page.dart b/lib/src/screens/disclaimer/disclaimer_page.dart index 47cfa40ab..fde5677e7 100644 --- a/lib/src/screens/disclaimer/disclaimer_page.dart +++ b/lib/src/screens/disclaimer/disclaimer_page.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'package:cake_wallet/palette.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; @@ -132,6 +133,7 @@ class DisclaimerBodyState extends State { _fileText, style: TextStyle( fontSize: 12.0, + fontWeight: FontWeight.normal, color: Theme.of(context).primaryTextTheme.title.color ), )) @@ -169,7 +171,7 @@ class DisclaimerBodyState extends State { xmrtoUrl, textAlign: TextAlign.left, style: TextStyle( - color: Colors.blue, + color: Palette.blueCraiola, fontSize: 14.0, fontWeight: FontWeight.normal, decoration: TextDecoration.underline), @@ -190,7 +192,7 @@ class DisclaimerBodyState extends State { changenowUrl, textAlign: TextAlign.left, style: TextStyle( - color: Colors.blue, + color: Palette.blueCraiola, fontSize: 14.0, fontWeight: FontWeight.normal, decoration: TextDecoration.underline), @@ -211,7 +213,7 @@ class DisclaimerBodyState extends State { morphUrl, textAlign: TextAlign.left, style: TextStyle( - color: Colors.blue, + color: Palette.blueCraiola, fontSize: 14.0, fontWeight: FontWeight.normal, decoration: TextDecoration.underline), diff --git a/lib/src/screens/faq/faq_page.dart b/lib/src/screens/faq/faq_page.dart index c823dfba9..70fbaa6d2 100644 --- a/lib/src/screens/faq/faq_page.dart +++ b/lib/src/screens/faq/faq_page.dart @@ -1,4 +1,6 @@ import 'dart:convert'; +import 'package:cake_wallet/palette.dart'; +import 'package:cake_wallet/src/widgets/standard_list.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; @@ -27,93 +29,85 @@ class FaqFormState extends State { @override Widget build(BuildContext context) { final addIcon = Icon(Icons.add, color: Theme.of(context).primaryTextTheme.title.color); - final removeIcon = Icon(Icons.remove, color: Colors.green); + final removeIcon = Icon(Icons.remove, color: Palette.blueCraiola); return Container( - padding: EdgeInsets.only(top: 12), - child: Container( - color: Theme.of(context).accentTextTheme.headline.color, - child: FutureBuilder( - builder: (context, snapshot) { - final faqItems = jsonDecode(snapshot.data.toString()) as List; + padding: EdgeInsets.only(top: 12, left: 24), + child: FutureBuilder( + builder: (context, snapshot) { + final faqItems = jsonDecode(snapshot.data.toString()) as List; - if (snapshot.hasData) { - setIconsAndColors(context, faqItems.length, addIcon); - } + if (snapshot.hasData) { + setIconsAndColors(context, faqItems.length, addIcon); + } - return SingleChildScrollView( - child: ListView.separated( - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), - itemBuilder: (BuildContext context, int index) { - final itemTitle = faqItems[index]["question"].toString(); - final itemChild = faqItems[index]["answer"].toString(); + return SingleChildScrollView( + child: Column( + children: [ + StandardListSeparator(), + ListView.separated( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (BuildContext context, int index) { + final itemTitle = faqItems[index]["question"].toString(); + final itemChild = faqItems[index]["answer"].toString(); - return ExpansionTile( - title: Padding( - padding: EdgeInsets.only(left: 8, top: 12, bottom: 12), - child: Text( - itemTitle, - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - color: colors[index] + return ListTileTheme( + contentPadding: EdgeInsets.fromLTRB(0, 6, 24, 6), + child: ExpansionTile( + title: Text( + itemTitle, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: colors[index] + ), ), - ), - ), - trailing: Padding( - padding: EdgeInsets.only(right: 24), - child: Container( - width: double.minPositive, - child: Center( - child: icons[index] - ), - ), - ), - backgroundColor: Theme.of(context).accentTextTheme.headline.backgroundColor, - onExpansionChanged: (value) { - setState(() { - if (value) { - icons[index] = removeIcon; - colors[index] = Colors.green; - } else { - icons[index] = addIcon; - colors[index] = Theme.of(context).primaryTextTheme.title.color; - } - }); - }, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, + trailing: icons[index], + onExpansionChanged: (value) { + setState(() { + if (value) { + icons[index] = removeIcon; + colors[index] = Palette.blueCraiola; + } else { + icons[index] = addIcon; + colors[index] = Theme.of(context).primaryTextTheme.title.color; + } + }); + }, children: [ - Expanded( - child: Container( - padding: EdgeInsets.only( - left: 24.0, - right: 24.0, - bottom: 8 - ), - child: Text( - itemChild, - style: TextStyle( - fontSize: 12, - color: Theme.of(context).primaryTextTheme.title.color - ), - ), - )) + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Container( + padding: EdgeInsets.only( + right: 24.0, + ), + child: Text( + itemChild, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.normal, + color: Theme.of(context).primaryTextTheme.title.color + ), + ), + )) + ], + ) ], - ) - ], - ); - }, - separatorBuilder: (_, __) => - Container(color: Theme.of(context).dividerColor, height: 1.0), - itemCount: faqItems == null ? 0 : faqItems.length, - ), - ); - }, - future: rootBundle.loadString(getFaqPath(context)), - ), + ), + ); + }, + separatorBuilder: (_, __) => + StandardListSeparator(), + itemCount: faqItems == null ? 0 : faqItems.length, + ) + ], + ), + ); + }, + future: rootBundle.loadString(getFaqPath(context)), ), ); } diff --git a/lib/src/screens/pin_code/pin_code.dart b/lib/src/screens/pin_code/pin_code.dart index b046b3fef..447fdb6dd 100644 --- a/lib/src/screens/pin_code/pin_code.dart +++ b/lib/src/screens/pin_code/pin_code.dart @@ -108,7 +108,7 @@ class PinCodeState extends State { Text(title, style: TextStyle( fontSize: 20, - fontWeight: FontWeight.bold, + fontWeight: FontWeight.w500, color: Theme.of(context).primaryTextTheme.title.color)), Spacer(flex: 3), Container( @@ -126,7 +126,7 @@ class PinCodeState extends State { shape: BoxShape.circle, color: isFilled ? Theme.of(context).primaryTextTheme.title.color - : Theme.of(context).primaryTextTheme.caption.color, + : Theme.of(context).accentTextTheme.body1.color, )); }), ), @@ -143,7 +143,8 @@ class PinCodeState extends State { _changePinLengthText(), style: TextStyle( fontSize: 14.0, - color: Theme.of(context).primaryTextTheme.caption.color), + fontWeight: FontWeight.normal, + color: Theme.of(context).accentTextTheme.body1.decorationColor), )) ], Spacer(flex: 1), @@ -227,7 +228,7 @@ class PinCodeState extends State { child: Text('$index', style: TextStyle( fontSize: 30.0, - fontWeight: FontWeight.bold, + fontWeight: FontWeight.w600, color: Theme.of(context) .primaryTextTheme .title diff --git a/lib/src/screens/settings/change_language.dart b/lib/src/screens/settings/change_language.dart index 8e2c49ea2..5ef079216 100644 --- a/lib/src/screens/settings/change_language.dart +++ b/lib/src/screens/settings/change_language.dart @@ -1,3 +1,5 @@ +import 'package:cake_wallet/src/screens/settings/widgets/language_row.dart'; +import 'package:cake_wallet/src/widgets/standard_list.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; @@ -16,29 +18,13 @@ class ChangeLanguage extends BasePage { final settingsStore = Provider.of(context); final currentLanguage = Provider.of(context); - final currentColor = Colors.green; - final notCurrentColor = Theme.of(context).primaryTextTheme.title.color; - - final shortDivider = Container( - height: 1, - padding: EdgeInsets.only(left: 24), - color: Theme.of(context).accentTextTheme.title.backgroundColor, - child: Container( - height: 1, - color: Theme.of(context).dividerColor, - ), - ); - - final longDivider = Container( - height: 1, - color: Theme.of(context).dividerColor, - ); - return Container( padding: EdgeInsets.only(top: 10.0), - child: ListView.builder( - itemCount: languages.values.length, - itemBuilder: (BuildContext context, int index) { + child: SectionStandardList( + sectionCount: 1, + context: context, + itemCounter: (int sectionIndex) => languages.values.length, + itemBuilder: (_, sectionIndex, index) { final item = languages.values.elementAt(index); final code = languages.keys.elementAt(index); @@ -46,52 +32,30 @@ class ChangeLanguage extends BasePage { ? false : code == settingsStore.languageCode; - return Column( - children: [ - index == 0 ? longDivider : Offstage(), - Container( - padding: EdgeInsets.only(top: 4, bottom: 4), - color: Theme.of(context).accentTextTheme.title.backgroundColor, - child: ListTile( - contentPadding: EdgeInsets.only(left: 24, right: 24), - title: Text( - item, - style: TextStyle( - fontSize: 14.0, - fontWeight: FontWeight.w600, - color: isCurrent ? currentColor : notCurrentColor - ), - ), - trailing: isCurrent - ? Icon(Icons.done, color: currentColor) - : Offstage(), - onTap: () async { - if (!isCurrent) { - await showDialog( - context: context, - builder: (BuildContext context) { - return AlertWithTwoActions( - alertTitle: S.of(context).change_language, - alertContent: S.of(context).change_language_to(item), - leftButtonText: S.of(context).change, - rightButtonText: S.of(context).cancel, - actionLeftButton: () { - settingsStore.saveLanguageCode( - languageCode: code); - currentLanguage.setCurrentLanguage(code); - Navigator.of(context).pop(); - }, - actionRightButton: () => Navigator.of(context).pop() - ); - }); - } - }, - ), - ), - item == languages.values.last - ? longDivider - : shortDivider - ], + return LanguageRow( + title: item, + isSelected: isCurrent, + handler: (context) async { + if (!isCurrent) { + await showDialog( + context: context, + builder: (BuildContext context) { + return AlertWithTwoActions( + alertTitle: S.of(context).change_language, + alertContent: S.of(context).change_language_to(item), + leftButtonText: S.of(context).change, + rightButtonText: S.of(context).cancel, + actionLeftButton: () { + settingsStore.saveLanguageCode( + languageCode: code); + currentLanguage.setCurrentLanguage(code); + Navigator.of(context).pop(); + }, + actionRightButton: () => Navigator.of(context).pop() + ); + }); + } + }, ); }, ) diff --git a/lib/src/screens/settings/settings.dart b/lib/src/screens/settings/settings.dart index c1f4cfabe..8e2ad1f68 100644 --- a/lib/src/screens/settings/settings.dart +++ b/lib/src/screens/settings/settings.dart @@ -1,3 +1,5 @@ +import 'package:cake_wallet/src/screens/settings/widgets/settings_version_cell.dart'; +import 'package:cake_wallet/view_model/settings/version_list_item.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; @@ -41,6 +43,8 @@ class SettingsPage extends BasePage { return SettingsPickerCell( title: item.title, selectedItem: item.selectedItem(), + setItem: (dynamic value) => item.setItem(value), + isAlwaysShowScrollThumb: item.isAlwaysShowScrollThumb, items: item.items); }); } @@ -55,7 +59,7 @@ class SettingsPage extends BasePage { } if (item is RegularListItem) { - return SettingsCellWithArrow(title: item.title); + return SettingsCellWithArrow(title: item.title, handler: item.handler); } if (item is LinkListItem) { @@ -66,6 +70,13 @@ class SettingsPage extends BasePage { linkTitle: item.linkTitle); } + if (item is VersionListItem) { + return Observer(builder: (_) { + return SettingsVersionCell( + title: S.of(context).version(settingsViewModel.currentVersion)); + }); + } + return Container(); }); } diff --git a/lib/src/screens/settings/widgets/language_row.dart b/lib/src/screens/settings/widgets/language_row.dart new file mode 100644 index 000000000..0f807a843 --- /dev/null +++ b/lib/src/screens/settings/widgets/language_row.dart @@ -0,0 +1,30 @@ +import 'package:cake_wallet/palette.dart'; +import 'package:flutter/material.dart'; +import 'package:cake_wallet/src/widgets/standard_list.dart'; + +class LanguageRow extends StandardListRow { + LanguageRow({@required String title, @required this.isSelected, @required Function(BuildContext context) handler}) : + super(title: title, isSelected: isSelected, onTap: handler); + + @override + final bool isSelected; + + @override + Widget buildCenter(BuildContext context, {@required bool hasLeftOffset}) { + return Expanded( + child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [ + if (hasLeftOffset) SizedBox(width: 10), + Text(title, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: titleColor(context))) + ])); + } + + @override + Widget buildTrailing(BuildContext context) => + isSelected + ? Icon(Icons.done, color: Palette.blueCraiola) + : Offstage(); +} \ No newline at end of file diff --git a/lib/src/screens/settings/widgets/settings_cell_with_arrow.dart b/lib/src/screens/settings/widgets/settings_cell_with_arrow.dart index 6e55aa5ee..270b3d88b 100644 --- a/lib/src/screens/settings/widgets/settings_cell_with_arrow.dart +++ b/lib/src/screens/settings/widgets/settings_cell_with_arrow.dart @@ -2,11 +2,11 @@ import 'package:flutter/material.dart'; import 'package:cake_wallet/src/widgets/standard_list.dart'; class SettingsCellWithArrow extends StandardListRow { - SettingsCellWithArrow({@required String title}) - : super(title: title, isSelected: false); + SettingsCellWithArrow({@required String title, @required Function(BuildContext context) handler}) + : super(title: title, isSelected: false, onTap: handler); @override Widget buildTrailing(BuildContext context) => Image.asset('assets/images/select_arrow.png', - color: Theme.of(context).primaryTextTheme.caption.color); + color: Theme.of(context).primaryTextTheme.overline.color); } \ No newline at end of file diff --git a/lib/src/screens/settings/widgets/settings_link_provider_cell.dart b/lib/src/screens/settings/widgets/settings_link_provider_cell.dart index 3babf3097..362d5ac46 100644 --- a/lib/src/screens/settings/widgets/settings_link_provider_cell.dart +++ b/lib/src/screens/settings/widgets/settings_link_provider_cell.dart @@ -1,5 +1,7 @@ +import 'package:cake_wallet/palette.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/src/widgets/standard_list.dart'; +import 'package:url_launcher/url_launcher.dart'; class SettingsLinkProviderCell extends StandardListRow { SettingsLinkProviderCell( @@ -7,7 +9,7 @@ class SettingsLinkProviderCell extends StandardListRow { @required this.icon, @required this.link, @required this.linkTitle}) - : super(title: title, isSelected: false); + : super(title: title, isSelected: false, onTap: (BuildContext context) => _launchUrl(link) ); final String icon; final String link; @@ -20,5 +22,11 @@ class SettingsLinkProviderCell extends StandardListRow { @override Widget buildTrailing(BuildContext context) => Text(linkTitle, style: TextStyle( - fontSize: 14.0, fontWeight: FontWeight.w500, color: Colors.blue)); + fontSize: 14.0, + fontWeight: FontWeight.w500, + color: Palette.blueCraiola)); + + static void _launchUrl(String url) async { + if (await canLaunch(url)) await launch(url); + } } \ No newline at end of file diff --git a/lib/src/screens/settings/widgets/settings_picker_cell.dart b/lib/src/screens/settings/widgets/settings_picker_cell.dart index a94bdfe0d..4116119ac 100644 --- a/lib/src/screens/settings/widgets/settings_picker_cell.dart +++ b/lib/src/screens/settings/widgets/settings_picker_cell.dart @@ -4,7 +4,8 @@ import 'package:cake_wallet/src/widgets/standard_list.dart'; import 'package:cake_wallet/generated/i18n.dart'; class SettingsPickerCell extends StandardListRow { - SettingsPickerCell({@required String title, this.selectedItem, this.items}) + SettingsPickerCell({@required String title, this.selectedItem, this.items, + this.setItem, this.isAlwaysShowScrollThumb}) : super( title: title, isSelected: false, @@ -18,11 +19,14 @@ class SettingsPickerCell extends StandardListRow { selectedAtIndex: selectedAtIndex, title: S.current.please_select, mainAxisAlignment: MainAxisAlignment.center, - onItemSelected: (Object _) {})); + isAlwaysShowScrollThumb: isAlwaysShowScrollThumb, + onItemSelected: (ItemType value) => setItem(value))); }); final ItemType selectedItem; final List items; + final Function(ItemType) setItem; + final bool isAlwaysShowScrollThumb; @override Widget buildTrailing(BuildContext context) { @@ -32,7 +36,7 @@ class SettingsPickerCell extends StandardListRow { style: TextStyle( fontSize: 14.0, fontWeight: FontWeight.w500, - color: Theme.of(context).primaryTextTheme.caption.color), + color: Theme.of(context).primaryTextTheme.overline.color), ); } } \ No newline at end of file diff --git a/lib/src/screens/settings/widgets/settings_version_cell.dart b/lib/src/screens/settings/widgets/settings_version_cell.dart new file mode 100644 index 000000000..91bd8fc1a --- /dev/null +++ b/lib/src/screens/settings/widgets/settings_version_cell.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +class SettingsVersionCell extends StatelessWidget { + SettingsVersionCell({@required this.title}); + + final String title; + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.only(bottom: 24), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + title, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.normal, + color: Theme.of(context).primaryTextTheme.overline.color + ), + ) + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/screens/setup_pin_code/setup_pin_code.dart b/lib/src/screens/setup_pin_code/setup_pin_code.dart index 3313f72a3..628337e30 100644 --- a/lib/src/screens/setup_pin_code/setup_pin_code.dart +++ b/lib/src/screens/setup_pin_code/setup_pin_code.dart @@ -53,7 +53,7 @@ class _SetupPinCodeFormState state.clear(); } else { if (listEquals(state.pin, _originalPin)) { - final String pin = state.pin.fold("", (ac, val) => ac + '$val'); + final String pin = state.pin.fold('', (ac, val) => ac + '$val'); _userStore.set(password: pin); _settingsStore.setDefaultPinLength(pinLength: state.pinLength); diff --git a/lib/src/widgets/picker.dart b/lib/src/widgets/picker.dart index 732c2118d..935237573 100644 --- a/lib/src/widgets/picker.dart +++ b/lib/src/widgets/picker.dart @@ -123,9 +123,7 @@ class PickerState extends State { mainAxisAlignment: widget.mainAxisAlignment, crossAxisAlignment: CrossAxisAlignment.center, children: [ - image != null - ? image - : Offstage(), + image ?? Offstage(), Padding( padding: EdgeInsets.only( left: image != null ? 12 : 0 diff --git a/lib/src/widgets/standard_list.dart b/lib/src/widgets/standard_list.dart index 9ad338870..e4f82a877 100644 --- a/lib/src/widgets/standard_list.dart +++ b/lib/src/widgets/standard_list.dart @@ -41,18 +41,17 @@ class StandardListRow extends StatelessWidget { style: TextStyle( fontSize: 14, fontWeight: FontWeight.normal, - color: _titleColor(context))) + color: titleColor(context))) ])); } Widget buildTrailing(BuildContext context) => null; - Color _titleColor(BuildContext context) => isSelected + Color titleColor(BuildContext context) => isSelected ? Palette.blueCraiola : Theme.of(context).primaryTextTheme.title.color; Color _backgroundColor(BuildContext context) { -// return Theme.of(context).accentTextTheme.subtitle.decorationColor; return Theme.of(context).backgroundColor; } } @@ -114,16 +113,20 @@ class SectionStandardList extends StatelessWidget { {@required this.itemCounter, @required this.itemBuilder, @required this.sectionCount, + this.hasTopSeparator = false, BuildContext context}) - : totalRows = transform(context, sectionCount, itemCounter, itemBuilder); + : totalRows = transform(hasTopSeparator, context, sectionCount, + itemCounter, itemBuilder); final int sectionCount; + final bool hasTopSeparator; final int Function(int sectionIndex) itemCounter; final Widget Function(BuildContext context, int sectionIndex, int itemIndex) itemBuilder; final List totalRows; static List transform( + bool hasTopSeparator, BuildContext context, int sectionCount, int Function(int sectionIndex) itemCounter, @@ -132,9 +135,9 @@ class SectionStandardList extends StatelessWidget { final items = []; for (var sectionIndex = 0; sectionIndex < sectionCount; sectionIndex++) { - /*if (sectionIndex == 0) { - items.add(StandardListSeparator()); - }*/ + if ((sectionIndex == 0)&&(hasTopSeparator)) { + items.add(StandardListSeparator(padding: EdgeInsets.only(left: 24))); + } final itemCount = itemCounter(sectionIndex); diff --git a/lib/src/widgets/standart_switch.dart b/lib/src/widgets/standart_switch.dart index cb2696339..0fa56f6ad 100644 --- a/lib/src/widgets/standart_switch.dart +++ b/lib/src/widgets/standart_switch.dart @@ -26,7 +26,7 @@ class StandartSwitchState extends State { decoration: BoxDecoration( color: widget.value ? Colors.green - : PaletteDark.distantBlue, + : Theme.of(context).accentTextTheme.display4.color, borderRadius: BorderRadius.all(Radius.circular(14.0))), child: Container( width: 24.0, diff --git a/lib/themes.dart b/lib/themes.dart index e2f75b7ff..f8d984baf 100644 --- a/lib/themes.dart +++ b/lib/themes.dart @@ -160,6 +160,13 @@ class Themes { color: Palette.darkGray, // hint text (new wallet page) decorationColor: Palette.periwinkleCraiola // underline (new wallet page) ), + display4: TextStyle( + color: Palette.darkGray, // switch background (settings page) + ), + body1: TextStyle( + color: Palette.darkGray, // indicators (PIN code) + decorationColor: Palette.darkGray // switch (PIN code) + ) ), @@ -331,6 +338,13 @@ class Themes { color: PaletteDark.cyanBlue, // hint text (new wallet page) decorationColor: PaletteDark.darkGrey // underline (new wallet page) ), + display4: TextStyle( + color: PaletteDark.deepVioletBlue, // switch background (settings page) + ), + body1: TextStyle( + color: PaletteDark.indicatorVioletBlue, // indicators (PIN code) + decorationColor: PaletteDark.lightPurpleBlue // switch (PIN code) + ) ), diff --git a/lib/view_model/settings/picker_list_item.dart b/lib/view_model/settings/picker_list_item.dart index 532f90a0d..0994e631b 100644 --- a/lib/view_model/settings/picker_list_item.dart +++ b/lib/view_model/settings/picker_list_item.dart @@ -5,9 +5,13 @@ class PickerListItem extends SettingsListItem { PickerListItem( {@required String title, @required this.selectedItem, - @required this.items}) + @required this.setItem, + @required this.items, + this.isAlwaysShowScrollThumb = false}) : super(title); final ItemType Function() selectedItem; + final Function(ItemType value) setItem; final List items; + final bool isAlwaysShowScrollThumb; } diff --git a/lib/view_model/settings/settings_view_model.dart b/lib/view_model/settings/settings_view_model.dart index 0986a8310..f5c0ea66d 100644 --- a/lib/view_model/settings/settings_view_model.dart +++ b/lib/view_model/settings/settings_view_model.dart @@ -1,6 +1,7 @@ import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/store/theme_changer_store.dart'; import 'package:cake_wallet/themes.dart'; +import 'package:cake_wallet/view_model/settings/version_list_item.dart'; import 'package:flutter/cupertino.dart'; import 'package:mobx/mobx.dart'; import 'package:cake_wallet/routes.dart'; @@ -17,6 +18,7 @@ import 'package:cake_wallet/view_model/settings/picker_list_item.dart'; import 'package:cake_wallet/view_model/settings/regular_list_item.dart'; import 'package:cake_wallet/view_model/settings/settings_list_item.dart'; import 'package:cake_wallet/view_model/settings/switcher_list_item.dart'; +import 'package:package_info/package_info.dart'; part 'settings_view_model.g.dart'; @@ -24,19 +26,27 @@ class SettingsViewModel = SettingsViewModelBase with _$SettingsViewModel; abstract class SettingsViewModelBase with Store { SettingsViewModelBase(this._settingsStore) : itemHeaders = {} { + currentVersion = ''; + PackageInfo.fromPlatform().then((PackageInfo packageInfo) => currentVersion = packageInfo.version); + sections = [ [ PickerListItem( title: S.current.settings_display_balance_as, items: BalanceDisplayMode.all, + setItem: (dynamic value) => balanceDisplayMode = value as BalanceDisplayMode, selectedItem: () => balanceDisplayMode), PickerListItem( title: S.current.settings_currency, items: FiatCurrency.all, + setItem: (dynamic value) => fiatCurrency = value as FiatCurrency, + isAlwaysShowScrollThumb: true, selectedItem: () => fiatCurrency), PickerListItem( title: S.current.settings_fee_priority, items: TransactionPriority.all, + setItem: (dynamic value) => transactionPriority = value as TransactionPriority, + isAlwaysShowScrollThumb: true, selectedItem: () => transactionPriority), SwitcherListItem( title: S.current.settings_save_recipient_address, @@ -111,11 +121,22 @@ abstract class SettingsViewModelBase with Store { title: S.current.settings_terms_and_conditions, handler: (BuildContext context) => Navigator.of(context).pushNamed(Routes.disclaimer), + ), + RegularListItem( + title: S.current.faq, + handler: (BuildContext context) => + Navigator.pushNamed(context, Routes.faq), ) + ], + [ + VersionListItem(title: currentVersion) ] ]; } + @observable + String currentVersion; + @computed Node get node => _settingsStore.node; @@ -150,6 +171,18 @@ abstract class SettingsViewModelBase with Store { set allowBiometricalAuthentication(bool value) => _settingsStore.allowBiometricalAuthentication = value; + @action + set balanceDisplayMode(BalanceDisplayMode value) => + _settingsStore.balanceDisplayMode = value; + + @action + set fiatCurrency(FiatCurrency value) => + _settingsStore.fiatCurrency = value; + + @action + set transactionPriority(TransactionPriority value) => + _settingsStore.transactionPriority = value; + // @observable // bool isDarkTheme; // diff --git a/lib/view_model/settings/version_list_item.dart b/lib/view_model/settings/version_list_item.dart new file mode 100644 index 000000000..5d64e7023 --- /dev/null +++ b/lib/view_model/settings/version_list_item.dart @@ -0,0 +1,6 @@ +import 'package:flutter/foundation.dart'; +import 'package:cake_wallet/view_model/settings/settings_list_item.dart'; + +class VersionListItem extends SettingsListItem { + VersionListItem({@required String title}) : super(title); +} \ No newline at end of file