Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PART-1] TF-2646 Enable selection all emails in mailbox #2842

Open
wants to merge 15 commits into
base: v0.11.3-patch4-dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions contact/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -539,8 +539,8 @@ packages:
dependency: "direct main"
description:
path: "."
ref: cnb_support
resolved-ref: "10f5838aa1c6c4bffc5690f46d05d0cc4e489e1c"
ref: add-reference-destroy-property
resolved-ref: "9bb94370504cc6eb5a1b0b7180c14c31477be2be"
url: "https://github.com/linagora/jmap-dart-client.git"
source: git
version: "0.0.1"
Expand Down
2 changes: 1 addition & 1 deletion contact/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ dependencies:
jmap_dart_client:
git:
url: https://github.com/linagora/jmap-dart-client.git
ref: cnb_support
ref: add-reference-destroy-property

### Dependencies from pub.dev ###
equatable: 2.0.5
Expand Down
1 change: 0 additions & 1 deletion core/lib/presentation/resources/assets_paths.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
class AssetsPaths {
static const images = 'assets/images/';
static const icons = 'assets/icons/';
static const configurationImages = 'configurations/icons/';
}
4 changes: 0 additions & 4 deletions core/lib/presentation/resources/image_paths.dart
Original file line number Diff line number Diff line change
Expand Up @@ -216,10 +216,6 @@ class ImagePaths {
return AssetsPaths.images + imageName;
}

String _getIconPath(String iconName) {
return AssetsPaths.icons + iconName;
}

String getConfigurationImagePath(String imageName) {
return AssetsPaths.configurationImages + imageName;
}
Expand Down
4 changes: 2 additions & 2 deletions email_recovery/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -295,8 +295,8 @@ packages:
dependency: "direct main"
description:
path: "."
ref: cnb_support
resolved-ref: "10f5838aa1c6c4bffc5690f46d05d0cc4e489e1c"
ref: add-reference-destroy-property
resolved-ref: "9bb94370504cc6eb5a1b0b7180c14c31477be2be"
url: "https://github.com/linagora/jmap-dart-client.git"
source: git
version: "0.0.1"
Expand Down
2 changes: 1 addition & 1 deletion email_recovery/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ dependencies:
jmap_dart_client:
git:
url: https://github.com/linagora/jmap-dart-client.git
ref: cnb_support
ref: add-reference-destroy-property

### Dependencies from pub.dev ###
equatable: 2.0.5
Expand Down
4 changes: 2 additions & 2 deletions fcm/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -295,8 +295,8 @@ packages:
dependency: "direct main"
description:
path: "."
ref: cnb_support
resolved-ref: "10f5838aa1c6c4bffc5690f46d05d0cc4e489e1c"
ref: add-reference-destroy-property
resolved-ref: "9bb94370504cc6eb5a1b0b7180c14c31477be2be"
url: "https://github.com/linagora/jmap-dart-client.git"
source: git
version: "0.0.1"
Expand Down
2 changes: 1 addition & 1 deletion fcm/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ dependencies:
jmap_dart_client:
git:
url: https://github.com/linagora/jmap-dart-client.git
ref: cnb_support
ref: add-reference-destroy-property

### Dependencies from pub.dev ###
equatable: 2.0.5
Expand Down
4 changes: 2 additions & 2 deletions forward/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -295,8 +295,8 @@ packages:
dependency: "direct main"
description:
path: "."
ref: cnb_support
resolved-ref: "10f5838aa1c6c4bffc5690f46d05d0cc4e489e1c"
ref: add-reference-destroy-property
resolved-ref: "9bb94370504cc6eb5a1b0b7180c14c31477be2be"
url: "https://github.com/linagora/jmap-dart-client.git"
source: git
version: "0.0.1"
Expand Down
2 changes: 1 addition & 1 deletion forward/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ dependencies:
jmap_dart_client:
git:
url: https://github.com/linagora/jmap-dart-client.git
ref: cnb_support
ref: add-reference-destroy-property

### Dependencies from pub.dev ###
equatable: 2.0.5
Expand Down
2 changes: 2 additions & 0 deletions lib/features/base/base_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import 'package:model/account/authentication_type.dart';
import 'package:rule_filter/rule_filter/capability_rule_filter.dart';
import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart';
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart';
import 'package:tmail_ui_user/features/base/toast/app_toast_manager.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
import 'package:tmail_ui_user/features/email/presentation/bindings/mdn_interactor_bindings.dart';
import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.dart';
Expand Down Expand Up @@ -78,6 +79,7 @@ abstract class BaseController extends GetxController
final ResponsiveUtils responsiveUtils = Get.find<ResponsiveUtils>();
final Uuid uuid = Get.find<Uuid>();
final ApplicationManager applicationManager = Get.find<ApplicationManager>();
final AppToastManager appToastManager = Get.find<AppToastManager>();

bool _isFcmEnabled = false;

Expand Down
3 changes: 1 addition & 2 deletions lib/features/base/mixin/mailbox_action_handler_mixin.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,13 @@ mixin MailboxActionHandlerMixin {
final session = dashboardController.sessionCurrent;
final accountId = dashboardController.accountId.value;
final mailboxId = presentationMailbox.id;
final countEmailsUnread = presentationMailbox.unreadEmails?.value.value ?? 0;
if (session != null && accountId != null) {
dashboardController.markAsReadMailbox(
session,
accountId,
mailboxId,
presentationMailbox.getDisplayName(context),
countEmailsUnread.toInt()
presentationMailbox.countUnreadEmails
);

onCallbackAction?.call(context);
Expand Down
129 changes: 129 additions & 0 deletions lib/features/base/toast/app_toast_manager.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@

import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/delete_all_permanently_emails_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/mark_all_as_starred_selection_all_emails_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/mark_all_as_unread_selection_all_emails_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/move_all_selection_all_emails_state.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';

class AppToastManager {
final AppToast _appToast;
final ImagePaths _imagePaths;

AppToastManager(this._appToast, this._imagePaths);

void showSuccessMessage({
required BuildContext context,
required BuildContext overlayContext,
required Success success
}) {
if (success is MarkAsMailboxReadAllSuccess) {
_appToast.showToastSuccessMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMarkAsMailboxReadSuccess(success.mailboxDisplayName),
leadingSVGIcon: _imagePaths.icReadToast);
} else if (success is MarkAsMailboxReadHasSomeEmailFailure) {
_appToast.showToastSuccessMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMarkAsMailboxReadHasSomeEmailFailure(success.mailboxDisplayName, success.countEmailsRead),
leadingSVGIcon: _imagePaths.icReadToast);
} else if (success is MarkAllAsUnreadSelectionAllEmailsAllSuccess) {
_appToast.showToastSuccessMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMarkAllAsUnreadSelectionAllEmailsSuccess,
leadingSVGIcon: _imagePaths.icUnreadToast);
} else if (success is MarkAllAsUnreadSelectionAllEmailsHasSomeEmailFailure) {
_appToast.showToastSuccessMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMarkAllAsUnreadSelectionAllEmailsHasSomeEmailFailure(success.countEmailsUnread),
leadingSVGIcon: _imagePaths.icUnreadToast);
} else if (success is MoveAllSelectionAllEmailsAllSuccess) {
_appToast.showToastSuccessMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMoveAllSelectionAllEmailsSuccess(success.destinationPath),
leadingSVGIconColor: Colors.white,
leadingSVGIcon: _imagePaths.icFolderMailbox);
} else if (success is MoveAllSelectionAllEmailsHasSomeEmailFailure) {
_appToast.showToastSuccessMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMoveAllSelectionAllEmailsHasSomeEmailFailure(success.countEmailsMoved, success.destinationPath),
leadingSVGIconColor: Colors.white,
leadingSVGIcon: _imagePaths.icFolderMailbox);
} else if (success is DeleteAllPermanentlyEmailsSuccess) {
_appToast.showToastSuccessMessage(
overlayContext,
AppLocalizations.of(context).toast_message_empty_trash_folder_success);
} else if (success is MarkAllAsStarredSelectionAllEmailsAllSuccess) {
_appToast.showToastSuccessMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMarkAllAsStarredSelectionAllEmailsSuccess,
leadingSVGIcon: _imagePaths.icUnreadToast);
} else if (success is MarkAllAsStarredSelectionAllEmailsHasSomeEmailFailure) {
_appToast.showToastSuccessMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMarkAllAsStarredSelectionAllEmailsHasSomeEmailFailure(success.countStarred),
leadingSVGIcon: _imagePaths.icUnreadToast);
}
}

void showFailureMessage({
required BuildContext context,
required BuildContext overlayContext,
required Failure failure
}) {
if (failure is MarkAsMailboxReadFailure) {
_appToast.showToastErrorMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMarkAsReadFolderFailureWithReason(
failure.mailboxDisplayName,
failure.exception.toString()
));
} else if (failure is MarkAsMailboxReadAllFailure) {
_appToast.showToastErrorMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMarkAsReadFolderAllFailure(failure.mailboxDisplayName));
} else if (failure is MarkAllAsUnreadSelectionAllEmailsFailure) {
_appToast.showToastErrorMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMarkAllAsUnreadSelectionAllEmailsFailureWithReason(
failure.exception.toString()
));
} else if (failure is MarkAllAsUnreadSelectionAllEmailsAllFailure) {
_appToast.showToastErrorMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMarkAllAsUnreadSelectionAllEmailsAllFailure);
} else if (failure is MoveAllSelectionAllEmailsFailure) {
_appToast.showToastErrorMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMoveAllSelectionAllEmailsFailureWithReason(
failure.destinationPath,
failure.exception.toString()
));
} else if (failure is MoveAllSelectionAllEmailsAllFailure) {
_appToast.showToastErrorMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMoveAllSelectionAllEmailsAllFailure(failure.destinationPath));
} else if (failure is DeleteAllPermanentlyEmailsFailure) {
_appToast.showToastSuccessMessage(
overlayContext,
AppLocalizations.of(context).toastMessageDeleteAllPermanentlyEmailsFailureWithReason(
failure.exception.toString()
));
} else if (failure is MarkAllAsStarredSelectionAllEmailsFailure) {
_appToast.showToastErrorMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMarkAllAsStarredSelectionAllEmailsFailureWithReason(
failure.exception.toString()
));
} else if (failure is MarkAllAsStarredSelectionAllEmailsAllFailure) {
_appToast.showToastErrorMessage(
overlayContext,
AppLocalizations.of(context).toastMessageMarkAllAsStarredSelectionAllEmailsAllFailure);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@

import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/extensions/html_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/cupertino.dart';
Expand Down Expand Up @@ -122,6 +123,7 @@ extension EmailActionTypeExtension on EmailActionType {
String getIcon(ImagePaths imagePaths) {
switch(this) {
case EmailActionType.markAsUnread:
case EmailActionType.markAllAsUnread:
return imagePaths.icUnreadEmail;
case EmailActionType.unSpam:
return imagePaths.icNotSpam;
Expand All @@ -133,6 +135,16 @@ extension EmailActionTypeExtension on EmailActionType {
return imagePaths.icUnsubscribe;
case EmailActionType.archiveMessage:
return imagePaths.icMailboxArchived;
case EmailActionType.markAsRead:
case EmailActionType.markAllAsRead:
return imagePaths.icRead;
case EmailActionType.moveToMailbox:
case EmailActionType.moveAll:
return imagePaths.icMove;
case EmailActionType.moveToTrash:
case EmailActionType.moveAllToTrash:
case EmailActionType.deleteAllPermanently:
return imagePaths.icDeleteComposer;
default:
return '';
}
Expand All @@ -152,8 +164,33 @@ extension EmailActionTypeExtension on EmailActionType {
return AppLocalizations.of(context).unsubscribe;
case EmailActionType.archiveMessage:
return AppLocalizations.of(context).archiveMessage;
case EmailActionType.markAsRead:
return AppLocalizations.of(context).mark_as_read;
case EmailActionType.moveToMailbox:
return AppLocalizations.of(context).move;
case EmailActionType.moveToTrash:
return AppLocalizations.of(context).move_to_trash;
case EmailActionType.markAllAsRead:
return AppLocalizations.of(context).mark_all_as_read;
case EmailActionType.markAllAsUnread:
return AppLocalizations.of(context).markAllAsUnread;
case EmailActionType.moveAll:
return AppLocalizations.of(context).moveAll;
case EmailActionType.moveAllToTrash:
return AppLocalizations.of(context).moveAllToTrash;
case EmailActionType.deleteAllPermanently:
return AppLocalizations.of(context).deleteAllPermanently;
default:
return '';
}
}

Color getIconColor() {
switch(this) {
case EmailActionType.deleteAllPermanently:
return AppColor.colorDeletePermanentlyButton;
default:
return AppColor.primaryColor;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class EmailDataSourceImpl extends EmailDataSource {
ReadActions readActions
) {
return Future.sync(() async {
return await emailAPI.markAsRead(session, accountId, emails, readActions);
return await emailAPI.markAsReadAndGetResult(session, accountId, emails, readActions);
}).catchError(_exceptionThrower.throwException);
}

Expand Down
Loading
Loading