import 'dart:convert'; import 'package:rxdart/subjects.dart'; import 'package:tunas/clients/storage/storage_client.dart'; import 'package:tunas/repositories/account/models/account.dart'; import 'package:tunas/repositories/account/models/budget.dart'; import 'package:tunas/repositories/account/models/category.dart'; import 'package:tunas/repositories/account/models/transaction.dart'; class AccountRepository { String accountFile = 'tunas_main_account.json'; Account? currentAccount; final StorageClient _storageClient; final _transactionsController = BehaviorSubject>.seeded(const []); final _categoriesController = BehaviorSubject>.seeded(const []); final _budgetController = BehaviorSubject>.seeded(const []); final _subAccountController = BehaviorSubject>.seeded(const {}); AccountRepository({ required storageClient, }) : _storageClient = storageClient { init(); } init() async { final account = await getAccount(); _broadcastAccountData(account); } Stream> getTransactionsStream() { return _transactionsController.asBroadcastStream(); } Stream> getCategoriesStream() { return _categoriesController.asBroadcastStream(); } Stream> getBudgetsStream() { return _budgetController.asBroadcastStream(); } Stream> getSubAccountsStream() { return _subAccountController.asBroadcastStream(); } Future getAccount() async { String json = await _storageClient.load(accountFile); Map accountJson = jsonDecode(json); return Account.fromJson(accountJson); } saveAccount(Account account) async { await _storageClient.save(accountFile, jsonEncode(account.toJson())); _broadcastAccountData(account); } saveTransactions(List transactions) async { Account? account = currentAccount; if (account == null) { throw Error(); } else {account.transactions = transactions; await saveAccount(account); } } deleteAccount() async { await _storageClient.delete(accountFile); _broadcastAccountData(Account()); } _broadcastAccountData(Account account) { currentAccount = account; _transactionsController.add(account.transactions); _categoriesController.add(account.categories); _budgetController.add(account.budgets); _subAccountController.add(account.subAccounts); } }