Files
sendico/frontend/pweb/lib/providers/payment_flow.dart

111 lines
2.6 KiB
Dart

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;
}
}