Files
flux/lib/features/tickets/blocs/ticket_list_cubit.dart

80 lines
2.3 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flux/features/tickets/models/ticket_model.dart';
import 'package:flux/features/tickets/data/ticket_repository.dart';
import 'package:get_it/get_it.dart';
import 'ticket_list_state.dart';
class TicketListCubit extends Cubit<TicketListState> {
final TicketRepository _repository = GetIt.I.get<TicketRepository>();
static const int _limit = 20; // Paginazione a blocchi di 20
TicketListCubit() : super(const TicketListState()) {
fetchTickets(reset: true);
}
/// Recupera i ticket. Se reset = true, svuota la lista e riparte da offset 0.
Future<void> fetchTickets({bool reset = false}) async {
if (state.isLoading) return;
if (!reset && state.hasReachedMax) return;
emit(
state.copyWith(
isLoading: true,
errorMessage: '',
tickets: reset ? [] : state.tickets,
),
);
try {
final currentOffset = reset ? 0 : state.tickets.length;
final newTickets = await _repository.fetchStoreTickets(
offset: currentOffset,
limit: _limit,
searchTerm: state.searchTerm,
dateRange: state.dateRange,
statusFilter: state.statusFilter,
ticketTypeFilter: state.ticketTypeFilter,
staffIdFilter: state.staffIdFilter,
);
emit(
state.copyWith(
tickets: reset ? newTickets : [...state.tickets, ...newTickets],
isLoading: false,
hasReachedMax: newTickets.length < _limit,
),
);
} catch (e) {
emit(state.copyWith(isLoading: false, errorMessage: e.toString()));
}
}
/// Aggiorna i filtri e ricarica tutto da zero
void updateFilters({
String? searchTerm,
DateTimeRange? dateRange,
TicketStatus? statusFilter,
TicketType? ticketTypeFilter,
String? staffIdFilter,
bool clearSearch = false,
bool clearDate = false,
bool clearStatus = false,
}) {
emit(
state.copyWith(
searchTerm: searchTerm,
dateRange: dateRange,
statusFilter: statusFilter,
ticketTypeFilter: ticketTypeFilter,
staffIdFilter: staffIdFilter,
clearSearch: clearSearch,
clearDate: clearDate,
clearStatus: clearStatus,
),
);
fetchTickets(reset: true); // Applica i filtri e ricarica
}
}