Basic budget sliders
This commit is contained in:
@@ -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),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -13,4 +13,35 @@ final class BudgetsLoad extends BudgetEvent {
|
||||
|
||||
@override
|
||||
List<Object> get props => [budgets];
|
||||
}
|
||||
}
|
||||
|
||||
final class BudgetAdd extends BudgetEvent {
|
||||
final String label;
|
||||
|
||||
const BudgetAdd(this.label);
|
||||
|
||||
@override
|
||||
List<Object> get props => [label];
|
||||
}
|
||||
|
||||
final class BudgetRemove extends BudgetEvent {
|
||||
final Budget budget;
|
||||
|
||||
const BudgetRemove(this.budget);
|
||||
|
||||
@override
|
||||
List<Object> get props => [budget];
|
||||
}
|
||||
|
||||
final class BudgetSetValue extends BudgetEvent {
|
||||
final Budget budget;
|
||||
final double value;
|
||||
|
||||
const BudgetSetValue(this.budget, this.value);
|
||||
|
||||
@override
|
||||
List<Object> get props => [budget, value];
|
||||
}
|
||||
|
||||
final class BudgetCompareNext extends BudgetEvent {}
|
||||
final class BudgetComparePrevious extends BudgetEvent {}
|
||||
@@ -1,20 +1,25 @@
|
||||
part of 'budget_bloc.dart';
|
||||
|
||||
final class BudgetState extends Equatable {
|
||||
final class BudgetState {
|
||||
final List<Budget> budgets;
|
||||
final double initialBudget;
|
||||
final double remainingBudget;
|
||||
|
||||
const BudgetState({
|
||||
this.budgets = const [],
|
||||
this.initialBudget = 2300.0,
|
||||
this.remainingBudget = 2300.0,
|
||||
});
|
||||
|
||||
BudgetState copyWith({
|
||||
List<Budget>? budgets,
|
||||
double? initialBudget,
|
||||
double? remainingBudget,
|
||||
}) {
|
||||
return BudgetState(
|
||||
budgets: budgets ?? this.budgets,
|
||||
initialBudget: initialBudget ?? this.initialBudget,
|
||||
remainingBudget: remainingBudget ?? this.remainingBudget,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object?> get props => [budgets];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user