TF-2469 Fix email set into root mailbox's SENT instead of team mailbox's SENT (#3482)
This commit is contained in:
@@ -0,0 +1,26 @@
|
|||||||
|
# 57. Team Mailboxes Matching
|
||||||
|
|
||||||
|
Date: 2025-02-18
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
Accepted
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
- Team mailboxes were not considered when sending emails
|
||||||
|
- Sent emails were saved to default sent mailbox, although selected identity's email was based on team mailbox email
|
||||||
|
- User does not have permission to edit mailboxes of team mailboxes
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
- Instead of hard coding default sent mailbox, sent emails will be saved to mailbox based on
|
||||||
|
- identity's email
|
||||||
|
- mailbox's name (hard coded English)
|
||||||
|
- Only when there's no matching mailbox, default sent mailbox will be used
|
||||||
|
- Same logic is applied to drafts mailbox and outbox mailbox
|
||||||
|
|
||||||
|
## Consequences
|
||||||
|
|
||||||
|
- Team mailboxes will be considered when sending emails
|
||||||
|
- Potentially, if team mailboxes existed but the name is not in English, sent emails will be saved to default sent mailbox
|
||||||
@@ -56,6 +56,9 @@ import 'package:tmail_ui_user/features/composer/domain/usecases/save_composer_ca
|
|||||||
import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_mobile_tablet_controller.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_mobile_tablet_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_web_controller.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_web_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/composer/presentation/extensions/get_draft_mailbox_id_for_composer_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/composer/presentation/extensions/get_outbox_mailbox_id_for_composer_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/composer/presentation/extensions/get_sent_mailbox_id_for_composer_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/extensions/list_identities_extension.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/extensions/list_identities_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/extensions/list_shared_media_file_extension.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/extensions/list_shared_media_file_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/mixin/drag_drog_file_mixin.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/mixin/drag_drog_file_mixin.dart';
|
||||||
@@ -481,9 +484,9 @@ class ComposerController extends BaseController
|
|||||||
identity: identitySelected.value,
|
identity: identitySelected.value,
|
||||||
attachments: uploadController.attachmentsUploaded,
|
attachments: uploadController.attachmentsUploaded,
|
||||||
inlineAttachments: uploadController.mapInlineAttachments,
|
inlineAttachments: uploadController.mapInlineAttachments,
|
||||||
outboxMailboxId: mailboxDashBoardController.outboxMailbox?.mailboxId,
|
outboxMailboxId: getOutboxMailboxIdForComposer(),
|
||||||
sentMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent],
|
sentMailboxId: getSentMailboxIdForComposer(),
|
||||||
draftsMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleDrafts],
|
draftsMailboxId: getDraftMailboxIdForComposer(),
|
||||||
draftsEmailId: getDraftEmailId(),
|
draftsEmailId: getDraftEmailId(),
|
||||||
answerForwardEmailId: composerArguments.value!.presentationEmail?.id,
|
answerForwardEmailId: composerArguments.value!.presentationEmail?.id,
|
||||||
unsubscribeEmailId: composerArguments.value!.previousEmailId,
|
unsubscribeEmailId: composerArguments.value!.previousEmailId,
|
||||||
@@ -1059,8 +1062,8 @@ class ComposerController extends BaseController
|
|||||||
identity: identitySelected.value,
|
identity: identitySelected.value,
|
||||||
attachments: uploadController.attachmentsUploaded,
|
attachments: uploadController.attachmentsUploaded,
|
||||||
inlineAttachments: uploadController.mapInlineAttachments,
|
inlineAttachments: uploadController.mapInlineAttachments,
|
||||||
outboxMailboxId: mailboxDashBoardController.outboxMailbox?.mailboxId,
|
outboxMailboxId: getOutboxMailboxIdForComposer(),
|
||||||
sentMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent],
|
sentMailboxId: getSentMailboxIdForComposer(),
|
||||||
draftsEmailId: getDraftEmailId(),
|
draftsEmailId: getDraftEmailId(),
|
||||||
answerForwardEmailId: composerArguments.value!.presentationEmail?.id,
|
answerForwardEmailId: composerArguments.value!.presentationEmail?.id,
|
||||||
unsubscribeEmailId: composerArguments.value!.previousEmailId,
|
unsubscribeEmailId: composerArguments.value!.previousEmailId,
|
||||||
@@ -1309,7 +1312,7 @@ class ComposerController extends BaseController
|
|||||||
if (composerArguments.value == null ||
|
if (composerArguments.value == null ||
|
||||||
mailboxDashBoardController.sessionCurrent == null ||
|
mailboxDashBoardController.sessionCurrent == null ||
|
||||||
mailboxDashBoardController.accountId.value == null ||
|
mailboxDashBoardController.accountId.value == null ||
|
||||||
mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleDrafts] == null
|
getDraftMailboxIdForComposer() == null
|
||||||
) {
|
) {
|
||||||
log('ComposerController::handleClickSaveAsDraftsButton: SESSION or ACCOUNT_ID or ARGUMENTS is NULL');
|
log('ComposerController::handleClickSaveAsDraftsButton: SESSION or ACCOUNT_ID or ARGUMENTS is NULL');
|
||||||
_saveToDraftButtonState = ButtonState.enabled;
|
_saveToDraftButtonState = ButtonState.enabled;
|
||||||
@@ -2309,7 +2312,7 @@ class ComposerController extends BaseController
|
|||||||
if (composerArguments.value == null ||
|
if (composerArguments.value == null ||
|
||||||
mailboxDashBoardController.sessionCurrent == null ||
|
mailboxDashBoardController.sessionCurrent == null ||
|
||||||
mailboxDashBoardController.accountId.value == null ||
|
mailboxDashBoardController.accountId.value == null ||
|
||||||
mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleDrafts] == null
|
getDraftMailboxIdForComposer() == null
|
||||||
) {
|
) {
|
||||||
log('ComposerController::_handleSaveMessageToDraft: SESSION or ACCOUNT_ID or ARGUMENTS is NULL');
|
log('ComposerController::_handleSaveMessageToDraft: SESSION or ACCOUNT_ID or ARGUMENTS is NULL');
|
||||||
_closeComposerButtonState = ButtonState.enabled;
|
_closeComposerButtonState = ButtonState.enabled;
|
||||||
@@ -2381,8 +2384,8 @@ class ComposerController extends BaseController
|
|||||||
identity: identitySelected.value,
|
identity: identitySelected.value,
|
||||||
attachments: uploadController.attachmentsUploaded,
|
attachments: uploadController.attachmentsUploaded,
|
||||||
inlineAttachments: uploadController.mapInlineAttachments,
|
inlineAttachments: uploadController.mapInlineAttachments,
|
||||||
sentMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent],
|
sentMailboxId: getSentMailboxIdForComposer(),
|
||||||
draftsMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleDrafts],
|
draftsMailboxId: getDraftMailboxIdForComposer(),
|
||||||
draftsEmailId: draftEmailId,
|
draftsEmailId: draftEmailId,
|
||||||
answerForwardEmailId: composerArguments.value!.presentationEmail?.id,
|
answerForwardEmailId: composerArguments.value!.presentationEmail?.id,
|
||||||
unsubscribeEmailId: composerArguments.value!.previousEmailId,
|
unsubscribeEmailId: composerArguments.value!.previousEmailId,
|
||||||
|
|||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
import 'package:collection/collection.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:model/extensions/presentation_mailbox_extension.dart';
|
||||||
|
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||||
|
import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart';
|
||||||
|
|
||||||
|
extension GetDraftMailboxIdForComposerExtension on ComposerController {
|
||||||
|
MailboxId? getDraftMailboxIdForComposer() {
|
||||||
|
final defaultDraftsMailbox = mailboxDashBoardController.mapDefaultMailboxIdByRole[
|
||||||
|
PresentationMailbox.roleDrafts
|
||||||
|
];
|
||||||
|
final lowercaseDraftsRole = PresentationMailbox.roleDrafts.value.toLowerCase();
|
||||||
|
|
||||||
|
return mailboxDashBoardController.mapMailboxById.entries
|
||||||
|
.firstWhereOrNull((entry) {
|
||||||
|
final mailbox = entry.value;
|
||||||
|
return mailbox.emailTeamMailBoxes == identitySelected.value?.email &&
|
||||||
|
mailbox.name?.name.toLowerCase() == lowercaseDraftsRole;
|
||||||
|
})
|
||||||
|
?.key ?? defaultDraftsMailbox;
|
||||||
|
}
|
||||||
|
}
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
import 'package:collection/collection.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:model/extensions/presentation_mailbox_extension.dart';
|
||||||
|
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||||
|
import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart';
|
||||||
|
|
||||||
|
extension GetOutboxMailboxIdForComposerExtension on ComposerController {
|
||||||
|
MailboxId? getOutboxMailboxIdForComposer() {
|
||||||
|
final defaultOutboxMailbox = mailboxDashBoardController.mapDefaultMailboxIdByRole[
|
||||||
|
PresentationMailbox.roleOutbox
|
||||||
|
];
|
||||||
|
final lowercaseOutboxRole = PresentationMailbox.roleOutbox.value.toLowerCase();
|
||||||
|
|
||||||
|
return mailboxDashBoardController.mapMailboxById.entries
|
||||||
|
.firstWhereOrNull((entry) {
|
||||||
|
final mailbox = entry.value;
|
||||||
|
return mailbox.emailTeamMailBoxes == identitySelected.value?.email &&
|
||||||
|
mailbox.name?.name.toLowerCase() == lowercaseOutboxRole;
|
||||||
|
})
|
||||||
|
?.key ?? defaultOutboxMailbox;
|
||||||
|
}
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
import 'package:collection/collection.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:model/model.dart';
|
||||||
|
import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart';
|
||||||
|
|
||||||
|
extension GetSentMailboxIdForComposerExtension on ComposerController {
|
||||||
|
MailboxId? getSentMailboxIdForComposer() {
|
||||||
|
final defaultSentMailbox = mailboxDashBoardController.mapDefaultMailboxIdByRole[
|
||||||
|
PresentationMailbox.roleSent
|
||||||
|
];
|
||||||
|
final lowercaseSentRole = PresentationMailbox.roleSent.value.toLowerCase();
|
||||||
|
|
||||||
|
return mailboxDashBoardController.mapMailboxById.entries
|
||||||
|
.firstWhereOrNull((entry) {
|
||||||
|
final mailbox = entry.value;
|
||||||
|
return mailbox.emailTeamMailBoxes == identitySelected.value?.email &&
|
||||||
|
mailbox.name?.name.toLowerCase() == lowercaseSentRole;
|
||||||
|
})
|
||||||
|
?.key ?? defaultSentMailbox;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -127,6 +127,9 @@ class MockMailboxDashBoardController extends Mock implements MailboxDashBoardCon
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
int get minInputLengthAutocomplete => AppConfig.defaultMinInputLengthAutocomplete;
|
int get minInputLengthAutocomplete => AppConfig.defaultMinInputLengthAutocomplete;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<MailboxId, PresentationMailbox> get mapMailboxById => {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@GenerateNiceMocks([
|
@GenerateNiceMocks([
|
||||||
|
|||||||
Reference in New Issue
Block a user