dynamic theme, basic category settings
This commit is contained in:
@@ -1,18 +1,35 @@
|
||||
import 'dart:async';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:tunas/repositories/metadata/metadata_repository.dart';
|
||||
import 'package:tunas/repositories/metadata/models/category.dart';
|
||||
import 'package:tunas/repositories/transactions/models/transaction.dart';
|
||||
import 'package:tunas/repositories/transactions/transactions_repository.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
part 'category_event.dart';
|
||||
part 'category_state.dart';
|
||||
|
||||
class CategoryBloc extends Bloc<CategoryEvent, CategoryState> {
|
||||
final MetadataRepository _metadataRepository;
|
||||
final TransactionsRepository _transactionsRepository;
|
||||
|
||||
CategoryBloc({required MetadataRepository metadataRepository}) : _metadataRepository = metadataRepository, super(const CategoryState()) {
|
||||
CategoryBloc({
|
||||
required MetadataRepository metadataRepository,
|
||||
required TransactionsRepository transactionsRepository,
|
||||
})
|
||||
: _metadataRepository = metadataRepository,
|
||||
_transactionsRepository = transactionsRepository,
|
||||
super(const CategoryState()) {
|
||||
on<CategoriesLoad>(_onCategoriesLoad);
|
||||
on<CategoryEditColor>(_onCategoryEditColor);
|
||||
on<CategoryEditTransfert>(_onCategoryEditTransfert);
|
||||
on<CategoryEditEssential>(_onCategoryEditEssential);
|
||||
on<CategoryEditLabel>(_onCategoryEditLabel);
|
||||
on<CategoryRemove>(_onCategoryRemove);
|
||||
on<CategoryAdd>(_onCategoryAdd);
|
||||
|
||||
_metadataRepository
|
||||
.getCategoriesStream()
|
||||
@@ -22,9 +39,81 @@ class CategoryBloc extends Bloc<CategoryEvent, CategoryState> {
|
||||
_onCategoriesLoad(
|
||||
CategoriesLoad event, Emitter<CategoryState> emit
|
||||
) {
|
||||
emit(state.copyWith(
|
||||
categories: event.categories,
|
||||
categoriesColors: { for (var category in event.categories) category.label : category.rgbToColor() }
|
||||
));
|
||||
emit(_computeState(event.categories));
|
||||
}
|
||||
|
||||
FutureOr<void> _onCategoryEditColor(CategoryEditColor event, Emitter<CategoryState> emit) async {
|
||||
Category category = event.category;
|
||||
category.color = event.color;
|
||||
emit(_computeState(await _saveCategory(category)));
|
||||
}
|
||||
|
||||
FutureOr<void> _onCategoryEditTransfert(CategoryEditTransfert event, Emitter<CategoryState> emit) async {
|
||||
Category category = event.category;
|
||||
category.transfert = event.transfert;
|
||||
emit(_computeState(await _saveCategory(category)));
|
||||
}
|
||||
|
||||
FutureOr<void> _onCategoryEditEssential(CategoryEditEssential event, Emitter<CategoryState> emit) async {
|
||||
Category category = event.category;
|
||||
category.essential = event.essential;
|
||||
emit(_computeState(await _saveCategory(category)));
|
||||
}
|
||||
|
||||
FutureOr<void> _onCategoryEditLabel(CategoryEditLabel event, Emitter<CategoryState> emit) async {
|
||||
// TODO check for existance, rename every transaction
|
||||
}
|
||||
|
||||
FutureOr<void> _onCategoryRemove(CategoryRemove event, Emitter<CategoryState> emit) async {
|
||||
CategoryState originalCategoryState = state.copyWith();
|
||||
Category categoryToRemove = event.category;
|
||||
List<Category> categories = state.categories;
|
||||
List<Transaction> transactions = _transactionsRepository.getTransactions();
|
||||
|
||||
if (transactions.any((transaction) => transaction.category == categoryToRemove.label)) {
|
||||
emit(CategoryRemoveFail());
|
||||
emit(originalCategoryState);
|
||||
} else {
|
||||
categories.removeWhere((category) => category.label == categoryToRemove.label);
|
||||
emit(CategoryRemoveSucess());
|
||||
emit(_computeState(await _metadataRepository.saveCategories(categories)));
|
||||
}
|
||||
}
|
||||
|
||||
FutureOr<void> _onCategoryAdd(CategoryAdd event, Emitter<CategoryState> emit) async {
|
||||
String uuid = const Uuid().v8();
|
||||
Category category = Category(
|
||||
label: 'Category $uuid',
|
||||
color: 'FF74feff',
|
||||
);
|
||||
|
||||
emit(_computeState(await _saveCategory(category)));
|
||||
}
|
||||
|
||||
_saveCategory(Category categoryToSave) async {
|
||||
List<Category> categories = _metadataRepository.getCategories();
|
||||
|
||||
try {
|
||||
Category categoryFound = categories.firstWhere((category) => category.label == categoryToSave.label);
|
||||
categoryFound.color = categoryToSave.color;
|
||||
categoryFound.essential = categoryToSave.essential;
|
||||
categoryFound.transfert = categoryToSave.transfert;
|
||||
} catch (e) {
|
||||
if (categories.isEmpty) {
|
||||
categories = [categoryToSave];
|
||||
} else {
|
||||
categories.add(categoryToSave);
|
||||
}
|
||||
}
|
||||
|
||||
await _metadataRepository.saveCategories(categories);
|
||||
return categories;
|
||||
}
|
||||
|
||||
CategoryState _computeState(List<Category> categories) {
|
||||
return state.copyWith(
|
||||
categories: categories,
|
||||
categoriesColors: { for (var category in categories) category.label : category.rgbToColor() }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,4 +13,55 @@ final class CategoriesLoad extends CategoryEvent {
|
||||
|
||||
@override
|
||||
List<Object> get props => [categories];
|
||||
}
|
||||
}
|
||||
|
||||
final class CategoryEditColor extends CategoryEvent {
|
||||
final Category category;
|
||||
final String color;
|
||||
|
||||
const CategoryEditColor(this.category, this.color);
|
||||
|
||||
@override
|
||||
List<Object> get props => [category, color];
|
||||
}
|
||||
|
||||
final class CategoryEditTransfert extends CategoryEvent {
|
||||
final Category category;
|
||||
final bool transfert;
|
||||
|
||||
const CategoryEditTransfert(this.category, this.transfert);
|
||||
|
||||
@override
|
||||
List<Object> get props => [category, transfert];
|
||||
}
|
||||
|
||||
final class CategoryEditEssential extends CategoryEvent {
|
||||
final Category category;
|
||||
final bool essential;
|
||||
|
||||
const CategoryEditEssential(this.category, this.essential);
|
||||
|
||||
@override
|
||||
List<Object> get props => [category, essential];
|
||||
}
|
||||
|
||||
final class CategoryEditLabel extends CategoryEvent {
|
||||
final Category category;
|
||||
final String label;
|
||||
|
||||
const CategoryEditLabel(this.category, this.label);
|
||||
|
||||
@override
|
||||
List<Object> get props => [category, label];
|
||||
}
|
||||
|
||||
final class CategoryRemove extends CategoryEvent {
|
||||
final Category category;
|
||||
|
||||
const CategoryRemove(this.category);
|
||||
|
||||
@override
|
||||
List<Object> get props => [category];
|
||||
}
|
||||
|
||||
final class CategoryAdd extends CategoryEvent {}
|
||||
@@ -1,6 +1,6 @@
|
||||
part of 'category_bloc.dart';
|
||||
|
||||
final class CategoryState extends Equatable {
|
||||
final class CategoryState {
|
||||
final List<Category> categories;
|
||||
final Map<String, Color> categoriesColors;
|
||||
|
||||
@@ -18,7 +18,7 @@ final class CategoryState extends Equatable {
|
||||
categoriesColors: categoriesColors ?? this.categoriesColors,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object> get props => [categories, categoriesColors];
|
||||
}
|
||||
|
||||
final class CategoryRemoveFail extends CategoryState {}
|
||||
final class CategoryRemoveSucess extends CategoryState {}
|
||||
Reference in New Issue
Block a user