1import 'package:flutter_bloc/flutter_bloc.dart';
2import 'package:fpdart/fpdart.dart';
3
4// Domain Contracts & State Definition
5abstract class TaskState {}
6class TaskInitial extends TaskState {}
7class TaskLoading extends TaskState {}
8class TaskSuccess extends TaskState {
9 final List<TaskEntity> tasks;
10 TaskSuccess(this.tasks);
11}
12class TaskFailure extends TaskState {
13 final String message;
14 TaskFailure(this.message);
15}
16
17// Presentation Bloc/Cubit - Zero Direct DB coupling
18class TaskCubit extends Cubit<TaskState> {
19 final GetTasksUseCase _getTasks;
20
21 TaskCubit({required GetTasksUseCase getTasks})
22 : _getTasks = getTasks,
23 super(TaskInitial());
24
25 Future<void> fetchTasks({required String projectId}) async {
26 emit(TaskLoading());
27 final Either<Failure, List<TaskEntity>> result =
28 await _getTasks(Params(projectId: projectId));
29
30 result.fold(
31 (failure) => emit(TaskFailure(failure.toUserFriendlyMessage())),
32 (tasks) => emit(TaskSuccess(tasks)),
33 );
34 }
35}