From 143503c52d1ef4bc5aa254b3d812bfa75790cba4 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 7 Sep 2023 15:20:58 +0700 Subject: [PATCH] TF-2129 Fix cannot attach file on mobile (cherry picked from commit b35f09069d5ac9379632f599419af0cda1d91cc7) --- .../data/model/upload_file_arguments.dart | 19 +++-- .../upload/data/network/file_uploader.dart | 83 ++++++------------- .../extensions/file_info_extension.dart | 7 ++ .../domain/model/mobile_file_upload.dart | 24 ++++++ 4 files changed, 68 insertions(+), 65 deletions(-) create mode 100644 lib/features/upload/domain/extensions/file_info_extension.dart create mode 100644 lib/features/upload/domain/model/mobile_file_upload.dart diff --git a/lib/features/upload/data/model/upload_file_arguments.dart b/lib/features/upload/data/model/upload_file_arguments.dart index b58004100..fc4ad2b6d 100644 --- a/lib/features/upload/data/model/upload_file_arguments.dart +++ b/lib/features/upload/data/model/upload_file_arguments.dart @@ -1,25 +1,28 @@ import 'package:core/data/network/dio_client.dart'; -import 'package:dio/dio.dart'; import 'package:equatable/equatable.dart'; -import 'package:model/upload/file_info.dart'; +import 'package:tmail_ui_user/features/upload/domain/model/mobile_file_upload.dart'; import 'package:tmail_ui_user/features/upload/domain/model/upload_task_id.dart'; class UploadFileArguments with EquatableMixin { final DioClient dioClient; final UploadTaskId uploadId; - final FileInfo fileInfo; + final MobileFileUpload mobileFileUpload; final Uri uploadUri; - final CancelToken? cancelToken; UploadFileArguments( this.dioClient, this.uploadId, - this.fileInfo, - this.uploadUri, - {this.cancelToken}); + this.mobileFileUpload, + this.uploadUri + ); @override - List get props => [uploadId, fileInfo, uploadUri]; + List get props => [ + dioClient, + uploadId, + mobileFileUpload, + uploadUri + ]; } \ No newline at end of file diff --git a/lib/features/upload/data/network/file_uploader.dart b/lib/features/upload/data/network/file_uploader.dart index e085a1ea0..271b43fa0 100644 --- a/lib/features/upload/data/network/file_uploader.dart +++ b/lib/features/upload/data/network/file_uploader.dart @@ -15,6 +15,7 @@ import 'package:model/upload/file_info.dart'; import 'package:model/upload/upload_response.dart'; import 'package:tmail_ui_user/features/upload/data/model/upload_file_arguments.dart'; import 'package:tmail_ui_user/features/upload/domain/exceptions/upload_exception.dart'; +import 'package:tmail_ui_user/features/upload/domain/extensions/file_info_extension.dart'; import 'package:tmail_ui_user/features/upload/domain/model/upload_task_id.dart'; import 'package:tmail_ui_user/features/upload/domain/state/attachment_upload_state.dart'; import 'package:worker_manager/worker_manager.dart' as worker; @@ -41,13 +42,13 @@ class FileUploader { uploadUri, cancelToken: cancelToken); } else { + final mobileFileUpload = fileInfo.toMobileFileUpload(); return await _isolateExecutor.execute( arg1: UploadFileArguments( _dioClient, uploadId, - fileInfo, - uploadUri, - cancelToken: cancelToken + mobileFileUpload, + uploadUri ), fun1: _handleUploadAttachmentAction, notification: (value) { @@ -66,34 +67,31 @@ class FileUploader { UploadFileArguments argsUpload, worker.TypeSendPort sendPort ) async { - final dioClient = argsUpload.dioClient; - final fileInfo = argsUpload.fileInfo; - final uploadUri = argsUpload.uploadUri; - final cancelToken = argsUpload.cancelToken; + final headerParam = argsUpload.dioClient.getHeaders(); + headerParam[HttpHeaders.contentTypeHeader] = argsUpload.mobileFileUpload.mimeType; + headerParam[HttpHeaders.contentLengthHeader] = argsUpload.mobileFileUpload.fileSize; + final data = File(argsUpload.mobileFileUpload.filePath).openRead(); - final resultJson = await _invokeRequestToServer( - dioClient, - uploadUri, - fileInfo, - cancelToken: cancelToken, + final resultJson = await argsUpload.dioClient.post( + Uri.decodeFull(argsUpload.uploadUri.toString()), + options: Options(headers: headerParam), + data: data, onSendProgress: (count, total) { log('FileUploader::_handleUploadAttachmentAction():onSendProgress: [${argsUpload.uploadId.id}] = $count'); sendPort.send( UploadingAttachmentUploadState( argsUpload.uploadId, count, - fileInfo.fileSize + argsUpload.mobileFileUpload.fileSize ) ); } ); log('FileUploader::_handleUploadAttachmentAction():resultJson: $resultJson'); - if (cancelToken?.isCancelled == true) { - log('FileUploader::_handleUploadAttachmentAction(): upload is cancelled'); - return null; - } - - return _parsingResponse(resultJson: resultJson, fileName: fileInfo.fileName); + return _parsingResponse( + resultJson: resultJson, + fileName: argsUpload.mobileFileUpload.fileName + ); } Future _handleUploadAttachmentActionOnWeb( @@ -103,10 +101,15 @@ class FileUploader { Uri uploadUri, {CancelToken? cancelToken} ) async { - final resultJson = await _invokeRequestToServer( - _dioClient, - uploadUri, - fileInfo, + final headerParam = _dioClient.getHeaders(); + headerParam[HttpHeaders.contentTypeHeader] = fileInfo.mimeType; + headerParam[HttpHeaders.contentLengthHeader] = fileInfo.fileSize; + final data = fileInfo.readStream; + + final resultJson = await _dioClient.post( + Uri.decodeFull(uploadUri.toString()), + options: Options(headers: headerParam), + data: data, cancelToken: cancelToken, onSendProgress: (count, total) { log('FileUploader::_handleUploadAttachmentActionOnWeb():onSendProgress: [${uploadId.id}] = $count'); @@ -119,44 +122,10 @@ class FileUploader { ); } ); - log('FileUploader::_handleUploadAttachmentActionOnWeb():resultJson: $resultJson'); - - if (cancelToken?.isCancelled == true) { - log('FileUploader::_handleUploadAttachmentActionOnWeb(): upload is cancelled'); - return null; - } - return _parsingResponse(resultJson: resultJson, fileName: fileInfo.fileName); } - static Future _invokeRequestToServer( - DioClient dioClient, - Uri uploadUri, - FileInfo fileInfo, { - CancelToken? cancelToken, - ProgressCallback? onSendProgress - }) { - final headerParam = dioClient.getHeaders(); - headerParam[HttpHeaders.contentTypeHeader] = fileInfo.mimeType; - headerParam[HttpHeaders.contentLengthHeader] = fileInfo.fileSize; - - final data = fileInfo.readStream ?? File(fileInfo.filePath).openRead(); - - if (cancelToken?.isCancelled == true) { - log('FileUploader::_invokeRequestToServer(): upload is cancelled'); - return Future.value(); - } - - return dioClient.post( - Uri.decodeFull(uploadUri.toString()), - options: Options(headers: headerParam), - data: data, - cancelToken: cancelToken, - onSendProgress: onSendProgress - ); - } - static Attachment? _parsingResponse({dynamic resultJson, required String fileName}) { log('FileUploader::_parsingResponse():resultJson: $resultJson'); if (resultJson != null) { diff --git a/lib/features/upload/domain/extensions/file_info_extension.dart b/lib/features/upload/domain/extensions/file_info_extension.dart new file mode 100644 index 000000000..58866921c --- /dev/null +++ b/lib/features/upload/domain/extensions/file_info_extension.dart @@ -0,0 +1,7 @@ + +import 'package:model/upload/file_info.dart'; +import 'package:tmail_ui_user/features/upload/domain/model/mobile_file_upload.dart'; + +extension FileInfoExtension on FileInfo { + MobileFileUpload toMobileFileUpload() => MobileFileUpload(fileName, filePath, fileSize, mimeType); +} \ No newline at end of file diff --git a/lib/features/upload/domain/model/mobile_file_upload.dart b/lib/features/upload/domain/model/mobile_file_upload.dart new file mode 100644 index 000000000..72c63b3da --- /dev/null +++ b/lib/features/upload/domain/model/mobile_file_upload.dart @@ -0,0 +1,24 @@ + +import 'package:equatable/equatable.dart'; + +class MobileFileUpload with EquatableMixin { + final String fileName; + final String filePath; + final int fileSize; + final String mimeType; + + MobileFileUpload( + this.fileName, + this.filePath, + this.fileSize, + this.mimeType + ); + + @override + List get props => [ + fileName, + filePath, + fileSize, + mimeType, + ]; +} \ No newline at end of file