95 lines
2.8 KiB
Dart
95 lines
2.8 KiB
Dart
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>[];
|
|
_filteredTransactions = source.where((tx) {
|
|
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 statusMatch && typeMatch && dateMatch;
|
|
}).toList();
|
|
|
|
if (notify) notifyListeners();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_provider?.removeListener(_onProviderChanged);
|
|
super.dispose();
|
|
}
|
|
}
|