TF-233 Implement create new mailbox and sub-folder
This commit is contained in:
@@ -7,7 +7,7 @@ import 'package:tmail_ui_user/features/base/base_controller.dart';
|
|||||||
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart';
|
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/model/mailbox_tree_builder.dart';
|
||||||
@@ -23,7 +23,7 @@ class DestinationPickerController extends BaseController {
|
|||||||
MailboxTree folderMailboxTree = MailboxTree(MailboxNode.root());
|
MailboxTree folderMailboxTree = MailboxTree(MailboxNode.root());
|
||||||
final defaultMailboxList = <PresentationMailbox>[].obs;
|
final defaultMailboxList = <PresentationMailbox>[].obs;
|
||||||
final folderMailboxNodeList = <MailboxNode>[].obs;
|
final folderMailboxNodeList = <MailboxNode>[].obs;
|
||||||
final mailboxAction = Rxn<MailboxAction>();
|
final mailboxAction = Rxn<MailboxActions>();
|
||||||
AccountId? accountId;
|
AccountId? accountId;
|
||||||
|
|
||||||
DestinationPickerController(
|
DestinationPickerController(
|
||||||
@@ -87,7 +87,7 @@ class DestinationPickerController extends BaseController {
|
|||||||
folderMailboxNodeList.value = newMailboxNodeList;
|
folderMailboxNodeList.value = newMailboxNodeList;
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveEmailToMailboxAction(PresentationMailbox destinationMailbox) {
|
void selectMailboxAction(PresentationMailbox? destinationMailbox) {
|
||||||
popBack(result: destinationMailbox);
|
popBack(result: destinationMailbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,18 @@
|
|||||||
import 'package:core/core.dart';
|
import 'package:core/core.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_controller.dart';
|
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/destination_picker/presentation/widgets/app_bar_destination_picker_builder.dart';
|
import 'package:tmail_ui_user/features/destination_picker/presentation/widgets/app_bar_destination_picker_builder.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displayed.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displayed.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_tile_builder.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_tile_builder.dart';
|
||||||
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
||||||
|
|
||||||
@@ -19,13 +21,13 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
DestinationPickerArguments? _destinationPickerArguments;
|
MailboxActions? actions;
|
||||||
final arguments = Get.arguments;
|
final arguments = Get.arguments;
|
||||||
if (arguments != null && arguments is DestinationPickerArguments) {
|
if (arguments != null && arguments is DestinationPickerArguments) {
|
||||||
_destinationPickerArguments = arguments;
|
actions = arguments.mailboxAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_destinationPickerArguments?.mailboxAction == MailboxAction.create) {
|
if (actions == MailboxActions.create) {
|
||||||
return Card(
|
return Card(
|
||||||
margin: EdgeInsets.zero,
|
margin: EdgeInsets.zero,
|
||||||
borderOnForeground: false,
|
borderOnForeground: false,
|
||||||
@@ -34,14 +36,16 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
onTap: () => controller.closeDestinationPicker(),
|
onTap: () => controller.closeDestinationPicker(),
|
||||||
child: ResponsiveWidget(
|
child: ResponsiveWidget(
|
||||||
responsiveUtils: _responsiveUtils,
|
responsiveUtils: _responsiveUtils,
|
||||||
mobile: Container(
|
mobile: _responsiveUtils.isPortrait(context)
|
||||||
child: _buildBody(context),
|
? Container(
|
||||||
width: _responsiveUtils.getSizeWidthScreen(context)),
|
child: _buildBodyMailboxLocation(context, actions),
|
||||||
|
width: _responsiveUtils.getSizeWidthScreen(context))
|
||||||
|
: _buildBodyMailboxDestination(context, actions),
|
||||||
tablet: Container(
|
tablet: Container(
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(flex: 1, child: Container(color: Colors.transparent)),
|
Expanded(flex: 1, child: Container(color: Colors.transparent)),
|
||||||
Expanded(flex: 1, child: _buildBody(context)),
|
Expanded(flex: 1, child: _buildBodyMailboxLocation(context, actions)),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
@@ -49,7 +53,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(flex: 7, child: Container(color: Colors.transparent)),
|
Expanded(flex: 7, child: Container(color: Colors.transparent)),
|
||||||
Expanded(flex: 13, child: _buildBody(context)),
|
Expanded(flex: 13, child: _buildBodyMailboxLocation(context, actions)),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
@@ -57,7 +61,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(flex: 1, child: Container(color: Colors.transparent)),
|
Expanded(flex: 1, child: Container(color: Colors.transparent)),
|
||||||
Expanded(flex: 3, child: _buildBody(context)),
|
Expanded(flex: 3, child: _buildBodyMailboxLocation(context, actions)),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -65,42 +69,46 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return GestureDetector(
|
return _buildBodyMailboxDestination(context, actions);
|
||||||
onTap: () => controller.closeDestinationPicker(),
|
|
||||||
child: Card(
|
|
||||||
margin: EdgeInsets.zero,
|
|
||||||
borderOnForeground: false,
|
|
||||||
color: Colors.transparent,
|
|
||||||
child: Container(
|
|
||||||
margin: _getMarginDestinationPicker(context),
|
|
||||||
child: ClipRRect(
|
|
||||||
borderRadius: _radiusDestinationPicker(context, 14),
|
|
||||||
child: GestureDetector(
|
|
||||||
onTap: () => {},
|
|
||||||
child: SafeArea(
|
|
||||||
top: _responsiveUtils.isMobile(context) ? true : false,
|
|
||||||
bottom: false,
|
|
||||||
right: false,
|
|
||||||
left: false,
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
_buildAppBar(context),
|
|
||||||
Expanded(child:
|
|
||||||
Container(
|
|
||||||
color: AppColor.colorBgMailbox,
|
|
||||||
child: _buildBodyDestinationPicker(context)))
|
|
||||||
],
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildBody(BuildContext context) {
|
Widget _buildBodyMailboxDestination(BuildContext context, MailboxActions? actions) {
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: () => controller.closeDestinationPicker(),
|
||||||
|
child: Card(
|
||||||
|
margin: EdgeInsets.zero,
|
||||||
|
borderOnForeground: false,
|
||||||
|
color: Colors.transparent,
|
||||||
|
child: Container(
|
||||||
|
margin: _getMarginDestinationPicker(context),
|
||||||
|
child: ClipRRect(
|
||||||
|
borderRadius: _radiusDestinationPicker(context, 14),
|
||||||
|
child: GestureDetector(
|
||||||
|
onTap: () => {},
|
||||||
|
child: SafeArea(
|
||||||
|
top: _responsiveUtils.isMobile(context) ? true : false,
|
||||||
|
bottom: false,
|
||||||
|
right: false,
|
||||||
|
left: false,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
_buildAppBar(context),
|
||||||
|
Expanded(child:
|
||||||
|
Container(
|
||||||
|
color: AppColor.colorBgMailbox,
|
||||||
|
child: _buildBodyDestinationPicker(context, actions)))
|
||||||
|
],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildBodyMailboxLocation(BuildContext context, MailboxActions? actions) {
|
||||||
return SafeArea(
|
return SafeArea(
|
||||||
top: _responsiveUtils.isMobile(context) ? true : false,
|
top: _responsiveUtils.isMobile(context) ? true : false,
|
||||||
bottom: false,
|
bottom: false,
|
||||||
@@ -122,10 +130,12 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
_buildAppBar(context),
|
_buildAppBar(context),
|
||||||
Expanded(child:
|
Expanded(
|
||||||
Container(
|
child: Container(
|
||||||
color: AppColor.colorBgMailbox,
|
color: AppColor.colorBgMailbox,
|
||||||
child: _buildBodyDestinationPicker(context)))
|
child: _buildBodyDestinationPicker(context, actions)
|
||||||
|
)
|
||||||
|
)
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@@ -145,7 +155,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildBodyDestinationPicker(BuildContext context) {
|
Widget _buildBodyDestinationPicker(BuildContext context, MailboxActions? actions) {
|
||||||
return RefreshIndicator(
|
return RefreshIndicator(
|
||||||
color: AppColor.primaryColor,
|
color: AppColor.primaryColor,
|
||||||
onRefresh: () async => controller.getAllMailboxAction(),
|
onRefresh: () async => controller.getAllMailboxAction(),
|
||||||
@@ -160,7 +170,8 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
_buildLoadingView(),
|
_buildLoadingView(),
|
||||||
_buildListMailbox(context)
|
if (actions == MailboxActions.create) _buildUnifiedMailbox(context),
|
||||||
|
_buildListMailbox(context, actions)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -182,7 +193,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
: SizedBox.shrink()));
|
: SizedBox.shrink()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildListMailbox(BuildContext context) {
|
Widget _buildListMailbox(BuildContext context, MailboxActions? actions) {
|
||||||
return ListView(
|
return ListView(
|
||||||
primary: false,
|
primary: false,
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
@@ -191,7 +202,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(14),
|
borderRadius: BorderRadius.circular(14),
|
||||||
color: Colors.white),
|
color: Colors.white),
|
||||||
margin: EdgeInsets.only(left: 16, right: 16, top: 16),
|
margin: EdgeInsets.only(left: 16, right: 16, top: _getTopPaddingListMailbox(context, actions)),
|
||||||
child: _buildDefaultMailbox(context)),
|
child: _buildDefaultMailbox(context)),
|
||||||
SizedBox(height: 20),
|
SizedBox(height: 20),
|
||||||
Container(
|
Container(
|
||||||
@@ -204,6 +215,14 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double _getTopPaddingListMailbox(BuildContext context, MailboxActions? actions) {
|
||||||
|
if (actions == MailboxActions.create) {
|
||||||
|
return (_responsiveUtils.isMobile(context) || _responsiveUtils.isMobileDevice(context)) ? 20.0 : 5.0;
|
||||||
|
} else {
|
||||||
|
return (_responsiveUtils.isMobile(context) || _responsiveUtils.isMobileDevice(context)) ? 16.0 : 10.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Widget _buildDefaultMailbox(BuildContext context) {
|
Widget _buildDefaultMailbox(BuildContext context) {
|
||||||
return Obx(() => controller.viewState.value.fold(
|
return Obx(() => controller.viewState.value.fold(
|
||||||
(failure) => SizedBox.shrink(),
|
(failure) => SizedBox.shrink(),
|
||||||
@@ -222,7 +241,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
mailboxDisplayed: MailboxDisplayed.destinationPicker,
|
mailboxDisplayed: MailboxDisplayed.destinationPicker,
|
||||||
isLastElement: index == defaultMailboxList.length - 1)
|
isLastElement: index == defaultMailboxList.length - 1)
|
||||||
..onOpenMailboxAction((mailbox) =>
|
..onOpenMailboxAction((mailbox) =>
|
||||||
controller.moveEmailToMailboxAction(mailbox.toPresentationMailboxWithMailboxPath(mailbox.name?.name ?? ''))))
|
controller.selectMailboxAction(mailbox.toPresentationMailboxWithMailboxPath(mailbox.name?.name ?? ''))))
|
||||||
.build());
|
.build());
|
||||||
} else {
|
} else {
|
||||||
return SizedBox.shrink();
|
return SizedBox.shrink();
|
||||||
@@ -257,7 +276,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
_imagePaths,
|
_imagePaths,
|
||||||
mailboxNode,
|
mailboxNode,
|
||||||
mailboxDisplayed: MailboxDisplayed.destinationPicker)
|
mailboxDisplayed: MailboxDisplayed.destinationPicker)
|
||||||
..addOnSelectMailboxFolderClick((mailboxNode) => controller.moveEmailToMailboxAction(mailboxNode.item.toPresentationMailboxWithMailboxPath(
|
..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxAction(mailboxNode.item.toPresentationMailboxWithMailboxPath(
|
||||||
mailboxNode.getPathMailboxNode(
|
mailboxNode.getPathMailboxNode(
|
||||||
controller.folderMailboxTree,
|
controller.folderMailboxTree,
|
||||||
controller.defaultMailboxList,
|
controller.defaultMailboxList,
|
||||||
@@ -273,7 +292,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
_imagePaths,
|
_imagePaths,
|
||||||
mailboxNode,
|
mailboxNode,
|
||||||
mailboxDisplayed: MailboxDisplayed.destinationPicker)
|
mailboxDisplayed: MailboxDisplayed.destinationPicker)
|
||||||
..addOnSelectMailboxFolderClick((mailboxNode) => controller.moveEmailToMailboxAction(mailboxNode.item.toPresentationMailboxWithMailboxPath(
|
..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxAction(mailboxNode.item.toPresentationMailboxWithMailboxPath(
|
||||||
mailboxNode.getPathMailboxNode(
|
mailboxNode.getPathMailboxNode(
|
||||||
controller.folderMailboxTree,
|
controller.folderMailboxTree,
|
||||||
controller.defaultMailboxList,
|
controller.defaultMailboxList,
|
||||||
@@ -325,4 +344,35 @@ class DestinationPickerView extends GetWidget<DestinationPickerController> {
|
|||||||
return BorderRadius.only(topLeft: Radius.circular(radius), topRight: Radius.circular(radius));
|
return BorderRadius.only(topLeft: Radius.circular(radius), topRight: Radius.circular(radius));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget _buildUnifiedMailbox(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
margin: EdgeInsets.only(left: 16, right: 16, top: 16),
|
||||||
|
decoration: BoxDecoration(borderRadius: BorderRadius.circular(14), color: Colors.white),
|
||||||
|
child: MediaQuery(
|
||||||
|
data: MediaQueryData(padding: EdgeInsets.zero),
|
||||||
|
child: ListTile(
|
||||||
|
contentPadding: EdgeInsets.zero,
|
||||||
|
onTap: () => controller.selectMailboxAction(null),
|
||||||
|
leading: Padding(
|
||||||
|
padding: EdgeInsets.only(left: 16),
|
||||||
|
child: SvgPicture.asset(_imagePaths.icFolderMailbox, width: 28, height: 28, fit: BoxFit.fill)),
|
||||||
|
title: Transform(
|
||||||
|
transform: Matrix4.translationValues(-5.0, 0.0, 0.0),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(child: Text(
|
||||||
|
AppLocalizations.of(context).default_mailbox,
|
||||||
|
maxLines: 1,
|
||||||
|
overflow:TextOverflow.ellipsis,
|
||||||
|
style: TextStyle(fontSize: 15, color: AppColor.colorNameEmail),
|
||||||
|
))
|
||||||
|
]
|
||||||
|
)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+2
-2
@@ -1,11 +1,11 @@
|
|||||||
|
|
||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||||
|
|
||||||
class DestinationPickerArguments with EquatableMixin {
|
class DestinationPickerArguments with EquatableMixin {
|
||||||
final AccountId accountId;
|
final AccountId accountId;
|
||||||
final MailboxAction mailboxAction;
|
final MailboxActions mailboxAction;
|
||||||
|
|
||||||
DestinationPickerArguments(this.accountId, this.mailboxAction);
|
DestinationPickerArguments(this.accountId, this.mailboxAction);
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -2,7 +2,7 @@
|
|||||||
import 'package:core/core.dart';
|
import 'package:core/core.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||||
|
|
||||||
typedef OnCloseActionClick = void Function();
|
typedef OnCloseActionClick = void Function();
|
||||||
|
|
||||||
@@ -12,7 +12,7 @@ class AppBarDestinationPickerBuilder {
|
|||||||
final BuildContext _context;
|
final BuildContext _context;
|
||||||
final ImagePaths _imagePaths;
|
final ImagePaths _imagePaths;
|
||||||
final ResponsiveUtils _responsiveUtils;
|
final ResponsiveUtils _responsiveUtils;
|
||||||
final MailboxAction? _mailboxAction;
|
final MailboxActions? _mailboxAction;
|
||||||
|
|
||||||
AppBarDestinationPickerBuilder(
|
AppBarDestinationPickerBuilder(
|
||||||
this._context,
|
this._context,
|
||||||
@@ -53,7 +53,7 @@ class AppBarDestinationPickerBuilder {
|
|||||||
color: Colors.transparent,
|
color: Colors.transparent,
|
||||||
child: _responsiveUtils.isMobile(_context)
|
child: _responsiveUtils.isMobile(_context)
|
||||||
? IconButton(
|
? IconButton(
|
||||||
color: _mailboxAction == MailboxAction.create ? AppColor.colorTextButton : AppColor.baseTextColor,
|
color: _mailboxAction == MailboxActions.create ? AppColor.colorTextButton : AppColor.baseTextColor,
|
||||||
icon: _getBackIcon(),
|
icon: _getBackIcon(),
|
||||||
onPressed: () => _onCloseActionClick?.call())
|
onPressed: () => _onCloseActionClick?.call())
|
||||||
: SizedBox(width: 40, height: 40)
|
: SizedBox(width: 40, height: 40)
|
||||||
@@ -74,7 +74,7 @@ class AppBarDestinationPickerBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TextAlign _getAlignTitle() {
|
TextAlign _getAlignTitle() {
|
||||||
if (_mailboxAction == MailboxAction.create) {
|
if (_mailboxAction == MailboxActions.create) {
|
||||||
return TextAlign.center;
|
return TextAlign.center;
|
||||||
} else {
|
} else {
|
||||||
return _responsiveUtils.isMobile(_context) ? TextAlign.start : TextAlign.center;
|
return _responsiveUtils.isMobile(_context) ? TextAlign.start : TextAlign.center;
|
||||||
@@ -82,7 +82,7 @@ class AppBarDestinationPickerBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _getBackIcon() {
|
Widget _getBackIcon() {
|
||||||
if (_mailboxAction == MailboxAction.create) {
|
if (_mailboxAction == MailboxActions.create) {
|
||||||
return SvgPicture.asset(_imagePaths.icBack, fit: BoxFit.fill);
|
return SvgPicture.asset(_imagePaths.icBack, fit: BoxFit.fill);
|
||||||
} else {
|
} else {
|
||||||
return SvgPicture.asset(_imagePaths.icComposerClose, fit: BoxFit.fill);
|
return SvgPicture.asset(_imagePaths.icComposerClose, fit: BoxFit.fill);
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_
|
|||||||
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||||
@@ -276,7 +276,7 @@ class EmailController extends BaseController {
|
|||||||
if (currentMailbox != null && accountId != null) {
|
if (currentMailbox != null && accountId != null) {
|
||||||
final destinationMailbox = await push(
|
final destinationMailbox = await push(
|
||||||
AppRoutes.DESTINATION_PICKER,
|
AppRoutes.DESTINATION_PICKER,
|
||||||
arguments: DestinationPickerArguments(accountId, MailboxAction.moveEmail)
|
arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
|
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/core/state.dart';
|
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.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_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
|
|
||||||
abstract class MailboxDataSource {
|
abstract class MailboxDataSource {
|
||||||
@@ -13,4 +14,6 @@ abstract class MailboxDataSource {
|
|||||||
Future<MailboxChangeResponse> getChanges(AccountId accountId, State sinceState);
|
Future<MailboxChangeResponse> getChanges(AccountId accountId, State sinceState);
|
||||||
|
|
||||||
Future<void> update({List<Mailbox>? updated, List<Mailbox>? created, List<MailboxId>? destroyed});
|
Future<void> update({List<Mailbox>? updated, List<Mailbox>? created, List<MailboxId>? destroyed});
|
||||||
|
|
||||||
|
Future<Mailbox?> createNewMailbox(AccountId accountId, CreateNewMailboxRequest newMailboxRequest);
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,7 @@ import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasourc
|
|||||||
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/extensions/mailbox_extension.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/extensions/mailbox_extension.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_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
|
|
||||||
class MailboxCacheDataSourceImpl extends MailboxDataSource {
|
class MailboxCacheDataSourceImpl extends MailboxDataSource {
|
||||||
@@ -43,4 +44,9 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource {
|
|||||||
throw error;
|
throw error;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Mailbox?> createNewMailbox(AccountId accountId, CreateNewMailboxRequest newMailboxRequest) {
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,7 @@ import 'package:jmap_dart_client/jmap/core/state.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.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_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
|
||||||
|
|
||||||
@@ -40,4 +41,13 @@ class MailboxDataSourceImpl extends MailboxDataSource {
|
|||||||
Future<List<Mailbox>> getAllMailboxCache() {
|
Future<List<Mailbox>> getAllMailboxCache() {
|
||||||
throw UnimplementedError();
|
throw UnimplementedError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Mailbox?> createNewMailbox(AccountId accountId, CreateNewMailboxRequest newMailboxRequest) {
|
||||||
|
return Future.sync(() async {
|
||||||
|
return await mailboxAPI.createNewMailbox(accountId, newMailboxRequest);
|
||||||
|
}).catchError((error) {
|
||||||
|
throw error;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -8,17 +8,17 @@ import 'package:tmail_ui_user/features/mailbox/data/extensions/mailbox_rights_ca
|
|||||||
extension MailboxCacheExtension on MailboxCache {
|
extension MailboxCacheExtension on MailboxCache {
|
||||||
Mailbox toMailbox() {
|
Mailbox toMailbox() {
|
||||||
return Mailbox(
|
return Mailbox(
|
||||||
MailboxId(Id(id)),
|
id: MailboxId(Id(id)),
|
||||||
name != null ? MailboxName(name!) : null,
|
name: name != null ? MailboxName(name!) : null,
|
||||||
parentId != null ? MailboxId(Id(parentId!)) : null,
|
parentId: parentId != null ? MailboxId(Id(parentId!)) : null,
|
||||||
role != null ? Role(role!) : null,
|
role: role != null ? Role(role!) : null,
|
||||||
sortOrder != null ? SortOrder(sortValue: sortOrder!) : null,
|
sortOrder: sortOrder != null ? SortOrder(sortValue: sortOrder!) : null,
|
||||||
totalEmails != null ? TotalEmails(UnsignedInt(totalEmails!)) : null,
|
totalEmails: totalEmails != null ? TotalEmails(UnsignedInt(totalEmails!)) : null,
|
||||||
unreadEmails != null ? UnreadEmails(UnsignedInt(unreadEmails!)) : null,
|
unreadEmails: unreadEmails != null ? UnreadEmails(UnsignedInt(unreadEmails!)) : null,
|
||||||
totalThreads != null ? TotalThreads(UnsignedInt(totalThreads!)) : null,
|
totalThreads: totalThreads != null ? TotalThreads(UnsignedInt(totalThreads!)) : null,
|
||||||
unreadThreads != null ? UnreadThreads(UnsignedInt(unreadThreads!)) : null,
|
unreadThreads: unreadThreads != null ? UnreadThreads(UnsignedInt(unreadThreads!)) : null,
|
||||||
myRights != null ? myRights!.toMailboxRights() : null,
|
myRights: myRights != null ? myRights!.toMailboxRights() : null,
|
||||||
isSubscribed != null ? IsSubscribed(isSubscribed!) : null
|
isSubscribed: isSubscribed != null ? IsSubscribed(isSubscribed!) : null
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,7 @@ extension MailboxExtension on Mailbox {
|
|||||||
|
|
||||||
MailboxCache toMailboxCache() {
|
MailboxCache toMailboxCache() {
|
||||||
return MailboxCache(
|
return MailboxCache(
|
||||||
id.id.value,
|
id!.id.value,
|
||||||
name: name?.name,
|
name: name?.name,
|
||||||
parentId: parentId?.id.value,
|
parentId: parentId?.id.value,
|
||||||
role: role?.value,
|
role: role?.value,
|
||||||
|
|||||||
@@ -12,7 +12,11 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/changes/changes_mailbox_respo
|
|||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_method.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_method.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_response.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_response.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/set/set_mailbox_method.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/set/set_mailbox_response.dart';
|
||||||
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.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_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
|
|
||||||
class MailboxAPI {
|
class MailboxAPI {
|
||||||
@@ -95,4 +99,33 @@ class MailboxAPI {
|
|||||||
hasMoreChanges: resultChanges?.hasMoreChanges ?? false,
|
hasMoreChanges: resultChanges?.hasMoreChanges ?? false,
|
||||||
updatedProperties: resultChanges?.updatedProperties);
|
updatedProperties: resultChanges?.updatedProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<Mailbox?> createNewMailbox(AccountId accountId, CreateNewMailboxRequest request) async {
|
||||||
|
final setMailboxMethod = SetMailboxMethod(accountId)
|
||||||
|
..addCreate(request.creationId, Mailbox(name: request.newName, parentId: request.parentId));
|
||||||
|
|
||||||
|
final requestBuilder = JmapRequestBuilder(httpClient, ProcessingInvocation());
|
||||||
|
|
||||||
|
final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod);
|
||||||
|
|
||||||
|
final response = await (requestBuilder
|
||||||
|
..usings(setMailboxMethod.requiredCapabilities))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
final setMailboxResponse = response.parse<SetMailboxResponse>(
|
||||||
|
setMailboxInvocation.methodCallId,
|
||||||
|
SetMailboxResponse.deserialize);
|
||||||
|
|
||||||
|
return Future.sync(() async {
|
||||||
|
final newMailbox = setMailboxResponse?.created?[request.creationId];
|
||||||
|
if (newMailbox != null) {
|
||||||
|
return newMailbox.addMailboxName(newMailbox, request.newName, parentId: request.parentId);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}).catchError((error) {
|
||||||
|
throw error;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,7 @@ import 'package:model/model.dart';
|
|||||||
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/extensions/state_extension.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/extensions/state_extension.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_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||||
@@ -83,7 +84,7 @@ class MailboxRepositoryImpl extends MailboxRepository {
|
|||||||
if (updatedProperties == null) {
|
if (updatedProperties == null) {
|
||||||
return mailboxUpdated;
|
return mailboxUpdated;
|
||||||
} else {
|
} else {
|
||||||
final mailboxOld = mailboxCacheList?.findMailbox(mailboxUpdated.id);
|
final mailboxOld = mailboxCacheList?.findMailbox(mailboxUpdated.id!);
|
||||||
if (mailboxOld != null) {
|
if (mailboxOld != null) {
|
||||||
return mailboxOld.combineMailbox(mailboxUpdated, updatedProperties);
|
return mailboxOld.combineMailbox(mailboxUpdated, updatedProperties);
|
||||||
} else {
|
} else {
|
||||||
@@ -134,4 +135,9 @@ class MailboxRepositoryImpl extends MailboxRepository {
|
|||||||
|
|
||||||
yield newMailboxResponse;
|
yield newMailboxResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Mailbox?> createNewMailbox(AccountId accountId, CreateNewMailboxRequest newMailboxRequest) {
|
||||||
|
return mapDataSource[DataSourceType.network]!.createNewMailbox(accountId, newMailboxRequest);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
|
||||||
|
class CreateNewMailboxRequest with EquatableMixin {
|
||||||
|
|
||||||
|
final MailboxName newName;
|
||||||
|
final Id creationId;
|
||||||
|
final MailboxId? parentId;
|
||||||
|
|
||||||
|
CreateNewMailboxRequest(this.creationId, this.newName, {this.parentId});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [creationId, newName, parentId];
|
||||||
|
}
|
||||||
@@ -1,10 +1,14 @@
|
|||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/state.dart';
|
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.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_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
|
|
||||||
abstract class MailboxRepository {
|
abstract class MailboxRepository {
|
||||||
Stream<MailboxResponse> getAllMailbox(AccountId accountId, {Properties? properties});
|
Stream<MailboxResponse> getAllMailbox(AccountId accountId, {Properties? properties});
|
||||||
|
|
||||||
Stream<MailboxResponse> refresh(AccountId accountId, State currentState);
|
Stream<MailboxResponse> refresh(AccountId accountId, State currentState);
|
||||||
|
|
||||||
|
Future<Mailbox?> createNewMailbox(AccountId accountId, CreateNewMailboxRequest newMailboxRequest);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import 'package:core/core.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
|
||||||
|
class CreateNewMailboxSuccess extends UIState {
|
||||||
|
|
||||||
|
final Mailbox newMailbox;
|
||||||
|
|
||||||
|
CreateNewMailboxSuccess(this.newMailbox);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [newMailbox];
|
||||||
|
}
|
||||||
|
|
||||||
|
class CreateNewMailboxFailure extends FeatureFailure {
|
||||||
|
final exception;
|
||||||
|
|
||||||
|
CreateNewMailboxFailure(this.exception);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [exception];
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import 'package:core/core.dart';
|
||||||
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart';
|
||||||
|
|
||||||
|
class CreateNewMailboxInteractor {
|
||||||
|
final MailboxRepository mailboxRepository;
|
||||||
|
|
||||||
|
CreateNewMailboxInteractor(this.mailboxRepository);
|
||||||
|
|
||||||
|
Stream<Either<Failure, Success>> execute(AccountId accountId, CreateNewMailboxRequest newMailboxRequest) async* {
|
||||||
|
try {
|
||||||
|
final newMailbox = await mailboxRepository.createNewMailbox(accountId, newMailboxRequest);
|
||||||
|
if (newMailbox != null) {
|
||||||
|
yield Right<Failure, Success>(CreateNewMailboxSuccess(newMailbox));
|
||||||
|
} else {
|
||||||
|
yield Left<Failure, Success>(CreateNewMailboxFailure(null));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
yield Left<Failure, Success>(CreateNewMailboxFailure(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,10 +15,12 @@ import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
|
|||||||
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.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/presentation/model/mailbox_tree_builder.dart';
|
||||||
|
import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
class MailboxBindings extends Bindings {
|
class MailboxBindings extends Bindings {
|
||||||
@override
|
@override
|
||||||
@@ -42,11 +44,17 @@ class MailboxBindings extends Bindings {
|
|||||||
Get.lazyPut(() => GetAllMailboxInteractor(Get.find<MailboxRepository>()));
|
Get.lazyPut(() => GetAllMailboxInteractor(Get.find<MailboxRepository>()));
|
||||||
Get.lazyPut(() => RefreshAllMailboxInteractor(Get.find<MailboxRepository>()));
|
Get.lazyPut(() => RefreshAllMailboxInteractor(Get.find<MailboxRepository>()));
|
||||||
Get.lazyPut(() => TreeBuilder());
|
Get.lazyPut(() => TreeBuilder());
|
||||||
|
Get.lazyPut(() => CreateNewMailboxInteractor(Get.find<MailboxRepository>()));
|
||||||
|
Get.lazyPut(() => Uuid());
|
||||||
Get.put(MailboxController(
|
Get.put(MailboxController(
|
||||||
Get.find<GetAllMailboxInteractor>(),
|
Get.find<GetAllMailboxInteractor>(),
|
||||||
Get.find<DeleteCredentialInteractor>(),
|
Get.find<DeleteCredentialInteractor>(),
|
||||||
Get.find<RefreshAllMailboxInteractor>(),
|
Get.find<RefreshAllMailboxInteractor>(),
|
||||||
|
Get.find<CreateNewMailboxInteractor>(),
|
||||||
Get.find<TreeBuilder>(),
|
Get.find<TreeBuilder>(),
|
||||||
|
Get.find<Uuid>(),
|
||||||
|
Get.find<AppToast>(),
|
||||||
|
Get.find<ImagePaths>(),
|
||||||
Get.find<ResponsiveUtils>(),
|
Get.find<ResponsiveUtils>(),
|
||||||
Get.find<CachingManager>()));
|
Get.find<CachingManager>()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,25 +4,32 @@ import 'package:flutter/cupertino.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
|
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
|
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_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/get_all_mailboxes_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_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/get_all_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.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/presentation/extensions/list_mailbox_node_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/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/presentation/mailbox_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
|
||||||
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/state.dart' as jmapState;
|
import 'package:jmap_dart_client/jmap/core/state.dart' as jmapState;
|
||||||
|
import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
class MailboxController extends BaseController {
|
class MailboxController extends BaseController {
|
||||||
|
|
||||||
@@ -30,7 +37,11 @@ class MailboxController extends BaseController {
|
|||||||
final GetAllMailboxInteractor _getAllMailboxInteractor;
|
final GetAllMailboxInteractor _getAllMailboxInteractor;
|
||||||
final DeleteCredentialInteractor _deleteCredentialInteractor;
|
final DeleteCredentialInteractor _deleteCredentialInteractor;
|
||||||
final RefreshAllMailboxInteractor _refreshAllMailboxInteractor;
|
final RefreshAllMailboxInteractor _refreshAllMailboxInteractor;
|
||||||
|
final CreateNewMailboxInteractor _createNewMailboxInteractor;
|
||||||
final TreeBuilder _treeBuilder;
|
final TreeBuilder _treeBuilder;
|
||||||
|
final Uuid _uuid;
|
||||||
|
final AppToast _appToast;
|
||||||
|
final ImagePaths _imagePaths;
|
||||||
final ResponsiveUtils responsiveUtils;
|
final ResponsiveUtils responsiveUtils;
|
||||||
final CachingManager _cachingManager;
|
final CachingManager _cachingManager;
|
||||||
|
|
||||||
@@ -45,7 +56,11 @@ class MailboxController extends BaseController {
|
|||||||
this._getAllMailboxInteractor,
|
this._getAllMailboxInteractor,
|
||||||
this._deleteCredentialInteractor,
|
this._deleteCredentialInteractor,
|
||||||
this._refreshAllMailboxInteractor,
|
this._refreshAllMailboxInteractor,
|
||||||
|
this._createNewMailboxInteractor,
|
||||||
this._treeBuilder,
|
this._treeBuilder,
|
||||||
|
this._uuid,
|
||||||
|
this._appToast,
|
||||||
|
this._imagePaths,
|
||||||
this.responsiveUtils,
|
this.responsiveUtils,
|
||||||
this._cachingManager,
|
this._cachingManager,
|
||||||
);
|
);
|
||||||
@@ -95,7 +110,20 @@ class MailboxController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onDone() {}
|
void onDone() {
|
||||||
|
viewState.value.fold(
|
||||||
|
(failure) {
|
||||||
|
if (failure is CreateNewMailboxFailure) {
|
||||||
|
_createNewMailboxFailure(failure);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
(success) {
|
||||||
|
if (success is CreateNewMailboxSuccess) {
|
||||||
|
_createNewMailboxSuccess(success);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onError(error) {}
|
void onError(error) {}
|
||||||
@@ -206,13 +234,47 @@ class MailboxController extends BaseController {
|
|||||||
await _cachingManager.clearAll();
|
await _cachingManager.clearAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
void createNewMailbox() async {
|
void goToCreateNewMailboxView() async {
|
||||||
final accountId = mailboxDashBoardController.accountId.value;
|
final accountId = mailboxDashBoardController.accountId.value;
|
||||||
if (accountId != null) {
|
if (accountId != null) {
|
||||||
final newMailboxArguments = await push(
|
final newMailboxArguments = await push(
|
||||||
AppRoutes.MAILBOX_CREATOR,
|
AppRoutes.MAILBOX_CREATOR,
|
||||||
arguments: MailboxCreatorArguments(accountId, allMailboxes)
|
arguments: MailboxCreatorArguments(accountId, allMailboxes)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (newMailboxArguments != null && newMailboxArguments is NewMailboxArguments) {
|
||||||
|
final generateCreateId = Id(_uuid.v1());
|
||||||
|
_createNewMailboxAction(accountId, CreateNewMailboxRequest(
|
||||||
|
generateCreateId,
|
||||||
|
newMailboxArguments.newName,
|
||||||
|
parentId: newMailboxArguments.mailboxLocation?.id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _createNewMailboxAction(AccountId accountId, CreateNewMailboxRequest request) async {
|
||||||
|
consumeState(_createNewMailboxInteractor.execute(accountId, request));
|
||||||
|
}
|
||||||
|
|
||||||
|
void _createNewMailboxSuccess(CreateNewMailboxSuccess success) {
|
||||||
|
if (Get.overlayContext != null && Get.context != null) {
|
||||||
|
_appToast.showToastWithIcon(
|
||||||
|
Get.overlayContext!,
|
||||||
|
textColor: AppColor.toastSuccessBackgroundColor,
|
||||||
|
message: AppLocalizations.of(Get.context!).new_mailbox_is_created(success.newMailbox.name?.name ?? ''),
|
||||||
|
icon: _imagePaths.icFolderMailbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshMailboxChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _createNewMailboxFailure(CreateNewMailboxFailure failure) {
|
||||||
|
if (Get.overlayContext != null && Get.context != null) {
|
||||||
|
_appToast.showToastWithIcon(
|
||||||
|
Get.overlayContext!,
|
||||||
|
textColor: AppColor.toastErrorBackgroundColor,
|
||||||
|
message: AppLocalizations.of(Get.context!).create_new_mailbox_failure,
|
||||||
|
icon: _imagePaths.icFolderMailbox);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -83,8 +83,8 @@ class MailboxView extends GetWidget<MailboxController> {
|
|||||||
return Padding(
|
return Padding(
|
||||||
padding: EdgeInsets.only(left: 16, right: 16),
|
padding: EdgeInsets.only(left: 16, right: 16),
|
||||||
child: IconButton(
|
child: IconButton(
|
||||||
key: Key('mailbox_add_new_folder_button'),
|
key: Key('create_new_mailbox_button'),
|
||||||
onPressed: () => controller.createNewMailbox(),
|
onPressed: () => controller.goToCreateNewMailboxView(),
|
||||||
icon: SvgPicture.asset(imagePaths.icAddNewFolder, width: 30, height: 30, fit: BoxFit.fill)));
|
icon: SvgPicture.asset(imagePaths.icAddNewFolder, width: 30, height: 30, fit: BoxFit.fill)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -2,18 +2,18 @@
|
|||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
enum MailboxAction {
|
enum MailboxActions {
|
||||||
create,
|
create,
|
||||||
moveEmail,
|
moveEmail,
|
||||||
}
|
}
|
||||||
|
|
||||||
extension MailboxActionExtension on MailboxAction {
|
extension MailboxActionsExtension on MailboxActions {
|
||||||
|
|
||||||
String getTitle(BuildContext context) {
|
String getTitle(BuildContext context) {
|
||||||
switch(this) {
|
switch(this) {
|
||||||
case MailboxAction.create:
|
case MailboxActions.create:
|
||||||
return AppLocalizations.of(context).mailbox_location;
|
return AppLocalizations.of(context).mailbox_location;
|
||||||
case MailboxAction.moveEmail:
|
case MailboxActions.moveEmail:
|
||||||
return AppLocalizations.of(context).move_to_mailbox;
|
return AppLocalizations.of(context).move_to_mailbox;
|
||||||
default:
|
default:
|
||||||
return '';
|
return '';
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
extension NameValidatorStringExtension on String {
|
extension NameValidatorStringExtension on String {
|
||||||
bool hasSpecialCharactersInName() {
|
bool hasSpecialCharactersInName() {
|
||||||
return RegExp(r'^([@#%^$~!%&*()+=\|{}/<>:;?`])').hasMatch(this);
|
return RegExp(r'(?=.*?[#?!@$%^&*)(=+}{:;?/|\\><.,`~])').hasMatch(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,10 +4,11 @@ import 'package:dartz/dartz.dart';
|
|||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.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/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/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/model/verification/special_character_validator.dart';
|
||||||
@@ -15,6 +16,7 @@ import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_
|
|||||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.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/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/mailbox_creator_arguments.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||||
import 'package:tmail_ui_user/main/utils/app_logger.dart';
|
import 'package:tmail_ui_user/main/utils/app_logger.dart';
|
||||||
@@ -97,11 +99,21 @@ class MailboxCreatorController extends BaseController {
|
|||||||
if (accountId != null) {
|
if (accountId != null) {
|
||||||
final destinationMailbox = await push(
|
final destinationMailbox = await push(
|
||||||
AppRoutes.DESTINATION_PICKER,
|
AppRoutes.DESTINATION_PICKER,
|
||||||
arguments: DestinationPickerArguments(accountId!, MailboxAction.create)
|
arguments: DestinationPickerArguments(accountId!, MailboxActions.create)
|
||||||
);
|
);
|
||||||
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
|
|
||||||
selectedMailbox.value = destinationMailbox;
|
selectedMailbox.value = destinationMailbox;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void createNewMailbox(BuildContext context) {
|
||||||
|
FocusScope.of(context).unfocus();
|
||||||
|
final nameMailbox = newNameMailbox.value;
|
||||||
|
if (nameMailbox != null && nameMailbox.isNotEmpty) {
|
||||||
|
final newMailboxArguments = NewMailboxArguments(
|
||||||
|
MailboxName(nameMailbox),
|
||||||
|
mailboxLocation: selectedMailbox.value);
|
||||||
|
popBack(result: newMailboxArguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
|
|||||||
title: AppLocalizations.of(context).new_mailbox,
|
title: AppLocalizations.of(context).new_mailbox,
|
||||||
isValidated: controller.isCreateMailboxValidated(context))
|
isValidated: controller.isCreateMailboxValidated(context))
|
||||||
..addOnCancelActionClick(() => controller.closeMailboxCreator(context))
|
..addOnCancelActionClick(() => controller.closeMailboxCreator(context))
|
||||||
..addOnDoneActionClick(() => {}))
|
..addOnDoneActionClick(() => controller.createNewMailbox(context)))
|
||||||
.build())
|
.build())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
|
|
||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||||
|
|
||||||
class NewMailboxArguments with EquatableMixin{
|
class NewMailboxArguments with EquatableMixin {
|
||||||
final String nameMailbox;
|
final MailboxName newName;
|
||||||
final PresentationMailbox mailboxLocation;
|
final PresentationMailbox? mailboxLocation;
|
||||||
|
|
||||||
NewMailboxArguments(this.nameMailbox, this.mailboxLocation);
|
NewMailboxArguments(this.newName, {this.mailboxLocation});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [nameMailbox, mailboxLocation];
|
List<Object?> get props => [newName, mailboxLocation];
|
||||||
}
|
}
|
||||||
@@ -21,7 +21,7 @@ import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_sta
|
|||||||
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.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/model/search_query.dart';
|
||||||
@@ -480,7 +480,7 @@ class ThreadController extends BaseController {
|
|||||||
final listEmailIds = listEmail.map((email) => email.id).toList();
|
final listEmailIds = listEmail.map((email) => email.id).toList();
|
||||||
final destinationMailbox = await push(
|
final destinationMailbox = await push(
|
||||||
AppRoutes.DESTINATION_PICKER,
|
AppRoutes.DESTINATION_PICKER,
|
||||||
arguments: DestinationPickerArguments(_accountId!, MailboxAction.moveEmail)
|
arguments: DestinationPickerArguments(_accountId!, MailboxActions.moveEmail)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
|
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
|
||||||
|
|||||||
@@ -634,4 +634,19 @@ class AppLocalizations {
|
|||||||
name: 'this_folder_name_is_already_taken',
|
name: 'this_folder_name_is_already_taken',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String new_mailbox_is_created(String nameMailbox) {
|
||||||
|
return Intl.message(
|
||||||
|
'$nameMailbox is created',
|
||||||
|
name: 'new_mailbox_is_created',
|
||||||
|
args: [nameMailbox]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
String get create_new_mailbox_failure {
|
||||||
|
return Intl.message(
|
||||||
|
'Create new mailbox failure',
|
||||||
|
name: 'new_mailbox_is_created'
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -8,7 +8,7 @@ extension MailboxExtension on Mailbox {
|
|||||||
|
|
||||||
PresentationMailbox toPresentationMailbox({SelectMode selectMode = SelectMode.INACTIVE}) {
|
PresentationMailbox toPresentationMailbox({SelectMode selectMode = SelectMode.INACTIVE}) {
|
||||||
return PresentationMailbox(
|
return PresentationMailbox(
|
||||||
id,
|
id!,
|
||||||
name: name,
|
name: name,
|
||||||
parentId: parentId,
|
parentId: parentId,
|
||||||
role: role,
|
role: role,
|
||||||
@@ -25,17 +25,33 @@ extension MailboxExtension on Mailbox {
|
|||||||
|
|
||||||
Mailbox combineMailbox(Mailbox newMailbox, Properties updatedProperties) {
|
Mailbox combineMailbox(Mailbox newMailbox, Properties updatedProperties) {
|
||||||
return Mailbox(
|
return Mailbox(
|
||||||
newMailbox.id,
|
id: newMailbox.id,
|
||||||
updatedProperties.contain(MailboxProperty.name) ? newMailbox.name : name,
|
name: updatedProperties.contain(MailboxProperty.name) ? newMailbox.name : name,
|
||||||
updatedProperties.contain(MailboxProperty.parentId) ? newMailbox.parentId : parentId,
|
parentId: updatedProperties.contain(MailboxProperty.parentId) ? newMailbox.parentId : parentId,
|
||||||
updatedProperties.contain(MailboxProperty.role) ? newMailbox.role : role,
|
role: updatedProperties.contain(MailboxProperty.role) ? newMailbox.role : role,
|
||||||
updatedProperties.contain(MailboxProperty.sortOrder) ? newMailbox.sortOrder : sortOrder,
|
sortOrder: updatedProperties.contain(MailboxProperty.sortOrder) ? newMailbox.sortOrder : sortOrder,
|
||||||
updatedProperties.contain(MailboxProperty.totalEmails) ? newMailbox.totalEmails : totalEmails,
|
totalEmails: updatedProperties.contain(MailboxProperty.totalEmails) ? newMailbox.totalEmails : totalEmails,
|
||||||
updatedProperties.contain(MailboxProperty.unreadEmails) ? newMailbox.unreadEmails : unreadEmails,
|
unreadEmails: updatedProperties.contain(MailboxProperty.unreadEmails) ? newMailbox.unreadEmails : unreadEmails,
|
||||||
updatedProperties.contain(MailboxProperty.totalThreads) ? newMailbox.totalThreads : totalThreads,
|
totalThreads: updatedProperties.contain(MailboxProperty.totalThreads) ? newMailbox.totalThreads : totalThreads,
|
||||||
updatedProperties.contain(MailboxProperty.unreadThreads) ? newMailbox.unreadThreads : unreadThreads,
|
unreadThreads: updatedProperties.contain(MailboxProperty.unreadThreads) ? newMailbox.unreadThreads : unreadThreads,
|
||||||
updatedProperties.contain(MailboxProperty.myRights) ? newMailbox.myRights : myRights,
|
myRights: updatedProperties.contain(MailboxProperty.myRights) ? newMailbox.myRights : myRights,
|
||||||
updatedProperties.contain(MailboxProperty.isSubscribed) ? newMailbox.isSubscribed : isSubscribed,
|
isSubscribed: updatedProperties.contain(MailboxProperty.isSubscribed) ? newMailbox.isSubscribed : isSubscribed,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Mailbox addMailboxName(Mailbox newMailbox, MailboxName mailboxName, {MailboxId? parentId}) {
|
||||||
|
return Mailbox(
|
||||||
|
id: id,
|
||||||
|
name: mailboxName,
|
||||||
|
parentId: parentId,
|
||||||
|
role: role,
|
||||||
|
sortOrder: sortOrder,
|
||||||
|
totalEmails: totalEmails,
|
||||||
|
unreadEmails: unreadEmails,
|
||||||
|
totalThreads: totalThreads,
|
||||||
|
unreadThreads: unreadThreads,
|
||||||
|
myRights: myRights,
|
||||||
|
isSubscribed: isSubscribed,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -23,17 +23,17 @@ extension PresentationMailboxExtension on PresentationMailbox {
|
|||||||
|
|
||||||
Mailbox toMailbox() {
|
Mailbox toMailbox() {
|
||||||
return Mailbox(
|
return Mailbox(
|
||||||
id,
|
id: id,
|
||||||
name,
|
name: name,
|
||||||
parentId,
|
parentId: parentId,
|
||||||
role,
|
role: role,
|
||||||
sortOrder,
|
sortOrder: sortOrder,
|
||||||
totalEmails,
|
totalEmails: totalEmails,
|
||||||
unreadEmails,
|
unreadEmails: unreadEmails,
|
||||||
totalThreads,
|
totalThreads: totalThreads,
|
||||||
unreadThreads,
|
unreadThreads: unreadThreads,
|
||||||
myRights,
|
myRights: myRights,
|
||||||
isSubscribed
|
isSubscribed: isSubscribed
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Vendored
+5
-5
@@ -16,7 +16,7 @@ class EmailFixtures {
|
|||||||
sentAt: UTCDate(DateTime.parse("2021-08-11T04:25:34Z")),
|
sentAt: UTCDate(DateTime.parse("2021-08-11T04:25:34Z")),
|
||||||
receivedAt: UTCDate(DateTime.parse("2021-08-11T04:25:55Z")),
|
receivedAt: UTCDate(DateTime.parse("2021-08-11T04:25:55Z")),
|
||||||
keywords: {KeyWordIdentifier.emailSeen : true},
|
keywords: {KeyWordIdentifier.emailSeen : true},
|
||||||
mailboxIds: {MailboxFixtures.inboxMailbox.id : true},
|
mailboxIds: {MailboxFixtures.inboxMailbox.id! : true},
|
||||||
to: {EmailAddress("DatVu", "tdvu@linagora.com")},
|
to: {EmailAddress("DatVu", "tdvu@linagora.com")},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ class EmailFixtures {
|
|||||||
from: {EmailAddress(null, "noreply@qa.open-paas.org")},
|
from: {EmailAddress(null, "noreply@qa.open-paas.org")},
|
||||||
sentAt: UTCDate(DateTime.parse("2021-08-10T09:45:01Z")),
|
sentAt: UTCDate(DateTime.parse("2021-08-10T09:45:01Z")),
|
||||||
receivedAt: UTCDate(DateTime.parse("2021-08-10T04:00:59Z")),
|
receivedAt: UTCDate(DateTime.parse("2021-08-10T04:00:59Z")),
|
||||||
mailboxIds: {MailboxFixtures.inboxMailbox.id : true},
|
mailboxIds: {MailboxFixtures.inboxMailbox.id! : true},
|
||||||
to: {EmailAddress("DatVu", "tdvu@facebook.com")},
|
to: {EmailAddress("DatVu", "tdvu@facebook.com")},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ class EmailFixtures {
|
|||||||
sentAt: UTCDate(DateTime.parse("2021-08-09T03:00:00Z")),
|
sentAt: UTCDate(DateTime.parse("2021-08-09T03:00:00Z")),
|
||||||
receivedAt: UTCDate(DateTime.parse("2021-08-09T04:00:55Z")),
|
receivedAt: UTCDate(DateTime.parse("2021-08-09T04:00:55Z")),
|
||||||
keywords: {KeyWordIdentifier.emailFlagged : true},
|
keywords: {KeyWordIdentifier.emailFlagged : true},
|
||||||
mailboxIds: {MailboxFixtures.inboxMailbox.id : true},
|
mailboxIds: {MailboxFixtures.inboxMailbox.id! : true},
|
||||||
to: {EmailAddress("DatVu", "tdvu@gmail.com")},
|
to: {EmailAddress("DatVu", "tdvu@gmail.com")},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ class EmailFixtures {
|
|||||||
sentAt: UTCDate(DateTime.parse("2021-08-08T06:46:25Z")),
|
sentAt: UTCDate(DateTime.parse("2021-08-08T06:46:25Z")),
|
||||||
receivedAt: UTCDate(DateTime.parse("2021-08-08T06:46:26Z")),
|
receivedAt: UTCDate(DateTime.parse("2021-08-08T06:46:26Z")),
|
||||||
keywords: {KeyWordIdentifier.emailFlagged : true},
|
keywords: {KeyWordIdentifier.emailFlagged : true},
|
||||||
mailboxIds: {MailboxFixtures.inboxMailbox.id : true},
|
mailboxIds: {MailboxFixtures.inboxMailbox.id! : true},
|
||||||
to: {EmailAddress("DatVu", "tdvu@icloud.com")},
|
to: {EmailAddress("DatVu", "tdvu@icloud.com")},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ class EmailFixtures {
|
|||||||
sentAt: UTCDate(DateTime.parse("2021-08-07T04:34:13Z")),
|
sentAt: UTCDate(DateTime.parse("2021-08-07T04:34:13Z")),
|
||||||
receivedAt: UTCDate(DateTime.parse("2021-08-07T04:34:17Z")),
|
receivedAt: UTCDate(DateTime.parse("2021-08-07T04:34:17Z")),
|
||||||
keywords: {KeyWordIdentifier.emailSeen : true},
|
keywords: {KeyWordIdentifier.emailSeen : true},
|
||||||
mailboxIds: {MailboxFixtures.inboxMailbox.id : true},
|
mailboxIds: {MailboxFixtures.inboxMailbox.id! : true},
|
||||||
to: {EmailAddress("DatVu", "tdvu@yahoo.com")},
|
to: {EmailAddress("DatVu", "tdvu@yahoo.com")},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Vendored
+44
-44
@@ -5,16 +5,16 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox_rights.dart';
|
|||||||
|
|
||||||
class MailboxFixtures {
|
class MailboxFixtures {
|
||||||
static final inboxMailbox = Mailbox(
|
static final inboxMailbox = Mailbox(
|
||||||
MailboxId(Id('1')),
|
id: MailboxId(Id('1')),
|
||||||
MailboxName('Inbox'),
|
name: MailboxName('Inbox'),
|
||||||
null,
|
parentId: null,
|
||||||
Role('inbox'),
|
role: Role('inbox'),
|
||||||
SortOrder(sortValue: 10),
|
sortOrder: SortOrder(sortValue: 10),
|
||||||
TotalEmails(UnsignedInt(2758)),
|
totalEmails: TotalEmails(UnsignedInt(2758)),
|
||||||
UnreadEmails(UnsignedInt(34)),
|
unreadEmails: UnreadEmails(UnsignedInt(34)),
|
||||||
TotalThreads(UnsignedInt(2758)),
|
totalThreads: TotalThreads(UnsignedInt(2758)),
|
||||||
UnreadThreads(UnsignedInt(34)),
|
unreadThreads: UnreadThreads(UnsignedInt(34)),
|
||||||
MailboxRights(
|
myRights: MailboxRights(
|
||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
@@ -24,20 +24,20 @@ class MailboxFixtures {
|
|||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
true),
|
true),
|
||||||
IsSubscribed(true)
|
isSubscribed: IsSubscribed(true)
|
||||||
);
|
);
|
||||||
|
|
||||||
static final sentMailbox = Mailbox(
|
static final sentMailbox = Mailbox(
|
||||||
MailboxId(Id('2')),
|
id: MailboxId(Id('2')),
|
||||||
MailboxName('Sent'),
|
name: MailboxName('Sent'),
|
||||||
null,
|
parentId: null,
|
||||||
Role('sent'),
|
role: Role('sent'),
|
||||||
SortOrder(sortValue: 3),
|
sortOrder: SortOrder(sortValue: 3),
|
||||||
TotalEmails(UnsignedInt(123)),
|
totalEmails: TotalEmails(UnsignedInt(123)),
|
||||||
UnreadEmails(UnsignedInt(12)),
|
unreadEmails: UnreadEmails(UnsignedInt(12)),
|
||||||
TotalThreads(UnsignedInt(123)),
|
totalThreads: TotalThreads(UnsignedInt(123)),
|
||||||
UnreadThreads(UnsignedInt(12)),
|
unreadThreads: UnreadThreads(UnsignedInt(12)),
|
||||||
MailboxRights(
|
myRights: MailboxRights(
|
||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
@@ -47,20 +47,20 @@ class MailboxFixtures {
|
|||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
true),
|
true),
|
||||||
IsSubscribed(true)
|
isSubscribed: IsSubscribed(true)
|
||||||
);
|
);
|
||||||
|
|
||||||
static final folder1 = Mailbox(
|
static final folder1 = Mailbox(
|
||||||
MailboxId(Id('b1')),
|
id: MailboxId(Id('b1')),
|
||||||
MailboxName('folder 1'),
|
name: MailboxName('folder 1'),
|
||||||
null,
|
parentId: null,
|
||||||
null,
|
role: null,
|
||||||
SortOrder(sortValue: 1000),
|
sortOrder: SortOrder(sortValue: 1000),
|
||||||
TotalEmails(UnsignedInt(123)),
|
totalEmails: TotalEmails(UnsignedInt(123)),
|
||||||
UnreadEmails(UnsignedInt(12)),
|
unreadEmails: UnreadEmails(UnsignedInt(12)),
|
||||||
TotalThreads(UnsignedInt(123)),
|
totalThreads: TotalThreads(UnsignedInt(123)),
|
||||||
UnreadThreads(UnsignedInt(12)),
|
unreadThreads: UnreadThreads(UnsignedInt(12)),
|
||||||
MailboxRights(
|
myRights: MailboxRights(
|
||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
@@ -70,20 +70,20 @@ class MailboxFixtures {
|
|||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
true),
|
true),
|
||||||
IsSubscribed(true)
|
isSubscribed: IsSubscribed(true)
|
||||||
);
|
);
|
||||||
|
|
||||||
static final folder1_1 = Mailbox(
|
static final folder1_1 = Mailbox(
|
||||||
MailboxId(Id('b11')),
|
id: MailboxId(Id('b11')),
|
||||||
MailboxName('folder 1_1'),
|
name: MailboxName('folder 1_1'),
|
||||||
MailboxId(Id("b1")),
|
parentId: MailboxId(Id("b1")),
|
||||||
null,
|
role: null,
|
||||||
SortOrder(sortValue: 1000),
|
sortOrder: SortOrder(sortValue: 1000),
|
||||||
TotalEmails(UnsignedInt(123)),
|
totalEmails: TotalEmails(UnsignedInt(123)),
|
||||||
UnreadEmails(UnsignedInt(12)),
|
unreadEmails: UnreadEmails(UnsignedInt(12)),
|
||||||
TotalThreads(UnsignedInt(123)),
|
totalThreads: TotalThreads(UnsignedInt(123)),
|
||||||
UnreadThreads(UnsignedInt(12)),
|
unreadThreads: UnreadThreads(UnsignedInt(12)),
|
||||||
MailboxRights(
|
myRights: MailboxRights(
|
||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
@@ -93,6 +93,6 @@ class MailboxFixtures {
|
|||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
true),
|
true),
|
||||||
IsSubscribed(true)
|
isSubscribed: IsSubscribed(true)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user