126 lines
3.7 KiB
Dart
126 lines
3.7 KiB
Dart
|
|
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<ServiceFilesEvent, ServiceFilesState> {
|
||
|
|
final _repository = GetIt.I.get<ServicesRepository>();
|
||
|
|
final String? serviceId;
|
||
|
|
|
||
|
|
ServiceFilesBloc({this.serviceId})
|
||
|
|
: super(
|
||
|
|
ServiceFilesState(
|
||
|
|
status: ServiceFilesStatus.initial,
|
||
|
|
serviceId: serviceId,
|
||
|
|
),
|
||
|
|
) {
|
||
|
|
on<ServiceSavedEvent>(_onServiceSaved);
|
||
|
|
on<LoadServiceFilesEvent>(_onLoadServiceFiles);
|
||
|
|
on<AddServiceFilesEvent>(_onAddServiceFiles);
|
||
|
|
on<UploadServiceFilesEvent>(_onUploadServiceFiles);
|
||
|
|
on<DeleteServiceFilesEvent>(_onDeleteServiceFiles);
|
||
|
|
on<ToggleServiceFileSelectionEvent>(_onToggleServiceFileSelection);
|
||
|
|
}
|
||
|
|
|
||
|
|
FutureOr<void> _onServiceSaved(
|
||
|
|
ServiceSavedEvent event,
|
||
|
|
Emitter<ServiceFilesState> emit,
|
||
|
|
) {
|
||
|
|
emit(state.copyWith(serviceId: event.serviceId));
|
||
|
|
}
|
||
|
|
|
||
|
|
FutureOr<void> _onLoadServiceFiles(
|
||
|
|
LoadServiceFilesEvent event,
|
||
|
|
Emitter<ServiceFilesState> 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<ServiceFilesState> 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<ServiceFileModel> 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<void> _onUploadServiceFiles(
|
||
|
|
UploadServiceFilesEvent event,
|
||
|
|
Emitter<ServiceFilesState> emit,
|
||
|
|
) {}
|
||
|
|
|
||
|
|
FutureOr<void> _onDeleteServiceFiles(
|
||
|
|
DeleteServiceFilesEvent event,
|
||
|
|
Emitter<ServiceFilesState> emit,
|
||
|
|
) {}
|
||
|
|
|
||
|
|
FutureOr<void> _onToggleServiceFileSelection(
|
||
|
|
ToggleServiceFileSelectionEvent event,
|
||
|
|
Emitter<ServiceFilesState> emit,
|
||
|
|
) {}
|
||
|
|
}
|