Fixed search field in payment page and cleaned up payment flow #187
@@ -3,18 +3,22 @@ import 'package:flutter/foundation.dart';
|
|||||||
import 'package:pshared/models/payment/methods/data.dart';
|
import 'package:pshared/models/payment/methods/data.dart';
|
||||||
import 'package:pshared/models/payment/type.dart';
|
import 'package:pshared/models/payment/type.dart';
|
||||||
import 'package:pshared/models/recipient/recipient.dart';
|
import 'package:pshared/models/recipient/recipient.dart';
|
||||||
|
import 'package:pshared/provider/recipient/provider.dart';
|
||||||
import 'package:pshared/provider/recipient/pmethods.dart';
|
import 'package:pshared/provider/recipient/pmethods.dart';
|
||||||
|
|
||||||
|
|
||||||
class PaymentFlowProvider extends ChangeNotifier {
|
class PaymentFlowProvider extends ChangeNotifier {
|
||||||
PaymentType _selectedType;
|
PaymentType _selectedType;
|
||||||
|
PaymentType? _preferredType;
|
||||||
PaymentMethodData? _manualPaymentData;
|
PaymentMethodData? _manualPaymentData;
|
||||||
MethodMap _availableTypes = {};
|
MethodMap _availableTypes = {};
|
||||||
Recipient? _recipient;
|
Recipient? _recipient;
|
||||||
|
|
||||||
PaymentFlowProvider({
|
PaymentFlowProvider({
|
||||||
required PaymentType initialType,
|
required PaymentType initialType,
|
||||||
}) : _selectedType = initialType;
|
PaymentType? preferredType,
|
||||||
|
}) : _selectedType = initialType,
|
||||||
|
_preferredType = preferredType ?? initialType;
|
||||||
|
|
||||||
PaymentType get selectedType => _selectedType;
|
PaymentType get selectedType => _selectedType;
|
||||||
PaymentMethodData? get manualPaymentData => _manualPaymentData;
|
PaymentMethodData? get manualPaymentData => _manualPaymentData;
|
||||||
@@ -29,30 +33,17 @@ class PaymentFlowProvider extends ChangeNotifier {
|
|||||||
PaymentMethodData? get selectedPaymentData =>
|
PaymentMethodData? get selectedPaymentData =>
|
||||||
hasRecipient ? _availableTypes[_selectedType] : _manualPaymentData;
|
hasRecipient ? _availableTypes[_selectedType] : _manualPaymentData;
|
||||||
|
|
||||||
void syncWith({
|
void update(
|
||||||
required Recipient? recipient,
|
RecipientsProvider recipientsProvider,
|
||||||
required PaymentMethodsProvider methodsProvider,
|
PaymentMethodsProvider methodsProvider,
|
||||||
PaymentType? preferredType,
|
) =>
|
||||||
}) =>
|
|
||||||
_applyState(
|
_applyState(
|
||||||
recipient: recipient,
|
recipient: recipientsProvider.currentObject,
|
||||||
availableTypes: methodsProvider.availableTypesForRecipient(recipient),
|
availableTypes: methodsProvider.availableTypesForRecipient(recipientsProvider.currentObject),
|
||||||
preferredType: preferredType,
|
preferredType: _preferredType,
|
||||||
forceResetManualData: false,
|
forceResetManualData: false,
|
||||||
);
|
);
|
||||||
|
|
||||||
void reset({
|
|
||||||
required Recipient? recipient,
|
|
||||||
required PaymentMethodsProvider methodsProvider,
|
|
||||||
PaymentType? preferredType,
|
|
||||||
}) =>
|
|
||||||
_applyState(
|
|
||||||
recipient: recipient,
|
|
||||||
availableTypes: methodsProvider.availableTypesForRecipient(recipient),
|
|
||||||
preferredType: preferredType,
|
|
||||||
forceResetManualData: true,
|
|
||||||
);
|
|
||||||
|
|
||||||
void selectType(PaymentType type, {bool resetManualData = false}) {
|
void selectType(PaymentType type, {bool resetManualData = false}) {
|
||||||
if (_selectedType == type && (!resetManualData || _manualPaymentData == null)) {
|
if (_selectedType == type && (!resetManualData || _manualPaymentData == null)) {
|
||||||
return;
|
return;
|
||||||
@@ -70,6 +61,20 @@ class PaymentFlowProvider extends ChangeNotifier {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setPreferredType(PaymentType? preferredType) {
|
||||||
|
if (_preferredType == preferredType) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_preferredType = preferredType;
|
||||||
|
_applyState(
|
||||||
|
recipient: _recipient,
|
||||||
|
availableTypes: _availableTypes,
|
||||||
|
preferredType: _preferredType,
|
||||||
|
forceResetManualData: false,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
PaymentType _resolveSelectedType({
|
PaymentType _resolveSelectedType({
|
||||||
required Recipient? recipient,
|
required Recipient? recipient,
|
||||||
required MethodMap availableTypes,
|
required MethodMap availableTypes,
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ import 'package:pshared/provider/recipient/provider.dart';
|
|||||||
import 'package:pshared/provider/recipient/pmethods.dart';
|
import 'package:pshared/provider/recipient/pmethods.dart';
|
||||||
import 'package:pshared/provider/payment/wallets.dart';
|
import 'package:pshared/provider/payment/wallets.dart';
|
||||||
import 'package:pshared/service/payment/wallets.dart';
|
import 'package:pshared/service/payment/wallets.dart';
|
||||||
|
import 'package:pshared/models/payment/type.dart';
|
||||||
|
|
||||||
import 'package:pweb/app/app.dart';
|
import 'package:pweb/app/app.dart';
|
||||||
import 'package:pweb/app/timeago.dart';
|
import 'package:pweb/app/timeago.dart';
|
||||||
import 'package:pweb/providers/carousel.dart';
|
import 'package:pweb/providers/carousel.dart';
|
||||||
import 'package:pshared/models/payment/type.dart';
|
|
||||||
import 'package:pweb/providers/operatioins.dart';
|
import 'package:pweb/providers/operatioins.dart';
|
||||||
import 'package:pweb/providers/two_factor.dart';
|
import 'package:pweb/providers/two_factor.dart';
|
||||||
import 'package:pweb/providers/upload_history.dart';
|
import 'package:pweb/providers/upload_history.dart';
|
||||||
@@ -92,10 +92,13 @@ void main() async {
|
|||||||
ChangeNotifierProvider(
|
ChangeNotifierProvider(
|
||||||
create: (_) => WalletTransactionsProvider(MockWalletTransactionsService())..load(),
|
create: (_) => WalletTransactionsProvider(MockWalletTransactionsService())..load(),
|
||||||
),
|
),
|
||||||
ChangeNotifierProvider(
|
ChangeNotifierProxyProvider2<RecipientsProvider, PaymentMethodsProvider, PaymentFlowProvider>(
|
||||||
create: (_) => PaymentFlowProvider(initialType: PaymentType.bankAccount),
|
create: (_) => PaymentFlowProvider(initialType: PaymentType.bankAccount),
|
||||||
|
update: (context, recipients, methods, provider) => provider!..update(
|
||||||
|
recipients,
|
||||||
|
methods,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
ChangeNotifierProvider(
|
ChangeNotifierProvider(
|
||||||
create: (_) => OperationProvider(OperationService())..loadOperations(),
|
create: (_) => OperationProvider(OperationService())..loadOperations(),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import 'package:pshared/provider/recipient/provider.dart';
|
|||||||
import 'package:pshared/models/payment/wallet.dart';
|
import 'package:pshared/models/payment/wallet.dart';
|
||||||
import 'package:pshared/provider/payment/wallets.dart';
|
import 'package:pshared/provider/payment/wallets.dart';
|
||||||
|
|
||||||
|
|
||||||
import 'package:pweb/pages/payment_methods/payment_page/body.dart';
|
import 'package:pweb/pages/payment_methods/payment_page/body.dart';
|
||||||
import 'package:pweb/widgets/sidebar/destinations.dart';
|
import 'package:pweb/widgets/sidebar/destinations.dart';
|
||||||
import 'package:pweb/services/posthog.dart';
|
import 'package:pweb/services/posthog.dart';
|
||||||
@@ -59,14 +58,8 @@ class _PaymentPageState extends State<PaymentPage> {
|
|||||||
void _initializePaymentPage() {
|
void _initializePaymentPage() {
|
||||||
final flowProvider = context.read<PaymentFlowProvider>();
|
final flowProvider = context.read<PaymentFlowProvider>();
|
||||||
final methodsProvider = context.read<PaymentMethodsProvider>();
|
final methodsProvider = context.read<PaymentMethodsProvider>();
|
||||||
_handleWalletAutoSelection(methodsProvider, flowProvider);
|
flowProvider.setPreferredType(widget.initialPaymentType);
|
||||||
|
_handleWalletAutoSelection(methodsProvider);
|
||||||
final recipient = context.read<RecipientsProvider>().currentObject;
|
|
||||||
flowProvider.syncWith(
|
|
||||||
recipient: recipient,
|
|
||||||
methodsProvider: methodsProvider,
|
|
||||||
preferredType: widget.initialPaymentType,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _handleSearchChanged(String query) {
|
void _handleSearchChanged(String query) {
|
||||||
@@ -74,30 +67,14 @@ class _PaymentPageState extends State<PaymentPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _handleRecipientSelected(Recipient recipient) {
|
void _handleRecipientSelected(Recipient recipient) {
|
||||||
final flowProvider = context.read<PaymentFlowProvider>();
|
|
||||||
final recipientProvider = context.read<RecipientsProvider>();
|
final recipientProvider = context.read<RecipientsProvider>();
|
||||||
final methodsProvider = context.read<PaymentMethodsProvider>();
|
|
||||||
|
|
||||||
recipientProvider.setCurrentObject(recipient.id);
|
recipientProvider.setCurrentObject(recipient.id);
|
||||||
flowProvider.reset(
|
|
||||||
recipient: recipient,
|
|
||||||
methodsProvider: methodsProvider,
|
|
||||||
preferredType: widget.initialPaymentType,
|
|
||||||
);
|
|
||||||
_clearSearchField();
|
_clearSearchField();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _handleRecipientCleared() {
|
void _handleRecipientCleared() {
|
||||||
final flowProvider = context.read<PaymentFlowProvider>();
|
|
||||||
final recipientProvider = context.read<RecipientsProvider>();
|
final recipientProvider = context.read<RecipientsProvider>();
|
||||||
final methodsProvider = context.read<PaymentMethodsProvider>();
|
|
||||||
|
|
||||||
recipientProvider.setCurrentObject(null);
|
recipientProvider.setCurrentObject(null);
|
||||||
flowProvider.reset(
|
|
||||||
recipient: null,
|
|
||||||
methodsProvider: methodsProvider,
|
|
||||||
preferredType: widget.initialPaymentType,
|
|
||||||
);
|
|
||||||
_clearSearchField();
|
_clearSearchField();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,13 +106,6 @@ class _PaymentPageState extends State<PaymentPage> {
|
|||||||
final recipient = context.select<RecipientsProvider, Recipient?>(
|
final recipient = context.select<RecipientsProvider, Recipient?>(
|
||||||
(provider) => provider.currentObject,
|
(provider) => provider.currentObject,
|
||||||
);
|
);
|
||||||
final flowProvider = context.watch<PaymentFlowProvider>();
|
|
||||||
|
|
||||||
flowProvider.syncWith(
|
|
||||||
recipient: recipient,
|
|
||||||
methodsProvider: methodsProvider,
|
|
||||||
preferredType: recipient != null ? widget.initialPaymentType : null,
|
|
||||||
);
|
|
||||||
|
|
||||||
return PaymentPageBody(
|
return PaymentPageBody(
|
||||||
onBack: widget.onBack,
|
onBack: widget.onBack,
|
||||||
@@ -152,18 +122,13 @@ class _PaymentPageState extends State<PaymentPage> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _handleWalletAutoSelection(PaymentMethodsProvider methodsProvider, PaymentFlowProvider flowProvider) {
|
void _handleWalletAutoSelection(PaymentMethodsProvider methodsProvider) {
|
||||||
final wallet = context.read<WalletsProvider>().selectedWallet;
|
final wallet = context.read<WalletsProvider>().selectedWallet;
|
||||||
if (wallet == null) return;
|
if (wallet == null) return;
|
||||||
|
|
||||||
final matchingMethod = _getPaymentMethodForWallet(wallet, methodsProvider);
|
final matchingMethod = _getPaymentMethodForWallet(wallet, methodsProvider);
|
||||||
if (matchingMethod != null) {
|
if (matchingMethod != null) {
|
||||||
methodsProvider.setCurrentObject(matchingMethod.id);
|
methodsProvider.setCurrentObject(matchingMethod.id);
|
||||||
flowProvider.syncWith(
|
|
||||||
recipient: context.read<RecipientsProvider>().currentObject,
|
|
||||||
methodsProvider: methodsProvider,
|
|
||||||
preferredType: widget.initialPaymentType,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user