import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../shared/models/transaction.dart'; import '../../shared/services/storage_service.dart'; final sharedPreferencesProvider = Provider((ref) { throw UnimplementedError('Override in main'); }); final storageServiceProvider = Provider((ref) { return StorageService(ref.watch(sharedPreferencesProvider)); }); final transactionsProvider = StateNotifierProvider>((ref) { final storage = ref.watch(storageServiceProvider); return TransactionsNotifier(storage); }); class TransactionsNotifier extends StateNotifier> { final StorageService _storage; TransactionsNotifier(this._storage) : super(_storage.loadTransactions()); Future add(Transaction transaction) async { await _storage.addTransaction(transaction); state = _storage.loadTransactions(); } Future delete(String id) async { await _storage.deleteTransaction(id); state = _storage.loadTransactions(); } } // Derived providers final totalBalanceProvider = Provider((ref) { final txs = ref.watch(transactionsProvider); return txs.fold(0.0, (sum, t) { return t.type == TransactionType.income ? sum + t.amount : sum - t.amount; }); }); final totalIncomeProvider = Provider((ref) { return ref .watch(transactionsProvider) .where((t) => t.type == TransactionType.income) .fold(0.0, (sum, t) => sum + t.amount); }); final totalExpenseProvider = Provider((ref) { return ref .watch(transactionsProvider) .where((t) => t.type == TransactionType.expense) .fold(0.0, (sum, t) => sum + t.amount); }); final recentTransactionsProvider = Provider>((ref) { final txs = List.from(ref.watch(transactionsProvider)); txs.sort((a, b) => b.date.compareTo(a.date)); return txs.take(20).toList(); });