TF-3514 Detect base64 image to transfer it to cid attachment

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-03-05 14:26:32 +07:00
committed by Dat H. Pham
parent 5c6a995107
commit 4765921a35
25 changed files with 367 additions and 231 deletions
@@ -65,29 +65,13 @@ import 'package:tmail_ui_user/features/upload/data/network/file_uploader.dart';
import 'package:tmail_ui_user/features/upload/domain/usecases/local_file_picker_interactor.dart';
import 'package:tmail_ui_user/features/upload/domain/usecases/local_image_picker_interactor.dart';
import 'package:tmail_ui_user/features/upload/presentation/controller/upload_controller.dart';
import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart';
import 'package:uuid/uuid.dart';
import 'package:worker_manager/worker_manager.dart';
class ComposerBindings extends BaseBindings {
@override
void dependencies() {
_bindingsUtils();
super.dependencies();
}
void _bindingsUtils() {
Get.lazyPut(() => FileUploader(
Get.find<DioClient>(tag: BindingTag.isolateTag),
Get.find<Executor>(),
Get.find<FileUtils>(),
));
}
@override
void bindingsDataSourceImpl() {
Get.lazyPut(() => AttachmentUploadDataSourceImpl(
@@ -20,6 +20,7 @@ import 'package:html/parser.dart';
import 'package:html_editor_enhanced/html_editor.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
@@ -474,24 +475,35 @@ class ComposerController extends BaseController
mailboxDashBoardController.sessionCurrent!.username);
}
Uri? _getUploadUriFromSession(Session session, AccountId accountId) {
try {
return session.getUploadUri(accountId, jmapUrl: dynamicUrlInterceptors.jmapUrl);
} catch (e) {
logError('ComposerController::_getUploadUriFromSession:Exception = $e');
return null;
}
}
Future<CreateEmailRequest?> _generateCreateEmailRequest() async {
if (composerArguments.value == null ||
mailboxDashBoardController.sessionCurrent == null ||
mailboxDashBoardController.accountId.value == null
) {
final arguments = composerArguments.value;
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value;
if (arguments == null || session == null || accountId == null) {
log('ComposerController::_generateCreateEmailRequest: SESSION or ACCOUNT_ID or ARGUMENTS is NULL');
return null;
}
final emailContent = await getContentInEditor();
final uploadUri = _getUploadUriFromSession(session, accountId);
return CreateEmailRequest(
session: mailboxDashBoardController.sessionCurrent!,
accountId: mailboxDashBoardController.accountId.value!,
emailActionType: composerArguments.value!.emailActionType,
session: session,
accountId: accountId,
emailActionType: arguments.emailActionType,
subject: subjectEmail.value ?? '',
emailContent: emailContent,
fromSender: composerArguments.value!.presentationEmail?.from ?? {},
fromSender: arguments.presentationEmail?.from ?? {},
toRecipients: listToEmailAddress.toSet(),
ccRecipients: listCcEmailAddress.toSet(),
bccRecipients: listBccEmailAddress.toSet(),
@@ -505,12 +517,13 @@ class ComposerController extends BaseController
sentMailboxId: getSentMailboxIdForComposer(),
draftsMailboxId: getDraftMailboxIdForComposer(),
draftsEmailId: getDraftEmailId(),
answerForwardEmailId: composerArguments.value!.presentationEmail?.id,
unsubscribeEmailId: composerArguments.value!.previousEmailId,
messageId: composerArguments.value!.messageId,
references: composerArguments.value!.references,
emailSendingQueue: composerArguments.value!.sendingEmail,
displayMode: screenDisplayMode.value
answerForwardEmailId: arguments.presentationEmail?.id,
unsubscribeEmailId: arguments.previousEmailId,
messageId: arguments.messageId,
references: arguments.references,
emailSendingQueue: arguments.sendingEmail,
displayMode: screenDisplayMode.value,
uploadUri: uploadUri,
);
}
@@ -1043,10 +1056,11 @@ class ComposerController extends BaseController
}
void _handleSendMessages(BuildContext context) async {
if (composerArguments.value == null ||
mailboxDashBoardController.sessionCurrent == null ||
mailboxDashBoardController.accountId.value == null
) {
final arguments = composerArguments.value;
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value;
if (arguments == null || session == null || accountId == null) {
log('ComposerController::_handleSendMessages: SESSION or ACCOUNT_ID or ARGUMENTS is NULL');
_sendButtonState = ButtonState.enabled;
_closeComposerAction(closeOverlays: true);
@@ -1058,9 +1072,14 @@ class ComposerController extends BaseController
}
final emailContent = await getContentInEditor();
final uploadUri = _getUploadUriFromSession(session, accountId);
final cancelToken = CancelToken();
final resultState = await _showSendingMessageDialog(
session: session,
accountId: accountId,
arguments: arguments,
emailContent: emailContent,
uploadUri: uploadUri,
cancelToken: cancelToken
);
log('ComposerController::_handleSendMessages: resultState = $resultState');
@@ -1080,18 +1099,22 @@ class ComposerController extends BaseController
}
Future<dynamic> _showSendingMessageDialog({
required Session session,
required AccountId accountId,
required ComposerArguments arguments,
required String emailContent,
CancelToken? cancelToken
required Uri? uploadUri,
CancelToken? cancelToken,
}) {
final childWidget = PointerInterceptor(
child: SendingMessageDialogView(
createEmailRequest: CreateEmailRequest(
session: mailboxDashBoardController.sessionCurrent!,
accountId: mailboxDashBoardController.accountId.value!,
emailActionType: composerArguments.value!.emailActionType,
session: session,
accountId: accountId,
emailActionType: arguments.emailActionType,
subject: subjectEmail.value ?? '',
emailContent: emailContent,
fromSender: composerArguments.value!.presentationEmail?.from ?? {},
fromSender: arguments.presentationEmail?.from ?? {},
toRecipients: listToEmailAddress.toSet(),
ccRecipients: listCcEmailAddress.toSet(),
bccRecipients: listBccEmailAddress.toSet(),
@@ -1104,12 +1127,13 @@ class ComposerController extends BaseController
outboxMailboxId: getOutboxMailboxIdForComposer(),
sentMailboxId: getSentMailboxIdForComposer(),
draftsEmailId: getDraftEmailId(),
answerForwardEmailId: composerArguments.value!.presentationEmail?.id,
unsubscribeEmailId: composerArguments.value!.previousEmailId,
messageId: composerArguments.value!.messageId,
references: composerArguments.value!.references,
emailSendingQueue: composerArguments.value!.sendingEmail,
displayMode: screenDisplayMode.value
answerForwardEmailId: arguments.presentationEmail?.id,
unsubscribeEmailId: arguments.previousEmailId,
messageId: arguments.messageId,
references: arguments.references,
emailSendingQueue: arguments.sendingEmail,
displayMode: screenDisplayMode.value,
uploadUri: uploadUri,
),
createNewAndSendEmailInteractor: _createNewAndSendEmailInteractor,
onCancelSendingEmailAction: _handleCancelSendingMessage,
@@ -1350,9 +1374,13 @@ class ComposerController extends BaseController
_saveToDraftButtonState = ButtonState.disabled;
if (composerArguments.value == null ||
mailboxDashBoardController.sessionCurrent == null ||
mailboxDashBoardController.accountId.value == null ||
final arguments = composerArguments.value;
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value;
if (arguments == null ||
session == null ||
accountId == null ||
getDraftMailboxIdForComposer() == null
) {
log('ComposerController::handleClickSaveAsDraftsButton: SESSION or ACCOUNT_ID or ARGUMENTS is NULL');
@@ -1361,9 +1389,14 @@ class ComposerController extends BaseController
}
final emailContent = await getContentInEditor();
final uploadUri = _getUploadUriFromSession(session, accountId);
final cancelToken = CancelToken();
final resultState = await _showSavingMessageToDraftsDialog(
session: session,
accountId: accountId,
arguments: arguments,
emailContent: emailContent,
uploadUri: uploadUri,
draftEmailId: _emailIdEditing,
cancelToken: cancelToken
);
@@ -2291,9 +2324,13 @@ class ComposerController extends BaseController
}
void _handleSaveMessageToDraft(BuildContext context) async {
if (composerArguments.value == null ||
mailboxDashBoardController.sessionCurrent == null ||
mailboxDashBoardController.accountId.value == null ||
final arguments = composerArguments.value;
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value;
if (arguments == null ||
session == null ||
accountId == null ||
getDraftMailboxIdForComposer() == null
) {
log('ComposerController::_handleSaveMessageToDraft: SESSION or ACCOUNT_ID or ARGUMENTS is NULL');
@@ -2305,11 +2342,16 @@ class ComposerController extends BaseController
popBack();
final emailContent = await getContentInEditor();
final uploadUri = _getUploadUriFromSession(session, accountId);
final draftEmailId = getDraftEmailId();
log('ComposerController::_handleSaveMessageToDraft: draftEmailId = $draftEmailId');
final cancelToken = CancelToken();
final resultState = await _showSavingMessageToDraftsDialog(
session: session,
accountId: accountId,
arguments: arguments,
emailContent: emailContent,
uploadUri: uploadUri,
draftEmailId: draftEmailId,
cancelToken: cancelToken
);
@@ -2346,19 +2388,23 @@ class ComposerController extends BaseController
}
Future<dynamic> _showSavingMessageToDraftsDialog({
required Session session,
required AccountId accountId,
required ComposerArguments arguments,
required String emailContent,
required Uri? uploadUri,
EmailId? draftEmailId,
CancelToken? cancelToken,
}) {
final childWidget = PointerInterceptor(
child: SavingMessageDialogView(
createEmailRequest: CreateEmailRequest(
session: mailboxDashBoardController.sessionCurrent!,
accountId: mailboxDashBoardController.accountId.value!,
emailActionType: composerArguments.value!.emailActionType,
session: session,
accountId: accountId,
emailActionType: arguments.emailActionType,
subject: subjectEmail.value ?? '',
emailContent: emailContent,
fromSender: composerArguments.value!.presentationEmail?.from ?? {},
fromSender: arguments.presentationEmail?.from ?? {},
toRecipients: listToEmailAddress.toSet(),
ccRecipients: listCcEmailAddress.toSet(),
bccRecipients: listBccEmailAddress.toSet(),
@@ -2371,12 +2417,13 @@ class ComposerController extends BaseController
sentMailboxId: getSentMailboxIdForComposer(),
draftsMailboxId: getDraftMailboxIdForComposer(),
draftsEmailId: draftEmailId,
answerForwardEmailId: composerArguments.value!.presentationEmail?.id,
unsubscribeEmailId: composerArguments.value!.previousEmailId,
messageId: composerArguments.value!.messageId,
references: composerArguments.value!.references,
emailSendingQueue: composerArguments.value!.sendingEmail,
displayMode: screenDisplayMode.value
answerForwardEmailId: arguments.presentationEmail?.id,
unsubscribeEmailId: arguments.previousEmailId,
messageId: arguments.messageId,
references: arguments.references,
emailSendingQueue: arguments.sendingEmail,
displayMode: screenDisplayMode.value,
uploadUri: uploadUri,
),
createNewAndSaveEmailToDraftsInteractor: _createNewAndSaveEmailToDraftsInteractor,
onCancelSavingEmailToDraftsAction: _handleCancelSavingMessageToDrafts,
@@ -38,6 +38,7 @@ class CreateEmailRequest with EquatableMixin {
final MessageIdsHeaderValue? references;
final SendingEmail? emailSendingQueue;
final ScreenDisplayMode displayMode;
final Uri? uploadUri;
CreateEmailRequest({
required this.session,
@@ -64,7 +65,8 @@ class CreateEmailRequest with EquatableMixin {
this.messageId,
this.references,
this.emailSendingQueue,
this.displayMode = ScreenDisplayMode.normal
this.displayMode = ScreenDisplayMode.normal,
this.uploadUri,
});
@override
@@ -94,5 +96,6 @@ class CreateEmailRequest with EquatableMixin {
references,
emailSendingQueue,
displayMode,
uploadUri,
];
}