ottimo punto sembra funzionare tutto, devo solo aggiungere l'aggiunta di un cliente volante, di un modello volante e gestire i file allegati

This commit is contained in:
2026-04-18 19:03:49 +02:00
parent bbb9729ca4
commit e9f3327f31
16 changed files with 665 additions and 96 deletions

View File

@@ -8,26 +8,27 @@ import 'package:flux/features/services/models/entertainment_service_model.dart';
import 'package:flux/features/services/models/fin_service_model.dart';
import 'package:flux/features/services/models/service_model.dart';
import 'package:get_it/get_it.dart';
import 'package:collection/collection.dart';
part 'services_state.dart';
class ServicesCubit extends Cubit<ServicesState> {
final ServicesRepository _repository = GetIt.I<ServicesRepository>();
final SessionBloc _sessionBloc = GetIt.I<SessionBloc>();
ServicesCubit() : super(const ServicesState());
ServicesCubit() : super(const ServicesState(status: ServicesStatus.initial));
// --- CARICAMENTO E PAGINAZIONE ---
Future<void> loadServices({bool refresh = false}) async {
// Se stiamo già caricando, evitiamo chiamate doppie
if (state.isLoading) return;
if (state.status == ServicesStatus.loading) return;
// Se non è un refresh e abbiamo già raggiunto la fine dei dati, ci fermiamo
if (!refresh && state.hasReachedMax) return;
emit(
state.copyWith(
isLoading: true,
status: ServicesStatus.loading,
errorMessage: null,
// Se è un refresh, svuotiamo la lista attuale per mostrare lo shimmer/loading
allServices: refresh ? [] : state.allServices,
@@ -56,7 +57,7 @@ class ServicesCubit extends Cubit<ServicesState> {
emit(
state.copyWith(
isLoading: false,
status: ServicesStatus.ready,
allServices: refresh
? newServices
: [...state.allServices, ...newServices],
@@ -66,7 +67,7 @@ class ServicesCubit extends Cubit<ServicesState> {
} catch (e) {
emit(
state.copyWith(
isLoading: false,
status: ServicesStatus.failure,
errorMessage: "Errore nel caricamento servizi: $e",
),
);
@@ -95,9 +96,28 @@ class ServicesCubit extends Cubit<ServicesState> {
// --- GESTIONE BOZZA (DRAFT) ---
/// Inizializza un nuovo servizio o ne carica uno esistente per la modifica
void initServiceForm(ServiceModel? existingService) {
void initServiceForm({
ServiceModel? existingService,
String? serviceId,
}) async {
if (existingService != null) {
emit(state.copyWith(currentService: existingService));
emit(
state.copyWith(
currentService: existingService,
status: ServicesStatus.ready,
),
);
} else if (serviceId != null) {
ServiceModel? serviceModel = state.allServices.firstWhereOrNull(
(s) => s.id == serviceId,
);
serviceModel ??= await _repository.fetchServiceById(serviceId);
emit(
state.copyWith(
currentService: serviceModel,
status: ServicesStatus.ready,
),
);
} else {
// Crea un template vuoto con lo store di default (se disponibile)
emit(
@@ -106,7 +126,9 @@ class ServicesCubit extends Cubit<ServicesState> {
storeId: _sessionBloc.state.selectedStore?.id ?? '',
number: '', // Sarà compilato dall'utente
createdAt: DateTime.now(),
companyId: _sessionBloc.state.company!.id,
),
status: ServicesStatus.ready,
),
);
}
@@ -180,16 +202,22 @@ class ServicesCubit extends Cubit<ServicesState> {
Future<void> saveCurrentService() async {
if (state.currentService == null) return;
emit(state.copyWith(isSaving: true, errorMessage: null));
emit(state.copyWith(status: ServicesStatus.saving, errorMessage: null));
try {
// Usiamo il repository corazzato che abbiamo scritto prima
await _repository.saveFullService(state.currentService!);
// Reset della bozza e ricaricamento lista
emit(state.copyWith(isSaving: false, currentService: null));
await loadServices(refresh: true);
// Reset della bozza e ricaricamento lista
emit(state.copyWith(status: ServicesStatus.saved, currentService: null));
} catch (e) {
emit(state.copyWith(isSaving: false, errorMessage: e.toString()));
emit(
state.copyWith(
status: ServicesStatus.failure,
errorMessage: e.toString(),
),
);
}
}
}