TF-235 Add presentation for rename a mailbox
This commit is contained in:
@@ -23,6 +23,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailb
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/search_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';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
class MailboxBindings extends BaseBindings {
|
||||
@@ -47,6 +48,7 @@ class MailboxBindings extends BaseBindings {
|
||||
Get.find<CreateNewMailboxInteractor>(),
|
||||
Get.find<SearchMailboxInteractor>(),
|
||||
Get.find<DeleteMultipleMailboxInteractor>(),
|
||||
Get.find<VerifyNameInteractor>(),
|
||||
Get.find<TreeBuilder>(),
|
||||
Get.find<Uuid>(),
|
||||
Get.find<AppToast>(),
|
||||
@@ -77,6 +79,7 @@ class MailboxBindings extends BaseBindings {
|
||||
Get.lazyPut(() => CreateNewMailboxInteractor(Get.find<MailboxRepository>()));
|
||||
Get.lazyPut(() => SearchMailboxInteractor());
|
||||
Get.lazyPut(() => DeleteMultipleMailboxInteractor(Get.find<MailboxRepository>()));
|
||||
Get.lazyPut(() => VerifyNameInteractor());
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -29,6 +29,12 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.d
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/list_mailbox_node_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/special_character_validator.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart';
|
||||
@@ -53,6 +59,7 @@ class MailboxController extends BaseController {
|
||||
final CreateNewMailboxInteractor _createNewMailboxInteractor;
|
||||
final SearchMailboxInteractor _searchMailboxInteractor;
|
||||
final DeleteMultipleMailboxInteractor _deleteMultipleMailboxInteractor;
|
||||
final VerifyNameInteractor _verifyNameInteractor;
|
||||
final TreeBuilder _treeBuilder;
|
||||
final Uuid _uuid;
|
||||
final AppToast _appToast;
|
||||
@@ -81,6 +88,7 @@ class MailboxController extends BaseController {
|
||||
this._createNewMailboxInteractor,
|
||||
this._searchMailboxInteractor,
|
||||
this._deleteMultipleMailboxInteractor,
|
||||
this._verifyNameInteractor,
|
||||
this._treeBuilder,
|
||||
this._uuid,
|
||||
this._appToast,
|
||||
@@ -465,6 +473,9 @@ class MailboxController extends BaseController {
|
||||
case MailboxActions.delete:
|
||||
_openConfirmationDialogDeleteMailboxAction(context, selectionMailbox.first);
|
||||
break;
|
||||
case MailboxActions.rename:
|
||||
_openDialogRenameMailboxAction(context, selectionMailbox.first);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -535,6 +546,78 @@ class MailboxController extends BaseController {
|
||||
}
|
||||
}
|
||||
|
||||
void _openDialogRenameMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) {
|
||||
if (responsiveUtils.isMobile(context) || responsiveUtils.isMobileDevice(context)) {
|
||||
(EditTextModalSheetBuilder()
|
||||
..key(Key('rename_mailbox_modal_sheet'))
|
||||
..title(AppLocalizations.of(context).rename_mailbox)
|
||||
..cancelText(AppLocalizations.of(context).cancel)
|
||||
..boxConstraints(responsiveUtils.isMobileDevice(context) && responsiveUtils.isLandscape(context)
|
||||
? BoxConstraints(maxWidth: 400)
|
||||
: null)
|
||||
..onConfirmAction(AppLocalizations.of(context).rename,
|
||||
(value) => _renameMailboxAction(presentationMailbox, value))
|
||||
..setErrorString((value) => getErrorInputNameStringRenameMailbox(context, value))
|
||||
..setTextController(TextEditingController.fromValue(
|
||||
TextEditingValue(
|
||||
text: presentationMailbox.name?.name ?? '',
|
||||
selection: TextSelection(
|
||||
baseOffset: 0,
|
||||
extentOffset: presentationMailbox.name?.name.length ?? 0
|
||||
)
|
||||
))))
|
||||
.show(context);
|
||||
} else {
|
||||
showDialog(
|
||||
context: context,
|
||||
barrierColor: AppColor.colorDefaultCupertinoActionSheet,
|
||||
builder: (BuildContext context) => (EditTextDialogBuilder()
|
||||
..key(Key('rename_mailbox_dialog'))
|
||||
..title(AppLocalizations.of(context).rename_mailbox)
|
||||
..cancelText(AppLocalizations.of(context).cancel)
|
||||
..setErrorString((value) => getErrorInputNameStringRenameMailbox(context, value))
|
||||
..setTextController(TextEditingController.fromValue(
|
||||
TextEditingValue(
|
||||
text: presentationMailbox.name?.name ?? '',
|
||||
selection: TextSelection(
|
||||
baseOffset: 0,
|
||||
extentOffset: presentationMailbox.name?.name.length ?? 0
|
||||
)
|
||||
)))
|
||||
..onConfirmButtonAction(AppLocalizations.of(context).rename,
|
||||
(value) => _renameMailboxAction(presentationMailbox, value)))
|
||||
.build());
|
||||
}
|
||||
}
|
||||
|
||||
String? getErrorInputNameStringRenameMailbox(BuildContext context, String newName) {
|
||||
final listName = allMailboxes
|
||||
.where((mailbox) => !(mailbox.name.isBlank == true))
|
||||
.map((mailbox) => mailbox.name!.name).toList();
|
||||
|
||||
return _verifyNameInteractor.execute(
|
||||
newName,
|
||||
[
|
||||
EmptyNameValidator(),
|
||||
DuplicateNameValidator(listName),
|
||||
SpecialCharacterValidator(),
|
||||
]
|
||||
).fold(
|
||||
(failure) {
|
||||
if (failure is VerifyNameFailure) {
|
||||
return failure.getMessage(context, actions: MailboxActions.rename);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
},
|
||||
(success) => null
|
||||
);
|
||||
}
|
||||
|
||||
void _renameMailboxAction(PresentationMailbox presentationMailbox, String newName) {
|
||||
|
||||
}
|
||||
|
||||
void closeMailboxScreen(BuildContext context) {
|
||||
_cancelSelectMailbox();
|
||||
mailboxDashBoardController.closeDrawer();
|
||||
|
||||
@@ -6,6 +6,7 @@ enum MailboxActions {
|
||||
create,
|
||||
moveEmail,
|
||||
delete,
|
||||
rename,
|
||||
}
|
||||
|
||||
extension MailboxActionsExtension on MailboxActions {
|
||||
|
||||
@@ -45,23 +45,29 @@ class BottomBarSelectionMailboxWidget {
|
||||
..key(Key('button_move_all_mailbox'))
|
||||
..paddingIcon(EdgeInsets.all(8))
|
||||
..textStyle(TextStyle(fontSize: 12, color: AppColor.colorTextButton.withOpacity(0.3)))
|
||||
..iconColor(AppColor.colorTextButton.withOpacity(0.5))
|
||||
..iconColor(AppColor.colorTextButton.withOpacity(0.3))
|
||||
..onPressActionClick(() => {})
|
||||
..text(AppLocalizations.of(_context).move, isVertical: true))
|
||||
.build(),
|
||||
(ButtonBuilder(_imagePaths.icRenameMailbox)
|
||||
..key(Key('button_rename_mailbox'))
|
||||
..paddingIcon(EdgeInsets.all(8))
|
||||
..textStyle(TextStyle(fontSize: 12, color: AppColor.colorTextButton.withOpacity(0.3)))
|
||||
..iconColor(AppColor.colorTextButton.withOpacity(0.5))
|
||||
..onPressActionClick(() => {})
|
||||
..textStyle(TextStyle(
|
||||
fontSize: 12,
|
||||
color: _isRenameMailboxValid ? AppColor.colorTextButton : AppColor.colorTextButton.withOpacity(0.3)))
|
||||
..iconColor(_isRenameMailboxValid ? AppColor.colorTextButton : AppColor.colorTextButton.withOpacity(0.3))
|
||||
..onPressActionClick(() {
|
||||
if (_isRenameMailboxValid) {
|
||||
_onMailboxActionsClick?.call(MailboxActions.rename, _listSelectionMailbox);
|
||||
}
|
||||
})
|
||||
..text(AppLocalizations.of(_context).rename, isVertical: true))
|
||||
.build(),
|
||||
(ButtonBuilder(_imagePaths.icReadV2)
|
||||
..key(Key('button_mark_read_all_mailbox'))
|
||||
..paddingIcon(EdgeInsets.all(8))
|
||||
..textStyle(TextStyle(fontSize: 12, color: AppColor.colorTextButton.withOpacity(0.3)))
|
||||
..iconColor(AppColor.colorTextButton.withOpacity(0.5))
|
||||
..iconColor(AppColor.colorTextButton.withOpacity(0.3))
|
||||
..onPressActionClick(() => {})
|
||||
..text(AppLocalizations.of(_context).mark_as_read, isVertical: true))
|
||||
.build(),
|
||||
@@ -85,5 +91,7 @@ class BottomBarSelectionMailboxWidget {
|
||||
|
||||
bool get _isDeleteMailboxValid => _listSelectionMailbox.length == 1 && _isAllFolderMailbox;
|
||||
|
||||
bool get _isRenameMailboxValid => _listSelectionMailbox.length == 1 && _isAllFolderMailbox;
|
||||
|
||||
bool get _isAllFolderMailbox => _listSelectionMailbox.every((mailbox) => !mailbox.hasRole());
|
||||
}
|
||||
@@ -60,7 +60,9 @@ class MailBoxFolderTileBuilder {
|
||||
data: MediaQueryData(padding: EdgeInsets.zero),
|
||||
child: Column(children: [
|
||||
ListTile(
|
||||
onTap: () => _onOpenMailboxFolderClick?.call(_mailboxNode),
|
||||
onTap: () => allSelectMode == SelectMode.ACTIVE
|
||||
? _onSelectMailboxFolderClick?.call(_mailboxNode)
|
||||
: _onOpenMailboxFolderClick?.call(_mailboxNode),
|
||||
contentPadding: EdgeInsets.zero,
|
||||
leading: allSelectMode == SelectMode.ACTIVE
|
||||
? _buildSelectModeIcon()
|
||||
|
||||
@@ -56,7 +56,9 @@ class MailboxTileBuilder {
|
||||
child: Column(children: [
|
||||
ListTile(
|
||||
contentPadding: EdgeInsets.zero,
|
||||
onTap: () => _onOpenMailboxActionClick?.call(_presentationMailbox),
|
||||
onTap: () => allSelectMode == SelectMode.ACTIVE
|
||||
? _onSelectMailboxActionClick?.call(_presentationMailbox)
|
||||
: _onOpenMailboxActionClick?.call(_presentationMailbox),
|
||||
leading: allSelectMode == SelectMode.ACTIVE
|
||||
? _buildSelectModeIcon()
|
||||
: _buildMailboxIcon(),
|
||||
|
||||
+8
-1
@@ -1,15 +1,22 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/exceptions/verify_name_exception.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
|
||||
extension ValicatorFailureExtension on VerifyNameFailure {
|
||||
|
||||
String getMessage(BuildContext context) {
|
||||
String getMessage(BuildContext context, {MailboxActions? actions}) {
|
||||
if (exception is EmptyNameException) {
|
||||
if (actions == MailboxActions.rename) {
|
||||
return AppLocalizations.of(context).this_field_cannot_be_blank;
|
||||
}
|
||||
return AppLocalizations.of(context).name_of_mailbox_is_required;
|
||||
} else if (exception is DuplicatedNameException) {
|
||||
if (actions == MailboxActions.rename) {
|
||||
return AppLocalizations.of(context).there_is_already_folder_with_the_same_name;
|
||||
}
|
||||
return AppLocalizations.of(context).this_folder_name_is_already_taken;
|
||||
} else if (exception is SpecialCharacterException) {
|
||||
return AppLocalizations.of(context).mailbox_name_cannot_contain_special_characters;
|
||||
|
||||
Reference in New Issue
Block a user