TF-239 Empty trash folder

This commit is contained in:
dab246
2022-04-05 16:18:22 +07:00
committed by Dat H. Pham
parent a89c5db744
commit 1c7f9ad333
19 changed files with 367 additions and 95 deletions
@@ -23,6 +23,7 @@ import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dar
import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart';
import 'package:tmail_ui_user/features/thread/data/repository/thread_repository_impl.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/empty_trash_folder_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
@@ -57,6 +58,7 @@ class ThreadBindings extends BaseBindings {
Get.find<SearchMoreEmailInteractor>(),
Get.find<MoveMultipleEmailToTrashInteractor>(),
Get.find<DeleteMultipleEmailsPermanentlyInteractor>(),
Get.find<EmptyTrashFolderInteractor>(),
));
}
@@ -96,6 +98,7 @@ class ThreadBindings extends BaseBindings {
Get.lazyPut(() => SearchMoreEmailInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => MoveMultipleEmailToTrashInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => DeleteMultipleEmailsPermanentlyInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => EmptyTrashFolderInteractor(Get.find<ThreadRepository>()));
}
@override
@@ -111,7 +114,8 @@ class ThreadBindings extends BaseBindings {
DataSourceType.network: Get.find<ThreadDataSource>(),
DataSourceType.local: Get.find<LocalThreadDataSourceImpl>()
},
Get.find<StateDataSource>()
Get.find<StateDataSource>(),
Get.find<EmailDataSource>(),
));
Get.lazyPut(() => EmailRepositoryImpl(
Get.find<EmailDataSource>(),
@@ -38,6 +38,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_da
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_action.dart';
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
@@ -47,6 +48,7 @@ import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_t
import 'package:tmail_ui_user/features/thread/domain/state/refresh_changes_all_email_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/empty_trash_folder_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
@@ -83,6 +85,7 @@ class ThreadController extends BaseController {
final SearchMoreEmailInteractor _searchMoreEmailInteractor;
final MoveMultipleEmailToTrashInteractor _moveMultipleEmailToTrashInteractor;
final DeleteMultipleEmailsPermanentlyInteractor _deleteMultipleEmailsPermanentlyInteractor;
final EmptyTrashFolderInteractor _emptyTrashFolderInteractor;
final emailList = <PresentationEmail>[].obs;
final emailListSearch = <PresentationEmail>[].obs;
@@ -118,6 +121,7 @@ class ThreadController extends BaseController {
this._searchMoreEmailInteractor,
this._moveMultipleEmailToTrashInteractor,
this._deleteMultipleEmailsPermanentlyInteractor,
this._emptyTrashFolderInteractor,
);
@override
@@ -214,6 +218,8 @@ class ThreadController extends BaseController {
} else if (failure is MarkAsStarMultipleEmailAllFailure
|| failure is MarkAsStarMultipleEmailFailure) {
_markAsStarMultipleEmailFailure(failure);
} else if (failure is EmptyTrashFolderFailure) {
_emptyTrashFolderFailure(failure);
}
},
(success) {
@@ -234,6 +240,8 @@ class ThreadController extends BaseController {
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess
|| success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
_deleteMultipleEmailsPermanentlySuccess(success);
} else if (success is EmptyTrashFolderSuccess) {
_emptyTrashFolderSuccess(success);
}
}
);
@@ -272,6 +280,10 @@ class ThreadController extends BaseController {
final emailsAfterChanges = success.emailList;
final newListEmail = emailsAfterChanges.combine(emailsBeforeChanges);
emailList.value = newListEmail;
if (emailList.isEmpty) {
refreshAllEmail();
}
}
void _getAllEmailAction(AccountId accountId, {MailboxId? mailboxId}) {
@@ -856,6 +868,7 @@ class ThreadController extends BaseController {
switch(actionType) {
case DeleteActionType.all:
_emptyTrashFolderAction();
break;
case DeleteActionType.multiple:
_deleteMultipleEmailsPermanently(listEmailSelected);
@@ -868,10 +881,9 @@ class ThreadController extends BaseController {
void _deleteMultipleEmailsPermanently(List<PresentationEmail> emailList) {
cancelSelectEmail();
final session = mailboxDashBoardController.sessionCurrent;
final listEmailIds = emailList.map((email) => email.id).toList();
if (session != null && _accountId != null && listEmailIds.isNotEmpty) {
consumeState(_deleteMultipleEmailsPermanentlyInteractor.execute(session, _accountId!, listEmailIds));
if ( _accountId != null && listEmailIds.isNotEmpty) {
consumeState(_deleteMultipleEmailsPermanentlyInteractor.execute(_accountId!, listEmailIds));
}
}
@@ -896,6 +908,35 @@ class ThreadController extends BaseController {
_refreshEmailChanges();
}
void _emptyTrashFolderAction() {
cancelSelectEmail();
final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxId[PresentationMailbox.roleTrash];
log('ThreadController::_emptyTrashFolderAction(): trashMailboxId: $trashMailboxId');
if (_accountId != null && trashMailboxId != null) {
consumeState(_emptyTrashFolderInteractor.execute(_accountId!, trashMailboxId));
}
}
void _emptyTrashFolderSuccess(EmptyTrashFolderSuccess success) {
mailboxDashBoardController.dispatchState(Right(success));
if (currentContext != null && currentOverlayContext != null) {
_appToast.showToastWithIcon(
currentOverlayContext!,
widthToast: _responsiveUtils.isDesktop(currentContext!) ? 360 : null,
message: AppLocalizations.of(currentContext!).toast_message_empty_trash_folder_success,
icon: _imagePaths.icDeleteToast);
}
refreshAllEmail();
}
void _emptyTrashFolderFailure(EmptyTrashFolderFailure failure) {
mailboxDashBoardController.dispatchState(Left(failure));
refreshAllEmail();
}
void openMailboxLeftMenu() {
mailboxDashBoardController.openDrawer();
}
@@ -43,6 +43,9 @@ class ThreadView extends GetWidget<ThreadController> with UserSettingPopupMenuMi
child: _buildHeader(context)),
_buildSearchInputFormForMobile(context),
_buildSearchButtonViewForMobile(context),
Obx(() => controller.isMailboxTrash && controller.emailList.isNotEmpty && !controller.isSearchActive()
? _buildEmptyTrashButton(context)
: SizedBox.shrink()),
Expanded(child: Container(
color: AppColor.colorBgDesktop,
margin: _responsiveUtils.isDesktop(context) ? EdgeInsets.all(16) : EdgeInsets.zero,
@@ -472,11 +475,11 @@ class ThreadView extends GetWidget<ThreadController> with UserSettingPopupMenuMi
(success) {
if (controller.isSearchActive()) {
return success is SearchingState
? Padding(padding: EdgeInsets.only(top: 16), child: _loadingWidget)
? Padding(padding: EdgeInsets.symmetric(vertical: 16), child: _loadingWidget)
: SizedBox.shrink();
} else {
return success is LoadingState
? Padding(padding: EdgeInsets.only(top: 16), child: _loadingWidget)
? Padding(padding: EdgeInsets.symmetric(vertical: 16), child: _loadingWidget)
: SizedBox.shrink();
}
}));
@@ -630,7 +633,7 @@ class ThreadView extends GetWidget<ThreadController> with UserSettingPopupMenuMi
return controller.emailListSearch.length > 0
? Container(
width: double.infinity,
margin: EdgeInsets.zero,
margin: EdgeInsets.only(bottom: 16),
padding: EdgeInsets.symmetric(vertical: 12, horizontal: 24),
decoration: BoxDecoration(
borderRadius: _responsiveUtils.isDesktop(context)
@@ -647,4 +650,41 @@ class ThreadView extends GetWidget<ThreadController> with UserSettingPopupMenuMi
}
});
}
Widget _buildEmptyTrashButton(BuildContext context) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(14)),
border: Border.all(color: AppColor.colorLineLeftEmailView),
color: Colors.white),
margin: EdgeInsets.only(left: 16, right: 16,
bottom: _responsiveUtils.isDesktop(context) ? 0 : 16,
top: _responsiveUtils.isDesktop(context) ? 16 : 0),
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Row(children: [
Padding(
padding: EdgeInsets.only(right: 16),
child: SvgPicture.asset(_imagePaths.icDeleteTrash, fit: BoxFit.fill)),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(left: 8),
child: Text(
AppLocalizations.of(context).message_delete_all_email_in_trash_button,
style: TextStyle(color: AppColor.colorContentEmail, fontSize: 13, fontWeight: FontWeight.w500))),
TextButton(
onPressed: () => controller.deleteEmailsPermanently(context, DeleteActionType.all),
child: Text(
AppLocalizations.of(context).empty_trash_now,
style: TextStyle(fontSize: 17, fontWeight: FontWeight.w500, color: AppColor.colorTextButton)
)
)
]
)
)
]),
);
}
}