diff --git a/lib/features/upload/domain/state/local_file_picker_state.dart b/lib/features/upload/domain/state/local_file_picker_state.dart new file mode 100644 index 000000000..91cd536d1 --- /dev/null +++ b/lib/features/upload/domain/state/local_file_picker_state.dart @@ -0,0 +1,26 @@ + +import 'package:core/core.dart'; +import 'package:model/model.dart'; + +class LocalFilePickerSuccess extends UIState { + final FileInfo fileInfo; + + LocalFilePickerSuccess(this.fileInfo); + + @override + List get props => [fileInfo]; +} + +class LocalFilePickerFailure extends FeatureFailure { + final exception; + + LocalFilePickerFailure(this.exception); + + @override + List get props => [exception]; +} + +class LocalFilePickerCancel extends FeatureFailure { + @override + List get props => []; +} \ No newline at end of file diff --git a/lib/features/upload/domain/usecases/local_file_picker_interactor.dart b/lib/features/upload/domain/usecases/local_file_picker_interactor.dart new file mode 100644 index 000000000..742d682ab --- /dev/null +++ b/lib/features/upload/domain/usecases/local_file_picker_interactor.dart @@ -0,0 +1,30 @@ + +import 'package:core/core.dart'; +import 'package:dartz/dartz.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/upload/domain/state/local_file_picker_state.dart'; + +class LocalFilePickerInteractor { + + LocalFilePickerInteractor(); + + Stream> execute({FileType fileType = FileType.any}) async* { + try { + final filesResult = await FilePicker.platform.pickFiles(type: fileType); + if (filesResult != null && filesResult.files.isNotEmpty) { + final platformFile = filesResult.files.first; + final fileInfoResult = FileInfo( + platformFile.name, + platformFile.path ?? '', + platformFile.size, + ); + yield Right(LocalFilePickerSuccess(fileInfoResult)); + } else { + yield Left(LocalFilePickerCancel()); + } + } catch (exception) { + yield Left(LocalFilePickerFailure(exception)); + } + } +} \ No newline at end of file