94 lines
2.9 KiB
Dart
94 lines
2.9 KiB
Dart
|
|
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/features/customers/data/customer_repository.dart';
|
||
|
|
import 'package:flux/features/customers/models/customer_file_model.dart';
|
||
|
|
import 'package:get_it/get_it.dart';
|
||
|
|
|
||
|
|
part 'customer_files_events.dart';
|
||
|
|
part 'customer_files_state.dart';
|
||
|
|
|
||
|
|
class CustomerFilesBloc extends Bloc<CustomerFilesEvent, CustomerFilesState> {
|
||
|
|
final CustomerRepository _repository = GetIt.I<CustomerRepository>();
|
||
|
|
final String customerId;
|
||
|
|
CustomerFilesBloc(this.customerId)
|
||
|
|
: super(const CustomerFilesState(status: CustomerFilesStatus.initial)) {
|
||
|
|
on<LoadCustomerFilesEvent>(_loadCustomerFiles);
|
||
|
|
on<UploadCustomerFileEvent>(_uploadCustomerFile);
|
||
|
|
on<DeleteCustomerFileEvent>(_deleteCustomerFile);
|
||
|
|
on<ToggleCustomerFileSelectionEvent>(_toggleCustomerFileSelection);
|
||
|
|
}
|
||
|
|
void _loadCustomerFiles(
|
||
|
|
LoadCustomerFilesEvent event,
|
||
|
|
Emitter<CustomerFilesState> emit,
|
||
|
|
) async {
|
||
|
|
await emit.forEach<List<CustomerFileModel>>(
|
||
|
|
_repository.getCustomerFilesStream(customerId),
|
||
|
|
onData: (customerFiles) => CustomerFilesState(
|
||
|
|
status: CustomerFilesStatus.success,
|
||
|
|
customerFiles: customerFiles,
|
||
|
|
),
|
||
|
|
onError: (error, stackTrace) => CustomerFilesState(
|
||
|
|
status: CustomerFilesStatus.failure,
|
||
|
|
error: error.toString(),
|
||
|
|
),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
Future<void> _uploadCustomerFile(
|
||
|
|
UploadCustomerFileEvent event,
|
||
|
|
Emitter<CustomerFilesState> emit,
|
||
|
|
) async {
|
||
|
|
emit(state.copyWith(status: CustomerFilesStatus.uploading));
|
||
|
|
if (event.pickedFile != null) {
|
||
|
|
try {
|
||
|
|
await _repository.uploadAndRegisterFile(
|
||
|
|
customerId: customerId,
|
||
|
|
pickedFile: event.pickedFile!,
|
||
|
|
);
|
||
|
|
emit(state.copyWith(status: CustomerFilesStatus.success));
|
||
|
|
} catch (e) {
|
||
|
|
emit(
|
||
|
|
state.copyWith(
|
||
|
|
status: CustomerFilesStatus.failure,
|
||
|
|
error: e.toString(),
|
||
|
|
),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
Future<void> _deleteCustomerFile(
|
||
|
|
DeleteCustomerFileEvent event,
|
||
|
|
Emitter<CustomerFilesState> emit,
|
||
|
|
) async {
|
||
|
|
emit(state.copyWith(status: CustomerFilesStatus.loading));
|
||
|
|
try {
|
||
|
|
await _repository.deleteDocument(event.file);
|
||
|
|
emit(state.copyWith(status: CustomerFilesStatus.success));
|
||
|
|
} catch (e) {
|
||
|
|
emit(
|
||
|
|
state.copyWith(
|
||
|
|
status: CustomerFilesStatus.failure,
|
||
|
|
error: e.toString(),
|
||
|
|
),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void _toggleCustomerFileSelection(
|
||
|
|
ToggleCustomerFileSelectionEvent event,
|
||
|
|
Emitter<CustomerFilesState> emit,
|
||
|
|
) {
|
||
|
|
List<CustomerFileModel> selectedFiles = List.from(state.selectedFiles);
|
||
|
|
if (selectedFiles.contains(event.file)) {
|
||
|
|
selectedFiles.remove(event.file);
|
||
|
|
} else {
|
||
|
|
selectedFiles.add(event.file);
|
||
|
|
}
|
||
|
|
emit(state.copyWith(selectedFiles: selectedFiles));
|
||
|
|
}
|
||
|
|
}
|