import 'dart:async'; // Serve per il Timer del debounce import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flux/core/blocs/session/session_cubit.dart'; import 'package:flux/features/customers/data/customer_repository.dart'; import 'package:flux/features/customers/models/customer_model.dart'; import 'package:get_it/get_it.dart'; part 'customers_list_state.dart'; class CustomersListCubit extends Cubit { final CustomerRepository _repository = GetIt.I(); final SessionCubit _sessionCubit = GetIt.I(); // Variabile per gestire il debounce della ricerca Timer? _searchDebounce; CustomersListCubit() : super(const CustomersListState()); // --- LETTURA --- Future loadCustomers() async { emit(state.copyWith(status: CustomersListStatus.loading)); try { final customers = await _repository.getCustomers( _sessionCubit.state.company!.id!, ); emit( state.copyWith( status: CustomersListStatus.success, customers: customers, ), ); } catch (e) { emit( state.copyWith( status: CustomersListStatus.failure, errorMessage: e.toString(), ), ); } } // --- RICERCA CON DEBOUNCE --- void searchCustomers(String query) { // 1. Se c'è già una ricerca in attesa (l'utente sta digitando veloce), la annulliamo if (_searchDebounce?.isActive ?? false) _searchDebounce!.cancel(); // 2. Facciamo partire un timer di 400 millisecondi _searchDebounce = Timer(const Duration(milliseconds: 300), () async { // Se cancella tutto e la query è vuota, ricarichiamo la lista base if (query.trim().isEmpty) { await loadCustomers(); return; } // Nessun "loading" state qui, per evitare sfarfallii visivi mentre si scrive try { final results = await _repository.searchCustomers( _sessionCubit.state.company!.id!, query, ); emit( state.copyWith( status: CustomersListStatus.success, customers: results, ), ); } catch (e) { emit( state.copyWith( status: CustomersListStatus.failure, errorMessage: e.toString(), ), ); } }); } // Pulizia della memoria quando il Cubit viene distrutto @override Future close() { _searchDebounce?.cancel(); return super.close(); } }