TF-3480 Handle reopen multiple composer when reload page or session expired

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-02-28 01:29:38 +07:00
committed by Dat H. Pham
parent 810d86b100
commit cfc72a6f4f
24 changed files with 318 additions and 101 deletions
@@ -52,7 +52,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/session
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/session_storage_composer_datasoure_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/composer_cache_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/composer_cache_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_on_web_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_by_id_on_web_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/bindings/preferences_interactors_bindings.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart';
@@ -260,7 +260,7 @@ class ComposerBindings extends BaseBindings {
tag: composerId,
);
Get.lazyPut(
() => RemoveComposerCacheOnWebInteractor(Get.find<ComposerCacheRepository>(tag: composerId)),
() => RemoveComposerCacheByIdOnWebInteractor(Get.find<ComposerCacheRepository>(tag: composerId)),
tag: composerId,
);
Get.lazyPut(() => SaveComposerCacheOnWebInteractor(
@@ -313,7 +313,7 @@ class ComposerBindings extends BaseBindings {
Get.find<GetEmailContentInteractor>(tag: composerId),
Get.find<GetAllIdentitiesInteractor>(tag: composerId),
Get.find<UploadController>(tag: composerId),
Get.find<RemoveComposerCacheOnWebInteractor>(tag: composerId),
Get.find<RemoveComposerCacheByIdOnWebInteractor>(tag: composerId),
Get.find<SaveComposerCacheOnWebInteractor>(tag: composerId),
Get.find<DownloadImageAsBase64Interactor>(tag: composerId),
Get.find<TransformHtmlEmailContentInteractor>(tag: composerId),
@@ -379,7 +379,7 @@ class ComposerBindings extends BaseBindings {
Get.delete<LocalImagePickerInteractor>(tag: composerId);
Get.delete<UploadAttachmentInteractor>(tag: composerId);
Get.delete<GetEmailContentInteractor>(tag: composerId);
Get.delete<RemoveComposerCacheOnWebInteractor>(tag: composerId);
Get.delete<RemoveComposerCacheByIdOnWebInteractor>(tag: composerId);
Get.delete<SaveComposerCacheOnWebInteractor>(tag: composerId);
Get.delete<DownloadImageAsBase64Interactor>(tag: composerId);
Get.delete<TransformHtmlEmailContentInteractor>(tag: composerId);
@@ -88,7 +88,7 @@ import 'package:tmail_ui_user/features/email/presentation/extensions/presentatio
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_on_web_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_by_id_on_web_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/draggable_app_state.dart';
@@ -149,7 +149,7 @@ class ComposerController extends BaseController
final GetEmailContentInteractor _getEmailContentInteractor;
final GetAllIdentitiesInteractor _getAllIdentitiesInteractor;
final UploadController uploadController;
final RemoveComposerCacheOnWebInteractor _removeComposerCacheOnWebInteractor;
final RemoveComposerCacheByIdOnWebInteractor _removeComposerCacheByIdOnWebInteractor;
final SaveComposerCacheOnWebInteractor _saveComposerCacheOnWebInteractor;
final DownloadImageAsBase64Interactor _downloadImageAsBase64Interactor;
final TransformHtmlEmailContentInteractor _transformHtmlEmailContentInteractor;
@@ -243,7 +243,7 @@ class ComposerController extends BaseController
this._getEmailContentInteractor,
this._getAllIdentitiesInteractor,
this.uploadController,
this._removeComposerCacheOnWebInteractor,
this._removeComposerCacheByIdOnWebInteractor,
this._saveComposerCacheOnWebInteractor,
this._downloadImageAsBase64Interactor,
this._transformHtmlEmailContentInteractor,
@@ -421,7 +421,15 @@ class ComposerController extends BaseController
@override
Future<void> onUnloadBrowserListener(html.Event event) async {
await _removeComposerCacheOnWebInteractor.execute();
final username = mailboxDashBoardController.sessionCurrent?.username;
final accountId = mailboxDashBoardController.accountId.value;
if (composerId != null && username != null && accountId != null) {
await _removeComposerCacheByIdOnWebInteractor.execute(
accountId,
username,
composerId!,
);
}
await _saveComposerCacheOnWebAction();
}
@@ -504,6 +512,10 @@ class ComposerController extends BaseController
final emailContent = await getContentInEditor();
final uploadUri = _getUploadUriFromSession(session, accountId);
final composerIndex = composerId != null
? mailboxDashBoardController.composerManager.getComposerIndex(composerId!)
: null;
return CreateEmailRequest(
session: session,
accountId: accountId,
@@ -531,6 +543,8 @@ class ComposerController extends BaseController
emailSendingQueue: arguments.sendingEmail,
displayMode: screenDisplayMode.value,
uploadUri: uploadUri,
composerIndex: composerIndex,
composerId: composerId,
);
}
@@ -1363,9 +1377,12 @@ class ComposerController extends BaseController
isEmailChanged.value = draftEmailHash != emptyDraftEmailHash;
if (composerArguments.value?.emailActionType == EmailActionType.compose ||
composerArguments.value?.emailActionType == EmailActionType.editDraft) {
final emailActionType = composerArguments.value?.emailActionType;
if (emailActionType == EmailActionType.compose
|| emailActionType == EmailActionType.editDraft) {
_savedEmailDraftHash = draftEmailHash;
} else if (emailActionType == EmailActionType.reopenComposerBrowser) {
_savedEmailDraftHash = emptyDraftEmailHash;
}
}
@@ -1468,7 +1485,7 @@ class ComposerController extends BaseController
required AccountId accountId,
required String downloadUrl
}) {
_restoreEmailInlineImagesInteractor = getBinding<RestoreEmailInlineImagesInteractor>();
_restoreEmailInlineImagesInteractor = getBinding<RestoreEmailInlineImagesInteractor>(tag: composerId);
if (_restoreEmailInlineImagesInteractor == null) return;
consumeState(_restoreEmailInlineImagesInteractor!.execute(
htmlContent: htmlContent,
@@ -30,6 +30,27 @@ class ComposerManager extends GetxController {
_arrangeComposerIfNeeded();
}
void addListComposer(List<ComposerArguments> listArguments) {
for (var argument in listArguments) {
final composerId = argument.composerId;
if (composerId == null) continue;
ComposerBindings(
composerId: composerId,
composerArguments: argument,
).dependencies();
composers[composerId] = ComposerView(
key: Key(composerId),
composerId: composerId,
);
composerIdsQueue.add(composerId);
}
_syncQueueIfNeeded();
}
void removeComposer(String id) {
log('ComposerManager::removeComposer:Id = $id');
if (!composers.containsKey(id)) return;
@@ -252,6 +273,8 @@ class ComposerManager extends GetxController {
.toList();
}
int getComposerIndex(String id) => composerIdsQueue.toList().indexOf(id);
void showComposerIfHidden(String composerId) {
log('ComposerManager::showComposerIfHidden:Id = $composerId');
if (!composers.containsKey(composerId)) return;
@@ -39,6 +39,8 @@ class CreateEmailRequest with EquatableMixin {
final SendingEmail? emailSendingQueue;
final ScreenDisplayMode displayMode;
final Uri? uploadUri;
final int? composerIndex;
final String? composerId;
CreateEmailRequest({
required this.session,
@@ -67,6 +69,8 @@ class CreateEmailRequest with EquatableMixin {
this.emailSendingQueue,
this.displayMode = ScreenDisplayMode.normal,
this.uploadUri,
this.composerIndex,
this.composerId,
});
@override
@@ -97,5 +101,7 @@ class CreateEmailRequest with EquatableMixin {
emailSendingQueue,
displayMode,
uploadUri,
composerIndex,
composerId,
];
}