From f02c8e52d98b51c9a65f007e18207e0dbe1ef4f7 Mon Sep 17 00:00:00 2001 From: vjrj <vjrj@comunes.org> Date: Sun, 19 Mar 2023 02:56:17 +0100 Subject: [PATCH] Expert mode --- assets/env.production.txt | 2 +- lib/data/models/app_cubit.dart | 7 + lib/data/models/app_state.dart | 12 +- lib/ui/screens/fifth_screen.dart | 128 ++++++++++-------- .../widgets/fifth_screen/export_dialog.dart | 4 +- .../widgets/fifth_screen/import_dialog.dart | 4 +- .../first_screen/pay_contact_search_page.dart | 4 +- 7 files changed, 97 insertions(+), 64 deletions(-) diff --git a/assets/env.production.txt b/assets/env.production.txt index 8c58533d..bb71ab38 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 2913ed15..26ecd875 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 ee21fe39..76c8b2ca 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 fb2b83a4..cabcc34b 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 c4a8e19a..476d7dcc 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 c17c9d3d..bf17e3c1 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 aa51c169..f8805d50 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); } }), -- GitLab