Multiple Wallet support, history of each wallet and updated payment page

This commit is contained in:
Arseni
2025-11-21 19:22:23 +03:00
parent 4c64a8d6e6
commit 87636a7ec3
68 changed files with 2154 additions and 701 deletions

View File

@@ -1,9 +1,13 @@
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:pshared/models/payment/methods/type.dart';
import 'package:pshared/models/payment/type.dart';
import 'package:pshared/models/recipient/recipient.dart';
import 'package:pweb/models/wallet.dart';
import 'package:pweb/providers/payment_methods.dart';
import 'package:pweb/providers/wallets.dart';
import 'package:pweb/widgets/sidebar/destinations.dart';
import 'package:pweb/services/amplitude.dart';
@@ -15,13 +19,29 @@ class PageSelectorProvider extends ChangeNotifier {
PaymentType? _type;
bool _cameFromRecipientList = false;
final RecipientProvider? recipientProvider;
final WalletsProvider? walletsProvider;
RecipientProvider? recipientProvider;
WalletsProvider? walletsProvider;
PaymentMethodsProvider? methodsProvider;
PayoutDestination get selected => _selected;
PaymentType? get type => _type;
bool get cameFromRecipientList => _cameFromRecipientList;
PageSelectorProvider({this.recipientProvider, this.walletsProvider});
PageSelectorProvider({
this.recipientProvider,
this.walletsProvider,
this.methodsProvider,
});
void update(
RecipientProvider recipientProv,
WalletsProvider walletsProv,
PaymentMethodsProvider methodsProv,
) {
recipientProvider = recipientProv;
walletsProvider = walletsProv;
methodsProvider = methodsProv;
}
void selectPage(PayoutDestination dest) {
_selected = dest;
@@ -90,7 +110,64 @@ class PageSelectorProvider extends ChangeNotifier {
_selected = PayoutDestination.editwallet;
notifyListeners();
} else {
debugPrint("RecipientProvider is null — cannot select wallet");
debugPrint("WalletsProvider is null — cannot select wallet");
}
}
void startPaymentFromWallet(Wallet wallet) {
_type = PaymentType.wallet;
_cameFromRecipientList = true;
_selected = PayoutDestination.payment;
notifyListeners();
}
PaymentMethod? getPaymentMethodForWallet(Wallet wallet) {
if (methodsProvider == null || methodsProvider!.methods.isEmpty) {
return null;
}
return methodsProvider!.methods.firstWhereOrNull(
(method) => method.type == PaymentType.wallet &&
method.details.contains(wallet.walletUserID)
);
}
Map<PaymentType, Object> getAvailablePaymentTypes() {
final recipient = selectedRecipient;
if (recipient == null) return {};
return {
if (recipient.card != null) PaymentType.card: recipient.card!,
if (recipient.iban != null) PaymentType.iban: recipient.iban!,
if (recipient.wallet != null) PaymentType.wallet: recipient.wallet!,
if (recipient.bank != null) PaymentType.bankAccount: recipient.bank!,
};
}
PaymentType getDefaultPaymentType() {
final availableTypes = getAvailablePaymentTypes();
final currentType = _type ?? PaymentType.bankAccount;
if (availableTypes.containsKey(currentType)) {
return currentType;
} else if (availableTypes.isNotEmpty) {
return availableTypes.keys.first;
} else {
return PaymentType.bankAccount;
}
}
bool shouldShowPaymentForm() {
return selectedRecipient == null;
}
void handleWalletAutoSelection() {
if (selectedWallet != null && methodsProvider != null) {
final wallet = selectedWallet!;
final matchingMethod = getPaymentMethodForWallet(wallet);
if (matchingMethod != null) {
methodsProvider!.selectMethod(matchingMethod);
}
}
}