Basic budget sliders

This commit is contained in:
2024-02-25 19:20:18 +01:00
parent 2b53d1ab74
commit 979fecb60a
10 changed files with 219 additions and 71 deletions

View File

@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:tunas/repositories/metadata/models/budget.dart';
@@ -11,6 +13,11 @@ class BudgetBloc extends Bloc<BudgetEvent, BudgetState> {
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()
@@ -24,4 +31,68 @@ class BudgetBloc extends Bloc<BudgetEvent, BudgetState> {
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),
);
}
}