From 74901821eedd4a61a498b6f32bb5b7bd0fc4d490 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 20 Jul 2022 16:48:28 +0700 Subject: [PATCH] TF-725 Download inline image as base64 data --- .../network/download/download_client.dart | 12 ++++ .../data/datasource/composer_datasource.dart | 4 ++ .../composer_datasource_impl.dart | 15 +++++ .../repository/composer_repository_impl.dart | 11 +++- .../repository/composer_repository.dart | 2 + .../state/download_image_as_base64_state.dart | 33 ++++++++++ .../domain/state/upload_attachment_state.dart | 64 ------------------- .../download_image_as_base64_interactor.dart | 25 ++++++++ 8 files changed, 101 insertions(+), 65 deletions(-) create mode 100644 lib/features/composer/data/datasource/composer_datasource.dart create mode 100644 lib/features/composer/data/datasource_impl/composer_datasource_impl.dart create mode 100644 lib/features/composer/domain/state/download_image_as_base64_state.dart delete mode 100644 lib/features/composer/domain/state/upload_attachment_state.dart create mode 100644 lib/features/composer/domain/usecases/download_image_as_base64_interactor.dart diff --git a/core/lib/data/network/download/download_client.dart b/core/lib/data/network/download/download_client.dart index 82a35c496..0d3985372 100644 --- a/core/lib/data/network/download/download_client.dart +++ b/core/lib/data/network/download/download_client.dart @@ -1,4 +1,5 @@ +import 'dart:convert'; import 'dart:io'; import 'package:core/core.dart'; @@ -26,4 +27,15 @@ class DownloadClient { return (responseBody as ResponseBody); } + + Future downloadImageAsBase64(String url) async { + try { + final response = await _dioClient.get( + url, + options: Options(responseType: ResponseType.bytes)); + return base64Encode(response); + } catch (e) { + return url; + } + } } \ No newline at end of file diff --git a/lib/features/composer/data/datasource/composer_datasource.dart b/lib/features/composer/data/datasource/composer_datasource.dart new file mode 100644 index 000000000..7d78cb470 --- /dev/null +++ b/lib/features/composer/data/datasource/composer_datasource.dart @@ -0,0 +1,4 @@ + +abstract class ComposerDataSource { + Future downloadImageAsBase64(String url); +} \ No newline at end of file diff --git a/lib/features/composer/data/datasource_impl/composer_datasource_impl.dart b/lib/features/composer/data/datasource_impl/composer_datasource_impl.dart new file mode 100644 index 000000000..60de37fab --- /dev/null +++ b/lib/features/composer/data/datasource_impl/composer_datasource_impl.dart @@ -0,0 +1,15 @@ + +import 'package:core/core.dart'; +import 'package:tmail_ui_user/features/composer/data/datasource/composer_datasource.dart'; + +class ComposerDataSourceImpl extends ComposerDataSource { + + final DownloadClient downloadClient; + + ComposerDataSourceImpl(this.downloadClient); + + @override + Future downloadImageAsBase64(String url) { + return downloadClient.downloadImageAsBase64(url); + } +} \ No newline at end of file diff --git a/lib/features/composer/data/repository/composer_repository_impl.dart b/lib/features/composer/data/repository/composer_repository_impl.dart index 6578f4ebc..fe9106548 100644 --- a/lib/features/composer/data/repository/composer_repository_impl.dart +++ b/lib/features/composer/data/repository/composer_repository_impl.dart @@ -1,6 +1,7 @@ import 'package:dio/dio.dart'; import 'package:model/upload/file_info.dart'; +import 'package:tmail_ui_user/features/composer/data/datasource/composer_datasource.dart'; import 'package:tmail_ui_user/features/composer/domain/repository/composer_repository.dart'; import 'package:tmail_ui_user/features/upload/data/datasource/attachment_upload_datasource.dart'; import 'package:tmail_ui_user/features/upload/domain/model/upload_attachment.dart'; @@ -8,11 +9,19 @@ import 'package:tmail_ui_user/features/upload/domain/model/upload_attachment.dar class ComposerRepositoryImpl extends ComposerRepository { final AttachmentUploadDataSource _attachmentUploadDataSource; + final ComposerDataSource _composerDataSource; - ComposerRepositoryImpl(this._attachmentUploadDataSource); + ComposerRepositoryImpl( + this._attachmentUploadDataSource, + this._composerDataSource); @override UploadAttachment uploadAttachment(FileInfo fileInfo, Uri uploadUri, {CancelToken? cancelToken}) { return _attachmentUploadDataSource.uploadAttachment(fileInfo, uploadUri, cancelToken: cancelToken); } + + @override + Future downloadImageAsBase64(String url) { + return _composerDataSource.downloadImageAsBase64(url); + } } \ No newline at end of file diff --git a/lib/features/composer/domain/repository/composer_repository.dart b/lib/features/composer/domain/repository/composer_repository.dart index ee0b3be5f..a184011cc 100644 --- a/lib/features/composer/domain/repository/composer_repository.dart +++ b/lib/features/composer/domain/repository/composer_repository.dart @@ -4,4 +4,6 @@ import 'package:tmail_ui_user/features/upload/domain/model/upload_attachment.dar abstract class ComposerRepository { UploadAttachment uploadAttachment(FileInfo fileInfo, Uri uploadUri, {CancelToken? cancelToken}); + + Future downloadImageAsBase64(String url); } \ No newline at end of file diff --git a/lib/features/composer/domain/state/download_image_as_base64_state.dart b/lib/features/composer/domain/state/download_image_as_base64_state.dart new file mode 100644 index 000000000..93f9c3cba --- /dev/null +++ b/lib/features/composer/domain/state/download_image_as_base64_state.dart @@ -0,0 +1,33 @@ + +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:model/upload/file_info.dart'; + +class DownloadingImageAsBase64 extends UIState { + + DownloadingImageAsBase64(); + + @override + List get props => []; +} + +class DownloadImageAsBase64Success extends UIState { + + final String imageAsBase64; + final String cid; + final FileInfo fileInfo; + + DownloadImageAsBase64Success(this.imageAsBase64, this.cid, this.fileInfo); + + @override + List get props => [imageAsBase64, cid, fileInfo]; +} + +class DownloadImageAsBase64Failure extends FeatureFailure { + final dynamic exception; + + DownloadImageAsBase64Failure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/composer/domain/state/upload_attachment_state.dart b/lib/features/composer/domain/state/upload_attachment_state.dart deleted file mode 100644 index 2d35f9513..000000000 --- a/lib/features/composer/domain/state/upload_attachment_state.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'package:core/core.dart'; -import 'package:dartz/dartz.dart'; -import 'package:model/model.dart'; - -class UploadingAttachmentState extends UIState { - UploadingAttachmentState(); - - @override - List get props => []; -} - -class UploadAttachmentSuccess extends UIState { - final Attachment attachment; - - UploadAttachmentSuccess(this.attachment); - - @override - List get props => [attachment]; -} - -class UploadAttachmentFailure extends FeatureFailure { - final dynamic exception; - - UploadAttachmentFailure(this.exception); - - @override - List get props => [exception]; -} - -class UploadMultipleAttachmentAllSuccess extends UIState { - final List> listResults; - - UploadMultipleAttachmentAllSuccess(this.listResults); - - @override - List get props => [listResults]; -} - -class UploadMultipleAttachmentHasSomeFailure extends UIState { - final List> listResults; - - UploadMultipleAttachmentHasSomeFailure(this.listResults); - - @override - List get props => [listResults]; -} - -class UploadMultipleAttachmentAllFailure extends FeatureFailure { - final List> listResults; - - UploadMultipleAttachmentAllFailure(this.listResults); - - @override - List get props => [listResults]; -} - -class UploadMultipleAttachmentFailure extends FeatureFailure { - final exception; - - UploadMultipleAttachmentFailure(this.exception); - - @override - List get props => [exception]; -} \ No newline at end of file diff --git a/lib/features/composer/domain/usecases/download_image_as_base64_interactor.dart b/lib/features/composer/domain/usecases/download_image_as_base64_interactor.dart new file mode 100644 index 000000000..2cf7f4b95 --- /dev/null +++ b/lib/features/composer/domain/usecases/download_image_as_base64_interactor.dart @@ -0,0 +1,25 @@ +import 'package:core/core.dart'; +import 'package:dartz/dartz.dart'; +import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/composer/domain/repository/composer_repository.dart'; +import 'package:tmail_ui_user/features/composer/domain/state/download_image_as_base64_state.dart'; + +class DownloadImageAsBase64Interactor { + final ComposerRepository _composerRepository; + + DownloadImageAsBase64Interactor(this._composerRepository); + + Stream> execute(String url, String cid, FileInfo fileInfo) async* { + try { + yield Right(DownloadingImageAsBase64()); + final result = await _composerRepository.downloadImageAsBase64(url); + if (result?.isNotEmpty == true) { + yield Right(DownloadImageAsBase64Success(result!, cid, fileInfo)); + } else { + yield Left(DownloadImageAsBase64Failure(null)); + } + } catch (exception) { + yield Left(DownloadImageAsBase64Failure(exception)); + } + } +} \ No newline at end of file