TF-239 Empty trash folder
This commit is contained in:
@@ -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)
|
||||
)
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
]),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user