import 'dart:async'; import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flux/core/utils/string_extensions.dart'; import 'package:flux/features/services/data/services_repository.dart'; import 'package:flux/features/services/models/service_file_model.dart'; import 'package:flux/features/services/models/service_model.dart'; import 'package:get_it/get_it.dart'; part 'service_files_events.dart'; part 'service_files_state.dart'; class ServiceFilesBloc extends Bloc { final _repository = GetIt.I.get(); final String? serviceId; ServiceFilesBloc({this.serviceId}) : super( ServiceFilesState( status: ServiceFilesStatus.initial, serviceId: serviceId, ), ) { on(_onServiceSaved); on(_onLoadServiceFiles); on(_onAddServiceFiles); on(_onUploadServiceFiles); on(_onDeleteServiceFiles); on(_onToggleServiceFileSelection); } FutureOr _onServiceSaved( ServiceSavedEvent event, Emitter emit, ) { emit(state.copyWith(serviceId: event.serviceId)); } FutureOr _onLoadServiceFiles( LoadServiceFilesEvent event, Emitter emit, ) async { if (serviceId != null) { emit(state.copyWith(status: ServiceFilesStatus.loading)); await emit.forEach( _repository.getServiceFilesStream(serviceId!), onData: (data) => state.copyWith( status: ServiceFilesStatus.success, remoteFiles: data, ), onError: (error, stackTrace) => state.copyWith( status: ServiceFilesStatus.failure, error: error.toString(), ), ); } } void _onAddServiceFiles( AddServiceFilesEvent event, Emitter emit, ) async { // BIVIO 1: PRATICA NUOVA (Nessun ID) if (serviceId == null) { // Mettiamo i file nel "parcheggio" locale dello State final newLocalFiles = event.files.map((file) { return ServiceFileModel( id: null, serviceId: serviceId ?? '', name: file.name.fileNameWithoutExtension(), extension: file.name.fileExtension(), storagePath: '', fileSize: file.size, localBytes: file.bytes, ); }).toList(); final List updatedLocalFiles = [ ...state.localFiles, ...newLocalFiles, ]; emit( state.copyWith( localFiles: updatedLocalFiles, status: ServiceFilesStatus.success, ), ); return; } // BIVIO 2: PRATICA ESISTENTE (Abbiamo l'ID) emit(state.copyWith(status: ServiceFilesStatus.uploading)); try { // Logica identica a quella che abbiamo fatto per i clienti for (var file in event.files) { await _repository.uploadAndRegisterServiceFile( serviceId: serviceId!, pickedFile: file, ); } emit(state.copyWith(status: ServiceFilesStatus.success)); } catch (e) { emit( state.copyWith(status: ServiceFilesStatus.failure, error: e.toString()), ); } } FutureOr _onUploadServiceFiles( UploadServiceFilesEvent event, Emitter emit, ) {} FutureOr _onDeleteServiceFiles( DeleteServiceFilesEvent event, Emitter emit, ) {} FutureOr _onToggleServiceFileSelection( ToggleServiceFileSelectionEvent event, Emitter emit, ) {} }