fixes for multiple payout
This commit is contained in:
@@ -1,23 +1,29 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import 'package:pshared/controllers/payment/source.dart';
|
||||
import 'package:pshared/models/money.dart';
|
||||
import 'package:pshared/models/payment/asset.dart';
|
||||
import 'package:pshared/models/payment/chain_network.dart';
|
||||
import 'package:pshared/models/payment/methods/data.dart';
|
||||
import 'package:pshared/models/payment/methods/ledger.dart';
|
||||
import 'package:pshared/models/payment/methods/managed_wallet.dart';
|
||||
import 'package:pshared/models/payment/payment.dart';
|
||||
import 'package:pshared/models/payment/quote/status_type.dart';
|
||||
import 'package:pshared/models/payment/wallet.dart';
|
||||
|
||||
import 'package:pweb/models/payment/multiple_payouts/csv_row.dart';
|
||||
import 'package:pweb/models/payment/multiple_payouts/state.dart';
|
||||
import 'package:pweb/providers/multiple_payouts.dart';
|
||||
import 'package:pweb/services/payments/csv_input.dart';
|
||||
|
||||
|
||||
class MultiplePayoutsController extends ChangeNotifier {
|
||||
final CsvInputService _csvInput;
|
||||
MultiplePayoutsProvider? _provider;
|
||||
PaymentSourceController? _sourceController;
|
||||
_PickState _pickState = _PickState.idle;
|
||||
Exception? _uiError;
|
||||
String? _lastSourceKey;
|
||||
|
||||
MultiplePayoutsController({required CsvInputService csvInput})
|
||||
: _csvInput = csvInput;
|
||||
@@ -37,6 +43,7 @@ class MultiplePayoutsController extends ChangeNotifier {
|
||||
_sourceController?.removeListener(_onSourceChanged);
|
||||
_sourceController = sourceController;
|
||||
_sourceController?.addListener(_onSourceChanged);
|
||||
_lastSourceKey = _currentSourceKey;
|
||||
shouldNotify = true;
|
||||
}
|
||||
if (shouldNotify) {
|
||||
@@ -60,16 +67,16 @@ class MultiplePayoutsController extends ChangeNotifier {
|
||||
_provider?.quoteStatusType ?? QuoteStatusType.missing;
|
||||
Duration? get quoteTimeLeft => _provider?.quoteTimeLeft;
|
||||
|
||||
bool get canSend => (_provider?.canSend ?? false) && _selectedWallet != null;
|
||||
bool get canSend => (_provider?.canSend ?? false) && _selectedSource != null;
|
||||
Money? get aggregateDebitAmount =>
|
||||
_provider?.aggregateDebitAmountFor(_selectedWallet);
|
||||
_provider?.aggregateDebitAmountForCurrency(_selectedSourceCurrencyCode);
|
||||
Money? get requestedSentAmount => _provider?.requestedSentAmount;
|
||||
Money? get aggregateSettlementAmount =>
|
||||
_provider?.aggregateSettlementAmountFor(_selectedWallet);
|
||||
Money? get aggregateSettlementAmount => _provider
|
||||
?.aggregateSettlementAmountForCurrency(_selectedSourceCurrencyCode);
|
||||
Money? get aggregateFeeAmount =>
|
||||
_provider?.aggregateFeeAmountFor(_selectedWallet);
|
||||
_provider?.aggregateFeeAmountForCurrency(_selectedSourceCurrencyCode);
|
||||
double? get aggregateFeePercent =>
|
||||
_provider?.aggregateFeePercentFor(_selectedWallet);
|
||||
_provider?.aggregateFeePercentForCurrency(_selectedSourceCurrencyCode);
|
||||
|
||||
Future<void> pickAndQuote() async {
|
||||
if (_pickState == _PickState.picking) return;
|
||||
@@ -84,15 +91,16 @@ class MultiplePayoutsController extends ChangeNotifier {
|
||||
try {
|
||||
final picked = await _csvInput.pickCsv();
|
||||
if (picked == null) return;
|
||||
final wallet = _selectedWallet;
|
||||
if (wallet == null) {
|
||||
_setUiError(StateError('Select source wallet first'));
|
||||
final source = _selectedSource;
|
||||
if (source == null) {
|
||||
_setUiError(StateError('Select source of funds first'));
|
||||
return;
|
||||
}
|
||||
await provider.quoteFromCsv(
|
||||
fileName: picked.name,
|
||||
content: picked.content,
|
||||
sourceWallet: wallet,
|
||||
sourceMethod: source.method,
|
||||
sourceCurrencyCode: source.currencyCode,
|
||||
);
|
||||
} catch (e) {
|
||||
_setUiError(e);
|
||||
@@ -131,10 +139,78 @@ class MultiplePayoutsController extends ChangeNotifier {
|
||||
}
|
||||
|
||||
void _onSourceChanged() {
|
||||
final currentSourceKey = _currentSourceKey;
|
||||
final sourceChanged = currentSourceKey != _lastSourceKey;
|
||||
_lastSourceKey = currentSourceKey;
|
||||
if (sourceChanged) {
|
||||
unawaited(_requoteWithUploadedRows());
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Wallet? get _selectedWallet => _sourceController?.selectedWallet;
|
||||
String? get _selectedSourceCurrencyCode =>
|
||||
_sourceController?.selectedCurrencyCode;
|
||||
String? get _currentSourceKey {
|
||||
final source = _sourceController;
|
||||
if (source == null ||
|
||||
source.selectedType == null ||
|
||||
source.selectedRef == null) {
|
||||
return null;
|
||||
}
|
||||
return '${source.selectedType!.name}:${source.selectedRef!}';
|
||||
}
|
||||
|
||||
({PaymentMethodData method, String currencyCode})? get _selectedSource {
|
||||
final source = _sourceController;
|
||||
if (source == null) return null;
|
||||
|
||||
final currencyCode = source.selectedCurrencyCode;
|
||||
if (currencyCode == null || currencyCode.isEmpty) return null;
|
||||
|
||||
final wallet = source.selectedWallet;
|
||||
if (wallet != null) {
|
||||
final hasAsset = (wallet.tokenSymbol ?? '').isNotEmpty;
|
||||
final asset = hasAsset
|
||||
? PaymentAsset(
|
||||
chain: wallet.network ?? ChainNetwork.unspecified,
|
||||
tokenSymbol: wallet.tokenSymbol!,
|
||||
contractAddress: wallet.contractAddress,
|
||||
)
|
||||
: null;
|
||||
return (
|
||||
method: ManagedWalletPaymentMethod(
|
||||
managedWalletRef: wallet.id,
|
||||
asset: asset,
|
||||
),
|
||||
currencyCode: currencyCode,
|
||||
);
|
||||
}
|
||||
|
||||
final ledger = source.selectedLedgerAccount;
|
||||
if (ledger != null) {
|
||||
return (
|
||||
method: LedgerPaymentMethod(ledgerAccountRef: ledger.ledgerAccountRef),
|
||||
currencyCode: currencyCode,
|
||||
);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
Future<void> _requoteWithUploadedRows() async {
|
||||
final provider = _provider;
|
||||
if (provider == null) return;
|
||||
if (provider.selectedFileName == null || provider.rows.isEmpty) return;
|
||||
|
||||
final source = _selectedSource;
|
||||
if (source == null) return;
|
||||
|
||||
_clearUiError(notify: false);
|
||||
await provider.requoteUploadedRows(
|
||||
sourceMethod: source.method,
|
||||
sourceCurrencyCode: source.currencyCode,
|
||||
);
|
||||
}
|
||||
|
||||
void _setUiError(Object error) {
|
||||
_uiError = error is Exception ? error : Exception(error.toString());
|
||||
|
||||
Reference in New Issue
Block a user