refactor of money utils with new money2 package

This commit is contained in:
Arseni
2026-03-13 03:17:29 +03:00
parent b4eb1437f6
commit 0091191d97
72 changed files with 453 additions and 982 deletions

View File

@@ -1,102 +0,0 @@
import 'package:flutter/material.dart';
import 'package:pshared/models/payment/status.dart';
import 'package:pweb/models/wallet/wallet_transaction.dart';
import 'package:pweb/providers/wallet_transactions.dart';
class WalletTransactionsController extends ChangeNotifier {
List<WalletTransaction> _filteredTransactions = [];
DateTimeRange? _dateRange;
final Set<OperationStatus> _selectedStatuses = {};
final Set<WalletTransactionType> _selectedTypes = {};
WalletTransactionsProvider? _provider;
List<WalletTransaction> get transactions =>
_provider?.transactions ?? const [];
List<WalletTransaction> get filteredTransactions => _filteredTransactions;
DateTimeRange? get dateRange => _dateRange;
Set<OperationStatus> get selectedStatuses => _selectedStatuses;
Set<WalletTransactionType> get selectedTypes => _selectedTypes;
bool get isLoading => _provider?.isLoading ?? false;
String? get error => _provider?.error;
bool get hasFilters =>
_dateRange != null ||
_selectedStatuses.isNotEmpty ||
_selectedTypes.isNotEmpty;
void update(WalletTransactionsProvider provider) {
if (identical(_provider, provider)) return;
_provider?.removeListener(_onProviderChanged);
_provider = provider;
_provider?.addListener(_onProviderChanged);
_rebuildFiltered(notify: false);
notifyListeners();
}
void setDateRange(DateTimeRange? range) {
_dateRange = range;
_rebuildFiltered();
}
void toggleStatus(OperationStatus status) {
if (_selectedStatuses.contains(status)) {
_selectedStatuses.remove(status);
} else {
_selectedStatuses.add(status);
}
_rebuildFiltered();
}
void toggleType(WalletTransactionType type) {
if (_selectedTypes.contains(type)) {
_selectedTypes.remove(type);
} else {
_selectedTypes.add(type);
}
_rebuildFiltered();
}
void resetFilters() {
_dateRange = null;
_selectedStatuses.clear();
_selectedTypes.clear();
_rebuildFiltered();
}
void _onProviderChanged() {
_rebuildFiltered();
}
void _rebuildFiltered({bool notify = true}) {
final source = _provider?.transactions ?? const <WalletTransaction>[];
final activeWalletId = _provider?.walletId;
_filteredTransactions = source.where((tx) {
final walletMatch =
activeWalletId == null || tx.walletId == activeWalletId;
final statusMatch =
_selectedStatuses.isEmpty || _selectedStatuses.contains(tx.status);
final typeMatch =
_selectedTypes.isEmpty || _selectedTypes.contains(tx.type);
final dateMatch =
_dateRange == null ||
(tx.date.isAfter(
_dateRange!.start.subtract(const Duration(seconds: 1)),
) &&
tx.date.isBefore(
_dateRange!.end.add(const Duration(seconds: 1)),
));
return walletMatch && statusMatch && typeMatch && dateMatch;
}).toList();
if (notify) notifyListeners();
}
@override
void dispose() {
_provider?.removeListener(_onProviderChanged);
super.dispose();
}
}

View File

@@ -1,10 +1,11 @@
import 'package:money2/money2.dart';
import 'package:flutter/material.dart';
import 'package:pshared/controllers/payment/source.dart';
import 'package:pshared/models/payment/settlement_mode.dart';
import 'package:pshared/provider/payment/amount.dart';
import 'package:pshared/utils/currency.dart';
import 'package:pshared/utils/money.dart';
import 'package:pweb/models/payment/amount/mode.dart';
@@ -22,7 +23,7 @@ class PaymentAmountFieldController extends ChangeNotifier {
PaymentAmountFieldController({required double? initialAmount})
: textController = TextEditingController(
text: initialAmount == null ? '' : amountToString(initialAmount),
text: initialAmount == null ? '' : initialAmount.toString(),
);
PaymentAmountMode get mode => _mode;
@@ -122,18 +123,14 @@ class PaymentAmountFieldController extends ChangeNotifier {
};
double? _parseAmount(String value) {
final parsed = parseMoneyAmount(
value.replaceAll(',', '.'),
fallback: double.nan,
);
return parsed.isNaN ? null : parsed;
return double.tryParse(value.replaceAll(',', '.').trim());
}
void _syncTextWithAmount(double? amount) {
final parsedText = _parseAmount(textController.text);
if (parsedText == amount) return;
final nextText = amount == null ? '' : amountToString(amount);
final nextText = amount == null ? '' : _formatAmount(amount);
_isSyncingText = true;
textController.value = TextEditingValue(
text: nextText,
@@ -142,6 +139,12 @@ class PaymentAmountFieldController extends ChangeNotifier {
_isSyncingText = false;
}
String _formatAmount(double amount) {
final currency = money2CurrencyFromCode(activeCurrencyCode);
if (currency == null) return amount.toString();
return Money.fromNumWithCurrency(amount, currency).toDecimal().toString();
}
@override
void dispose() {
_provider?.removeListener(_handleProviderChanged);

View File

@@ -29,5 +29,4 @@ class RecentPaymentsController extends ChangeNotifier {
_recent = sortOperations(operations).take(5).toList();
notifyListeners();
}
}

View File

@@ -2,8 +2,9 @@ import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:money2/money2.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';
@@ -17,6 +18,7 @@ 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;