From ba57bd9558c83e154577bad187676873fa949bab Mon Sep 17 00:00:00 2001 From: Ethan Lee <125412902+ethan-tbd@users.noreply.github.com> Date: Thu, 16 May 2024 12:20:42 -0700 Subject: [PATCH] chore: remove `AddPfiConfirmationPage` (#159) --- lib/features/did_qr/did_qr.dart | 8 +- .../pfis/add_pfi_confirmation_page.dart | 59 ------ lib/features/pfis/add_pfi_page.dart | 168 ++++++++++-------- lib/features/pfis/pfis_notifier.dart | 1 + lib/features/send/send_details_page.dart | 15 +- 5 files changed, 105 insertions(+), 146 deletions(-) delete mode 100644 lib/features/pfis/add_pfi_confirmation_page.dart diff --git a/lib/features/did_qr/did_qr.dart b/lib/features/did_qr/did_qr.dart index e1b41a97..2e1436c8 100644 --- a/lib/features/did_qr/did_qr.dart +++ b/lib/features/did_qr/did_qr.dart @@ -36,11 +36,6 @@ class DidQr { ), ); - static Future _isValidDid(String did) async { - final result = await DidResolver.resolve(did); - return !result.hasError(); - } - static Future _scanQrCode( BuildContext context, TextEditingController didTextController, @@ -51,7 +46,8 @@ class DidQr { MaterialPageRoute(builder: (context) => const DidQrScanPage()), ); - final isValid = qrValue != null && await _isValidDid(qrValue); + final isValid = + qrValue != null && !(await DidResolver.resolve(qrValue)).hasError(); didTextController.text = isValid ? qrValue : ''; errorText.value = isValid ? null : errorMessage; } diff --git a/lib/features/pfis/add_pfi_confirmation_page.dart b/lib/features/pfis/add_pfi_confirmation_page.dart deleted file mode 100644 index 65cc5611..00000000 --- a/lib/features/pfis/add_pfi_confirmation_page.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:didpay/features/pfis/pfi.dart'; -import 'package:didpay/features/pfis/pfis_notifier.dart'; -import 'package:didpay/l10n/app_localizations.dart'; -import 'package:didpay/shared/pending_page.dart'; -import 'package:didpay/shared/success_page.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; - -class AddPfiConfirmationPage extends HookConsumerWidget { - final String did; - - const AddPfiConfirmationPage({ - required this.did, - super.key, - }); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final addPfiState = useState>(const AsyncLoading()); - - useEffect( - () { - _addPfi(context, ref, addPfiState); - return null; - }, - [], - ); - - return Scaffold( - body: SafeArea( - child: addPfiState.value.when( - data: (pfi) => SuccessPage(text: Loc.of(context).pfiAdded), - loading: () => PendingPage(text: Loc.of(context).addingPfi), - error: (error, _) => Text('Error: $error'), - ), - ), - ); - } - - void _addPfi( - BuildContext context, - WidgetRef ref, - ValueNotifier> state, - ) { - state.value = const AsyncLoading(); - ref - .read(pfisProvider.notifier) - .add(did) - .then((pfi) => state.value = AsyncData(pfi)) - .onError((error, stackTrace) { - state.value = AsyncError( - error ?? Exception('Unable to resolve add PFI'), - stackTrace, - ); - throw Exception(); - }); - } -} diff --git a/lib/features/pfis/add_pfi_page.dart b/lib/features/pfis/add_pfi_page.dart index dc5f6809..aaf1865e 100644 --- a/lib/features/pfis/add_pfi_page.dart +++ b/lib/features/pfis/add_pfi_page.dart @@ -1,7 +1,10 @@ import 'package:didpay/features/device/device_info_service.dart'; import 'package:didpay/features/did_qr/did_qr.dart'; -import 'package:didpay/features/pfis/add_pfi_confirmation_page.dart'; +import 'package:didpay/features/pfis/pfi.dart'; +import 'package:didpay/features/pfis/pfis_notifier.dart'; import 'package:didpay/l10n/app_localizations.dart'; +import 'package:didpay/shared/pending_page.dart'; +import 'package:didpay/shared/success_page.dart'; import 'package:didpay/shared/theme/grid.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; @@ -14,11 +17,14 @@ class AddPfiPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final focusNode = useFocusNode(); final isPhysicalDevice = useState(true); final errorText = useState(null); + final addPfiState = useState?>(null); + final pfiDidController = useTextEditingController(); + final focusNode = useFocusNode(); + useEffect( () { Future.microtask(() async { @@ -31,53 +37,64 @@ class AddPfiPage extends HookConsumerWidget { ); return Scaffold( - appBar: AppBar(), + appBar: addPfiState.value != null ? null : AppBar(), body: SafeArea( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded( - child: SingleChildScrollView( - physics: const BouncingScrollPhysics(), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - _buildHeader( - context, - Loc.of(context).addAPfi, - Loc.of(context).makeSureInfoIsCorrect, - ), - _buildDidForm( - context, - pfiDidController, - focusNode, - errorText, - Loc.of(context).invalidDid, + child: addPfiState.value != null + ? addPfiState.value!.when( + data: (pfi) => SuccessPage(text: Loc.of(context).pfiAdded), + loading: () => PendingPage(text: Loc.of(context).addingPfi), + error: (error, _) => Text('Error: $error'), + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _buildHeader( + context, + Loc.of(context).addAPfi, + Loc.of(context).makeSureInfoIsCorrect, + ), + _buildDidForm( + context, + pfiDidController, + focusNode, + errorText, + Loc.of(context).invalidDid, + ), + ], + ), ), - ], - ), + ), + DidQr.buildScanTile( + context, + Loc.of(context).scanPfiQrCode, + pfiDidController, + errorText, + isPhysicalDevice: isPhysicalDevice.value, + ), + _buildAddButton( + context, + ref, + pfiDidController, + addPfiState, + errorText.value, + ), + ], ), - ), - DidQr.buildScanTile( - context, - Loc.of(context).scanPfiQrCode, - pfiDidController, - errorText, - isPhysicalDevice: isPhysicalDevice.value, - ), - _buildAddButton( - context, - ref, - pfiDidController, - errorText.value, - ), - ], - ), ), ); } - Widget _buildHeader(BuildContext context, String title, String subtitle) => + Widget _buildHeader( + BuildContext context, + String title, + String subtitle, + ) => Padding( padding: const EdgeInsets.symmetric( vertical: Grid.xs, @@ -138,9 +155,11 @@ class AddPfiPage extends HookConsumerWidget { onTap: () => errorText.value = null, onTapOutside: (_) async { if (pfiDidController.text.isNotEmpty) { - errorText.value = await _isValidDid(pfiDidController.text) - ? null - : errorMessage; + errorText.value = + !(await DidResolver.resolve(pfiDidController.text)) + .hasError() + ? null + : errorMessage; } focusNode.unfocus(); }, @@ -165,34 +184,39 @@ class AddPfiPage extends HookConsumerWidget { BuildContext context, WidgetRef ref, TextEditingController pfiDidController, + ValueNotifier?> state, String? errorText, - ) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: Grid.side), - child: FilledButton( - onPressed: () { - if ((_formKey.currentState?.validate() ?? false) && - errorText == null) { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => AddPfiConfirmationPage( - did: pfiDidController.text, - ), - ), - ); - } - }, - child: const Text('Add'), - ), - ); - } + ) => + Padding( + padding: const EdgeInsets.symmetric(horizontal: Grid.side), + child: FilledButton( + onPressed: () { + if ((_formKey.currentState?.validate() ?? false) && + errorText == null) { + _addPfi(context, ref, pfiDidController.text, state); + } + }, + child: const Text('Add'), + ), + ); - static Future _isValidDid(String did) async { - try { - final result = await DidResolver.resolve(did); - return !result.hasError(); - } on Exception catch (_) { - return false; - } + void _addPfi( + BuildContext context, + WidgetRef ref, + String did, + ValueNotifier?> state, + ) { + state.value = const AsyncLoading(); + ref + .read(pfisProvider.notifier) + .add(did) + .then((pfi) => state.value = AsyncData(pfi)) + .onError((error, stackTrace) { + state.value = AsyncError( + error ?? Exception('Unable to resolve add PFI'), + stackTrace, + ); + throw Exception(); + }); } } diff --git a/lib/features/pfis/pfis_notifier.dart b/lib/features/pfis/pfis_notifier.dart index cb523173..7e50706e 100644 --- a/lib/features/pfis/pfis_notifier.dart +++ b/lib/features/pfis/pfis_notifier.dart @@ -18,6 +18,7 @@ class PfisNotifier extends StateNotifier> { Future add(String input) async { final pfi = await pfiService.createPfi(input); + await Future.delayed(const Duration(seconds: 1)); state = [...state, pfi]; await _save(); diff --git a/lib/features/send/send_details_page.dart b/lib/features/send/send_details_page.dart index 95c9898e..e8d33b68 100644 --- a/lib/features/send/send_details_page.dart +++ b/lib/features/send/send_details_page.dart @@ -105,10 +105,12 @@ class SendDetailsPage extends HookConsumerWidget { onTap: () => errorText.value = null, onTapOutside: (_) async { if (recipientDidController.text.isNotEmpty) { - errorText.value = - await _isValidDid(recipientDidController.text) - ? null - : errorMessage; + errorText.value = !(await DidResolver.resolve( + recipientDidController.text, + )) + .hasError() + ? null + : errorMessage; } focusNode.unfocus(); }, @@ -155,9 +157,4 @@ class SendDetailsPage extends HookConsumerWidget { ), ); } - - Future _isValidDid(String did) async { - final result = await DidResolver.resolve(did); - return !result.hasError(); - } }