dynamic theme, basic category settings

This commit is contained in:
2024-02-25 13:22:45 +01:00
parent 2006ebf5cb
commit 2b53d1ab74
20 changed files with 372 additions and 146 deletions

View File

@@ -172,10 +172,7 @@ class AccountBloc extends Bloc<AccountEvent, AccountState> {
_onAccountEditLabel(AccountEditLabel event, Emitter<AccountState> emit) async {
Account account = event.account;
account.label = event.label;
emit(
state.copyWith(await _saveAccount(account))
);
// TODO check for existance, rename every transaction
}
_onAccountEditSaving(AccountEditSaving event, Emitter<AccountState> emit) async {

View File

@@ -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() }
);
}
}

View File

@@ -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 {}

View File

@@ -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 {}