import 'dart:async'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:tunas/repositories/metadata/models/budget.dart'; import 'package:tunas/repositories/metadata/metadata_repository.dart'; part 'budget_event.dart'; part 'budget_state.dart'; class BudgetBloc extends Bloc { final MetadataRepository _metadataRepository; BudgetBloc({required MetadataRepository metadataRepository}) : _metadataRepository = metadataRepository, super(const BudgetState()) { on(_onBudgetsLoad); on(_onBudgetAdd); on(_onBudgetRemove); on(_onBudgetSetValue); on(_onBudgetCompareNext); on(_onBudgetComparePrevious); _metadataRepository .getBudgetsStream() .listen((budgets) => add(BudgetsLoad(budgets))); } _onBudgetsLoad( BudgetsLoad event, Emitter emit ) { emit(state.copyWith( budgets: event.budgets, )); } FutureOr _onBudgetAdd(BudgetAdd event, Emitter emit) async { Budget budget = Budget( label: event.label, ); emit(_computeState(await _saveBudget(budget))); } FutureOr _onBudgetRemove(BudgetRemove event, Emitter emit) async { List budgets = _metadataRepository.getBudgets(); Budget budgetToRemove = event.budget; budgets.removeWhere((budget) => budget.label == budgetToRemove.label); emit(_computeState(await _metadataRepository.saveBudgets(budgets))); } FutureOr _onBudgetSetValue(BudgetSetValue event, Emitter emit) async { Budget budgetToUpdate = event.budget; if (state.remainingBudget - (event.value - budgetToUpdate.value) < 0) { return; } // if (state.remainingBudget - event.value < 0 && state.remainingBudget < 10) { // budgetToUpdate.value = // } else { // budgetToUpdate.value = event.value; // } budgetToUpdate.value = event.value; emit(_computeState(await _saveBudget(budgetToUpdate))); } FutureOr _onBudgetCompareNext(BudgetCompareNext event, Emitter emit) { } FutureOr _onBudgetComparePrevious(BudgetComparePrevious event, Emitter emit) { } Future> _saveBudget(Budget budgetToSave) async { List budgets = _metadataRepository.getBudgets(); try { Budget budgetFound = budgets.firstWhere((category) => category.label == budgetToSave.label); budgetFound.value = budgetToSave.value; } catch (e) { if (budgets.isEmpty) { budgets = [budgetToSave]; } else { budgets.add(budgetToSave); } } // _metadataRepository.saveBudgets(budgets); return budgets; } BudgetState _computeState(List budgets) { return state.copyWith( budgets: budgets, remainingBudget: state.initialBudget - budgets.map((budget) => budget.value).reduce((value, element) => value + element), ); } }