diff --git a/assets/env.production.txt b/assets/env.production.txt index 8c58533dcc8ce7341b18b3187d66c4c2d0c7f273..bb71ab38cd29b3df6ae851d532d1e2ba7c26dbe0 100644 --- a/assets/env.production.txt +++ b/assets/env.production.txt @@ -4,7 +4,7 @@ SENTRY_DSN=https://306345cb87ee4e1cbbe9023fb4afc5fc@sentry.comunes.org/6 CARD_COLOR_LEFT=0xFF05112B CARD_COLOR_RIGHT=0xFF085476 # Empty for default -CARD_COLOR_TEXT=Äž1 Wallet Cop +CARD_COLOR_TEXT=Äž1 Wallet # Nodes space-separated # The duniter nodes are only used at boot time, later it tries to calculate periodically the nodes diff --git a/lib/data/models/app_cubit.dart b/lib/data/models/app_cubit.dart index 2913ed15863246f272fe1eb616dccc90b606ae40..26ecd875cd0b6eb469e4b0883b29a9e912eee631 100644 --- a/lib/data/models/app_cubit.dart +++ b/lib/data/models/app_cubit.dart @@ -9,10 +9,13 @@ class AppCubit extends HydratedCubit<AppState> { bool get isWarningViewed => state.warningViewed; + bool get isExpertMode => state.expertMode; + void introViewed() { emit(state.copyWith(introViewed: true)); } + void warningViewed() { emit(state.copyWith(warningViewed: true)); } @@ -26,4 +29,8 @@ class AppCubit extends HydratedCubit<AppState> { Map<String, dynamic> toJson(AppState state) { return state.toJson(); } + + void setExpertMode(bool value) { + emit(state.copyWith(expertMode: value)); + } } diff --git a/lib/data/models/app_state.dart b/lib/data/models/app_state.dart index ee21fe39a726b507d6120af4cc763f2108bf2ad2..76c8b2ca76f8da0a938a1ffa62f076b2f333e595 100644 --- a/lib/data/models/app_state.dart +++ b/lib/data/models/app_state.dart @@ -10,6 +10,7 @@ class AppState extends Equatable implements IsJsonSerializable<AppState> { const AppState({ this.introViewed = false, this.warningViewed = false, + this.expertMode = false, }); factory AppState.fromJson(Map<String, dynamic> json) => @@ -17,16 +18,17 @@ class AppState extends Equatable implements IsJsonSerializable<AppState> { final bool introViewed; final bool warningViewed; + final bool expertMode; AppState copyWith({ bool? introViewed, bool? warningViewed, - DateTime? lastFetchTime, + bool? expertMode, }) { return AppState( - introViewed: introViewed ?? this.introViewed, - warningViewed: warningViewed ?? this.warningViewed, - ); + introViewed: introViewed ?? this.introViewed, + warningViewed: warningViewed ?? this.warningViewed, + expertMode: expertMode ?? this.expertMode); } @override @@ -36,5 +38,5 @@ class AppState extends Equatable implements IsJsonSerializable<AppState> { Map<String, dynamic> toJson() => _$AppStateToJson(this); @override - List<Object?> get props => <Object>[introViewed, warningViewed]; + List<Object?> get props => <Object>[introViewed, warningViewed, expertMode]; } diff --git a/lib/ui/screens/fifth_screen.dart b/lib/ui/screens/fifth_screen.dart index fb2b83a4071ce485ad8f2ffb573a2d02dbb0953e..cabcc34b162aac61be4d1023d2f7afc5a5635f73 100644 --- a/lib/ui/screens/fifth_screen.dart +++ b/lib/ui/screens/fifth_screen.dart @@ -1,5 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import '../../data/models/app_cubit.dart'; +import '../../data/models/app_state.dart'; import '../../data/models/node_manager.dart'; import '../ui_helpers.dart'; import '../widgets/bottom_widget.dart'; @@ -16,60 +19,75 @@ class FifthScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return Material( - color: Theme.of(context).colorScheme.background, - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 16), - physics: const BouncingScrollPhysics(), - children: <Widget>[ - const Header(text: 'bottom_nav_fifth'), - const TextDivider(text: 'key_tools_title'), - GridView.count( - physics: const NeverScrollableScrollPhysics(), - crossAxisCount: 2, - childAspectRatio: 2 / 1.15, - crossAxisSpacing: 8, - mainAxisSpacing: 8, - shrinkWrap: true, - padding: EdgeInsets.zero, - children: <GridItem>[ - GridItem( - title: 'export_key', - icon: Icons.download, - onTap: () { - showDialog( - context: context, - builder: (BuildContext context) { - return const ExportDialog(); - }, - ); - }), - GridItem( - title: 'import_key', - icon: Icons.upload, - onTap: () { - showDialog( - context: context, - builder: (BuildContext context) { - return ImportDialog(); - }, - ); - }), - GridItem( - title: 'copy_your_key', - icon: Icons.copy, - onTap: () => copyPublicKeyToClipboard(context), - ) - ]), - const TextDivider(text: 'technical_info_title'), - const NodeInfoCard(type: NodeType.duniter), - const NodeInfoCard(type: NodeType.cesiumPlus), - LinkCard( - title: 'code_card_title', - icon: Icons.code_rounded, - url: Uri.parse('https://git.duniter.org/vjrj/ginkgo')), - const BottomWidget() - ]), - ); + return BlocBuilder<AppCubit, AppState>( + builder: (BuildContext context, AppState state) => Material( + color: Theme.of(context).colorScheme.background, + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 16), + physics: const BouncingScrollPhysics(), + children: <Widget>[ + const Header(text: 'bottom_nav_fifth'), + const TextDivider(text: 'key_tools_title'), + GridView.count( + physics: const NeverScrollableScrollPhysics(), + crossAxisCount: 2, + childAspectRatio: 2 / 1.15, + crossAxisSpacing: 8, + mainAxisSpacing: 8, + shrinkWrap: true, + padding: EdgeInsets.zero, + children: <GridItem>[ + if (state.expertMode) + GridItem( + title: 'export_key', + icon: Icons.download, + onTap: () { + showDialog( + context: context, + builder: (BuildContext context) { + return const ExportDialog(); + }, + ); + }), + if (state.expertMode) + GridItem( + title: 'import_key', + icon: Icons.upload, + onTap: () { + showDialog( + context: context, + builder: (BuildContext context) { + return ImportDialog(); + }, + ); + }), + GridItem( + title: 'copy_your_key', + icon: Icons.copy, + onTap: () => copyPublicKeyToClipboard(context), + ) + ]), + if (state.expertMode) + const TextDivider(text: 'technical_info_title'), + if (state.expertMode) + const NodeInfoCard(type: NodeType.duniter), + if (state.expertMode) + const NodeInfoCard(type: NodeType.cesiumPlus), + if (state.expertMode) + LinkCard( + title: 'code_card_title', + icon: Icons.code_rounded, + url: + Uri.parse('https://git.duniter.org/vjrj/ginkgo')), + const BottomWidget(), + SwitchListTile( + title: const Text('Expert mode'), + value: state.expertMode, + onChanged: (bool value) => + context.read<AppCubit>().setExpertMode(value), + ), + const BottomWidget() + ]), + )); } } diff --git a/lib/ui/widgets/fifth_screen/export_dialog.dart b/lib/ui/widgets/fifth_screen/export_dialog.dart index c4a8e19a149998806378e6b0caa74faa23451eab..476d7dcc92605b8e7d2b7220acd07f16cca360db 100644 --- a/lib/ui/widgets/fifth_screen/export_dialog.dart +++ b/lib/ui/widgets/fifth_screen/export_dialog.dart @@ -116,7 +116,9 @@ class _ExportDialogState extends State<ExportDialog> { anchor.download = 'ginkgo-wallet.json'; anchor.click(); - if (!mounted) return; + if (!mounted) { + return; + } context.replaceSnackbar( content: const Text( "HURRA", diff --git a/lib/ui/widgets/fifth_screen/import_dialog.dart b/lib/ui/widgets/fifth_screen/import_dialog.dart index c17c9d3d29dce0aa132839ac455ba6edc838e7e7..bf17e3c14dcc0a6148110564493319222896e9b9 100644 --- a/lib/ui/widgets/fifth_screen/import_dialog.dart +++ b/lib/ui/widgets/fifth_screen/import_dialog.dart @@ -93,7 +93,9 @@ class ImportDialog extends StatelessWidget { try { final String jsonString = reader.result as String; - logger(jsonString); + if (!kReleaseMode) { + logger(jsonString); + } final dynamic jsonMap = jsonDecode(jsonString); final SharedPreferences prefs = await SharedPreferences.getInstance(); completer.complete(jsonString); diff --git a/lib/ui/widgets/first_screen/pay_contact_search_page.dart b/lib/ui/widgets/first_screen/pay_contact_search_page.dart index aa51c1698d432810dd1751e41ca95b1e48669e0d..f8805d507f2df50c5348ed3e2488575c994c0861 100644 --- a/lib/ui/widgets/first_screen/pay_contact_search_page.dart +++ b/lib/ui/widgets/first_screen/pay_contact_search_page.dart @@ -115,7 +115,9 @@ class _PayContactSearchPageState extends State<PayContactSearchPage> { } else { paymentCubit.selectKey(pay.publicKey); } - + if (!mounted) { + return; + } Navigator.pop(context); } }),