98 lines
3.0 KiB
Dart
98 lines
3.0 KiB
Dart
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<BudgetEvent, BudgetState> {
|
|
final MetadataRepository _metadataRepository;
|
|
|
|
BudgetBloc({required MetadataRepository metadataRepository}) : _metadataRepository = metadataRepository, super(const BudgetState()) {
|
|
on<BudgetsLoad>(_onBudgetsLoad);
|
|
on<BudgetAdd>(_onBudgetAdd);
|
|
on<BudgetRemove>(_onBudgetRemove);
|
|
on<BudgetSetValue>(_onBudgetSetValue);
|
|
on<BudgetCompareNext>(_onBudgetCompareNext);
|
|
on<BudgetComparePrevious>(_onBudgetComparePrevious);
|
|
|
|
_metadataRepository
|
|
.getBudgetsStream()
|
|
.listen((budgets) => add(BudgetsLoad(budgets)));
|
|
}
|
|
|
|
_onBudgetsLoad(
|
|
BudgetsLoad event, Emitter<BudgetState> emit
|
|
) {
|
|
emit(state.copyWith(
|
|
budgets: event.budgets,
|
|
));
|
|
}
|
|
|
|
FutureOr<void> _onBudgetAdd(BudgetAdd event, Emitter<BudgetState> emit) async {
|
|
Budget budget = Budget(
|
|
label: event.label,
|
|
);
|
|
|
|
emit(_computeState(await _saveBudget(budget)));
|
|
}
|
|
|
|
FutureOr<void> _onBudgetRemove(BudgetRemove event, Emitter<BudgetState> emit) async {
|
|
List<Budget> budgets = _metadataRepository.getBudgets();
|
|
Budget budgetToRemove = event.budget;
|
|
|
|
budgets.removeWhere((budget) => budget.label == budgetToRemove.label);
|
|
emit(_computeState(await _metadataRepository.saveBudgets(budgets)));
|
|
}
|
|
|
|
FutureOr<void> _onBudgetSetValue(BudgetSetValue event, Emitter<BudgetState> 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<void> _onBudgetCompareNext(BudgetCompareNext event, Emitter<BudgetState> emit) {
|
|
}
|
|
|
|
FutureOr<void> _onBudgetComparePrevious(BudgetComparePrevious event, Emitter<BudgetState> emit) {
|
|
}
|
|
|
|
Future<List<Budget>> _saveBudget(Budget budgetToSave) async {
|
|
List<Budget> 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<Budget> budgets) {
|
|
return state.copyWith(
|
|
budgets: budgets,
|
|
remainingBudget: state.initialBudget - budgets.map((budget) => budget.value).reduce((value, element) => value + element),
|
|
);
|
|
}
|
|
} |