TF-2129 Fix cannot attach file on mobile

(cherry picked from commit b35f09069d5ac9379632f599419af0cda1d91cc7)
This commit is contained in:
dab246
2023-09-07 15:20:58 +07:00
committed by Dat Vu
parent 8f7a1aeb10
commit 143503c52d
4 changed files with 68 additions and 65 deletions
@@ -1,25 +1,28 @@
import 'package:core/data/network/dio_client.dart'; import 'package:core/data/network/dio_client.dart';
import 'package:dio/dio.dart';
import 'package:equatable/equatable.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'; import 'package:tmail_ui_user/features/upload/domain/model/upload_task_id.dart';
class UploadFileArguments with EquatableMixin { class UploadFileArguments with EquatableMixin {
final DioClient dioClient; final DioClient dioClient;
final UploadTaskId uploadId; final UploadTaskId uploadId;
final FileInfo fileInfo; final MobileFileUpload mobileFileUpload;
final Uri uploadUri; final Uri uploadUri;
final CancelToken? cancelToken;
UploadFileArguments( UploadFileArguments(
this.dioClient, this.dioClient,
this.uploadId, this.uploadId,
this.fileInfo, this.mobileFileUpload,
this.uploadUri, this.uploadUri
{this.cancelToken}); );
@override @override
List<Object?> get props => [uploadId, fileInfo, uploadUri]; List<Object?> get props => [
dioClient,
uploadId,
mobileFileUpload,
uploadUri
];
} }
@@ -15,6 +15,7 @@ import 'package:model/upload/file_info.dart';
import 'package:model/upload/upload_response.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/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/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/model/upload_task_id.dart';
import 'package:tmail_ui_user/features/upload/domain/state/attachment_upload_state.dart'; import 'package:tmail_ui_user/features/upload/domain/state/attachment_upload_state.dart';
import 'package:worker_manager/worker_manager.dart' as worker; import 'package:worker_manager/worker_manager.dart' as worker;
@@ -41,13 +42,13 @@ class FileUploader {
uploadUri, uploadUri,
cancelToken: cancelToken); cancelToken: cancelToken);
} else { } else {
final mobileFileUpload = fileInfo.toMobileFileUpload();
return await _isolateExecutor.execute( return await _isolateExecutor.execute(
arg1: UploadFileArguments( arg1: UploadFileArguments(
_dioClient, _dioClient,
uploadId, uploadId,
fileInfo, mobileFileUpload,
uploadUri, uploadUri
cancelToken: cancelToken
), ),
fun1: _handleUploadAttachmentAction, fun1: _handleUploadAttachmentAction,
notification: (value) { notification: (value) {
@@ -66,34 +67,31 @@ class FileUploader {
UploadFileArguments argsUpload, UploadFileArguments argsUpload,
worker.TypeSendPort sendPort worker.TypeSendPort sendPort
) async { ) async {
final dioClient = argsUpload.dioClient; final headerParam = argsUpload.dioClient.getHeaders();
final fileInfo = argsUpload.fileInfo; headerParam[HttpHeaders.contentTypeHeader] = argsUpload.mobileFileUpload.mimeType;
final uploadUri = argsUpload.uploadUri; headerParam[HttpHeaders.contentLengthHeader] = argsUpload.mobileFileUpload.fileSize;
final cancelToken = argsUpload.cancelToken; final data = File(argsUpload.mobileFileUpload.filePath).openRead();
final resultJson = await _invokeRequestToServer( final resultJson = await argsUpload.dioClient.post(
dioClient, Uri.decodeFull(argsUpload.uploadUri.toString()),
uploadUri, options: Options(headers: headerParam),
fileInfo, data: data,
cancelToken: cancelToken,
onSendProgress: (count, total) { onSendProgress: (count, total) {
log('FileUploader::_handleUploadAttachmentAction():onSendProgress: [${argsUpload.uploadId.id}] = $count'); log('FileUploader::_handleUploadAttachmentAction():onSendProgress: [${argsUpload.uploadId.id}] = $count');
sendPort.send( sendPort.send(
UploadingAttachmentUploadState( UploadingAttachmentUploadState(
argsUpload.uploadId, argsUpload.uploadId,
count, count,
fileInfo.fileSize argsUpload.mobileFileUpload.fileSize
) )
); );
} }
); );
log('FileUploader::_handleUploadAttachmentAction():resultJson: $resultJson'); log('FileUploader::_handleUploadAttachmentAction():resultJson: $resultJson');
if (cancelToken?.isCancelled == true) { return _parsingResponse(
log('FileUploader::_handleUploadAttachmentAction(): upload is cancelled'); resultJson: resultJson,
return null; fileName: argsUpload.mobileFileUpload.fileName
} );
return _parsingResponse(resultJson: resultJson, fileName: fileInfo.fileName);
} }
Future<Attachment?> _handleUploadAttachmentActionOnWeb( Future<Attachment?> _handleUploadAttachmentActionOnWeb(
@@ -103,10 +101,15 @@ class FileUploader {
Uri uploadUri, Uri uploadUri,
{CancelToken? cancelToken} {CancelToken? cancelToken}
) async { ) async {
final resultJson = await _invokeRequestToServer( final headerParam = _dioClient.getHeaders();
_dioClient, headerParam[HttpHeaders.contentTypeHeader] = fileInfo.mimeType;
uploadUri, headerParam[HttpHeaders.contentLengthHeader] = fileInfo.fileSize;
fileInfo, final data = fileInfo.readStream;
final resultJson = await _dioClient.post(
Uri.decodeFull(uploadUri.toString()),
options: Options(headers: headerParam),
data: data,
cancelToken: cancelToken, cancelToken: cancelToken,
onSendProgress: (count, total) { onSendProgress: (count, total) {
log('FileUploader::_handleUploadAttachmentActionOnWeb():onSendProgress: [${uploadId.id}] = $count'); log('FileUploader::_handleUploadAttachmentActionOnWeb():onSendProgress: [${uploadId.id}] = $count');
@@ -119,44 +122,10 @@ class FileUploader {
); );
} }
); );
log('FileUploader::_handleUploadAttachmentActionOnWeb():resultJson: $resultJson'); log('FileUploader::_handleUploadAttachmentActionOnWeb():resultJson: $resultJson');
if (cancelToken?.isCancelled == true) {
log('FileUploader::_handleUploadAttachmentActionOnWeb(): upload is cancelled');
return null;
}
return _parsingResponse(resultJson: resultJson, fileName: fileInfo.fileName); return _parsingResponse(resultJson: resultJson, fileName: fileInfo.fileName);
} }
static Future<dynamic> _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}) { static Attachment? _parsingResponse({dynamic resultJson, required String fileName}) {
log('FileUploader::_parsingResponse():resultJson: $resultJson'); log('FileUploader::_parsingResponse():resultJson: $resultJson');
if (resultJson != null) { if (resultJson != null) {
@@ -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);
}
@@ -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<Object?> get props => [
fileName,
filePath,
fileSize,
mimeType,
];
}