import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flux/core/blocs/session/session_cubit.dart'; import 'package:flux/features/operations/data/operations_repository.dart'; import 'package:flux/features/operations/models/operation_model.dart'; import 'package:get_it/get_it.dart'; part 'operation_list_state.dart'; class OperationListCubit extends Cubit { final OperationsRepository _repository = GetIt.I(); final SessionCubit _sessionCubit = GetIt.I(); OperationListCubit() : super(const OperationListState()) { loadOperations(refresh: true); } Future loadOperations({bool refresh = false}) async { if (state.status == OperationListStatus.loading) return; if (!refresh && state.hasReachedMax) return; emit( state.copyWith( status: OperationListStatus.loading, errorMessage: null, operations: refresh ? [] : state.operations, hasReachedMax: refresh ? false : state.hasReachedMax, ), ); try { final currentOffset = refresh ? 0 : state.operations.length; final companyId = _sessionCubit.state.company?.id; if (companyId == null) { throw Exception("Company ID non trovato nella sessione"); } final newOperations = await _repository.fetchOperations( companyId: companyId, offset: currentOffset, limit: 50, searchTerm: state.query, dateRange: state.dateRange, ); final bool reachedMax = newOperations.length < 50; emit( state.copyWith( status: OperationListStatus.success, operations: refresh ? newOperations : [...state.operations, ...newOperations], hasReachedMax: reachedMax, ), ); } catch (e) { emit( state.copyWith( status: OperationListStatus.failure, errorMessage: "Errore nel caricamento operazioni: $e", ), ); } } void updateFilters({String? query, DateTimeRange? range}) { emit( state.copyWith( query: query ?? state.query, dateRange: range ?? state.dateRange, ), ); loadOperations(refresh: true); } void clearFilters() { emit(const OperationListState()); // Resetta tutto allo stato iniziale loadOperations(refresh: true); } }