Files
sendico/frontend/pshared/lib/controllers/wallets.dart
2026-01-22 14:15:14 +01:00

130 lines
3.7 KiB
Dart

import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
import 'package:pshared/models/payment/wallet.dart';
import 'package:pshared/provider/payment/wallets.dart';
class WalletsController with ChangeNotifier {
late WalletsProvider _wallets;
// If you want per-org isolation, we reset when org changes.
String? _orgRef;
// Visibility is UI-only: store hidden wallet ids here.
final Set<String> _hiddenWalletIds = <String>{};
String? _selectedWalletId;
bool get isLoading => _wallets.isLoading;
Exception? get error => _wallets.error;
/// Inject / update dependency (use ProxyProvider).
void update(WalletsProvider wallets) {
_wallets = wallets;
final nextOrgRef = wallets.organizationId;
final orgChanged = nextOrgRef != _orgRef;
if (orgChanged) {
_orgRef = nextOrgRef;
_hiddenWalletIds.clear();
_selectedWalletId = null;
}
// Prune hidden ids for wallets that no longer exist.
final ids = wallets.wallets.map((w) => w.id).toSet();
final beforeHiddenLen = _hiddenWalletIds.length;
_hiddenWalletIds.removeWhere((id) => !ids.contains(id));
// Ensure selection is valid.
final beforeSelected = _selectedWalletId;
_selectedWalletId = _resolveSelectedId(
currentId: _selectedWalletId,
wallets: wallets.wallets,
hiddenIds: _hiddenWalletIds,
);
final selectionChanged = beforeSelected != _selectedWalletId;
final hiddenChanged = beforeHiddenLen != _hiddenWalletIds.length;
if (orgChanged || selectionChanged || hiddenChanged) {
notifyListeners();
}
}
List<Wallet> get wallets => _wallets.wallets;
bool isHidden(String walletId) => _hiddenWalletIds.contains(walletId);
List<Wallet> get visibleWallets =>
wallets.where((w) => !_hiddenWalletIds.contains(w.id)).toList(growable: false);
Wallet? get selectedWallet {
final id = _selectedWalletId;
if (id == null) return null;
return wallets.firstWhereOrNull((w) => w.id == id);
}
String? get selectedWalletId => _selectedWalletId;
void selectWallet(Wallet wallet) => selectWalletId(wallet.id);
void selectWalletId(String walletId) {
if (_selectedWalletId == walletId) return;
// Allow selecting hidden wallet if you want; if not, block it:
// if (isHidden(walletId)) return;
_selectedWalletId = walletId;
notifyListeners();
}
void toggleVisibility(String walletId) {
final existed = _hiddenWalletIds.remove(walletId);
if (!existed) _hiddenWalletIds.add(walletId);
// If we hid the selected wallet, move selection to next visible.
_selectedWalletId = _resolveSelectedId(
currentId: _selectedWalletId,
wallets: wallets,
hiddenIds: _hiddenWalletIds,
);
notifyListeners();
}
void showAll() {
if (_hiddenWalletIds.isEmpty) return;
_hiddenWalletIds.clear();
_selectedWalletId = _resolveSelectedId(
currentId: _selectedWalletId,
wallets: wallets,
hiddenIds: _hiddenWalletIds,
);
notifyListeners();
}
String? _resolveSelectedId({
required String? currentId,
required List<Wallet> wallets,
required Set<String> hiddenIds,
}) {
if (wallets.isEmpty) return null;
// Keep current if exists and is not hidden.
if (currentId != null) {
final exists = wallets.any((w) => w.id == currentId);
if (exists && !hiddenIds.contains(currentId)) return currentId;
}
// Pick first visible.
final firstVisible = wallets.firstWhereOrNull((w) => !hiddenIds.contains(w.id));
if (firstVisible != null) return firstVisible.id;
// All hidden: fall back to first wallet id (or return null if you prefer).
return wallets.first.id;
}
}