quotation provider now uses payment methods as source for quotation

This commit is contained in:
Stephan D
2025-12-24 20:39:17 +01:00
parent 4251dfb2c6
commit 407e704352
9 changed files with 34 additions and 35 deletions

View File

@@ -1,26 +1,20 @@
import 'package:pshared/models/currency.dart';
import 'package:pshared/models/wallet/wallet.dart' as domain;
import 'package:pshared/models/payment/wallet.dart';
import 'package:pshared/utils/currency.dart';
extension WalletUiMapper on domain.WalletModel {
Wallet toUi() {
final amountStr = availableMoney?.amount ?? balance?.available?.amount ?? '0';
final parsedAmount = double.tryParse(amountStr) ?? 0;
final currency = currencyStringToCode(asset.tokenSymbol);
return Wallet(
id: walletRef,
walletUserID: walletRef,
balance: parsedAmount,
currency: currency,
isHidden: true,
calculatedAt: balance?.calculatedAt ?? DateTime.now(),
depositAddress: depositAddress,
network: asset.chain,
tokenSymbol: asset.tokenSymbol,
contractAddress: asset.contractAddress,
describable: describable,
);
}
Wallet toUi() => Wallet(
id: walletRef,
walletUserID: walletRef,
balance: double.tryParse(availableMoney?.amount ?? balance?.available?.amount ?? '0') ?? 0,
currency: currencyStringToCode(asset.tokenSymbol),
isHidden: true,
calculatedAt: balance?.calculatedAt ?? DateTime.now(),
depositAddress: depositAddress,
network: asset.chain,
tokenSymbol: asset.tokenSymbol,
contractAddress: asset.contractAddress,
describable: describable,
);
}

View File

@@ -1,18 +1,18 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:pshared/models/auth/state.dart';
import 'package:share_plus/share_plus.dart';
import 'package:pshared/api/errors/unauthorized.dart';
import 'package:pshared/api/requests/signup.dart';
import 'package:pshared/api/requests/login_data.dart';
import 'package:pshared/api/responses/confirmation.dart';
import 'package:pshared/config/constants.dart';
import 'package:pshared/models/account/account.dart';
import 'package:pshared/api/responses/confirmation.dart';
import 'package:pshared/models/auth/login_outcome.dart';
import 'package:pshared/models/auth/pending_login.dart';
import 'package:pshared/models/auth/state.dart';
import 'package:pshared/models/describable.dart';
import 'package:pshared/models/storable.dart';
import 'package:pshared/provider/locale.dart';

View File

@@ -0,0 +1,110 @@
import 'package:flutter/foundation.dart';
import 'package:pshared/models/payment/methods/data.dart';
import 'package:pshared/models/payment/type.dart';
import 'package:pshared/models/recipient/recipient.dart';
class PaymentFlowProvider extends ChangeNotifier {
PaymentType _selectedType;
PaymentMethodData? _manualPaymentData;
PaymentFlowProvider({
required PaymentType initialType,
}) : _selectedType = initialType;
PaymentType get selectedType => _selectedType;
PaymentMethodData? get manualPaymentData => _manualPaymentData;
void sync({
required Recipient? recipient,
required MethodMap availableTypes,
PaymentType? preferredType,
}) {
final resolvedType = _resolveSelectedType(
recipient: recipient,
availableTypes: availableTypes,
preferredType: preferredType,
);
var hasChanges = false;
if (resolvedType != _selectedType) {
_selectedType = resolvedType;
hasChanges = true;
}
if (recipient != null && _manualPaymentData != null) {
_manualPaymentData = null;
hasChanges = true;
}
if (hasChanges) notifyListeners();
}
void reset({
required Recipient? recipient,
required MethodMap availableTypes,
PaymentType? preferredType,
}) {
final resolvedType = _resolveSelectedType(
recipient: recipient,
availableTypes: availableTypes,
preferredType: preferredType,
);
var hasChanges = false;
if (resolvedType != _selectedType) {
_selectedType = resolvedType;
hasChanges = true;
}
if (_manualPaymentData != null) {
_manualPaymentData = null;
hasChanges = true;
}
if (hasChanges) notifyListeners();
}
void selectType(PaymentType type, {bool resetManualData = false}) {
if (_selectedType == type && (!resetManualData || _manualPaymentData == null)) {
return;
}
_selectedType = type;
if (resetManualData) {
_manualPaymentData = null;
}
notifyListeners();
}
void setManualPaymentData(PaymentMethodData? data) {
_manualPaymentData = data;
notifyListeners();
}
PaymentType _resolveSelectedType({
required Recipient? recipient,
required MethodMap availableTypes,
PaymentType? preferredType,
}) {
if (recipient == null) {
return preferredType ?? _selectedType;
}
if (availableTypes.isEmpty) {
return preferredType ?? PaymentType.bankAccount;
}
if (availableTypes.keys.contains(_selectedType)) {
return _selectedType;
}
if (preferredType != null && availableTypes.keys.contains(preferredType)) {
return preferredType;
}
return availableTypes.keys.first;
}
}

View File

@@ -1,5 +1,7 @@
import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:uuid/uuid.dart';
import 'package:pshared/api/requests/payment/quote.dart';
@@ -9,7 +11,6 @@ import 'package:pshared/models/payment/currency_pair.dart';
import 'package:pshared/models/payment/fx/intent.dart';
import 'package:pshared/models/payment/fx/side.dart';
import 'package:pshared/models/payment/kind.dart';
import 'package:pshared/models/payment/methods/card.dart';
import 'package:pshared/models/payment/methods/managed_wallet.dart';
import 'package:pshared/models/payment/money.dart';
import 'package:pshared/models/payment/settlement_mode.dart';
@@ -17,7 +18,9 @@ import 'package:pshared/models/payment/intent.dart';
import 'package:pshared/models/payment/quote.dart';
import 'package:pshared/provider/organizations.dart';
import 'package:pshared/provider/payment/amount.dart';
import 'package:pshared/provider/payment/flow.dart';
import 'package:pshared/provider/payment/wallets.dart';
import 'package:pshared/provider/recipient/pmethods.dart';
import 'package:pshared/provider/resource.dart';
import 'package:pshared/service/payment/quotation.dart';
import 'package:pshared/utils/currency.dart';
@@ -32,9 +35,13 @@ class QuotationProvider extends ChangeNotifier {
OrganizationsProvider venue,
PaymentAmountProvider payment,
WalletsProvider wallets,
PaymentFlowProvider flow,
PaymentMethodsProvider methods,
) {
_organizations = venue;
if (wallets.selectedWallet != null) {
final t = flow.selectedType;
final method = methods.methods.firstWhereOrNull((m) => m.type == t);
if ((wallets.selectedWallet != null) && (method != null)) {
getQuotation(PaymentIntent(
kind: PaymentKind.payout,
amount: Money(
@@ -42,18 +49,14 @@ class QuotationProvider extends ChangeNotifier {
// TODO: adapt to possible other sources
currency: currencyCodeToString(wallets.selectedWallet!.currency),
),
destination: CardPaymentMethod(
pan: '4000000000000077',
firstName: 'John',
lastName: 'Doe',
),
destination: method.data,
source: ManagedWalletPaymentMethod(
managedWalletRef: wallets.selectedWallet!.id,
),
fx: FxIntent(
pair: CurrencyPair(
base: currencyCodeToString(wallets.selectedWallet!.currency),
quote: 'RUB',
quote: 'RUB', // TODO: exentd target currencies
),
side: FxSide.sellBaseBuyQuote,
),