From baf064801ebb35482969a56b4a627ba5f9ee9891 Mon Sep 17 00:00:00 2001 From: Ethan Lee <125412902+ethan-tbd@users.noreply.github.com> Date: Tue, 18 Jun 2024 00:24:38 -0700 Subject: [PATCH] feat: filter offerings (#206) --- lib/features/countries/countries_page.dart | 2 +- .../lucid/lucid_offerings_page.dart | 5 +++- lib/features/payment/payment_amount_page.dart | 17 +++++++------ .../payment/payment_details_page.dart | 10 ++++---- lib/features/tbdex/tbdex_service.dart | 25 ++++++++++++++++--- .../lucid/lucid_offerings_page_test.dart | 10 +++++++- test/features/home/home_page_test.dart | 10 +++++++- .../payment/payment_amount_page_test.dart | 8 +++++- 8 files changed, 66 insertions(+), 21 deletions(-) diff --git a/lib/features/countries/countries_page.dart b/lib/features/countries/countries_page.dart index aea48733..f4e30dc9 100644 --- a/lib/features/countries/countries_page.dart +++ b/lib/features/countries/countries_page.dart @@ -38,7 +38,7 @@ class CountriesPage extends HookConsumerWidget { MaterialPageRoute( builder: (context) => PaymentAmountPage( paymentState: PaymentState( - transactionType: TransactionType.deposit, + transactionType: TransactionType.send, selectedCountry: country.value, ), ), diff --git a/lib/features/feature_flags/lucid/lucid_offerings_page.dart b/lib/features/feature_flags/lucid/lucid_offerings_page.dart index 83a99be0..85c50052 100644 --- a/lib/features/feature_flags/lucid/lucid_offerings_page.dart +++ b/lib/features/feature_flags/lucid/lucid_offerings_page.dart @@ -106,6 +106,7 @@ class LucidOfferingsPage extends HookConsumerWidget { transactionType: TransactionType.send, selectedOffering: selectedOffering.value, selectedPfi: selectedPfi.value, + offeringsMap: offeringsMap, ), ), ), @@ -133,7 +134,9 @@ class LucidOfferingsPage extends HookConsumerWidget { try { await ref .read(tbdexServiceProvider) - .getOfferings(ref.read(pfisProvider)) + .getOfferings( + const PaymentState(transactionType: TransactionType.send), + ref.read(pfisProvider),) .then((offerings) => state.value = AsyncData(offerings)); } on Exception catch (e) { state.value = AsyncError(e, StackTrace.current); diff --git a/lib/features/payment/payment_amount_page.dart b/lib/features/payment/payment_amount_page.dart index 44c5b09b..a8355139 100644 --- a/lib/features/payment/payment_amount_page.dart +++ b/lib/features/payment/payment_amount_page.dart @@ -38,12 +38,11 @@ class PaymentAmountPage extends HookConsumerWidget { useEffect( () { Future.microtask( - () async => - selectedOffering.value != null && selectedPfi.value != null - ? offerings.value = AsyncData({ - selectedPfi.value!: [selectedOffering.value!], - }) - : await _getOfferings(ref, offerings), + () async => paymentState.offeringsMap != null + ? offerings.value = AsyncData({ + selectedPfi.value!: [selectedOffering.value!], + }) + : await _getOfferings(ref, currentPaymentState.value, offerings), ); return null; }, @@ -141,7 +140,8 @@ class PaymentAmountPage extends HookConsumerWidget { AsyncLoadingWidget(text: Loc.of(context).fetchingOfferings), error: (error, stackTrace) => AsyncErrorWidget( text: error.toString(), - onRetry: () => _getOfferings(ref, offerings), + onRetry: () => + _getOfferings(ref, currentPaymentState.value, offerings), ), ), ), @@ -150,13 +150,14 @@ class PaymentAmountPage extends HookConsumerWidget { Future _getOfferings( WidgetRef ref, + PaymentState paymentState, ValueNotifier>>> state, ) async { state.value = const AsyncLoading(); try { await ref .read(tbdexServiceProvider) - .getOfferings(ref.read(pfisProvider)) + .getOfferings(paymentState, ref.read(pfisProvider)) .then((offerings) => state.value = AsyncData(offerings)); } on Exception catch (e) { state.value = AsyncError(e, StackTrace.current); diff --git a/lib/features/payment/payment_details_page.dart b/lib/features/payment/payment_details_page.dart index 4332962c..2e87960b 100644 --- a/lib/features/payment/payment_details_page.dart +++ b/lib/features/payment/payment_details_page.dart @@ -43,7 +43,7 @@ class PaymentDetailsPage extends HookConsumerWidget { useEffect( () { - selectedPaymentMethod.value = (filteredPaymentMethods?.length ?? 1) <= 1 + selectedPaymentMethod.value = (filteredPaymentMethods?.length ?? 0) <= 1 ? filteredPaymentMethods?.firstOrNull : null; return; @@ -104,11 +104,11 @@ class PaymentDetailsPage extends HookConsumerWidget { selectedPayinMethod: paymentState.transactionType == TransactionType.deposit ? selectedPaymentMethod.value as PayinMethod? - : paymentState.payinMethods?.firstOrNull, + : null, selectedPayoutMethod: paymentState.transactionType == - TransactionType.withdraw - ? selectedPaymentMethod.value as PayoutMethod? - : paymentState.payoutMethods?.firstOrNull, + TransactionType.deposit + ? null + : selectedPaymentMethod.value as PayoutMethod?, ), onPaymentFormSubmit: (paymentState) async { await _hasRequiredVc( diff --git a/lib/features/tbdex/tbdex_service.dart b/lib/features/tbdex/tbdex_service.dart index 0c5c5fec..9772afbe 100644 --- a/lib/features/tbdex/tbdex_service.dart +++ b/lib/features/tbdex/tbdex_service.dart @@ -11,14 +11,33 @@ import 'package:web5/web5.dart'; final tbdexServiceProvider = Provider((_) => TbdexService()); class TbdexService { - Future>> getOfferings(List pfis) async { + Future>> getOfferings( + PaymentState paymentState, + List pfis, + ) async { final offeringsMap = >{}; + GetOfferingsFilter? filter; + switch (paymentState.transactionType) { + case TransactionType.deposit: + filter = GetOfferingsFilter(payoutCurrency: 'USDC'); + break; + case TransactionType.withdraw: + filter = GetOfferingsFilter(payinCurrency: 'USDC'); + break; + case TransactionType.send: + filter = paymentState.selectedCountry != null + ? GetOfferingsFilter(payoutCurrency: 'MXN') + : null; + break; + } + for (final pfi in pfis) { try { - await TbdexHttpClient.listOfferings(pfi.did) + await TbdexHttpClient.listOfferings(pfi.did, filter: filter) .then((offerings) => offeringsMap[pfi] = offerings); - } on Exception { + } on Exception catch (e) { + if (e is ValidationError) continue; rethrow; } } diff --git a/test/features/feature_flags/lucid/lucid_offerings_page_test.dart b/test/features/feature_flags/lucid/lucid_offerings_page_test.dart index 2636137f..10d19f42 100644 --- a/test/features/feature_flags/lucid/lucid_offerings_page_test.dart +++ b/test/features/feature_flags/lucid/lucid_offerings_page_test.dart @@ -1,7 +1,9 @@ import 'package:didpay/features/feature_flags/feature_flags_notifier.dart'; import 'package:didpay/features/feature_flags/lucid/lucid_offerings_page.dart'; +import 'package:didpay/features/payment/payment_state.dart'; import 'package:didpay/features/pfis/pfis_notifier.dart'; import 'package:didpay/features/tbdex/tbdex_service.dart'; +import 'package:didpay/features/transaction/transaction.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; @@ -26,10 +28,16 @@ void main() async { mockFeatureFlagsNotifier = MockFeatureFlagsNotifier([]); when( - () => mockTbdexService.getOfferings(pfis), + () => mockTbdexService.getOfferings(any(), pfis), ).thenAnswer((_) async => offerings); }); + setUpAll( + () => registerFallbackValue( + const PaymentState(transactionType: TransactionType.send), + ), + ); + group('LucidOfferingsPage', () { Widget lucidOfferingsPageTestWidget() => WidgetHelpers.testableWidget( child: const LucidOfferingsPage(), diff --git a/test/features/home/home_page_test.dart b/test/features/home/home_page_test.dart index db977bc7..7ed71b04 100644 --- a/test/features/home/home_page_test.dart +++ b/test/features/home/home_page_test.dart @@ -4,8 +4,10 @@ import 'package:didpay/features/account/account_balance_notifier.dart'; import 'package:didpay/features/did/did_provider.dart'; import 'package:didpay/features/home/home_page.dart'; import 'package:didpay/features/payment/payment_amount_page.dart'; +import 'package:didpay/features/payment/payment_state.dart'; import 'package:didpay/features/pfis/pfis_notifier.dart'; import 'package:didpay/features/tbdex/tbdex_service.dart'; +import 'package:didpay/features/transaction/transaction.dart'; import 'package:didpay/features/transaction/transaction_notifier.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -44,7 +46,7 @@ void main() async { mockPfisNotifier = MockPfisNotifier(pfis); when( - () => mockTbdexService.getOfferings(pfis), + () => mockTbdexService.getOfferings(any(), pfis), ).thenAnswer((_) async => offerings); when( @@ -59,6 +61,12 @@ void main() async { ); }); + setUpAll( + () => registerFallbackValue( + const PaymentState(transactionType: TransactionType.deposit), + ), + ); + testWidgets('should show account balance', (tester) async { await tester.pumpWidget(homePageTestWidget()); diff --git a/test/features/payment/payment_amount_page_test.dart b/test/features/payment/payment_amount_page_test.dart index d9e81404..052ce556 100644 --- a/test/features/payment/payment_amount_page_test.dart +++ b/test/features/payment/payment_amount_page_test.dart @@ -28,10 +28,16 @@ void main() async { mockPfisNotifier = MockPfisNotifier(pfis); when( - () => mockTbdexService.getOfferings(pfis), + () => mockTbdexService.getOfferings(any(), pfis), ).thenAnswer((_) async => offerings); }); + setUpAll( + () => registerFallbackValue( + const PaymentState(transactionType: TransactionType.deposit), + ), + ); + group('PaymentAmountPage', () { Widget paymentAmountPageTestWidget() => WidgetHelpers.testableWidget( child: const PaymentAmountPage(