TF-3035 Restore identity from draft

This commit is contained in:
DatDang
2024-09-05 16:46:28 +07:00
committed by Dat H. Pham
parent fd78f327b7
commit 82a49c5923
21 changed files with 199 additions and 49 deletions
@@ -17,9 +17,11 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.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/identities/identity.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:jmap_dart_client/jmap/mail/email/individual_header_identifier.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart';
import 'package:permission_handler/permission_handler.dart';
@@ -58,6 +60,7 @@ import 'package:tmail_ui_user/features/composer/presentation/extensions/list_sha
import 'package:tmail_ui_user/features/composer/presentation/mixin/drag_drog_file_mixin.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/signature_status.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/inline_image.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/prefix_recipient_state.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/screen_display_mode.dart';
@@ -191,6 +194,7 @@ class ComposerController extends BaseController with DragDropFileMixin implement
ButtonState _closeComposerButtonState = ButtonState.enabled;
ButtonState _saveToDraftButtonState = ButtonState.enabled;
ButtonState _sendButtonState = ButtonState.enabled;
SignatureStatus _identityContentOnOpenPolicy = SignatureStatus.editedAvailable;
late Worker uploadInlineImageWorker;
late Worker dashboardViewStateWorker;
@@ -258,6 +262,7 @@ class ComposerController extends BaseController with DragDropFileMixin implement
} else {
richTextMobileTabletController = null;
}
_identityContentOnOpenPolicy = SignatureStatus.editedAvailable;
super.onClose();
}
@@ -716,14 +721,21 @@ class ComposerController extends BaseController with DragDropFileMixin implement
}
}
Identity? _selectIdentityFromId(IdentityId? identityId) {
if (identityId == null) return null;
return listFromIdentities.firstWhereOrNull(
(identity) => identity.id == identityId);
}
void _initIdentities(ComposerArguments composerArguments) {
listFromIdentities.value = composerArguments.identities ?? [];
final selectedIdentityFromId = _selectIdentityFromId(
composerArguments.selectedIdentityId);
if (listFromIdentities.isEmpty) {
_getAllIdentities();
} else if (composerArguments.selectedIdentity != null
&& listFromIdentities.contains(composerArguments.selectedIdentity!)
) {
_selectIdentity(composerArguments.selectedIdentity!);
} else if (selectedIdentityFromId != null) {
_selectIdentity(selectedIdentityFromId);
} else if (composerArguments.identities?.isNotEmpty == true) {
_selectIdentity(composerArguments.identities!.first);
}
@@ -744,11 +756,10 @@ class ComposerController extends BaseController with DragDropFileMixin implement
listFromIdentities.value = listIdentitiesMayDeleted;
if (identitySelected.value == null) {
final selectedIdentityFromArguments = composerArguments.value?.selectedIdentity;
if (selectedIdentityFromArguments != null
&& listFromIdentities.contains(selectedIdentityFromArguments)
) {
await _selectIdentity(selectedIdentityFromArguments);
final selectedIdentityFromId = _selectIdentityFromId(
composerArguments.value?.selectedIdentityId);
if (selectedIdentityFromId != null) {
await _selectIdentity(selectedIdentityFromId);
} else {
await _selectIdentity(listIdentitiesMayDeleted.firstOrNull);
}
@@ -1389,7 +1400,9 @@ class ComposerController extends BaseController with DragDropFileMixin implement
accountId,
emailId,
mailboxDashBoardController.baseDownloadUrl,
TransformConfiguration.forDraftsEmail()
TransformConfiguration.forEditDraftsEmail(),
additionalProperties: Properties({
IndividualHeaderIdentifier.identityHeader.value}),
));
}
@@ -1412,9 +1425,18 @@ class ComposerController extends BaseController with DragDropFileMixin implement
if (composerArguments.value?.emailActionType == EmailActionType.editDraft) {
_setUpRequestReadReceiptForDraftEmail(success.emailCurrent);
_restoreIdentityFromHeader(success.emailCurrent);
}
}
void _restoreIdentityFromHeader(Email? email) {
final identityIdFromHeader = email?.identityIdFromHeader;
if (identityIdFromHeader == null) return;
final selectedIdentityFromHeader = _selectIdentityFromId(identityIdFromHeader);
if (selectedIdentityFromHeader == null) return;
identitySelected.value = selectedIdentityFromHeader;
}
void _transformHtmlEmailContent(String? emailContent) {
emailContentsViewState(Right(TransformHtmlEmailContentLoading()));
if (emailContent?.isEmpty == true) {
@@ -1662,11 +1684,18 @@ class ComposerController extends BaseController with DragDropFileMixin implement
identitySelected.value = newIdentity;
if (newIdentity == null) return;
if (composerArguments.value?.emailActionType == EmailActionType.reopenComposerBrowser) {
composerArguments.value = composerArguments.value?.copyWith(
emailActionType: EmailActionType.editDraft);
} else {
await _applyIdentityForAllFieldComposer(formerIdentity, newIdentity);
final emailActionType = composerArguments.value?.emailActionType;
switch (emailActionType) {
case EmailActionType.reopenComposerBrowser:
case EmailActionType.editDraft:
if (_identityContentOnOpenPolicy == SignatureStatus.editedAvailable) {
_identityContentOnOpenPolicy = SignatureStatus.editedApplied;
} else {
await _applyIdentityForAllFieldComposer(formerIdentity, newIdentity);
}
break;
default:
await _applyIdentityForAllFieldComposer(formerIdentity, newIdentity);
}
}
@@ -1891,7 +1920,9 @@ class ComposerController extends BaseController with DragDropFileMixin implement
if (identitySelected.value == null) {
_getAllIdentities();
} else {
await _selectIdentity(identitySelected.value);
if (composerArguments.value?.emailActionType != EmailActionType.editDraft) {
await _selectIdentity(identitySelected.value);
}
_autoFocusFieldWhenLauncher();
}
}