Skip to content

Commit be04173

Browse files
committed
TF-3358 Remove local email draft when Delete, Save as draft or Send successfully
Signed-off-by: dab246 <tdvu@linagora.com>
1 parent d620d51 commit be04173

File tree

8 files changed

+99
-4
lines changed

8 files changed

+99
-4
lines changed

lib/features/composer/presentation/composer_controller.dart

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart
9191
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
9292
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
9393
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart';
94+
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/remove_local_email_draft_extension.dart';
9495
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/draggable_app_state.dart';
9596
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
9697
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
@@ -744,7 +745,7 @@ class ComposerController extends BaseController
744745
}
745746

746747
if (accountId == null || downloadUrl == null) return;
747-
_getEmailContentFromSessionStorageBrowser(
748+
_getEmailContentFromLocalEmailDraft(
748749
htmlContent: arguments.emailContents ?? '',
749750
inlineImages: arguments.inlineImages ?? [],
750751
accountId: accountId,
@@ -1072,6 +1073,9 @@ class ComposerController extends BaseController
10721073
log('ComposerController::_handleSendMessages: resultState = $resultState');
10731074
if (resultState is SendEmailSuccess || mailboxDashBoardController.validateSendingEmailFailedWhenNetworkIsLostOnMobile(resultState)) {
10741075
_sendButtonState = ButtonState.enabled;
1076+
if (composerId != null) {
1077+
mailboxDashBoardController.removeLocalEmailDraft(composerId!);
1078+
}
10751079
_closeComposerAction(result: resultState);
10761080
} else if (resultState is SendEmailFailure && resultState.exception is SendingEmailCanceledException) {
10771081
_sendButtonState = ButtonState.enabled;
@@ -1441,7 +1445,7 @@ class ComposerController extends BaseController
14411445
));
14421446
}
14431447

1444-
void _getEmailContentFromSessionStorageBrowser({
1448+
void _getEmailContentFromLocalEmailDraft({
14451449
required String htmlContent,
14461450
required List<Attachment> inlineImages,
14471451
required AccountId accountId,
@@ -1880,6 +1884,9 @@ class ComposerController extends BaseController
18801884

18811885
void handleClickDeleteComposer(BuildContext context) {
18821886
clearFocus(context);
1887+
if (composerId != null) {
1888+
mailboxDashBoardController.removeLocalEmailDraft(composerId!);
1889+
}
18831890
_closeComposerAction();
18841891
}
18851892

@@ -2284,6 +2291,9 @@ class ComposerController extends BaseController
22842291

22852292
if (resultState is SaveEmailAsDraftsSuccess || resultState is UpdateEmailDraftsSuccess) {
22862293
_closeComposerButtonState = ButtonState.enabled;
2294+
if (composerId != null) {
2295+
mailboxDashBoardController.removeLocalEmailDraft(composerId!);
2296+
}
22872297
_closeComposerAction(result: resultState);
22882298
} else if ((resultState is SaveEmailAsDraftsFailure && resultState.exception is SavingEmailToDraftsCanceledException) ||
22892299
(resultState is UpdateEmailDraftsFailure && resultState.exception is SavingEmailToDraftsCanceledException)) {

lib/features/mailbox_dashboard/data/datasource_impl/local_email_draft_datasource_impl.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,13 @@ class LocalEmailDraftDataSourceImpl extends LocalEmailDraftDatasource {
6969
@override
7070
Future<void> removeLocalEmailDraft(String draftLocalId) {
7171
return Future.sync(() async {
72-
return await _localEmailDraftManager.removeLocalEmailDraft(draftLocalId);
72+
final task = HiveTask(
73+
id: draftLocalId,
74+
runnable: () async {
75+
return await _localEmailDraftManager.removeLocalEmailDraft(draftLocalId);
76+
},
77+
);
78+
return _localEmailDraftWorkerQueue.addTask(task);
7379
}).catchError(_exceptionThrower.throwException);
7480
}
7581
}

lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/spam_repor
9292
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_all_local_email_draft_state.dart';
9393
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart';
9494
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart';
95+
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_local_email_draft_interactor.dart';
9596
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
9697
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart';
9798
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/download/download_controller.dart';
@@ -222,6 +223,7 @@ class MailboxDashBoardController extends ReloadableController
222223
GetAutoCompleteInteractor? _getAutoCompleteInteractor;
223224
IOSNotificationManager? _iosNotificationManager;
224225
GetServerSettingInteractor? getServerSettingInteractor;
226+
RemoveLocalEmailDraftInteractor? removeLocalEmailDraftInteractor;
225227

226228
final scaffoldKey = GlobalKey<ScaffoldState>();
227229
final selectedMailbox = Rxn<PresentationMailbox>();
@@ -321,6 +323,7 @@ class MailboxDashBoardController extends ReloadableController
321323
void onReady() {
322324
if (PlatformInfo.isWeb) {
323325
listSearchFilterScrollController = ScrollController();
326+
removeLocalEmailDraftInteractor = getBinding<RemoveLocalEmailDraftInteractor>();
324327
}
325328
if (PlatformInfo.isIOS) {
326329
_registerPendingCurrentEmailIdInNotification();
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
2+
import 'package:jmap_dart_client/jmap/account_id.dart';
3+
import 'package:jmap_dart_client/jmap/core/user_name.dart';
4+
import 'package:model/extensions/account_id_extensions.dart';
5+
import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart';
6+
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
7+
8+
extension RemoveLocalEmailDraftExtension on MailboxDashBoardController {
9+
10+
Future<void> removeLocalEmailDraft(String composerId) async {
11+
if (accountId.value == null ||
12+
sessionCurrent == null ||
13+
removeLocalEmailDraftInteractor == null) return;
14+
15+
final draftLocalId = _generateDraftLocalId(
16+
composerId: composerId,
17+
accountId: accountId.value!,
18+
userName: sessionCurrent!.username,
19+
);
20+
21+
await removeLocalEmailDraftInteractor!.execute(draftLocalId);
22+
}
23+
24+
String _generateDraftLocalId({
25+
required String composerId,
26+
required AccountId accountId,
27+
required UserName userName,
28+
}) {
29+
return TupleKey(
30+
composerId,
31+
accountId.asString,
32+
userName.value,
33+
).encodeKey;
34+
}
35+
}

lib/features/mailbox_dashboard/presentation/extensions/restore_local_email_draft_extension.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions
1111
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart';
1212
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/presentation_local_email_draft.dart';
1313
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/local_email_draft/local_email_draft_list_dialog_builder.dart';
14+
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
1415
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
1516

1617
extension RestoreLocalEmailDraftExtension on MailboxDashBoardController {
@@ -68,5 +69,12 @@ extension RestoreLocalEmailDraftExtension on MailboxDashBoardController {
6869
.toList();
6970

7071
openListComposer(listComposerArguments);
72+
73+
if (currentOverlayContext != null && currentContext != null) {
74+
appToast.showToastSuccessMessage(
75+
currentOverlayContext!,
76+
AppLocalizations.of(currentContext!).restoreAllLocalDraftsSuccessfully,
77+
);
78+
}
7179
}
7280
}

lib/features/mailbox_dashboard/presentation/widgets/local_email_draft/local_email_draft_list_dialog_builder.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,13 @@ class _LocalEmailDraftListDialogBuilderState
410410
widget.session!.username,
411411
);
412412

413+
if (context.mounted) {
414+
_appToast.showToastSuccessMessage(
415+
context,
416+
AppLocalizations.of(context).deleteAllLocalDraftsSuccessfully,
417+
);
418+
}
419+
413420
SmartDialog.dismiss();
414421
popBack();
415422
}

lib/l10n/intl_messages.arb

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"@@last_modified": "2025-03-25T23:46:35.150458",
2+
"@@last_modified": "2025-03-26T03:05:38.715094",
33
"initializing_data": "Initializing data...",
44
"@initializing_data": {
55
"type": "text",
@@ -4417,5 +4417,17 @@
44174417
"type": "text",
44184418
"placeholders_order": [],
44194419
"placeholders": {}
4420+
},
4421+
"deleteAllLocalDraftsSuccessfully": "Delete all local drafts successfully",
4422+
"@deleteAllLocalDraftsSuccessfully": {
4423+
"type": "text",
4424+
"placeholders_order": [],
4425+
"placeholders": {}
4426+
},
4427+
"restoreAllLocalDraftsSuccessfully": "Restore all local drafts successfully",
4428+
"@restoreAllLocalDraftsSuccessfully": {
4429+
"type": "text",
4430+
"placeholders_order": [],
4431+
"placeholders": {}
44204432
}
44214433
}

lib/main/localizations/app_localizations.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4646,4 +4646,18 @@ class AppLocalizations {
46464646
name: 'deletingLocalDraft',
46474647
);
46484648
}
4649+
4650+
String get deleteAllLocalDraftsSuccessfully {
4651+
return Intl.message(
4652+
'Delete all local drafts successfully',
4653+
name: 'deleteAllLocalDraftsSuccessfully',
4654+
);
4655+
}
4656+
4657+
String get restoreAllLocalDraftsSuccessfully {
4658+
return Intl.message(
4659+
'Restore all local drafts successfully',
4660+
name: 'restoreAllLocalDraftsSuccessfully',
4661+
);
4662+
}
46494663
}

0 commit comments

Comments
 (0)