TF-1311: [Presentation] Implement hide mailbox in presentation
This commit is contained in:
@@ -296,7 +296,7 @@ class MailboxAPI with HandleSetErrorMixin {
|
||||
final setMailboxMethod = SetMailboxMethod(accountId)
|
||||
..addUpdates({
|
||||
request.mailboxId.id : PatchObject({
|
||||
'isSubscribed': request.newState == MailboxSubscribeState.disabled ? true : false
|
||||
'isSubscribed': request.newState == MailboxSubscribeState.disabled ? false : true
|
||||
})
|
||||
});
|
||||
|
||||
|
||||
@@ -1,13 +1,4 @@
|
||||
enum MailboxSubscribeState {
|
||||
enabled,
|
||||
disabled;
|
||||
|
||||
String get keyValue {
|
||||
switch(this) {
|
||||
case MailboxSubscribeState.enabled:
|
||||
return 'enabled';
|
||||
case MailboxSubscribeState.disabled:
|
||||
return 'disabled';
|
||||
}
|
||||
}
|
||||
disabled
|
||||
}
|
||||
@@ -1,15 +1,19 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
||||
|
||||
|
||||
class LoadingSubscribeMailbox extends UIState {}
|
||||
|
||||
class SubscribeMailboxSuccess extends UIState {
|
||||
class SubscribeMailboxSuccess extends UIActionState {
|
||||
|
||||
final bool subscribeMailbox;
|
||||
|
||||
SubscribeMailboxSuccess(this.subscribeMailbox);
|
||||
SubscribeMailboxSuccess({
|
||||
jmap.State? currentEmailState,
|
||||
jmap.State? currentMailboxState,
|
||||
}) : super(currentEmailState, currentMailboxState);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [subscribeMailbox];
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class SubscribeMailboxFailure extends FeatureFailure {
|
||||
|
||||
@@ -6,18 +6,25 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_re
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_mailbox_state.dart';
|
||||
|
||||
class SearchMailboxInteractor {
|
||||
class SubscribeMailboxInteractor {
|
||||
final MailboxRepository _mailboxRepository;
|
||||
|
||||
SearchMailboxInteractor(this._mailboxRepository);
|
||||
SubscribeMailboxInteractor(this._mailboxRepository);
|
||||
|
||||
Stream<Either<Failure, Success>> execute(AccountId accountId, SubscribeMailboxRequest request) async* {
|
||||
try {
|
||||
yield Right<Failure, Success>(LoadingSubscribeMailbox());
|
||||
|
||||
final resultList = await _mailboxRepository.subscribeMailbox(accountId, request);
|
||||
final currentMailboxState = await _mailboxRepository.getMailboxState();
|
||||
|
||||
final result = await _mailboxRepository.subscribeMailbox(accountId, request);
|
||||
|
||||
if (result) {
|
||||
yield Right<Failure, Success>(SubscribeMailboxSuccess(currentMailboxState: currentMailboxState));
|
||||
} else {
|
||||
yield Left<Failure, Success>(SubscribeMailboxFailure(null));
|
||||
}
|
||||
|
||||
yield Right<Failure, Success>(SubscribeMailboxSuccess(resultList));
|
||||
} catch (exception) {
|
||||
yield Left<Failure, Success>(SubscribeMailboxFailure(exception));
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_mailbox_inte
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/rename_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/search_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
|
||||
@@ -55,6 +56,7 @@ class MailboxBindings extends BaseBindings {
|
||||
Get.find<VerifyNameInteractor>(),
|
||||
Get.find<RenameMailboxInteractor>(),
|
||||
Get.find<MoveMailboxInteractor>(),
|
||||
Get.find<SubscribeMailboxInteractor>(),
|
||||
Get.find<TreeBuilder>(),
|
||||
));
|
||||
}
|
||||
@@ -96,6 +98,7 @@ class MailboxBindings extends BaseBindings {
|
||||
Get.lazyPut(() => VerifyNameInteractor());
|
||||
Get.lazyPut(() => RenameMailboxInteractor(Get.find<MailboxRepository>()));
|
||||
Get.lazyPut(() => MoveMailboxInteractor(Get.find<MailboxRepository>()));
|
||||
Get.lazyPut(() => SubscribeMailboxInteractor(Get.find<MailboxRepository>()));
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -27,8 +27,10 @@ import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails
|
||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
|
||||
@@ -37,6 +39,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.d
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/rename_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/search_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/delete_multiple_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
|
||||
@@ -44,6 +47,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_mailbox_inte
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/rename_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/search_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
|
||||
@@ -92,6 +96,7 @@ class MailboxController extends BaseMailboxController {
|
||||
final VerifyNameInteractor _verifyNameInteractor;
|
||||
final RenameMailboxInteractor _renameMailboxInteractor;
|
||||
final MoveMailboxInteractor _moveMailboxInteractor;
|
||||
final SubscribeMailboxInteractor _subscribeMailboxInteractor;
|
||||
|
||||
final listMailboxSearched = <PresentationMailbox>[].obs;
|
||||
final searchState = SearchState.initial().obs;
|
||||
@@ -118,6 +123,7 @@ class MailboxController extends BaseMailboxController {
|
||||
this._verifyNameInteractor,
|
||||
this._renameMailboxInteractor,
|
||||
this._moveMailboxInteractor,
|
||||
this._subscribeMailboxInteractor,
|
||||
treeBuilder,
|
||||
) : super(treeBuilder);
|
||||
|
||||
@@ -156,7 +162,7 @@ class MailboxController extends BaseMailboxController {
|
||||
_buildMailboxTreeHasSubscribed(success.mailboxList);
|
||||
} else if (success is RefreshChangesAllMailboxSuccess) {
|
||||
_currentMailboxState = success.currentMailboxState;
|
||||
await refreshTree(success.mailboxList);
|
||||
_refreshMailboxTreeHasSubscribed(success.mailboxList);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -192,6 +198,8 @@ class MailboxController extends BaseMailboxController {
|
||||
refreshMailboxChanges(currentMailboxState: success.currentMailboxState);
|
||||
} else if (success is MoveMailboxSuccess) {
|
||||
_moveMailboxSuccess(success);
|
||||
} else if (success is SubscribeMailboxSuccess){
|
||||
refreshMailboxChanges(currentMailboxState: success.currentMailboxState);
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -1142,7 +1150,10 @@ class MailboxController extends BaseMailboxController {
|
||||
case MailboxActions.disableSpamReport:
|
||||
case MailboxActions.enableSpamReport:
|
||||
mailboxDashBoardController.storeSpamReportStateAction();
|
||||
return;
|
||||
break;
|
||||
case MailboxActions.disableMailbox:
|
||||
subscribeMailboxAction(mailbox);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -1206,4 +1217,19 @@ class MailboxController extends BaseMailboxController {
|
||||
final _mailboxList = mailboxList.where((mailbox) => mailbox.isSubscribed?.value == true).toList();
|
||||
await buildTree(_mailboxList);
|
||||
}
|
||||
|
||||
void _refreshMailboxTreeHasSubscribed(List<PresentationMailbox> mailboxList) async {
|
||||
final _mailboxList = mailboxList.where((mailbox) => mailbox.isSubscribed?.value == true).toList();
|
||||
await refreshTree(_mailboxList);
|
||||
}
|
||||
|
||||
void subscribeMailboxAction(PresentationMailbox mailboxSelected) {
|
||||
final _accountId = mailboxDashBoardController.accountId.value;
|
||||
if(_accountId != null) {
|
||||
consumeState(_subscribeMailboxInteractor.execute(_accountId, SubscribeMailboxRequest(
|
||||
mailboxSelected.id,
|
||||
MailboxSubscribeState.disabled,
|
||||
)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -331,11 +331,15 @@ class MailboxView extends GetWidget<MailboxController> {
|
||||
|
||||
void _openBottomSheetSpamMenuAction(BuildContext context, PresentationMailbox mailbox) {
|
||||
final _spamActionsSupported = [
|
||||
controller.mailboxDashBoardController.enableSpamReport
|
||||
? MailboxActions.disableSpamReport
|
||||
: MailboxActions.enableSpamReport
|
||||
MailboxActions.disableMailbox
|
||||
];
|
||||
|
||||
if (mailbox.isSpam) {
|
||||
_spamActionsSupported.add(controller.mailboxDashBoardController.enableSpamReport
|
||||
? MailboxActions.disableSpamReport
|
||||
: MailboxActions.enableSpamReport);
|
||||
}
|
||||
|
||||
final listContextSpamPopupMenuItemAction = _spamActionsSupported
|
||||
.map((action) => ContextMenuItemMailboxAction(action, action.getContextMenuItemState(mailbox)))
|
||||
.toList();
|
||||
@@ -381,6 +385,7 @@ class MailboxView extends GetWidget<MailboxController> {
|
||||
isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
|
||||
parent: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode,
|
||||
allSelectMode: controller.currentSelectMode.value)
|
||||
..addOnLongPressMailboxFolderClick((mailboxNode) => _openBottomSheetSpamMenuAction(context, mailboxNode.item))
|
||||
..addOnOpenMailboxFolderClick((mailboxNode) => controller.openMailbox(context, mailboxNode.item))
|
||||
..addOnExpandFolderActionClick((mailboxNode) => controller.toggleMailboxFolder(mailboxNode))
|
||||
..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode)))
|
||||
@@ -389,7 +394,7 @@ class MailboxView extends GetWidget<MailboxController> {
|
||||
).build()
|
||||
: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode,
|
||||
allSelectMode: controller.currentSelectMode.value)
|
||||
..addOnLongPressSpamReport((mailboxNode) => _openBottomSheetSpamMenuAction(context, mailboxNode.item))
|
||||
..addOnLongPressMailboxFolderClick((mailboxNode) => _openBottomSheetSpamMenuAction(context, mailboxNode.item))
|
||||
..addOnOpenMailboxFolderClick((mailboxNode) => controller.openMailbox(context, mailboxNode.item))
|
||||
..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode)))
|
||||
.build())
|
||||
|
||||
@@ -205,14 +205,22 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
|
||||
]),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
_buildHeaderMailboxCategory(context, MailboxCategories.personalMailboxes),
|
||||
Obx(() => controller.personalMailboxHasChild
|
||||
? _buildMailboxCategory(context, MailboxCategories.personalMailboxes, controller.personalRootNode)
|
||||
? Column(
|
||||
children: [
|
||||
_buildHeaderMailboxCategory(context, MailboxCategories.personalMailboxes),
|
||||
_buildMailboxCategory(context, MailboxCategories.personalMailboxes, controller.personalRootNode),
|
||||
],
|
||||
)
|
||||
: const SizedBox.shrink()),
|
||||
const SizedBox(height: 8),
|
||||
_buildHeaderMailboxCategory(context, MailboxCategories.teamMailboxes),
|
||||
Obx(() => controller.teamMailboxesHasChild
|
||||
? _buildMailboxCategory(context, MailboxCategories.teamMailboxes, controller.teamMailboxesRootNode)
|
||||
? Column(
|
||||
children: [
|
||||
_buildHeaderMailboxCategory(context, MailboxCategories.teamMailboxes),
|
||||
_buildMailboxCategory(context, MailboxCategories.teamMailboxes, controller.teamMailboxesRootNode),
|
||||
],
|
||||
)
|
||||
: const SizedBox.shrink()),
|
||||
])
|
||||
),
|
||||
@@ -446,9 +454,13 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
|
||||
MailboxActions.markAsRead,
|
||||
MailboxActions.move,
|
||||
MailboxActions.rename,
|
||||
MailboxActions.delete
|
||||
MailboxActions.delete,
|
||||
];
|
||||
|
||||
if(mailbox.isShowDisableMailbox) {
|
||||
mailboxActionsSupported.add(MailboxActions.disableMailbox);
|
||||
}
|
||||
|
||||
if (mailbox.isSpam) {
|
||||
mailboxActionsSupported.insert(
|
||||
1,
|
||||
|
||||
@@ -16,7 +16,8 @@ enum MailboxActions {
|
||||
selectForRuleAction,
|
||||
openInNewTab,
|
||||
disableSpamReport,
|
||||
enableSpamReport
|
||||
enableSpamReport,
|
||||
disableMailbox
|
||||
}
|
||||
|
||||
extension MailboxActionsExtension on MailboxActions {
|
||||
@@ -52,6 +53,8 @@ extension MailboxActionsExtension on MailboxActions {
|
||||
return AppLocalizations.of(context).rename_mailbox;
|
||||
case MailboxActions.delete:
|
||||
return AppLocalizations.of(context).deleteMailbox;
|
||||
case MailboxActions.disableMailbox:
|
||||
return AppLocalizations.of(context).hideMailBoxes;
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
@@ -73,6 +76,8 @@ extension MailboxActionsExtension on MailboxActions {
|
||||
return imagePaths.icRenameMailbox;
|
||||
case MailboxActions.delete:
|
||||
return imagePaths.icDelete;
|
||||
case MailboxActions.disableMailbox:
|
||||
return imagePaths.icEyeOff;
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
@@ -93,6 +98,7 @@ extension MailboxActionsExtension on MailboxActions {
|
||||
return AppColor.colorActionDeleteConfirmDialog;
|
||||
case MailboxActions.disableSpamReport:
|
||||
case MailboxActions.enableSpamReport:
|
||||
case MailboxActions.disableMailbox:
|
||||
return AppColor.primaryColor;
|
||||
default:
|
||||
return Colors.black;
|
||||
@@ -140,6 +146,7 @@ extension MailboxActionsExtension on MailboxActions {
|
||||
case MailboxActions.openInNewTab:
|
||||
case MailboxActions.disableSpamReport:
|
||||
case MailboxActions.enableSpamReport:
|
||||
case MailboxActions.disableMailbox:
|
||||
return ContextMenuItemState.activated;
|
||||
case MailboxActions.markAsRead:
|
||||
return mailbox.getCountUnReadEmails().isNotEmpty
|
||||
|
||||
@@ -15,7 +15,7 @@ typedef OnOpenMailboxFolderClick = void Function(MailboxNode);
|
||||
typedef OnSelectMailboxFolderClick = void Function(MailboxNode);
|
||||
typedef OnMenuActionClick = void Function(RelativeRect, MailboxNode);
|
||||
typedef OnDragItemAccepted = void Function(List<PresentationEmail>, PresentationMailbox);
|
||||
typedef OnLongPressSpamReport = void Function(MailboxNode);
|
||||
typedef OnLongPressMailboxFolderClick = void Function(MailboxNode);
|
||||
|
||||
class MailBoxFolderTileBuilder {
|
||||
|
||||
@@ -36,7 +36,7 @@ class MailBoxFolderTileBuilder {
|
||||
OnSelectMailboxFolderClick? _onSelectMailboxFolderClick;
|
||||
OnMenuActionClick? _onMenuActionClick;
|
||||
OnDragItemAccepted? _onDragItemAccepted;
|
||||
OnLongPressSpamReport? _onLongPressSpamReport;
|
||||
OnLongPressMailboxFolderClick? _onLongPressMailboxFolderClick;
|
||||
|
||||
bool isHoverItem = false;
|
||||
|
||||
@@ -74,8 +74,8 @@ class MailBoxFolderTileBuilder {
|
||||
_onDragItemAccepted = onDragItemAccepted;
|
||||
}
|
||||
|
||||
void addOnLongPressSpamReport(OnLongPressSpamReport onLongPressSpamReport) {
|
||||
_onLongPressSpamReport = onLongPressSpamReport;
|
||||
void addOnLongPressMailboxFolderClick(OnLongPressMailboxFolderClick onLongPressMailboxFolderClick) {
|
||||
_onLongPressMailboxFolderClick = onLongPressMailboxFolderClick;
|
||||
}
|
||||
|
||||
Widget build() => DragTarget<List<PresentationEmail>>(
|
||||
@@ -127,9 +127,11 @@ class MailBoxFolderTileBuilder {
|
||||
child: Opacity(
|
||||
opacity: _mailboxNode.isActivated ? 1.0 : 0.3,
|
||||
child: InkWell(
|
||||
onLongPress: _mailboxNode.item.isSpam ? () {
|
||||
_onLongPressSpamReport?.call(_mailboxNode);
|
||||
} : null,
|
||||
onLongPress: () {
|
||||
if(_mailboxNode.item.isShowDisableMailbox || _mailboxNode.item.isSpam) {
|
||||
_onLongPressMailboxFolderClick?.call(_mailboxNode);
|
||||
}
|
||||
},
|
||||
onTap: () => allSelectMode == SelectMode.ACTIVE
|
||||
? _onSelectMailboxFolderClick?.call(_mailboxNode)
|
||||
: _onOpenMailboxFolderClick?.call(_mailboxNode),
|
||||
@@ -170,6 +172,7 @@ class MailBoxFolderTileBuilder {
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
child: InkWell(
|
||||
onLongPress: () => print('123'),
|
||||
onTap: () => _onOpenMailboxFolderClick?.call(_mailboxNode),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 24),
|
||||
@@ -199,7 +202,7 @@ class MailBoxFolderTileBuilder {
|
||||
if (_mailboxNode.hasChildren())
|
||||
Row(
|
||||
children: [
|
||||
const SizedBox(width: 8),
|
||||
SizedBox(width: _mailboxNode.item.hasRole() ? 0 : 8),
|
||||
buildIconWeb(
|
||||
icon: SvgPicture.asset(
|
||||
_mailboxNode.expandMode == ExpandMode.EXPAND
|
||||
@@ -216,11 +219,10 @@ class MailBoxFolderTileBuilder {
|
||||
? AppLocalizations.of(_context).collapse
|
||||
: AppLocalizations.of(_context).expand,
|
||||
onTap: () => _onExpandFolderActionClick?.call(_mailboxNode)),
|
||||
const SizedBox(width: 4),
|
||||
],
|
||||
)
|
||||
else
|
||||
SizedBox(width:_mailboxNode.item.hasRole() ? 0 : 24),
|
||||
SizedBox(width: !_mailboxNode.item.hasRole() ? 32 : 24),
|
||||
Transform(
|
||||
transform: Matrix4.translationValues(-4.0, 0.0, 0.0),
|
||||
child: _buildLeadingIcon()),
|
||||
@@ -254,7 +256,7 @@ class MailBoxFolderTileBuilder {
|
||||
],
|
||||
)
|
||||
else
|
||||
SizedBox(width: _mailboxNode.item.hasRole() ? 0 : 36),
|
||||
const SizedBox(width: 36),
|
||||
_buildLeadingIcon(),
|
||||
]);
|
||||
} else {
|
||||
|
||||
@@ -101,6 +101,8 @@ class PresentationMailbox with EquatableMixin {
|
||||
(namespace?.value.indexOf('[') ?? 0) + 1,
|
||||
namespace?.value.indexOf(']'));
|
||||
|
||||
bool get isShowDisableMailbox => isTeamMailboxes || hasRole() || !hasParentId();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
id,
|
||||
|
||||
Reference in New Issue
Block a user