import 'dart:async'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flux/features/tasks/data/task_repository.dart'; import 'package:flux/features/tasks/models/task_model.dart'; import 'package:get_it/get_it.dart'; part 'task_list_state.dart'; class TaskListCubit extends Cubit { final TaskRepository _repository = GetIt.I.get(); final String currentCompanyId; final String? currentStoreId; // Il nostro abbonamento allo stream del repository StreamSubscription? _taskSubscription; TaskListCubit({required this.currentCompanyId, this.currentStoreId}) : super(const TaskListState()) { _initRealtime(); } void _initRealtime() { emit(state.copyWith(status: TaskListStatus.loading)); // Primo caricamento _loadTasksSilently(); // Ci mettiamo in ascolto del campanello del Repository _taskSubscription = _repository.watchCompanyTasks(currentCompanyId).listen(( _, ) { // Quando il campanello suona (qualcosa è cambiato a DB), ricarichiamo! _loadTasksSilently(); }); } Future loadTasks() async { emit(state.copyWith(status: TaskListStatus.loading)); await _loadTasksSilently(); } Future _loadTasksSilently() async { try { final tasks = await _repository.getTasks( companyId: currentCompanyId, storeId: currentStoreId, ); emit( state.copyWith( status: TaskListStatus.success, tasks: tasks, errorMessage: null, ), ); } catch (e) { emit( state.copyWith( status: TaskListStatus.failure, errorMessage: e.toString(), ), ); } } @override Future close() { // Stacchiamo l'abbonamento. Il controller.onCancel nel Repo farà il resto! _taskSubscription?.cancel(); return super.close(); } }