feat-tickets (#14)
Some checks failed
Deploy to Cloudflare Pages / build-and-deploy (push) Has been cancelled
Some checks failed
Deploy to Cloudflare Pages / build-and-deploy (push) Has been cancelled
Reviewed-on: #14 Co-authored-by: mark-cachy <marco@catelli.it> Co-committed-by: mark-cachy <marco@catelli.it>
This commit is contained in:
79
lib/features/tickets/blocs/ticket_list_cubit.dart
Normal file
79
lib/features/tickets/blocs/ticket_list_cubit.dart
Normal file
@@ -0,0 +1,79 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user