diff --git a/lib/features/payment/payment_amount_state.dart b/lib/features/payment/payment_amount_state.dart index 1a9fd4e3..2e9d48e2 100644 --- a/lib/features/payment/payment_amount_state.dart +++ b/lib/features/payment/payment_amount_state.dart @@ -26,7 +26,7 @@ class PaymentAmountState { String? get payoutCurrency => selectedOffering?.data.payout.currencyCode; String? get exchangeRate => selectedOffering?.data.payoutUnitsPerPayinUnit; - String? get exchangeId => selectedOffering?.metadata.id; + String? get offeringId => selectedOffering?.metadata.id; PaymentAmountState copyWith({ String? payinAmount, diff --git a/lib/features/payment/payment_details_page.dart b/lib/features/payment/payment_details_page.dart index 4f72b70b..5f1b9095 100644 --- a/lib/features/payment/payment_details_page.dart +++ b/lib/features/payment/payment_details_page.dart @@ -258,12 +258,10 @@ class PaymentDetailsPage extends HookConsumerWidget { final updatedPaymentState = paymentState.copyWith(paymentDetailsState: state); - print('payout details: ${state.formData}'); - - await ref.read(tbdexServiceProvider).sendRfq( + final sentRfq = await ref.read(tbdexServiceProvider).sendRfq( ref.read(didProvider), updatedPaymentState.paymentAmountState?.pfiDid ?? '', - updatedPaymentState.paymentAmountState?.exchangeId ?? '', + updatedPaymentState.paymentAmountState?.offeringId ?? '', updatedPaymentState.paymentAmountState?.payinAmount ?? '', updatedPaymentState.selectedPayinKind ?? '', updatedPaymentState.selectedPayoutKind ?? '', @@ -275,7 +273,10 @@ class PaymentDetailsPage extends HookConsumerWidget { await Navigator.of(context).push( MaterialPageRoute( builder: (context) => PaymentReviewPage( - paymentState: paymentState.copyWith(paymentDetailsState: state), + paymentState: updatedPaymentState.copyWith( + paymentDetailsState: updatedPaymentState.paymentDetailsState + ?.copyWith(exchangeId: sentRfq.metadata.exchangeId), + ), ), ), ); diff --git a/lib/features/payment/payment_details_state.dart b/lib/features/payment/payment_details_state.dart index 1f98dfcf..99d42a35 100644 --- a/lib/features/payment/payment_details_state.dart +++ b/lib/features/payment/payment_details_state.dart @@ -4,6 +4,7 @@ import 'package:didpay/features/payment/payment_method.dart'; class PaymentDetailsState { final String? paymentCurrency; final String? paymentName; + final String? exchangeId; final String? selectedPaymentType; final PaymentMethod? selectedPaymentMethod; final List? paymentMethods; @@ -14,6 +15,7 @@ class PaymentDetailsState { PaymentDetailsState({ this.paymentCurrency, this.paymentName, + this.exchangeId, this.selectedPaymentType, this.selectedPaymentMethod, this.paymentMethods, @@ -38,6 +40,7 @@ class PaymentDetailsState { PaymentDetailsState copyWith({ String? paymentCurrency, String? paymentName, + String? exchangeId, String? selectedPaymentType, PaymentMethod? selectedPaymentMethod, List? paymentMethods, @@ -48,6 +51,7 @@ class PaymentDetailsState { return PaymentDetailsState( paymentCurrency: paymentCurrency ?? this.paymentCurrency, paymentName: paymentName ?? this.paymentName, + exchangeId: exchangeId ?? this.exchangeId, selectedPaymentType: selectedPaymentType ?? this.selectedPaymentType, selectedPaymentMethod: selectedPaymentMethod ?? this.selectedPaymentMethod, diff --git a/lib/features/payment/payment_fee_details.dart b/lib/features/payment/payment_fee_details.dart index ef05db92..b32b53e4 100644 --- a/lib/features/payment/payment_fee_details.dart +++ b/lib/features/payment/payment_fee_details.dart @@ -56,13 +56,8 @@ class PaymentFeeDetails extends HookWidget { ); } - static String calculateExchangeRate(QuoteData? quote) => - (double.parse(quote?.payout.amount ?? '0') / - double.parse(quote?.payin.amount ?? '0')) - .toStringAsFixed(quote?.payout.currencyCode == 'BTC' ? 8 : 2); - static String calculateTotalAmount(QuoteData? quote) => - Decimal.parse(quote?.payin.amount ?? '0') + Decimal.parse(quote?.payin.total ?? '0') .formatCurrency(quote?.payin.currencyCode ?? ''); Widget _buildRow( @@ -118,7 +113,7 @@ extension _PaymentDetailsOperations on Object? { : null; String? get exchangeRate => this is QuoteData - ? PaymentFeeDetails.calculateExchangeRate(this as QuoteData?) + ? (this as QuoteData?)?.payoutUnitsPerPayinUnit : this is OfferingData ? (this as OfferingData?)?.payoutUnitsPerPayinUnit : null; diff --git a/lib/features/payment/payment_link_webview_page.dart b/lib/features/payment/payment_link_webview_page.dart index c7cc7e70..79578b0e 100644 --- a/lib/features/payment/payment_link_webview_page.dart +++ b/lib/features/payment/payment_link_webview_page.dart @@ -43,7 +43,6 @@ class PaymentLinkWebviewPage extends HookConsumerWidget { if (context.mounted) Navigator.of(context).pop(); } }, - onExitFullscreen: (controller) => print('onExitFullscreen'), onReceivedServerTrustAuthRequest: (controller, challenge) async { return ServerTrustAuthResponse( action: ServerTrustAuthResponseAction.PROCEED, diff --git a/lib/features/payment/payment_review_page.dart b/lib/features/payment/payment_review_page.dart index 0a22b353..ef6f2963 100644 --- a/lib/features/payment/payment_review_page.dart +++ b/lib/features/payment/payment_review_page.dart @@ -175,7 +175,7 @@ class PaymentReviewPage extends HookConsumerWidget { await ref.read(tbdexServiceProvider).submitClose( ref.read(didProvider), paymentState.paymentAmountState?.pfiDid ?? '', - paymentState.paymentAmountState?.exchangeId ?? '', + paymentState.paymentDetailsState?.exchangeId ?? '', ); if (dialogContext.mounted) { @@ -203,7 +203,7 @@ class PaymentReviewPage extends HookConsumerWidget { children: [ Flexible( child: AutoSizeText( - Decimal.parse(quote.payin.amount) + Decimal.parse(quote.payin.total) .formatCurrency(quote.payin.currencyCode), style: Theme.of(context).textTheme.headlineMedium, maxLines: 1, @@ -231,7 +231,7 @@ class PaymentReviewPage extends HookConsumerWidget { children: [ Flexible( child: AutoSizeText( - Decimal.parse(quote.payout.amount) + Decimal.parse(quote.payout.total) .formatCurrency(quote.payout.currencyCode), style: Theme.of(context).textTheme.headlineMedium, maxLines: 1, @@ -282,7 +282,7 @@ class PaymentReviewPage extends HookConsumerWidget { style: Theme.of(context).textTheme.bodyLarge, ), const SizedBox(height: Grid.xxs), - ...?paymentState.paymentDetailsState?.formData?.entries.map( + ...?paymentState.paymentDetails?.entries.map( (entry) => Padding( padding: const EdgeInsets.only( bottom: Grid.xxs, @@ -308,7 +308,7 @@ class PaymentReviewPage extends HookConsumerWidget { try { final quote = await quoteNotifier.startPolling( paymentState.paymentAmountState?.pfiDid ?? '', - paymentState.paymentAmountState?.exchangeId ?? '', + paymentState.paymentDetailsState?.exchangeId ?? '', ); if (context.mounted && quote != null) { @@ -332,7 +332,7 @@ class PaymentReviewPage extends HookConsumerWidget { final order = await ref.read(tbdexServiceProvider).submitOrder( ref.read(didProvider), paymentState.paymentAmountState?.pfiDid ?? '', - paymentState.paymentAmountState?.exchangeId ?? '', + paymentState.paymentDetailsState?.exchangeId ?? '', ); if (context.mounted) { diff --git a/lib/features/payment/payment_state.dart b/lib/features/payment/payment_state.dart index b4044891..3bb5e122 100644 --- a/lib/features/payment/payment_state.dart +++ b/lib/features/payment/payment_state.dart @@ -35,6 +35,16 @@ class PaymentState { } } + Map? get paymentDetails { + switch (transactionType) { + case TransactionType.deposit: + case TransactionType.withdraw: + return payinDetails; + case TransactionType.send: + return payoutDetails; + } + } + String? get selectedPayinKind { switch (transactionType) { case TransactionType.deposit: diff --git a/lib/features/transaction/transaction.dart b/lib/features/transaction/transaction.dart index 4ea172c3..43120c13 100644 --- a/lib/features/transaction/transaction.dart +++ b/lib/features/transaction/transaction.dart @@ -39,8 +39,8 @@ class Transaction { payinAmount = (msg as Rfq).data.payin.amount; break; case MessageKind.quote: - payinAmount = (msg as Quote).data.payin.amount; - payoutAmount = msg.data.payout.amount; + payinAmount = (msg as Quote).data.payin.total; + payoutAmount = msg.data.payout.total; payinCurrency = msg.data.payin.currencyCode; payoutCurrency = msg.data.payout.currencyCode; break; diff --git a/pubspec.lock b/pubspec.lock index 238ad6d2..a1cacc07 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -792,7 +792,7 @@ packages: description: path: "." ref: main - resolved-ref: a8c47960a9ea77424cc28f2762488c9d4a4125d5 + resolved-ref: ae4c59d75da3eae9f320885d89d16536a89caf75 url: "https://github.com/TBD54566975/tbdex-dart.git" source: git version: "1.0.0" diff --git a/test/features/payment/payment_review_page_test.dart b/test/features/payment/payment_review_page_test.dart index 83eb66bd..3356db28 100644 --- a/test/features/payment/payment_review_page_test.dart +++ b/test/features/payment/payment_review_page_test.dart @@ -83,7 +83,7 @@ void main() async { await tester.pumpAndSettle(); - expect(find.widgetWithText(AutoSizeText, '100'), findsOneWidget); + expect(find.widgetWithText(AutoSizeText, '100.01'), findsOneWidget); expect(find.text('AUD'), findsOneWidget); expect(find.widgetWithText(AutoSizeText, '0.12'), findsOneWidget); expect(find.text('BTC'), findsOneWidget); @@ -115,7 +115,7 @@ void main() async { ); await tester.pumpAndSettle(); - await tester.tap(find.text('Pay 100 AUD')); + await tester.tap(find.text('Pay 100.01 AUD')); await tester.pumpAndSettle(); expect(find.text('Order confirmed!'), findsOneWidget); diff --git a/test/helpers/test_data.dart b/test/helpers/test_data.dart index f03bd25f..3b8f6164 100644 --- a/test/helpers/test_data.dart +++ b/test/helpers/test_data.dart @@ -100,14 +100,17 @@ class TestData { TypeId.generate(MessageKind.rfq.name), QuoteData( expiresAt: '2022-01-01T00:00:00Z', + payoutUnitsPerPayinUnit: '1', payin: QuoteDetails( currencyCode: 'AUD', - amount: '100', + subtotal: '100', + total: '100.01', fee: '0.01', ), payout: QuoteDetails( currencyCode: 'BTC', - amount: '0.12', + subtotal: '0.10', + total: '0.12', fee: '0.02', ), ),