Refactor CategoryCubit to manage user-specific categories

This commit is contained in:
2025-07-10 18:23:17 +03:00
parent adafdb88f8
commit c829b0e6f5
2 changed files with 46 additions and 39 deletions
+1 -1
View File
@@ -155,7 +155,7 @@ Future<void> initUserSpecificDependencies(String userId) async {
await getIt.unregister<CategoryCubit>();
}
getIt.registerFactory<CategoryCubit>(
() => CategoryCubit(getIt()),
() => CategoryCubit(getIt(), userId), // Добавляем userId
);
// Теги
+45 -38
View File
@@ -1,53 +1,60 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:budget_app/models/category.dart';
import 'package:hive_ce/hive.dart';
import 'package:budget_app/logic/user/user_cubit.dart'; // Импортируем UserCubit
import '../../data/repositories/interfaces/icategory_repository.dart';
import '../../models/category.dart';
import 'category_state.dart';
class CategoryCubit extends Cubit<List<Category>> {
final UserCubit _userCubit; // Добавляем зависимость от UserCubit
final Box<Category> _categoryBox; // Используем Box<Category> для типизации
/// Cubit для управления категориями
/// Изменения:
/// - Добавлено хранение userId в cubit
/// - Упрощена работа с состояниями по аналогии с TagCubit
class CategoryCubit extends Cubit<CategoryState> {
final ICategoryRepository repository;
final String userId; // Храним userId в cubit
CategoryCubit(this._userCubit) // Принимаем UserCubit через конструктор
: _categoryBox = Hive.box<Category>('categories'),
super([]);
CategoryCubit(this.repository, this.userId) : super(CategoryInitial());
// Загружает категории, фильтруя их по userId текущего пользователя
void loadCategories() {
// Получаем текущего пользователя из состояния UserCubit
final userState = _userCubit.state;
if (userState is UserLoaded && userState.user != null) {
final currentUserId = userState.user!.id;
final userCategories = _categoryBox.values
.where((category) => category.userId == currentUserId)
.toList();
emit(List.from(userCategories));
} else {
emit([]); // Если пользователя нет, список категорий пуст
/// Загружает категории для текущего пользователя
Future<void> loadCategories() async {
emit(CategoryLoading());
try {
final categories = await repository.getAllByUser(userId);
emit(CategoryLoaded(categories));
} catch (e) {
emit(CategoryError('Ошибка загрузки категорий: $e'));
}
}
// Добавляет новую категорию, присваивая ей userId текущего пользователя
void addCategory(Category category) {
// Получаем текущего пользователя из состояния UserCubit
final userState = _userCubit.state;
if (userState is UserLoaded && userState.user != null) {
final currentUserId = userState.user!.id;
final newCategory = category.copyWith(userId: currentUserId); // Присваиваем userId
_categoryBox.put(newCategory.id, newCategory);
loadCategories();
/// Добавляет новую категорию
Future<void> addCategory(Category category) async {
try {
// Устанавливаем userId для категории из cubit
final newCategory = category.copyWith(userId: userId);
await repository.add(newCategory);
// Перезагружаем список категорий
await loadCategories();
} catch (e) {
emit(CategoryError('Ошибка добавления категории: $e'));
}
}
// Обновляет существующую категорию
void updateCategory(Category category) {
_categoryBox.put(category.id, category);
loadCategories();
/// Обновляет существующую категорию
Future<void> updateCategory(Category category) async {
try {
await repository.update(category);
await loadCategories();
} catch (e) {
emit(CategoryError('Ошибка обновления категории: $e'));
}
}
// Удаляет категорию по ее id
void deleteCategory(String id) {
_categoryBox.delete(id);
loadCategories();
/// Удаляет категорию по её id
Future<void> deleteCategory(String id) async {
try {
await repository.delete(id);
await loadCategories();
} catch (e) {
emit(CategoryError('Ошибка удаления категории: $e'));
}
}
}