TF-1083: add drag single mail

This commit is contained in:
ManhNTX
2022-10-20 15:55:40 +07:00
committed by Dat H. Pham
parent bdbc8b4a11
commit 64cef87b74
8 changed files with 175 additions and 52 deletions
@@ -303,25 +303,25 @@ class ThreadController extends BaseController {
if (viewState is Either) {
viewState.map((success) {
if (success is MarkAsEmailReadSuccess) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
refreshEmailChanges(currentEmailState: success.currentEmailState);
} else if (success is MoveToMailboxSuccess) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
refreshEmailChanges(currentEmailState: success.currentEmailState);
} else if (success is MarkAsStarEmailSuccess) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
refreshEmailChanges(currentEmailState: success.currentEmailState);
} else if (success is DeleteEmailPermanentlySuccess) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
refreshEmailChanges(currentEmailState: success.currentEmailState);
} else if (success is SaveEmailAsDraftsSuccess) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
refreshEmailChanges(currentEmailState: success.currentEmailState);
} else if (success is RemoveEmailDraftsSuccess) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
refreshEmailChanges(currentEmailState: success.currentEmailState);
} else if (success is SendEmailSuccess) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
refreshEmailChanges(currentEmailState: success.currentEmailState);
} else if (success is UpdateEmailDraftsSuccess) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
refreshEmailChanges(currentEmailState: success.currentEmailState);
} else if (success is MarkAsMailboxReadAllSuccess) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
refreshEmailChanges(currentEmailState: success.currentEmailState);
} else if (success is MarkAsMailboxReadHasSomeEmailFailure) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
refreshEmailChanges(currentEmailState: success.currentEmailState);
}
});
}
@@ -424,8 +424,8 @@ class ThreadController extends BaseController {
}
}
void _refreshEmailChanges({jmap.State? currentEmailState}) {
log('ThreadController::_refreshEmailChanges(): currentEmailState: $currentEmailState');
void refreshEmailChanges({jmap.State? currentEmailState}) {
log('ThreadController::refreshEmailChanges(): currentEmailState: $currentEmailState');
if (isSearchActive()) {
if (_accountId != null && searchQuery != null) {
final limit = emailList.isNotEmpty
@@ -436,7 +436,7 @@ class ThreadController extends BaseController {
}
} else {
final newEmailState = currentEmailState ?? _currentEmailState;
log('ThreadController::_refreshEmailChanges(): newEmailState: $newEmailState');
log('ThreadController::refreshEmailChanges(): newEmailState: $newEmailState');
if (_accountId != null && newEmailState != null) {
consumeState(_refreshChangesEmailsInMailboxInteractor.execute(
_accountId!,
@@ -575,7 +575,7 @@ class ThreadController extends BaseController {
message: message,
icon: readActions == ReadActions.markAsUnread ? _imagePaths.icUnreadToast : _imagePaths.icReadToast);
}
_refreshEmailChanges(currentEmailState: currentEmailState);
refreshEmailChanges(currentEmailState: currentEmailState);
}
void _markAsReadSelectedMultipleEmailFailure(Failure failure) {
@@ -732,7 +732,7 @@ class ThreadController extends BaseController {
);
}
_refreshEmailChanges(currentEmailState: currentEmailState);
refreshEmailChanges(currentEmailState: currentEmailState);
}
void moveSelectedMultipleEmailToTrash(
@@ -820,7 +820,7 @@ class ThreadController extends BaseController {
}
void _markAsStarEmailSuccess(MarkAsStarEmailSuccess success) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
refreshEmailChanges(currentEmailState: success.currentEmailState);
}
void markAsStarSelectedMultipleEmail(
@@ -861,7 +861,7 @@ class ThreadController extends BaseController {
icon: markStarAction == MarkStarAction.unMarkStar ? _imagePaths.icUnStar : _imagePaths.icStar);
}
_refreshEmailChanges(currentEmailState: currentEmailState);
refreshEmailChanges(currentEmailState: currentEmailState);
}
void _markAsStarMultipleEmailFailure(Failure failure) {
@@ -1316,7 +1316,7 @@ class ThreadController extends BaseController {
icon: _imagePaths.icDeleteToast);
}
_refreshEmailChanges(currentEmailState: currentEmailState);
refreshEmailChanges(currentEmailState: currentEmailState);
}
void _emptyTrashFolderAction() {
@@ -332,7 +332,10 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
key: const PageStorageKey('list_presentation_email_in_threads'),
itemExtent: _getItemExtent(context),
itemCount: listPresentationEmail.length,
itemBuilder: (context, index) => Obx(() => (EmailTileBuilder(
itemBuilder: (context, index) =>
Draggable<List<PresentationEmail>>(
data: [listPresentationEmail[index]],
child: Obx(() => (EmailTileBuilder(
context,
listPresentationEmail[index],
controller.mailboxDashBoardController.currentSelectMode.value,
@@ -340,21 +343,71 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
controller.searchQuery,
mailboxCurrent: controller.searchController.isSearchEmailRunning
? listPresentationEmail[index].findMailboxContain(
controller.mailboxDashBoardController.mapMailboxById)
controller.mailboxDashBoardController.mapMailboxById)
: controller.currentMailbox,
advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue)
..addOnPressEmailActionClick((action, email) =>
controller.pressEmailAction(
..addOnPressEmailActionClick((action, email) =>
controller.pressEmailAction(
context,
action,
email,
mailboxContain: controller.searchController.isSearchEmailRunning
? email.findMailboxContain(controller.mailboxDashBoardController.mapMailboxById)
: controller.currentMailbox))
..addOnMoreActionClick((email, position) => _responsiveUtils.isMobile(context)
? controller.openContextMenuAction(context, _contextMenuActionTile(context, email))
: controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email))))
.build()))
..addOnMoreActionClick((email, position) => _responsiveUtils.isMobile(context)
? controller.openContextMenuAction(context, _contextMenuActionTile(context, email))
: controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email))))
.build()),
feedback: _buildFeedBackWidget(),
childWhenDragging: (EmailTileBuilder(
context,
listPresentationEmail[index],
controller.mailboxDashBoardController.currentSelectMode.value,
controller.searchController.searchState.value.searchStatus,
controller.searchQuery,
mailboxCurrent: controller.searchController.isSearchEmailRunning
? listPresentationEmail[index].findMailboxContain(
controller.mailboxDashBoardController.mapMailboxById)
: controller.currentMailbox,
advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue,
isDrag: true))
.build(),
dragAnchorStrategy: pointerDragAnchorStrategy,
))
);
}
Widget _buildFeedBackWidget() {
return SizedBox(
height: 60,
child: Material(
borderRadius: BorderRadius.circular(10),
color: AppColor.colorTextButton,
child: Padding(
padding: const EdgeInsets.all(16),
child: Row(
children: [
SvgPicture.asset(
_imagePaths.icFilterMessageAll,
width: 24,
height: 24,
fit: BoxFit.fill,
color: Colors.white,
),
const SizedBox(width: 10),
const Text(
'Move 1 conversation',
overflow: TextOverflow.clip,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
maxLines: 1,
),
],
),
),
),
);
}
@@ -17,6 +17,7 @@ class EmailTileBuilder with BaseEmailItemTile {
final bool advancedSearchActivated;
final EdgeInsets? padding;
final EdgeInsets? paddingDivider;
final bool isDrag;
OnPressEmailActionClick? _emailActionClick;
@@ -31,6 +32,7 @@ class EmailTileBuilder with BaseEmailItemTile {
this.mailboxCurrent,
this.padding,
this.paddingDivider,
this.isDrag = false,
}
);
@@ -19,6 +19,7 @@ class EmailTileBuilder with BaseEmailItemTile {
final bool advancedSearchActivated;
final EdgeInsets? padding;
final EdgeInsets? paddingDivider;
final bool isDrag;
OnPressEmailActionClick? _emailActionClick;
OnMoreActionClick? _onMoreActionClick;
@@ -37,6 +38,7 @@ class EmailTileBuilder with BaseEmailItemTile {
this.mailboxCurrent,
this.padding,
this.paddingDivider,
this.isDrag = false,
}
);
@@ -74,8 +76,8 @@ class EmailTileBuilder with BaseEmailItemTile {
return Container(
margin: const EdgeInsets.only(top: 3),
padding: const EdgeInsets.symmetric(vertical: 8),
decoration: _selectModeAll == SelectMode.ACTIVE &&
_presentationEmail.selectMode == SelectMode.ACTIVE
decoration: (_selectModeAll == SelectMode.ACTIVE &&
_presentationEmail.selectMode == SelectMode.ACTIVE) || isDrag
? BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: AppColor.colorItemEmailSelectedDesktop)
@@ -86,8 +88,8 @@ class EmailTileBuilder with BaseEmailItemTile {
return Container(
margin: const EdgeInsets.only(top: 3, left: 16, right: 16),
padding: const EdgeInsets.only(bottom: 8, right: 8, top: 8),
decoration: _selectModeAll == SelectMode.ACTIVE &&
_presentationEmail.selectMode == SelectMode.ACTIVE
decoration: (_selectModeAll == SelectMode.ACTIVE &&
_presentationEmail.selectMode == SelectMode.ACTIVE) || isDrag
? BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: AppColor.colorItemEmailSelectedDesktop)