TF-2311 Sync use variables in BaseController to avoid wasting memory

Signed-off-by: dab246 <tdvu@linagora.com>

Signed-off-by: dab246 <tdvu@linagora.com>
(cherry picked from commit 21ac80615f7bc9e832fd72cb8ae6875c967d3cea)
This commit is contained in:
dab246
2023-11-14 17:33:17 +07:00
committed by Dat Vu
parent 4ff601b4fc
commit fb47832225
57 changed files with 727 additions and 958 deletions
+65 -59
View File
@@ -1,9 +1,11 @@
import 'package:contact/contact/model/capability_contact.dart'; import 'package:contact/contact/model/capability_contact.dart';
import 'package:core/data/network/config/dynamic_url_interceptors.dart';
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart'; import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/toast/tmail_toast.dart'; import 'package:core/presentation/views/toast/tmail_toast.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:core/utils/fps_manager.dart'; import 'package:core/utils/fps_manager.dart';
@@ -52,27 +54,31 @@ 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_config.dart'; import 'package:tmail_ui_user/main/utils/app_config.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart'; import 'package:tmail_ui_user/main/utils/app_utils.dart';
import 'package:uuid/uuid.dart';
abstract class BaseController extends GetxController abstract class BaseController extends GetxController
with MessageDialogActionMixin, with MessageDialogActionMixin,
PopupContextMenuActionMixin { PopupContextMenuActionMixin {
final CachingManager cachingManager = Get.find<CachingManager>(); final CachingManager cachingManager = Get.find<CachingManager>();
final languageCacheManager = Get.find<LanguageCacheManager>(); final LanguageCacheManager languageCacheManager = Get.find<LanguageCacheManager>();
final authorizationInterceptors = Get.find<AuthorizationInterceptors>(); final AuthorizationInterceptors authorizationInterceptors = Get.find<AuthorizationInterceptors>();
final authorizationIsolateInterceptors = Get.find<AuthorizationInterceptors>(tag: BindingTag.isolateTag); final AuthorizationInterceptors authorizationIsolateInterceptors = Get.find<AuthorizationInterceptors>(tag: BindingTag.isolateTag);
final DynamicUrlInterceptors dynamicUrlInterceptors = Get.find<DynamicUrlInterceptors>();
final DeleteCredentialInteractor deleteCredentialInteractor = Get.find<DeleteCredentialInteractor>(); final DeleteCredentialInteractor deleteCredentialInteractor = Get.find<DeleteCredentialInteractor>();
final LogoutOidcInteractor logoutOidcInteractor = Get.find<LogoutOidcInteractor>(); final LogoutOidcInteractor logoutOidcInteractor = Get.find<LogoutOidcInteractor>();
final DeleteAuthorityOidcInteractor deleteAuthorityOidcInteractor = Get.find<DeleteAuthorityOidcInteractor>(); final DeleteAuthorityOidcInteractor deleteAuthorityOidcInteractor = Get.find<DeleteAuthorityOidcInteractor>();
final AppToast appToast = Get.find<AppToast>();
final ImagePaths imagePaths = Get.find<ImagePaths>();
final ResponsiveUtils responsiveUtils = Get.find<ResponsiveUtils>();
final Uuid uuid = Get.find<Uuid>();
final _fcmReceiver = FcmReceiver.instance; final _fcmReceiver = FcmReceiver.instance;
bool _isFcmEnabled = false; bool _isFcmEnabled = false;
GetFCMSubscriptionLocalInteractor? _getSubscriptionLocalInteractor; GetFCMSubscriptionLocalInteractor? _getSubscriptionLocalInteractor;
DestroySubscriptionInteractor? _destroySubscriptionInteractor; DestroySubscriptionInteractor? _destroySubscriptionInteractor;
final AppToast _appToast = Get.find<AppToast>();
final ImagePaths _imagePaths = Get.find<ImagePaths>();
final viewState = Rx<Either<Failure, Success>>(Right(UIState.idle)); final viewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
FpsCallback? fpsCallback; FpsCallback? fpsCallback;
@@ -123,12 +129,12 @@ abstract class BaseController extends GetxController
logError('BaseController::_performFilterExceptionInError(): $error'); logError('BaseController::_performFilterExceptionInError(): $error');
if (error is NoNetworkError || error is ConnectionTimeout || error is InternalServerError) { if (error is NoNetworkError || error is ConnectionTimeout || error is InternalServerError) {
if (PlatformInfo.isWeb && currentOverlayContext != null && currentContext != null) { if (PlatformInfo.isWeb && currentOverlayContext != null && currentContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).no_internet_connection, AppLocalizations.of(currentContext!).no_internet_connection,
actionName: AppLocalizations.of(currentContext!).skip, actionName: AppLocalizations.of(currentContext!).skip,
onActionClick: ToastView.dismiss, onActionClick: ToastView.dismiss,
leadingSVGIcon: _imagePaths.icNotConnection, leadingSVGIcon: imagePaths.icNotConnection,
backgroundColor: AppColor.textFieldErrorBorderColor, backgroundColor: AppColor.textFieldErrorBorderColor,
textColor: Colors.white, textColor: Colors.white,
infinityToast: true, infinityToast: true,
@@ -137,7 +143,7 @@ abstract class BaseController extends GetxController
return error; return error;
} else if (error is BadCredentialsException) { } else if (error is BadCredentialsException) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).badCredentials AppLocalizations.of(currentContext!).badCredentials
); );
@@ -145,7 +151,7 @@ abstract class BaseController extends GetxController
return error; return error;
} else if (error is ConnectionError) { } else if (error is ConnectionError) {
if (authorizationInterceptors.isAppRunning && currentOverlayContext != null && currentContext != null) { if (authorizationInterceptors.isAppRunning && currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).connectionError AppLocalizations.of(currentContext!).connectionError
); );
@@ -164,38 +170,36 @@ abstract class BaseController extends GetxController
return; return;
} }
if (exception is BadCredentialsException || exception is ConnectionError) { if (exception is BadCredentialsException || exception is ConnectionError) {
performInvokeLogoutAction(); clearDataAndGoToLoginPage();
} }
} }
void handleFailureViewState(Failure failure) { void handleFailureViewState(Failure failure) async {
logError('BaseController::handleFailureViewState(): ${failure.runtimeType}'); logError('BaseController::handleFailureViewState(): ${failure.runtimeType}');
if (failure is LogoutOidcFailure) { if (failure is LogoutOidcFailure) {
if (_isFcmEnabled) { if (_isFcmEnabled) {
_getSubscriptionLocalAction(); _getSubscriptionLocalAction();
} else { } else {
_logoutOIDCAction(); await clearDataAndGoToLoginPage();
} }
} else if (failure is GetFCMSubscriptionLocalFailure) { } else if (failure is GetFCMSubscriptionLocalFailure ||
performInvokeLogoutAction(); failure is DestroySubscriptionFailure) {
} else if (failure is DestroySubscriptionFailure) { await clearDataAndGoToLoginPage();
performInvokeLogoutAction();
} }
} }
void handleSuccessViewState(Success success) { void handleSuccessViewState(Success success) async {
log('BaseController::handleSuccessViewState(): ${success.runtimeType}'); log('BaseController::handleSuccessViewState(): ${success.runtimeType}');
if (success is LogoutOidcSuccess) { if (success is LogoutOidcSuccess) {
if (_isFcmEnabled) { if (_isFcmEnabled) {
_getSubscriptionLocalAction(); _getSubscriptionLocalAction();
} else { } else {
_logoutOIDCAction(); await clearDataAndGoToLoginPage();
} }
} else if (success is GetFCMSubscriptionLocalSuccess) { } else if (success is GetFCMSubscriptionLocalSuccess) {
final subscriptionId = success.fcmSubscription.subscriptionId; _destroySubscriptionAction(success.fcmSubscription.subscriptionId);
_destroySubscriptionAction(subscriptionId);
} else if (success is DestroySubscriptionSuccess) { } else if (success is DestroySubscriptionSuccess) {
performInvokeLogoutAction(); await clearDataAndGoToLoginPage();
} }
} }
@@ -275,7 +279,7 @@ abstract class BaseController extends GetxController
bool get isAuthenticatedWithOidc => authenticationType == AuthenticationType.oidc; bool get isAuthenticatedWithOidc => authenticationType == AuthenticationType.oidc;
bool _isFcmActivated(Session session, AccountId accountId) => bool _isFcmActivated(Session session, AccountId accountId) =>
[FirebaseCapability.fcmIdentifier].isSupported(session, accountId) && AppConfig.fcmAvailable; FirebaseCapability.fcmIdentifier.isSupported(session, accountId) && AppConfig.fcmAvailable;
void goToLogin({LoginArguments? arguments}) { void goToLogin({LoginArguments? arguments}) {
if (Get.currentRoute != AppRoutes.login) { if (Get.currentRoute != AppRoutes.login) {
@@ -283,10 +287,9 @@ abstract class BaseController extends GetxController
} }
} }
void logout(Session? session, AccountId? accountId) { void logout(Session? session, AccountId? accountId) async {
if (session == null || accountId == null) { if (session == null || accountId == null) {
logError('BaseController::logout(): Session is $session OR AccountId is $accountId'); await clearDataAndGoToLoginPage();
performInvokeLogoutAction();
return; return;
} }
_isFcmEnabled = _isFcmActivated(session, accountId); _isFcmEnabled = _isFcmActivated(session, accountId);
@@ -296,71 +299,74 @@ abstract class BaseController extends GetxController
if (_isFcmEnabled) { if (_isFcmEnabled) {
_getSubscriptionLocalAction(); _getSubscriptionLocalAction();
} else { } else {
_logoutAction(); await clearDataAndGoToLoginPage();
} }
} }
} }
void _destroySubscriptionAction(String subscriptionId) { void _destroySubscriptionAction(String subscriptionId) async {
try { _destroySubscriptionInteractor = getBinding<DestroySubscriptionInteractor>();
_destroySubscriptionInteractor = Get.find<DestroySubscriptionInteractor>(); if (_destroySubscriptionInteractor != null) {
consumeState(_destroySubscriptionInteractor!.execute(subscriptionId)); consumeState(_destroySubscriptionInteractor!.execute(subscriptionId));
} catch(e) {
logError('BaseController::destroySubscriptionAction(): exception: $e');
performInvokeLogoutAction();
}
}
void _getSubscriptionLocalAction() {
try {
_getSubscriptionLocalInteractor = Get.find<GetFCMSubscriptionLocalInteractor>();
consumeState(_getSubscriptionLocalInteractor!.execute());
} catch (e) {
logError('BaseController::getSubscriptionLocalAction(): exception: $e');
performInvokeLogoutAction();
}
}
void performInvokeLogoutAction() {
log('BaseController::performInvokeLogoutAction():');
if (isAuthenticatedWithOidc) {
_logoutOIDCAction();
} else { } else {
_logoutAction(); await clearDataAndGoToLoginPage();
} }
} }
void _logoutAction() async { void _getSubscriptionLocalAction() async {
log('BaseController::_logoutAction():'); _getSubscriptionLocalInteractor = getBinding<GetFCMSubscriptionLocalInteractor>();
if (_getSubscriptionLocalInteractor != null) {
consumeState(_getSubscriptionLocalInteractor!.execute());
} else {
await clearDataAndGoToLoginPage();
}
}
Future<void> clearDataAndGoToLoginPage() async {
log('BaseController::clearDataAndGoToLoginPage:');
await clearAllData();
goToLogin(arguments: LoginArguments(
isAuthenticatedWithOidc
? LoginFormType.ssoForm
: LoginFormType.credentialForm
));
}
Future<void> clearAllData() async {
if (isAuthenticatedWithOidc) {
await _clearOidcAuthData();
} else {
await _clearBasicAuthData();
}
}
Future<void> _clearBasicAuthData() async {
await Future.wait([ await Future.wait([
deleteCredentialInteractor.execute(), deleteCredentialInteractor.execute(),
cachingManager.clearAll(), cachingManager.clearAll(),
languageCacheManager.removeLanguage(), languageCacheManager.removeLanguage(),
]); ]);
cachingManager.clearAllFileInStorage(); await cachingManager.clearAllFileInStorage();
authorizationInterceptors.clear(); authorizationInterceptors.clear();
authorizationIsolateInterceptors.clear(); authorizationIsolateInterceptors.clear();
if (_isFcmEnabled) { if (_isFcmEnabled) {
_fcmReceiver.deleteFcmToken(); _fcmReceiver.deleteFcmToken();
} }
await cachingManager.closeHive(); await cachingManager.closeHive();
goToLogin(arguments: LoginArguments(LoginFormType.credentialForm));
} }
void _logoutOIDCAction() async { Future<void> _clearOidcAuthData() async {
log('BaseController::_logoutOIDCAction():');
await Future.wait([ await Future.wait([
deleteAuthorityOidcInteractor.execute(), deleteAuthorityOidcInteractor.execute(),
cachingManager.clearAll(), cachingManager.clearAll(),
languageCacheManager.removeLanguage(), languageCacheManager.removeLanguage(),
]); ]);
cachingManager.clearAllFileInStorage(); await cachingManager.clearAllFileInStorage();
authorizationIsolateInterceptors.clear(); authorizationIsolateInterceptors.clear();
authorizationInterceptors.clear(); authorizationInterceptors.clear();
if (_isFcmEnabled) { if (_isFcmEnabled) {
_fcmReceiver.deleteFcmToken(); _fcmReceiver.deleteFcmToken();
} }
await cachingManager.closeHive(); await cachingManager.closeHive();
goToLogin(arguments: LoginArguments(LoginFormType.ssoForm));
} }
} }
@@ -86,7 +86,6 @@ import 'package:tmail_ui_user/features/upload/domain/usecases/local_file_picker_
import 'package:tmail_ui_user/features/upload/presentation/controller/upload_controller.dart'; import 'package:tmail_ui_user/features/upload/presentation/controller/upload_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/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:uuid/uuid.dart';
import 'package:universal_html/html.dart' as html; import 'package:universal_html/html.dart' as html;
class ComposerController extends BaseController { class ComposerController extends BaseController {
@@ -94,10 +93,6 @@ class ComposerController extends BaseController {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>(); final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final richTextMobileTabletController = Get.find<RichTextMobileTabletController>(); final richTextMobileTabletController = Get.find<RichTextMobileTabletController>();
final networkConnectionController = Get.find<NetworkConnectionController>(); final networkConnectionController = Get.find<NetworkConnectionController>();
final _appToast = Get.find<AppToast>();
final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _uuid = Get.find<Uuid>();
final _dynamicUrlInterceptors = Get.find<DynamicUrlInterceptors>(); final _dynamicUrlInterceptors = Get.find<DynamicUrlInterceptors>();
final expandModeAttachments = ExpandMode.EXPAND.obs; final expandModeAttachments = ExpandMode.EXPAND.obs;
@@ -726,7 +721,7 @@ class ComposerController extends BaseController {
final inReplyTo = _generateInReplyTo(arguments); final inReplyTo = _generateInReplyTo(arguments);
final references = _generateReferences(arguments); final references = _generateReferences(arguments);
final generatePartId = PartId(_uuid.v1()); final generatePartId = PartId(uuid.v1());
return Email( return Email(
mailboxIds: mailboxIds.isNotEmpty ? mailboxIds : null, mailboxIds: mailboxIds.isNotEmpty ? mailboxIds : null,
@@ -828,7 +823,7 @@ class ComposerController extends BaseController {
AppLocalizations.of(context).add_recipients, AppLocalizations.of(context).add_recipients,
onConfirmAction: () => {isSendEmailLoading.value = false}, onConfirmAction: () => {isSendEmailLoading.value = false},
title: AppLocalizations.of(context).sending_failed, title: AppLocalizations.of(context).sending_failed,
icon: SvgPicture.asset(_imagePaths.icSendToastError, fit: BoxFit.fill), icon: SvgPicture.asset(imagePaths.icSendToastError, fit: BoxFit.fill),
hasCancelButton: false); hasCancelButton: false);
return; return;
} }
@@ -848,7 +843,7 @@ class ComposerController extends BaseController {
isSendEmailLoading.value = false; isSendEmailLoading.value = false;
}, },
title: AppLocalizations.of(context).sending_failed, title: AppLocalizations.of(context).sending_failed,
icon: SvgPicture.asset(_imagePaths.icSendToastError, fit: BoxFit.fill), icon: SvgPicture.asset(imagePaths.icSendToastError, fit: BoxFit.fill),
hasCancelButton: false); hasCancelButton: false);
return; return;
} }
@@ -860,7 +855,7 @@ class ComposerController extends BaseController {
onConfirmAction: () => _handleSendMessages(context), onConfirmAction: () => _handleSendMessages(context),
onCancelAction: () => {isSendEmailLoading.value = false}, onCancelAction: () => {isSendEmailLoading.value = false},
title: AppLocalizations.of(context).empty_subject, title: AppLocalizations.of(context).empty_subject,
icon: SvgPicture.asset(_imagePaths.icEmpty, fit: BoxFit.fill), icon: SvgPicture.asset(imagePaths.icEmpty, fit: BoxFit.fill),
); );
return; return;
} }
@@ -872,7 +867,7 @@ class ComposerController extends BaseController {
AppLocalizations.of(context).got_it, AppLocalizations.of(context).got_it,
onConfirmAction: () => {isSendEmailLoading.value = false}, onConfirmAction: () => {isSendEmailLoading.value = false},
title: AppLocalizations.of(context).sending_failed, title: AppLocalizations.of(context).sending_failed,
icon: SvgPicture.asset(_imagePaths.icSendToastError, fit: BoxFit.fill), icon: SvgPicture.asset(imagePaths.icSendToastError, fit: BoxFit.fill),
hasCancelButton: false); hasCancelButton: false);
return; return;
} }
@@ -885,7 +880,7 @@ class ComposerController extends BaseController {
AppLocalizations.of(context).got_it, AppLocalizations.of(context).got_it,
onConfirmAction: () => {isSendEmailLoading.value = false}, onConfirmAction: () => {isSendEmailLoading.value = false},
title: AppLocalizations.of(context).sending_failed, title: AppLocalizations.of(context).sending_failed,
icon: SvgPicture.asset(_imagePaths.icSendToastError, fit: BoxFit.fill), icon: SvgPicture.asset(imagePaths.icSendToastError, fit: BoxFit.fill),
hasCancelButton: false); hasCancelButton: false);
return; return;
} }
@@ -957,7 +952,7 @@ class ComposerController extends BaseController {
final mailboxRequest = mailboxDashBoardController.outboxMailbox?.id == null final mailboxRequest = mailboxDashBoardController.outboxMailbox?.id == null
? CreateNewMailboxRequest( ? CreateNewMailboxRequest(
Id(_uuid.v1()), Id(uuid.v1()),
MailboxName(PresentationMailbox.outboxRole.inCaps) MailboxName(PresentationMailbox.outboxRole.inCaps)
) )
: null; : null;
@@ -985,7 +980,7 @@ class ComposerController extends BaseController {
}, },
onCancelAction: _closeComposerAction, onCancelAction: _closeComposerAction,
title: AppLocalizations.of(context).youAreInOfflineMode, title: AppLocalizations.of(context).youAreInOfflineMode,
icon: SvgPicture.asset(_imagePaths.icDialogOfflineMode), icon: SvgPicture.asset(imagePaths.icDialogOfflineMode),
alignCenter: true, alignCenter: true,
messageStyle: const TextStyle( messageStyle: const TextStyle(
color: AppColor.colorTitleSendingItem, color: AppColor.colorTitleSendingItem,
@@ -1124,7 +1119,7 @@ class ComposerController extends BaseController {
void _pickFileFailure(Failure failure) { void _pickFileFailure(Failure failure) {
if (failure is LocalFilePickerFailure) { if (failure is LocalFilePickerFailure) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).can_not_upload_this_file_as_attachments); AppLocalizations.of(currentContext!).can_not_upload_this_file_as_attachments);
} }
@@ -1765,7 +1760,7 @@ class ComposerController extends BaseController {
void insertImage(BuildContext context, double maxWith) async { void insertImage(BuildContext context, double maxWith) async {
clearFocusEditor(context); clearFocusEditor(context);
if (_responsiveUtils.isMobile(context)) { if (responsiveUtils.isMobile(context)) {
maxWithEditor = maxWith - 40; maxWithEditor = maxWith - 40;
} else { } else {
maxWithEditor = maxWith - 120; maxWithEditor = maxWith - 120;
@@ -1779,7 +1774,7 @@ class ComposerController extends BaseController {
} }
} else { } else {
if (context.mounted) { if (context.mounted) {
_appToast.showToastErrorMessage(context, AppLocalizations.of(context).cannotSelectThisImage); appToast.showToastErrorMessage(context, AppLocalizations.of(context).cannotSelectThisImage);
} }
} }
} }
@@ -1912,7 +1907,7 @@ class ComposerController extends BaseController {
BuildContext context, BuildContext context,
) { ) {
scrollController.jumpTo( scrollController.jumpTo(
realCoordinateY - (_responsiveUtils.isLandscapeMobile(context) ? 0 : headerEditorMobileHeight / 2), realCoordinateY - (responsiveUtils.isLandscapeMobile(context) ? 0 : headerEditorMobileHeight / 2),
); );
} }
@@ -1978,7 +1973,7 @@ class ComposerController extends BaseController {
) async { ) async {
log('ComposerController::handleImageUploadSuccess:NAME: ${fileUpload.name} | TYPE: ${fileUpload.type} | SIZE: ${fileUpload.size}'); log('ComposerController::handleImageUploadSuccess:NAME: ${fileUpload.name} | TYPE: ${fileUpload.type} | SIZE: ${fileUpload.size}');
if (fileUpload.base64 == null) { if (fileUpload.base64 == null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
context, context,
AppLocalizations.of(context).can_not_upload_this_file_as_attachments AppLocalizations.of(context).can_not_upload_this_file_as_attachments
); );
@@ -1990,7 +1985,7 @@ class ComposerController extends BaseController {
if (fileInfo != null) { if (fileInfo != null) {
_uploadInlineAttachmentsAction(fileInfo); _uploadInlineAttachmentsAction(fileInfo);
} else if (context.mounted) { } else if (context.mounted) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
context, context,
AppLocalizations.of(context).can_not_upload_this_file_as_attachments AppLocalizations.of(context).can_not_upload_this_file_as_attachments
); );
@@ -2000,7 +1995,7 @@ class ComposerController extends BaseController {
if (fileInfo != null) { if (fileInfo != null) {
_addAttachmentFromDragAndDrop(fileInfo: fileInfo); _addAttachmentFromDragAndDrop(fileInfo: fileInfo);
} else if (context.mounted) { } else if (context.mounted) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
context, context,
AppLocalizations.of(context).can_not_upload_this_file_as_attachments AppLocalizations.of(context).can_not_upload_this_file_as_attachments
); );
@@ -2015,7 +2010,7 @@ class ComposerController extends BaseController {
String? base64Str, String? base64Str,
}) { }) {
logError('ComposerController::handleImageUploadFailure:fileUpload: $fileUpload | uploadError: $uploadError'); logError('ComposerController::handleImageUploadFailure:fileUpload: $fileUpload | uploadError: $uploadError');
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
context, context,
'${AppLocalizations.of(context).can_not_upload_this_file_as_attachments}. (${uploadError.name})' '${AppLocalizations.of(context).can_not_upload_this_file_as_attachments}. (${uploadError.name})'
); );
@@ -2083,7 +2078,7 @@ class ComposerController extends BaseController {
var contentHtml = ''; var contentHtml = '';
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
if (_responsiveUtils.isDesktop(context) && if (responsiveUtils.isDesktop(context) &&
screenDisplayMode.value == ScreenDisplayMode.minimize) { screenDisplayMode.value == ScreenDisplayMode.minimize) {
contentHtml = _textEditorWeb ?? ''; contentHtml = _textEditorWeb ?? '';
} else { } else {
@@ -2176,7 +2171,7 @@ class ComposerController extends BaseController {
( (
FromComposerBottomSheetBuilder( FromComposerBottomSheetBuilder(
context, context,
_imagePaths, imagePaths,
listFromIdentities, listFromIdentities,
scrollControllerIdentities, scrollControllerIdentities,
searchIdentitiesInputController searchIdentitiesInputController
@@ -1,5 +1,3 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/context_menu/simple_context_menu_action_builder.dart'; import 'package:core/presentation/views/context_menu/simple_context_menu_action_builder.dart';
import 'package:core/presentation/views/responsive/responsive_widget.dart'; import 'package:core/presentation/views/responsive/responsive_widget.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
@@ -31,15 +29,12 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class ComposerView extends GetWidget<ComposerController> { class ComposerView extends GetWidget<ComposerController> {
final _responsiveUtils = Get.find<ResponsiveUtils>(); const ComposerView({Key? key}) : super(key: key);
final _imagePaths = Get.find<ImagePaths>();
ComposerView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ResponsiveWidget( return ResponsiveWidget(
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
mobile: MobileContainerView( mobile: MobileContainerView(
keyboardRichTextController: controller.keyboardRichTextController, keyboardRichTextController: controller.keyboardRichTextController,
onCloseViewAction: () => controller.saveToDraftAndClose(context, canPop: false), onCloseViewAction: () => controller.saveToDraftAndClose(context, canPop: false),
@@ -55,13 +50,13 @@ class ComposerView extends GetWidget<ComposerController> {
: null, : null,
backgroundColor: MobileAppBarComposerWidgetStyle.backgroundColor, backgroundColor: MobileAppBarComposerWidgetStyle.backgroundColor,
childBuilder: (context) => SafeArea( childBuilder: (context) => SafeArea(
left: !_responsiveUtils.isLandscapeMobile(context), left: !controller.responsiveUtils.isLandscapeMobile(context),
right: !_responsiveUtils.isLandscapeMobile(context), right: !controller.responsiveUtils.isLandscapeMobile(context),
child: Container( child: Container(
color: ComposerStyle.mobileBackgroundColor, color: ComposerStyle.mobileBackgroundColor,
child: Column( child: Column(
children: [ children: [
if (_responsiveUtils.isLandscapeMobile(context)) if (controller.responsiveUtils.isLandscapeMobile(context))
Obx(() => LandscapeAppBarComposerWidget( Obx(() => LandscapeAppBarComposerWidget(
isSendButtonEnabled: controller.isEnableEmailSendButton.value, isSendButtonEnabled: controller.isEnableEmailSendButton.value,
onCloseViewAction: () => controller.saveToDraftAndClose(context), onCloseViewAction: () => controller.saveToDraftAndClose(context),
@@ -103,8 +98,8 @@ class ComposerView extends GetWidget<ComposerController> {
if (controller.fromRecipientState.value == PrefixRecipientState.enabled) if (controller.fromRecipientState.value == PrefixRecipientState.enabled)
FromComposerMobileWidget( FromComposerMobileWidget(
selectedIdentity: controller.identitySelected.value, selectedIdentity: controller.identitySelected.value,
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
margin: ComposerStyle.mobileRecipientMargin, margin: ComposerStyle.mobileRecipientMargin,
padding: ComposerStyle.mobileRecipientPadding, padding: ComposerStyle.mobileRecipientPadding,
onTap: () => controller.openSelectIdentityBottomSheet(context) onTap: () => controller.openSelectIdentityBottomSheet(context)
@@ -252,7 +247,7 @@ class ComposerView extends GetWidget<ComposerController> {
items: controller.listFromIdentities, items: controller.listFromIdentities,
itemSelected: controller.identitySelected.value, itemSelected: controller.identitySelected.value,
dropdownKey: controller.identityDropdownKey, dropdownKey: controller.identityDropdownKey,
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
padding: ComposerStyle.mobileRecipientPadding, padding: ComposerStyle.mobileRecipientPadding,
margin: ComposerStyle.mobileRecipientMargin, margin: ComposerStyle.mobileRecipientMargin,
onChangeIdentity: controller.onChangeIdentity, onChangeIdentity: controller.onChangeIdentity,
@@ -390,7 +385,7 @@ class ComposerView extends GetWidget<ComposerController> {
Widget _pickPhotoAndVideoAction(BuildContext context) { Widget _pickPhotoAndVideoAction(BuildContext context) {
return (SimpleContextMenuActionBuilder( return (SimpleContextMenuActionBuilder(
const Key('pick_photo_and_video_context_menu_action'), const Key('pick_photo_and_video_context_menu_action'),
SvgPicture.asset(_imagePaths.icPhotoLibrary, width: 24, height: 24, fit: BoxFit.fill), SvgPicture.asset(controller.imagePaths.icPhotoLibrary, width: 24, height: 24, fit: BoxFit.fill),
AppLocalizations.of(context).photos_and_videos) AppLocalizations.of(context).photos_and_videos)
..onActionClick((_) => controller.openFilePickerByType(context, FileType.media))) ..onActionClick((_) => controller.openFilePickerByType(context, FileType.media)))
.build(); .build();
@@ -399,7 +394,7 @@ class ComposerView extends GetWidget<ComposerController> {
Widget _browseFileAction(BuildContext context) { Widget _browseFileAction(BuildContext context) {
return (SimpleContextMenuActionBuilder( return (SimpleContextMenuActionBuilder(
const Key('browse_file_context_menu_action'), const Key('browse_file_context_menu_action'),
SvgPicture.asset(_imagePaths.icMore, width: 24, height: 24, fit: BoxFit.fill), SvgPicture.asset(controller.imagePaths.icMore, width: 24, height: 24, fit: BoxFit.fill),
AppLocalizations.of(context).browse) AppLocalizations.of(context).browse)
..onActionClick((_) => controller.openFilePickerByType(context, FileType.any))) ..onActionClick((_) => controller.openFilePickerByType(context, FileType.any)))
.build(); .build();
@@ -410,11 +405,11 @@ class ComposerView extends GetWidget<ComposerController> {
PopupMenuItem( PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemWidget( child: PopupItemWidget(
_imagePaths.icReadReceipt, controller.imagePaths.icReadReceipt,
AppLocalizations.of(context).requestReadReceipt, AppLocalizations.of(context).requestReadReceipt,
styleName: ComposerStyle.popupItemTextStyle, styleName: ComposerStyle.popupItemTextStyle,
padding: ComposerStyle.popupItemPadding, padding: ComposerStyle.popupItemPadding,
selectedIcon: _imagePaths.icFilterSelected, selectedIcon: controller.imagePaths.icFilterSelected,
isSelected: controller.hasRequestReadReceipt.value, isSelected: controller.hasRequestReadReceipt.value,
onCallbackAction: () { onCallbackAction: () {
popBack(); popBack();
@@ -430,12 +425,12 @@ class ComposerView extends GetWidget<ComposerController> {
PopupMenuItem( PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemWidget( child: PopupItemWidget(
_imagePaths.icReadReceipt, controller.imagePaths.icReadReceipt,
AppLocalizations.of(context).requestReadReceipt, AppLocalizations.of(context).requestReadReceipt,
styleName: ComposerStyle.popupItemTextStyle, styleName: ComposerStyle.popupItemTextStyle,
padding: ComposerStyle.popupItemPadding, padding: ComposerStyle.popupItemPadding,
colorIcon: ComposerStyle.popupItemIconColor, colorIcon: ComposerStyle.popupItemIconColor,
selectedIcon: _imagePaths.icFilterSelected, selectedIcon: controller.imagePaths.icFilterSelected,
isSelected: controller.hasRequestReadReceipt.value, isSelected: controller.hasRequestReadReceipt.value,
onCallbackAction: () { onCallbackAction: () {
popBack(); popBack();
@@ -446,7 +441,7 @@ class ComposerView extends GetWidget<ComposerController> {
PopupMenuItem( PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemWidget( child: PopupItemWidget(
_imagePaths.icSaveToDraft, controller.imagePaths.icSaveToDraft,
AppLocalizations.of(context).saveAsDraft, AppLocalizations.of(context).saveAsDraft,
colorIcon: ComposerStyle.popupItemIconColor, colorIcon: ComposerStyle.popupItemIconColor,
styleName: ComposerStyle.popupItemTextStyle, styleName: ComposerStyle.popupItemTextStyle,
@@ -460,7 +455,7 @@ class ComposerView extends GetWidget<ComposerController> {
PopupMenuItem( PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemWidget( child: PopupItemWidget(
_imagePaths.icDeleteMailbox, controller.imagePaths.icDeleteMailbox,
AppLocalizations.of(context).delete, AppLocalizations.of(context).delete,
styleName: ComposerStyle.popupItemTextStyle, styleName: ComposerStyle.popupItemTextStyle,
padding: ComposerStyle.popupItemPadding, padding: ComposerStyle.popupItemPadding,
@@ -1,5 +1,3 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/responsive/responsive_widget.dart'; import 'package:core/presentation/views/responsive/responsive_widget.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -30,15 +28,12 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class ComposerView extends GetWidget<ComposerController> { class ComposerView extends GetWidget<ComposerController> {
final _responsiveUtils = Get.find<ResponsiveUtils>(); const ComposerView({Key? key}) : super(key: key);
final _imagePaths = Get.find<ImagePaths>();
ComposerView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ResponsiveWidget( return ResponsiveWidget(
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
mobile: MobileResponsiveContainerView( mobile: MobileResponsiveContainerView(
childBuilder: (context, constraints) { childBuilder: (context, constraints) {
return Column( return Column(
@@ -67,7 +62,7 @@ class ComposerView extends GetWidget<ComposerController> {
maxHeight: ComposerStyle.getMaxHeightEmailAddressWidget( maxHeight: ComposerStyle.getMaxHeightEmailAddressWidget(
context, context,
constraints, constraints,
_responsiveUtils controller.responsiveUtils
) )
), ),
child: SingleChildScrollView( child: SingleChildScrollView(
@@ -79,8 +74,8 @@ class ComposerView extends GetWidget<ComposerController> {
message: controller.identitySelected.value?.email ?? '', message: controller.identitySelected.value?.email ?? '',
child: FromComposerMobileWidget( child: FromComposerMobileWidget(
selectedIdentity: controller.identitySelected.value, selectedIdentity: controller.identitySelected.value,
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
margin: ComposerStyle.mobileRecipientMargin, margin: ComposerStyle.mobileRecipientMargin,
padding: ComposerStyle.mobileRecipientPadding, padding: ComposerStyle.mobileRecipientPadding,
onTap: () => controller.openSelectIdentityBottomSheet(context) onTap: () => controller.openSelectIdentityBottomSheet(context)
@@ -247,7 +242,7 @@ class ComposerView extends GetWidget<ComposerController> {
maxHeight: ComposerStyle.getMaxHeightEmailAddressWidget( maxHeight: ComposerStyle.getMaxHeightEmailAddressWidget(
context, context,
constraints, constraints,
_responsiveUtils controller.responsiveUtils
) )
), ),
child: SingleChildScrollView( child: SingleChildScrollView(
@@ -259,7 +254,7 @@ class ComposerView extends GetWidget<ComposerController> {
items: controller.listFromIdentities, items: controller.listFromIdentities,
itemSelected: controller.identitySelected.value, itemSelected: controller.identitySelected.value,
dropdownKey: controller.identityDropdownKey, dropdownKey: controller.identityDropdownKey,
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
padding: ComposerStyle.desktopRecipientPadding, padding: ComposerStyle.desktopRecipientPadding,
margin: ComposerStyle.desktopRecipientMargin, margin: ComposerStyle.desktopRecipientMargin,
onChangeIdentity: controller.onChangeIdentity, onChangeIdentity: controller.onChangeIdentity,
@@ -477,7 +472,7 @@ class ComposerView extends GetWidget<ComposerController> {
maxHeight: ComposerStyle.getMaxHeightEmailAddressWidget( maxHeight: ComposerStyle.getMaxHeightEmailAddressWidget(
context, context,
constraints, constraints,
_responsiveUtils controller.responsiveUtils
) )
), ),
child: SingleChildScrollView( child: SingleChildScrollView(
@@ -489,7 +484,7 @@ class ComposerView extends GetWidget<ComposerController> {
items: controller.listFromIdentities, items: controller.listFromIdentities,
itemSelected: controller.identitySelected.value, itemSelected: controller.identitySelected.value,
dropdownKey: controller.identityDropdownKey, dropdownKey: controller.identityDropdownKey,
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
padding: ComposerStyle.tabletRecipientPadding, padding: ComposerStyle.tabletRecipientPadding,
margin: ComposerStyle.tabletRecipientMargin, margin: ComposerStyle.tabletRecipientMargin,
onChangeIdentity: controller.onChangeIdentity, onChangeIdentity: controller.onChangeIdentity,
@@ -683,11 +678,11 @@ class ComposerView extends GetWidget<ComposerController> {
PopupMenuItem( PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemWidget( child: PopupItemWidget(
_imagePaths.icReadReceipt, controller.imagePaths.icReadReceipt,
AppLocalizations.of(context).requestReadReceipt, AppLocalizations.of(context).requestReadReceipt,
styleName: ComposerStyle.popupItemTextStyle, styleName: ComposerStyle.popupItemTextStyle,
padding: ComposerStyle.popupItemPadding, padding: ComposerStyle.popupItemPadding,
selectedIcon: _imagePaths.icFilterSelected, selectedIcon: controller.imagePaths.icFilterSelected,
isSelected: controller.hasRequestReadReceipt.value, isSelected: controller.hasRequestReadReceipt.value,
onCallbackAction: () { onCallbackAction: () {
popBack(); popBack();
@@ -703,12 +698,12 @@ class ComposerView extends GetWidget<ComposerController> {
PopupMenuItem( PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemWidget( child: PopupItemWidget(
_imagePaths.icStyleCodeView, controller.imagePaths.icStyleCodeView,
AppLocalizations.of(context).embedCode, AppLocalizations.of(context).embedCode,
styleName: ComposerStyle.popupItemTextStyle, styleName: ComposerStyle.popupItemTextStyle,
colorIcon: ComposerStyle.popupItemIconColor, colorIcon: ComposerStyle.popupItemIconColor,
padding: ComposerStyle.popupItemPadding, padding: ComposerStyle.popupItemPadding,
selectedIcon: _imagePaths.icFilterSelected, selectedIcon: controller.imagePaths.icFilterSelected,
isSelected: controller.richTextWebController.codeViewEnabled, isSelected: controller.richTextWebController.codeViewEnabled,
onCallbackAction: () { onCallbackAction: () {
popBack(); popBack();
@@ -719,12 +714,12 @@ class ComposerView extends GetWidget<ComposerController> {
PopupMenuItem( PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemWidget( child: PopupItemWidget(
_imagePaths.icReadReceipt, controller.imagePaths.icReadReceipt,
AppLocalizations.of(context).requestReadReceipt, AppLocalizations.of(context).requestReadReceipt,
styleName: ComposerStyle.popupItemTextStyle, styleName: ComposerStyle.popupItemTextStyle,
padding: ComposerStyle.popupItemPadding, padding: ComposerStyle.popupItemPadding,
colorIcon: ComposerStyle.popupItemIconColor, colorIcon: ComposerStyle.popupItemIconColor,
selectedIcon: _imagePaths.icFilterSelected, selectedIcon: controller.imagePaths.icFilterSelected,
isSelected: controller.hasRequestReadReceipt.value, isSelected: controller.hasRequestReadReceipt.value,
onCallbackAction: () { onCallbackAction: () {
popBack(); popBack();
@@ -735,7 +730,7 @@ class ComposerView extends GetWidget<ComposerController> {
PopupMenuItem( PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemWidget( child: PopupItemWidget(
_imagePaths.icSaveToDraft, controller.imagePaths.icSaveToDraft,
AppLocalizations.of(context).saveAsDraft, AppLocalizations.of(context).saveAsDraft,
colorIcon: ComposerStyle.popupItemIconColor, colorIcon: ComposerStyle.popupItemIconColor,
styleName: ComposerStyle.popupItemTextStyle, styleName: ComposerStyle.popupItemTextStyle,
@@ -749,7 +744,7 @@ class ComposerView extends GetWidget<ComposerController> {
PopupMenuItem( PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemWidget( child: PopupItemWidget(
_imagePaths.icDeleteMailbox, controller.imagePaths.icDeleteMailbox,
AppLocalizations.of(context).delete, AppLocalizations.of(context).delete,
styleName: ComposerStyle.popupItemTextStyle, styleName: ComposerStyle.popupItemTextStyle,
padding: ComposerStyle.popupItemPadding, padding: ComposerStyle.popupItemPadding,
@@ -1,7 +1,5 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.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:get/get.dart'; import 'package:get/get.dart';
@@ -16,10 +14,7 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class ContactView extends GetWidget<ContactController> { class ContactView extends GetWidget<ContactController> {
final _responsiveUtils = Get.find<ResponsiveUtils>(); const ContactView({super.key});
final _imagePaths = Get.find<ImagePaths>();
ContactView({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -31,38 +26,38 @@ class ContactView extends GetWidget<ContactController> {
bottom: false, bottom: false,
left: false, left: false,
right: false, right: false,
top: ContactUtils.supportAppBarTopBorder(context, _responsiveUtils), top: ContactUtils.supportAppBarTopBorder(context, controller.responsiveUtils),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
topLeft: Radius.circular(ContactUtils.getRadiusBorderAppBarTop( topLeft: Radius.circular(ContactUtils.getRadiusBorderAppBarTop(
context, context,
_responsiveUtils)), controller.responsiveUtils)),
topRight: Radius.circular(ContactUtils.getRadiusBorderAppBarTop( topRight: Radius.circular(ContactUtils.getRadiusBorderAppBarTop(
context, context,
_responsiveUtils))), controller.responsiveUtils))),
color: Colors.white), color: Colors.white),
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
topLeft: Radius.circular(ContactUtils.getRadiusBorderAppBarTop( topLeft: Radius.circular(ContactUtils.getRadiusBorderAppBarTop(
context, context,
_responsiveUtils)), controller.responsiveUtils)),
topRight: Radius.circular(ContactUtils.getRadiusBorderAppBarTop( topRight: Radius.circular(ContactUtils.getRadiusBorderAppBarTop(
context, context,
_responsiveUtils))), controller.responsiveUtils))),
child: SafeArea(child: Container( child: SafeArea(child: Container(
color: Colors.white, color: Colors.white,
child: Column(children: [ child: Column(children: [
Container( Container(
height: 52, height: 52,
color: Colors.white, color: Colors.white,
padding: ContactUtils.getPaddingAppBar(context, _responsiveUtils), padding: ContactUtils.getPaddingAppBar(context, controller.responsiveUtils),
child: AppBarContactWidget( child: AppBarContactWidget(
onCloseContactView: () => controller.closeContactView(context)) onCloseContactView: () => controller.closeContactView(context))
), ),
const Divider(color: AppColor.colorDividerComposer, height: 1), const Divider(color: AppColor.colorDividerComposer, height: 1),
SearchAppBarWidget( SearchAppBarWidget(
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
searchQuery: controller.searchQuery.value, searchQuery: controller.searchQuery.value,
searchFocusNode: controller.textInputSearchFocus, searchFocusNode: controller.textInputSearchFocus,
searchInputController: controller.textInputSearchController, searchInputController: controller.textInputSearchController,
@@ -70,12 +65,12 @@ class ContactView extends GetWidget<ContactController> {
hasSearchButton: true, hasSearchButton: true,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
heightSearchBar: 44, heightSearchBar: 44,
margin: ContactUtils.getPaddingSearchInputForm(context, _responsiveUtils), margin: ContactUtils.getPaddingSearchInputForm(context, controller.responsiveUtils),
decoration: const BoxDecoration( decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(10)), borderRadius: BorderRadius.all(Radius.circular(10)),
color: AppColor.colorBgSearchBar), color: AppColor.colorBgSearchBar),
iconClearText: SvgPicture.asset( iconClearText: SvgPicture.asset(
_imagePaths.icClearTextSearch, controller.imagePaths.icClearTextSearch,
width: 18, width: 18,
height: 18, height: 18,
fit: BoxFit.fill), fit: BoxFit.fill),
@@ -92,7 +87,7 @@ class ContactView extends GetWidget<ContactController> {
itemCount: controller.listContactSearched.length, itemCount: controller.listContactSearched.length,
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return Padding( return Padding(
padding: ContactUtils.getPaddingDividerSearchResultList(context, _responsiveUtils), padding: ContactUtils.getPaddingDividerSearchResultList(context, controller.responsiveUtils),
child: const Divider( child: const Divider(
height: 1, height: 1,
color: AppColor.colorDivider), color: AppColor.colorDivider),
@@ -108,7 +103,7 @@ class ContactView extends GetWidget<ContactController> {
); );
return ContactSuggestionBoxItem( return ContactSuggestionBoxItem(
suggestionEmailAddress, suggestionEmailAddress,
padding: ContactUtils.getPaddingSearchResultList(context, _responsiveUtils), padding: ContactUtils.getPaddingSearchResultList(context, controller.responsiveUtils),
selectedContactCallbackAction: (contact) => controller.selectContact(context, contact), selectedContactCallbackAction: (contact) => controller.selectContact(context, contact),
); );
} }
@@ -1,7 +1,6 @@
import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/presentation/utils/keyboard_utils.dart'; import 'package:core/presentation/utils/keyboard_utils.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -40,13 +39,9 @@ import 'package:tmail_ui_user/features/thread/presentation/model/search_state.da
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/search_status.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/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:uuid/uuid.dart';
class DestinationPickerController extends BaseMailboxController { class DestinationPickerController extends BaseMailboxController {
final _uuid = Get.find<Uuid>();
final _appToast = Get.find<AppToast>();
final SearchMailboxInteractor _searchMailboxInteractor; final SearchMailboxInteractor _searchMailboxInteractor;
final CreateNewMailboxInteractor _createNewMailboxInteractor; final CreateNewMailboxInteractor _createNewMailboxInteractor;
@@ -310,7 +305,7 @@ class DestinationPickerController extends BaseMailboxController {
void openCreateNewMailboxView(BuildContext context) async { void openCreateNewMailboxView(BuildContext context) async {
if (mailboxDestination.value == null) { if (mailboxDestination.value == null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(context).toastMessageErrorNotSelectedFolderWhenCreateNewMailbox); AppLocalizations.of(context).toastMessageErrorNotSelectedFolderWhenCreateNewMailbox);
} else { } else {
@@ -346,7 +341,7 @@ class DestinationPickerController extends BaseMailboxController {
if (exception is ErrorMethodResponse) { if (exception is ErrorMethodResponse) {
messageError = exception.description ?? AppLocalizations.of(currentContext!).createNewFolderFailure; messageError = exception.description ?? AppLocalizations.of(currentContext!).createNewFolderFailure;
} }
_appToast.showToastErrorMessage(currentOverlayContext!, messageError); appToast.showToastErrorMessage(currentOverlayContext!, messageError);
} }
} }
@@ -379,7 +374,7 @@ class DestinationPickerController extends BaseMailboxController {
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
if (mailboxDestination.value == null) { if (mailboxDestination.value == null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(context).toastMessageErrorNotSelectedFolderWhenCreateNewMailbox); AppLocalizations.of(context).toastMessageErrorNotSelectedFolderWhenCreateNewMailbox);
return; return;
@@ -392,7 +387,7 @@ class DestinationPickerController extends BaseMailboxController {
final nameMailbox = newNameMailbox.value; final nameMailbox = newNameMailbox.value;
if (nameMailbox != null && nameMailbox.isNotEmpty) { if (nameMailbox != null && nameMailbox.isNotEmpty) {
final generateCreateId = Id(_uuid.v1()); final generateCreateId = Id(uuid.v1());
final parentId = mailboxDestination.value == PresentationMailbox.unifiedMailbox final parentId = mailboxDestination.value == PresentationMailbox.unifiedMailbox
? null ? null
: mailboxDestination.value?.id; : mailboxDestination.value?.id;
@@ -1,7 +1,5 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/style_utils.dart'; import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/presentation/views/button/icon_button_web.dart'; import 'package:core/presentation/views/button/icon_button_web.dart';
import 'package:core/presentation/views/list/tree_view.dart'; import 'package:core/presentation/views/list/tree_view.dart';
@@ -38,8 +36,6 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
MailboxWidgetMixin { MailboxWidgetMixin {
final _maxHeight = 656.0; final _maxHeight = 656.0;
final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
@override @override
final controller = Get.find<DestinationPickerController>(); final controller = Get.find<DestinationPickerController>();
@@ -59,7 +55,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
borderOnForeground: false, borderOnForeground: false,
color: Colors.transparent, color: Colors.transparent,
child: SafeArea( child: SafeArea(
top: PlatformInfo.isMobile && _responsiveUtils.isPortraitMobile(context), top: PlatformInfo.isMobile && controller.responsiveUtils.isPortraitMobile(context),
bottom: false, bottom: false,
left: false, left: false,
right: false, right: false,
@@ -90,8 +86,8 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
child: SafeArea( child: SafeArea(
top: false, top: false,
bottom: false, bottom: false,
left: PlatformInfo.isMobile && _responsiveUtils.isLandscapeMobile(context), left: PlatformInfo.isMobile && controller.responsiveUtils.isLandscapeMobile(context),
right: PlatformInfo.isMobile && _responsiveUtils.isLandscapeMobile(context), right: PlatformInfo.isMobile && controller.responsiveUtils.isLandscapeMobile(context),
child: Column(children: [ child: Column(children: [
Obx(() => TopBarDestinationPickerBuilder( Obx(() => TopBarDestinationPickerBuilder(
controller.mailboxAction.value, controller.mailboxAction.value,
@@ -201,7 +197,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
if (actions?.canSearch() == true && if (actions?.canSearch() == true &&
controller.destinationScreenType.value == DestinationScreenType.destinationPicker) controller.destinationScreenType.value == DestinationScreenType.destinationPicker)
SearchBarView( SearchBarView(
_imagePaths, controller.imagePaths,
margin: const EdgeInsets.all(16), margin: const EdgeInsets.all(16),
hintTextSearch: AppLocalizations.of(context).hintSearchFolders, hintTextSearch: AppLocalizations.of(context).hintSearchFolders,
onOpenSearchViewAction: controller.enableSearch onOpenSearchViewAction: controller.enableSearch
@@ -294,8 +290,8 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
children: [ children: [
buildHeaderMailboxCategory( buildHeaderMailboxCategory(
context, context,
_responsiveUtils, controller.responsiveUtils,
_imagePaths, controller.imagePaths,
categories, categories,
controller, controller,
toggleMailboxCategories: controller.toggleMailboxCategories, toggleMailboxCategories: controller.toggleMailboxCategories,
@@ -404,8 +400,8 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
itemBuilder: (context, index) { itemBuilder: (context, index) {
return Obx(() => DestinationPickerSearchMailboxItemBuilder( return Obx(() => DestinationPickerSearchMailboxItemBuilder(
_imagePaths, controller.imagePaths,
_responsiveUtils, controller.responsiveUtils,
controller.listMailboxSearched[index], controller.listMailboxSearched[index],
mailboxActions: actions, mailboxActions: actions,
mailboxIdAlreadySelected: mailboxIdSelected, mailboxIdAlreadySelected: mailboxIdSelected,
@@ -443,7 +439,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
: Colors.transparent, : Colors.transparent,
child: Row(children: [ child: Row(children: [
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icFolderMailbox, controller.imagePaths.icFolderMailbox,
width: PlatformInfo.isWeb ? 20 : 24, width: PlatformInfo.isWeb ? 20 : 24,
height: PlatformInfo.isWeb ? 20 : 24, height: PlatformInfo.isWeb ? 20 : 24,
fit: BoxFit.fill fit: BoxFit.fill
@@ -469,7 +465,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
left: AppUtils.isDirectionRTL(context) ? 30 : 0.0, left: AppUtils.isDirectionRTL(context) ? 30 : 0.0,
), ),
child: SvgPicture.asset( child: SvgPicture.asset(
_imagePaths.icFilterSelected, controller.imagePaths.icFilterSelected,
width: 20, width: 20,
height: 20, height: 20,
fit: BoxFit.fill fit: BoxFit.fill
@@ -528,12 +524,12 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
), ),
child: buildIconWeb( child: buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icBack, controller.imagePaths.icBack,
colorFilter: AppColor.colorTextButton.asFilter(), colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill), fit: BoxFit.fill),
onTap: () => controller.disableSearch(context))), onTap: () => controller.disableSearch(context))),
Expanded(child: SearchAppBarWidget( Expanded(child: SearchAppBarWidget(
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
searchQuery: controller.searchQuery.value, searchQuery: controller.searchQuery.value,
searchFocusNode: controller.searchFocus, searchFocusNode: controller.searchFocus,
searchInputController: controller.searchInputController, searchInputController: controller.searchInputController,
@@ -547,7 +543,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
borderRadius: BorderRadius.all(Radius.circular(12)), borderRadius: BorderRadius.all(Radius.circular(12)),
color: AppColor.colorBgSearchBar), color: AppColor.colorBgSearchBar),
iconClearText: SvgPicture.asset( iconClearText: SvgPicture.asset(
_imagePaths.icClearTextSearch, controller.imagePaths.icClearTextSearch,
width: 18, width: 18,
height: 18, height: 18,
fit: BoxFit.fill), fit: BoxFit.fill),
@@ -562,9 +558,9 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
} }
BorderRadius _getRadiusDestinationPicker(BuildContext context) { BorderRadius _getRadiusDestinationPicker(BuildContext context) {
if (PlatformInfo.isMobile && _responsiveUtils.isLandscapeMobile(context)) { if (PlatformInfo.isMobile && controller.responsiveUtils.isLandscapeMobile(context)) {
return BorderRadius.zero; return BorderRadius.zero;
} else if (_responsiveUtils.isMobile(context)) { } else if (controller.responsiveUtils.isMobile(context)) {
return const BorderRadius.only( return const BorderRadius.only(
topRight: Radius.circular(16), topRight: Radius.circular(16),
topLeft: Radius.circular(16)); topLeft: Radius.circular(16));
@@ -575,14 +571,14 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
double _getWidthDestinationPicker(BuildContext context) { double _getWidthDestinationPicker(BuildContext context) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
if (_responsiveUtils.isMobile(context)) { if (controller.responsiveUtils.isMobile(context)) {
return double.infinity; return double.infinity;
} else { } else {
return 556; return 556;
} }
} else { } else {
if (_responsiveUtils.isLandscapeMobile(context) || if (controller.responsiveUtils.isLandscapeMobile(context) ||
_responsiveUtils.isPortraitMobile(context)) { controller.responsiveUtils.isPortraitMobile(context)) {
return double.infinity; return double.infinity;
} else { } else {
return 556; return 556;
@@ -592,21 +588,21 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
double _getHeightDestinationPicker(BuildContext context) { double _getHeightDestinationPicker(BuildContext context) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
if (_responsiveUtils.isMobile(context)) { if (controller.responsiveUtils.isMobile(context)) {
return double.infinity; return double.infinity;
} else { } else {
if (_responsiveUtils.getSizeScreenHeight(context) > _maxHeight) { if (controller.responsiveUtils.getSizeScreenHeight(context) > _maxHeight) {
return _maxHeight; return _maxHeight;
} else { } else {
return double.infinity; return double.infinity;
} }
} }
} else { } else {
if (_responsiveUtils.isLandscapeMobile(context) || if (controller.responsiveUtils.isLandscapeMobile(context) ||
_responsiveUtils.isPortraitMobile(context)) { controller.responsiveUtils.isPortraitMobile(context)) {
return double.infinity; return double.infinity;
} else { } else {
if (_responsiveUtils.getSizeScreenHeight(context) > _maxHeight) { if (controller.responsiveUtils.getSizeScreenHeight(context) > _maxHeight) {
return _maxHeight; return _maxHeight;
} else { } else {
return double.infinity; return double.infinity;
@@ -618,21 +614,21 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
EdgeInsets _getMarginDestinationPicker(BuildContext context) { EdgeInsets _getMarginDestinationPicker(BuildContext context) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
if (_responsiveUtils.isMobile(context)) { if (controller.responsiveUtils.isMobile(context)) {
return EdgeInsets.zero; return EdgeInsets.zero;
} else { } else {
if (_responsiveUtils.getSizeScreenHeight(context) > _maxHeight) { if (controller.responsiveUtils.getSizeScreenHeight(context) > _maxHeight) {
return const EdgeInsets.symmetric(vertical: 12); return const EdgeInsets.symmetric(vertical: 12);
} else { } else {
return const EdgeInsets.symmetric(vertical: 50); return const EdgeInsets.symmetric(vertical: 50);
} }
} }
} else { } else {
if (_responsiveUtils.isLandscapeMobile(context) || if (controller.responsiveUtils.isLandscapeMobile(context) ||
_responsiveUtils.isPortraitMobile(context)) { controller.responsiveUtils.isPortraitMobile(context)) {
return EdgeInsets.zero; return EdgeInsets.zero;
} else { } else {
if (_responsiveUtils.getSizeScreenHeight(context) > _maxHeight) { if (controller.responsiveUtils.getSizeScreenHeight(context) > _maxHeight) {
return const EdgeInsets.symmetric(vertical: 12); return const EdgeInsets.symmetric(vertical: 12);
} else { } else {
return const EdgeInsets.symmetric(vertical: 50); return const EdgeInsets.symmetric(vertical: 50);
@@ -62,6 +62,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/attachment_lis
import 'package:tmail_ui_user/features/email/presentation/widgets/attachment_list/attachment_list_dialog_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/attachment_list/attachment_list_dialog_builder.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_bottom_sheet_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_bottom_sheet_builder.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_dialog_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_dialog_builder.dart';
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
@@ -74,7 +75,6 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart';
import 'package:tmail_ui_user/features/session/data/exceptions/session_exceptions.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/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/main/error/capability_validator.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart';
@@ -85,18 +85,12 @@ import 'package:tmail_ui_user/main/routes/navigation_router.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/routes/route_utils.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart'; import 'package:tmail_ui_user/main/utils/app_utils.dart';
import 'package:uuid/uuid.dart';
class SingleEmailController extends BaseController with AppLoaderMixin { class SingleEmailController extends BaseController with AppLoaderMixin {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>(); final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final emailSupervisorController = Get.find<EmailSupervisorController>(); final emailSupervisorController = Get.find<EmailSupervisorController>();
final responsiveUtils = Get.find<ResponsiveUtils>();
final imagePaths = Get.find<ImagePaths>();
final _appToast = Get.find<AppToast>();
final _uuid = Get.find<Uuid>();
final _downloadManager = Get.find<DownloadManager>(); final _downloadManager = Get.find<DownloadManager>();
final _dynamicUrlInterceptors = Get.find<DynamicUrlInterceptors>();
final _attachmentListScrollController = ScrollController(); final _attachmentListScrollController = ScrollController();
final GetEmailContentInteractor _getEmailContentInteractor; final GetEmailContentInteractor _getEmailContentInteractor;
@@ -297,7 +291,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
attachment: success.attachment)); attachment: success.attachment));
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).your_download_has_started, AppLocalizations.of(currentContext!).your_download_has_started,
leadingSVGIconColor: AppColor.primaryColor, leadingSVGIconColor: AppColor.primaryColor,
@@ -396,7 +390,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
final session = mailboxDashBoardController.sessionCurrent; final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (session != null && accountId != null) { if (session != null && accountId != null) {
final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl(jmapUrl: _dynamicUrlInterceptors.jmapUrl) ?? ''; final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl(jmapUrl: dynamicUrlInterceptors.jmapUrl) ?? '';
TransformConfiguration transformConfiguration = PlatformInfo.isWeb TransformConfiguration transformConfiguration = PlatformInfo.isWeb
? TransformConfiguration.forPreviewEmailOnWeb() ? TransformConfiguration.forPreviewEmailOnWeb()
: TransformConfiguration.forPreviewEmail(); : TransformConfiguration.forPreviewEmail();
@@ -570,7 +564,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
break; break;
case PermissionStatus.permanentlyDenied: case PermissionStatus.permanentlyDenied:
if (context.mounted && currentOverlayContext != null && currentContext != null) { if (context.mounted && currentOverlayContext != null && currentContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(context).you_need_to_grant_files_permission_to_download_attachments, AppLocalizations.of(context).you_need_to_grant_files_permission_to_download_attachments,
); );
@@ -584,7 +578,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
break; break;
default: default:
if (context.mounted && currentOverlayContext != null && currentContext != null) { if (context.mounted && currentOverlayContext != null && currentContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(context).you_need_to_grant_files_permission_to_download_attachments, AppLocalizations.of(context).you_need_to_grant_files_permission_to_download_attachments,
); );
@@ -601,14 +595,14 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void _downloadAttachmentsAction(List<Attachment> attachments) async { void _downloadAttachmentsAction(List<Attachment> attachments) async {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (accountId != null && mailboxDashBoardController.sessionCurrent != null) { if (accountId != null && mailboxDashBoardController.sessionCurrent != null) {
final baseDownloadUrl = mailboxDashBoardController.sessionCurrent!.getDownloadUrl(jmapUrl: _dynamicUrlInterceptors.jmapUrl); final baseDownloadUrl = mailboxDashBoardController.sessionCurrent!.getDownloadUrl(jmapUrl: dynamicUrlInterceptors.jmapUrl);
consumeState(_downloadAttachmentsInteractor.execute(attachments, accountId, baseDownloadUrl)); consumeState(_downloadAttachmentsInteractor.execute(attachments, accountId, baseDownloadUrl));
} }
} }
void _downloadAttachmentsFailure(DownloadAttachmentsFailure failure) { void _downloadAttachmentsFailure(DownloadAttachmentsFailure failure) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).attachment_download_failed); AppLocalizations.of(currentContext!).attachment_download_failed);
} }
@@ -650,7 +644,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void _exportAttachmentAction(Attachment attachment, CancelToken cancelToken) async { void _exportAttachmentAction(Attachment attachment, CancelToken cancelToken) async {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (accountId != null && mailboxDashBoardController.sessionCurrent != null) { if (accountId != null && mailboxDashBoardController.sessionCurrent != null) {
final baseDownloadUrl = mailboxDashBoardController.sessionCurrent!.getDownloadUrl(jmapUrl: _dynamicUrlInterceptors.jmapUrl); final baseDownloadUrl = mailboxDashBoardController.sessionCurrent!.getDownloadUrl(jmapUrl: dynamicUrlInterceptors.jmapUrl);
consumeState(_exportAttachmentInteractor.execute(attachment, accountId, baseDownloadUrl, cancelToken)); consumeState(_exportAttachmentInteractor.execute(attachment, accountId, baseDownloadUrl, cancelToken));
} }
} }
@@ -660,7 +654,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
popBack(); popBack();
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).attachment_download_failed); AppLocalizations.of(currentContext!).attachment_download_failed);
} }
@@ -686,7 +680,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
if (openResult.type != open_file.ResultType.done) { if (openResult.type != open_file.ResultType.done) {
logError('SingleEmailController::_openDownloadedPreviewWorkGroupDocument(): no preview available'); logError('SingleEmailController::_openDownloadedPreviewWorkGroupDocument(): no preview available');
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).noPreviewAvailable); AppLocalizations.of(currentContext!).noPreviewAvailable);
} }
@@ -701,8 +695,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final session = mailboxDashBoardController.sessionCurrent; final session = mailboxDashBoardController.sessionCurrent;
if (accountId != null && session != null) { if (accountId != null && session != null) {
final baseDownloadUrl = session.getDownloadUrl(jmapUrl: _dynamicUrlInterceptors.jmapUrl); final baseDownloadUrl = session.getDownloadUrl(jmapUrl: dynamicUrlInterceptors.jmapUrl);
final generateTaskId = DownloadTaskId(_uuid.v4()); final generateTaskId = DownloadTaskId(uuid.v4());
consumeState(_downloadAttachmentForWebInteractor.execute( consumeState(_downloadAttachmentForWebInteractor.execute(
generateTaskId, generateTaskId,
attachment, attachment,
@@ -732,7 +726,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} }
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).attachment_download_failed); AppLocalizations.of(currentContext!).attachment_download_failed);
} }
@@ -821,7 +815,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void _moveToMailboxSuccess(MoveToMailboxSuccess success) { void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
mailboxDashBoardController.dispatchState(Right(success)); mailboxDashBoardController.dispatchState(Right(success));
if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) { if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
success.emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: success.destinationPath), success.emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: success.destinationPath),
actionName: AppLocalizations.of(currentContext!).undo, actionName: AppLocalizations.of(currentContext!).undo,
@@ -1063,21 +1057,21 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} }
if (_sendReceiptToSenderInteractor == null) { if (_sendReceiptToSenderInteractor == null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(context).toastMessageNotSupportMdnWhenSendReceipt); AppLocalizations.of(context).toastMessageNotSupportMdnWhenSendReceipt);
return; return;
} }
if (_identitySelected == null || _identitySelected?.id == null) { if (_identitySelected == null || _identitySelected?.id == null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(context).toastMessageCannotFoundIdentityWhenSendReceipt); AppLocalizations.of(context).toastMessageCannotFoundIdentityWhenSendReceipt);
return; return;
} }
if (currentEmail == null || _currentEmailId == null) { if (currentEmail == null || _currentEmailId == null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(context).toastMessageCannotFoundEmailIdWhenSendReceipt); AppLocalizations.of(context).toastMessageCannotFoundEmailIdWhenSendReceipt);
return; return;
@@ -1089,7 +1083,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
final sendReceiptRequest = SendReceiptToSenderRequest( final sendReceiptRequest = SendReceiptToSenderRequest(
mdn: mdnToSender, mdn: mdnToSender,
identityId: _identitySelected!.id!, identityId: _identitySelected!.id!,
sendId: Id(_uuid.v1())); sendId: Id(uuid.v1()));
log('SingleEmailController::_handleSendReceiptToSenderAction(): sendReceiptRequest: $sendReceiptRequest'); log('SingleEmailController::_handleSendReceiptToSenderAction(): sendReceiptRequest: $sendReceiptRequest');
consumeState(_sendReceiptToSenderInteractor!.execute(accountId, sendReceiptRequest)); consumeState(_sendReceiptToSenderInteractor!.execute(accountId, sendReceiptRequest));
@@ -1129,7 +1123,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void _sendReceiptToSenderSuccess(SendReceiptToSenderSuccess success) { void _sendReceiptToSenderSuccess(SendReceiptToSenderSuccess success) {
log('SingleEmailController::_sendReceiptToSenderSuccess(): ${success.mdn.toString()}'); log('SingleEmailController::_sendReceiptToSenderSuccess(): ${success.mdn.toString()}');
if (currentContext != null) { if (currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toastMessageSendReceiptSuccess, AppLocalizations.of(currentContext!).toastMessageSendReceiptSuccess,
leadingSVGIcon: imagePaths.icReadReceiptMessage); leadingSVGIcon: imagePaths.icReadReceiptMessage);
@@ -1264,7 +1258,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void _createNewRuleFilterSuccess(CreateNewRuleFilterSuccess success) { void _createNewRuleFilterSuccess(CreateNewRuleFilterSuccess success) {
if (success.newListRules.isNotEmpty == true) { if (success.newListRules.isNotEmpty == true) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).newFilterWasCreated); AppLocalizations.of(currentContext!).newFilterWasCreated);
} }
+30 -40
View File
@@ -1,11 +1,8 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:core/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart'; import 'package:core/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart';
import 'package:core/presentation/views/html_viewer/html_content_viewer_widget.dart'; import 'package:core/presentation/views/html_viewer/html_content_viewer_widget.dart';
import 'package:core/presentation/views/html_viewer/html_viewer_controller_for_web.dart'; import 'package:core/presentation/views/html_viewer/html_viewer_controller_for_web.dart';
import 'package:core/utils/app_logger.dart';
import 'package:core/utils/direction_utils.dart'; import 'package:core/utils/direction_utils.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -42,17 +39,14 @@ import 'package:tmail_ui_user/main/utils/app_utils.dart';
class EmailView extends GetWidget<SingleEmailController> { class EmailView extends GetWidget<SingleEmailController> {
final responsiveUtils = Get.find<ResponsiveUtils>(); const EmailView({Key? key}) : super(key: key);
final imagePaths = Get.find<ImagePaths>();
EmailView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return WillPopScope( return WillPopScope(
onWillPop: () => controller.backButtonPressedCallbackAction.call(context), onWillPop: () => controller.backButtonPressedCallbackAction.call(context),
child: Scaffold( child: Scaffold(
backgroundColor: responsiveUtils.isWebDesktop(context) backgroundColor: controller.responsiveUtils.isWebDesktop(context)
? AppColor.colorBgDesktop ? AppColor.colorBgDesktop
: Colors.white, : Colors.white,
appBar: PlatformInfo.isIOS appBar: PlatformInfo.isIOS
@@ -93,12 +87,12 @@ class EmailView extends GetWidget<SingleEmailController> {
) )
: null, : null,
body: SafeArea( body: SafeArea(
right: responsiveUtils.isLandscapeMobile(context), right: controller.responsiveUtils.isLandscapeMobile(context),
left: responsiveUtils.isLandscapeMobile(context), left: controller.responsiveUtils.isLandscapeMobile(context),
bottom: !PlatformInfo.isIOS, bottom: !PlatformInfo.isIOS,
child: Container( child: Container(
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
decoration: responsiveUtils.isWebDesktop(context) decoration: controller.responsiveUtils.isWebDesktop(context)
? BoxDecoration( ? BoxDecoration(
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), border: Border.all(color: AppColor.colorBorderBodyThread, width: 1),
@@ -139,9 +133,9 @@ class EmailView extends GetWidget<SingleEmailController> {
final vacation = controller.mailboxDashBoardController.vacationResponse.value; final vacation = controller.mailboxDashBoardController.vacationResponse.value;
if (vacation?.vacationResponderIsValid == true && if (vacation?.vacationResponderIsValid == true &&
( (
responsiveUtils.isMobile(context) || controller.responsiveUtils.isMobile(context) ||
responsiveUtils.isTablet(context) || controller.responsiveUtils.isTablet(context) ||
responsiveUtils.isLandscapeMobile(context) controller.responsiveUtils.isLandscapeMobile(context)
) )
) { ) {
return VacationNotificationMessageWidget( return VacationNotificationMessageWidget(
@@ -270,7 +264,7 @@ class EmailView extends GetWidget<SingleEmailController> {
EdgeInsetsGeometry _getMarginEmailView(BuildContext context) { EdgeInsetsGeometry _getMarginEmailView(BuildContext context) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
if (responsiveUtils.isDesktop(context)) { if (controller.responsiveUtils.isDesktop(context)) {
return const EdgeInsetsDirectional.only( return const EdgeInsetsDirectional.only(
end: 16, end: 16,
top: 8, top: 8,
@@ -292,8 +286,8 @@ class EmailView extends GetWidget<SingleEmailController> {
return [ return [
TMailButtonWidget.fromIcon( TMailButtonWidget.fromIcon(
icon: DirectionUtils.isDirectionRTLByLanguage(context) icon: DirectionUtils.isDirectionRTLByLanguage(context)
? imagePaths.icOlder ? controller.imagePaths.icOlder
: imagePaths.icNewer, : controller.imagePaths.icNewer,
iconColor: controller.emailSupervisorController.nextEmailActivated iconColor: controller.emailSupervisorController.nextEmailActivated
? AppColor.primaryColor ? AppColor.primaryColor
: AppColor.colorAttachmentIcon, : AppColor.colorAttachmentIcon,
@@ -305,8 +299,8 @@ class EmailView extends GetWidget<SingleEmailController> {
), ),
TMailButtonWidget.fromIcon( TMailButtonWidget.fromIcon(
icon: DirectionUtils.isDirectionRTLByLanguage(context) icon: DirectionUtils.isDirectionRTLByLanguage(context)
? imagePaths.icNewer ? controller.imagePaths.icNewer
: imagePaths.icOlder, : controller.imagePaths.icOlder,
iconColor: controller.emailSupervisorController.previousEmailActivated iconColor: controller.emailSupervisorController.previousEmailActivated
? AppColor.primaryColor ? AppColor.primaryColor
: AppColor.colorAttachmentIcon, : AppColor.colorAttachmentIcon,
@@ -332,22 +326,18 @@ class EmailView extends GetWidget<SingleEmailController> {
InformationSenderAndReceiverBuilder( InformationSenderAndReceiverBuilder(
controller: controller, controller: controller,
emailSelected: presentationEmail, emailSelected: presentationEmail,
imagePaths: imagePaths, imagePaths: controller.imagePaths,
responsiveUtils: responsiveUtils, responsiveUtils: controller.responsiveUtils,
), ),
Obx(() { Obx(() {
final attachments = controller.attachments.listAttachmentsDisplayedOutSide; final attachments = controller.attachments.listAttachmentsDisplayedOutSide;
if (attachments.isNotEmpty) { if (attachments.isNotEmpty) {
return EmailAttachmentsWidget( return EmailAttachmentsWidget(
responsiveUtils: responsiveUtils, responsiveUtils: controller.responsiveUtils,
attachments: attachments, attachments: attachments,
imagePaths: imagePaths, imagePaths: controller.imagePaths,
onDragStarted: () { onDragStarted: controller.mailboxDashBoardController.enableDraggableApp,
log('EmailView::_buildEmailMessage:onDragStarted:');
controller.mailboxDashBoardController.enableDraggableApp();
},
onDragEnd: (details) { onDragEnd: (details) {
log('EmailView::_buildEmailMessage:onDragEnd:');
controller.mailboxDashBoardController.disableDraggableApp(); controller.mailboxDashBoardController.disableDraggableApp();
}, },
downloadAttachmentAction: (attachment) { downloadAttachmentAction: (attachment) {
@@ -463,7 +453,7 @@ class EmailView extends GetWidget<SingleEmailController> {
return (EmailActionCupertinoActionSheetActionBuilder( return (EmailActionCupertinoActionSheetActionBuilder(
const Key('mark_as_unread_action'), const Key('mark_as_unread_action'),
SvgPicture.asset( SvgPicture.asset(
imagePaths.icUnreadEmail, controller.imagePaths.icUnreadEmail,
width: 24, width: 24,
height: 24, height: 24,
fit: BoxFit.fill, fit: BoxFit.fill,
@@ -471,7 +461,7 @@ class EmailView extends GetWidget<SingleEmailController> {
), ),
AppLocalizations.of(context).mark_as_unread, AppLocalizations.of(context).mark_as_unread,
email, email,
iconLeftPadding: responsiveUtils.isMobile(context) iconLeftPadding: controller.responsiveUtils.isMobile(context)
? EdgeInsets.only( ? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 12, left: AppUtils.isDirectionRTL(context) ? 16 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 16, right: AppUtils.isDirectionRTL(context) ? 12 : 16,
@@ -480,7 +470,7 @@ class EmailView extends GetWidget<SingleEmailController> {
left: AppUtils.isDirectionRTL(context) ? 12 : 0, left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12, right: AppUtils.isDirectionRTL(context) ? 0 : 12,
), ),
iconRightPadding: responsiveUtils.isMobile(context) iconRightPadding: controller.responsiveUtils.isMobile(context)
? EdgeInsets.only( ? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0, left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12, right: AppUtils.isDirectionRTL(context) ? 0 : 12,
@@ -500,7 +490,7 @@ class EmailView extends GetWidget<SingleEmailController> {
return (EmailActionCupertinoActionSheetActionBuilder( return (EmailActionCupertinoActionSheetActionBuilder(
const Key('mark_as_spam_or_un_spam_action'), const Key('mark_as_spam_or_un_spam_action'),
SvgPicture.asset( SvgPicture.asset(
currentMailbox?.isSpam == true ? imagePaths.icNotSpam : imagePaths.icSpam, currentMailbox?.isSpam == true ? controller.imagePaths.icNotSpam : controller.imagePaths.icSpam,
width: 24, width: 24,
height: 24, height: 24,
fit: BoxFit.fill, fit: BoxFit.fill,
@@ -510,7 +500,7 @@ class EmailView extends GetWidget<SingleEmailController> {
? AppLocalizations.of(context).remove_from_spam ? AppLocalizations.of(context).remove_from_spam
: AppLocalizations.of(context).mark_as_spam, : AppLocalizations.of(context).mark_as_spam,
email, email,
iconLeftPadding: responsiveUtils.isMobile(context) iconLeftPadding: controller.responsiveUtils.isMobile(context)
? EdgeInsets.only( ? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 12, left: AppUtils.isDirectionRTL(context) ? 16 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 16, right: AppUtils.isDirectionRTL(context) ? 12 : 16,
@@ -519,7 +509,7 @@ class EmailView extends GetWidget<SingleEmailController> {
left: AppUtils.isDirectionRTL(context) ? 12 : 0, left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12, right: AppUtils.isDirectionRTL(context) ? 0 : 12,
), ),
iconRightPadding: responsiveUtils.isMobile(context) iconRightPadding: controller.responsiveUtils.isMobile(context)
? EdgeInsets.only( ? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0, left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12, right: AppUtils.isDirectionRTL(context) ? 0 : 12,
@@ -537,14 +527,14 @@ class EmailView extends GetWidget<SingleEmailController> {
return (EmailActionCupertinoActionSheetActionBuilder( return (EmailActionCupertinoActionSheetActionBuilder(
const Key('quick_creating_rule_action'), const Key('quick_creating_rule_action'),
SvgPicture.asset( SvgPicture.asset(
imagePaths.icQuickCreatingRule, controller.imagePaths.icQuickCreatingRule,
width: 24, width: 24,
height: 24, height: 24,
fit: BoxFit.fill, fit: BoxFit.fill,
colorFilter: AppColor.colorTextButton.asFilter()), colorFilter: AppColor.colorTextButton.asFilter()),
AppLocalizations.of(context).quickCreatingRule, AppLocalizations.of(context).quickCreatingRule,
email, email,
iconLeftPadding: responsiveUtils.isMobile(context) iconLeftPadding: controller.responsiveUtils.isMobile(context)
? EdgeInsets.only( ? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 12, left: AppUtils.isDirectionRTL(context) ? 16 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 16, right: AppUtils.isDirectionRTL(context) ? 12 : 16,
@@ -553,7 +543,7 @@ class EmailView extends GetWidget<SingleEmailController> {
left: AppUtils.isDirectionRTL(context) ? 12 : 0, left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12, right: AppUtils.isDirectionRTL(context) ? 0 : 12,
), ),
iconRightPadding: responsiveUtils.isMobile(context) iconRightPadding: controller.responsiveUtils.isMobile(context)
? EdgeInsets.only( ? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0, left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12, right: AppUtils.isDirectionRTL(context) ? 0 : 12,
@@ -577,7 +567,7 @@ class EmailView extends GetWidget<SingleEmailController> {
return PopupMenuItem( return PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemWidget( child: PopupItemWidget(
imagePaths.icUnreadEmail, controller.imagePaths.icUnreadEmail,
AppLocalizations.of(context).mark_as_unread, AppLocalizations.of(context).mark_as_unread,
colorIcon: AppColor.colorTextButton, colorIcon: AppColor.colorTextButton,
padding: const EdgeInsetsDirectional.only(start: 12), padding: const EdgeInsetsDirectional.only(start: 12),
@@ -603,7 +593,7 @@ class EmailView extends GetWidget<SingleEmailController> {
return PopupMenuItem( return PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemWidget( child: PopupItemWidget(
mailboxContain?.isSpam == true ? imagePaths.icNotSpam : imagePaths.icSpam, mailboxContain?.isSpam == true ? controller.imagePaths.icNotSpam : controller.imagePaths.icSpam,
mailboxContain?.isSpam == true mailboxContain?.isSpam == true
? AppLocalizations.of(context).remove_from_spam ? AppLocalizations.of(context).remove_from_spam
: AppLocalizations.of(context).mark_as_spam, : AppLocalizations.of(context).mark_as_spam,
@@ -627,7 +617,7 @@ class EmailView extends GetWidget<SingleEmailController> {
return PopupMenuItem( return PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemWidget( child: PopupItemWidget(
imagePaths.icQuickCreatingRule, controller.imagePaths.icQuickCreatingRule,
AppLocalizations.of(context).quickCreatingRule, AppLocalizations.of(context).quickCreatingRule,
colorIcon: AppColor.colorTextButton, colorIcon: AppColor.colorTextButton,
padding: const EdgeInsetsDirectional.only(start: 12), padding: const EdgeInsetsDirectional.only(start: 12),
@@ -1,4 +1,3 @@
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/presentation/utils/keyboard_utils.dart'; import 'package:core/presentation/utils/keyboard_utils.dart';
import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
@@ -40,7 +39,6 @@ import 'package:tmail_ui_user/features/manage_account/presentation/profiles/iden
import 'package:tmail_ui_user/main/error/capability_validator.dart'; import 'package:tmail_ui_user/main/error/capability_validator.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/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:uuid/uuid.dart';
class IdentityCreatorController extends BaseController { class IdentityCreatorController extends BaseController {
@@ -48,9 +46,6 @@ class IdentityCreatorController extends BaseController {
final GetAllIdentitiesInteractor _getAllIdentitiesInteractor; final GetAllIdentitiesInteractor _getAllIdentitiesInteractor;
final IdentityUtils _identityUtils; final IdentityUtils _identityUtils;
final _uuid = Get.find<Uuid>();
final _appToast = Get.find<AppToast>();
final noneEmailAddress = EmailAddress(null, 'None'); final noneEmailAddress = EmailAddress(null, 'None');
final listEmailAddressDefault = <EmailAddress>[].obs; final listEmailAddressDefault = <EmailAddress>[].obs;
final listEmailAddressOfReplyTo = <EmailAddress>[].obs; final listEmailAddressOfReplyTo = <EmailAddress>[].obs;
@@ -343,7 +338,7 @@ class IdentityCreatorController extends BaseController {
htmlSignature: Signature(signatureHtmlText ?? ''), htmlSignature: Signature(signatureHtmlText ?? ''),
sortOrder: sortOrder); sortOrder: sortOrder);
final generateCreateId = Id(_uuid.v1()); final generateCreateId = Id(uuid.v1());
if (actionType.value == IdentityActionType.create) { if (actionType.value == IdentityActionType.create) {
final identityRequest = CreateNewIdentityRequest( final identityRequest = CreateNewIdentityRequest(
@@ -486,7 +481,7 @@ class IdentityCreatorController extends BaseController {
final platformFile = filePickerResult!.files.first; final platformFile = filePickerResult!.files.first;
_insertInlineImage(context, platformFile, maxWidth: maxWidth); _insertInlineImage(context, platformFile, maxWidth: maxWidth);
} else { } else {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
context, context,
AppLocalizations.of(context).cannotSelectThisImage AppLocalizations.of(context).cannotSelectThisImage
); );
@@ -505,7 +500,7 @@ class IdentityCreatorController extends BaseController {
{int? maxWidth} {int? maxWidth}
) { ) {
if (_isExceedMaxSizeInlineImage(platformFile.size)) { if (_isExceedMaxSizeInlineImage(platformFile.size)) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
context, context,
AppLocalizations.of(context).pleaseChooseAnImageSizeCorrectly( AppLocalizations.of(context).pleaseChooseAnImageSizeCorrectly(
IdentityCreatorConstants.maxKBSizeIdentityInlineImage IdentityCreatorConstants.maxKBSizeIdentityInlineImage
@@ -2,9 +2,7 @@ import 'dart:math' as math;
import 'package:core/presentation/extensions/capitalize_extension.dart'; import 'package:core/presentation/extensions/capitalize_extension.dart';
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/html_transformer/html_utils.dart'; import 'package:core/presentation/utils/html_transformer/html_utils.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/style_utils.dart'; import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/presentation/views/button/icon_button_web.dart'; import 'package:core/presentation/views/button/icon_button_web.dart';
import 'package:core/presentation/views/responsive/responsive_widget.dart'; import 'package:core/presentation/views/responsive/responsive_widget.dart';
@@ -33,9 +31,6 @@ import 'package:tmail_ui_user/main/utils/app_utils.dart';
class IdentityCreatorView extends GetWidget<IdentityCreatorController> class IdentityCreatorView extends GetWidget<IdentityCreatorController>
with RichTextButtonMixin { with RichTextButtonMixin {
final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
@override @override
final controller = Get.find<IdentityCreatorController>(); final controller = Get.find<IdentityCreatorController>();
@@ -44,7 +39,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final responsiveWidget = ResponsiveWidget( final responsiveWidget = ResponsiveWidget(
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
mobile: Scaffold( mobile: Scaffold(
backgroundColor: Colors.black38, backgroundColor: Colors.black38,
body: GestureDetector( body: GestureDetector(
@@ -103,8 +98,8 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(16)) borderRadius: BorderRadius.all(Radius.circular(16))
), ),
width: math.max(_responsiveUtils.getSizeScreenWidth(context) * 0.4, 700), width: math.max(controller.responsiveUtils.getSizeScreenWidth(context) * 0.4, 700),
height: _responsiveUtils.getSizeScreenHeight(context) * 0.8, height: controller.responsiveUtils.getSizeScreenHeight(context) * 0.8,
child: ClipRRect( child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(16)), borderRadius: const BorderRadius.all(Radius.circular(16)),
child: _buildBodyView(context) child: _buildBodyView(context)
@@ -129,8 +124,8 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(16)) borderRadius: BorderRadius.all(Radius.circular(16))
), ),
width: math.max(_responsiveUtils.getSizeScreenWidth(context) * 0.4, 800), width: math.max(controller.responsiveUtils.getSizeScreenWidth(context) * 0.4, 800),
height: _responsiveUtils.getSizeScreenHeight(context) * 0.8, height: controller.responsiveUtils.getSizeScreenHeight(context) * 0.8,
child: ClipRRect( child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(16)), borderRadius: const BorderRadius.all(Radius.circular(16)),
child: _buildBodyView(context) child: _buildBodyView(context)
@@ -150,7 +145,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
backgroundKeyboardToolBarColor: PlatformInfo.isIOS backgroundKeyboardToolBarColor: PlatformInfo.isIOS
? AppColor.colorBackgroundKeyboard ? AppColor.colorBackgroundKeyboard
: AppColor.colorBackgroundKeyboardAndroid, : AppColor.colorBackgroundKeyboardAndroid,
isLandScapeMode: _responsiveUtils.isLandscapeMobile(context), isLandScapeMode: controller.responsiveUtils.isLandscapeMobile(context),
richTextController: controller.keyboardRichTextController, richTextController: controller.keyboardRichTextController,
titleQuickStyleBottomSheet: AppLocalizations.of(context).titleQuickStyles, titleQuickStyleBottomSheet: AppLocalizations.of(context).titleQuickStyles,
titleBackgroundBottomSheet: AppLocalizations.of(context).titleBackground, titleBackgroundBottomSheet: AppLocalizations.of(context).titleBackground,
@@ -185,7 +180,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
Obx(() { Obx(() {
if (controller.actionType.value == IdentityActionType.create) { if (controller.actionType.value == IdentityActionType.create) {
return IdentityDropListFieldBuilder( return IdentityDropListFieldBuilder(
_imagePaths, controller.imagePaths,
AppLocalizations.of(context).email.inCaps, AppLocalizations.of(context).email.inCaps,
controller.emailOfIdentity.value, controller.emailOfIdentity.value,
controller.listEmailAddressDefault, controller.listEmailAddressDefault,
@@ -198,7 +193,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
}), }),
const SizedBox(height: 24), const SizedBox(height: 24),
Obx(() => IdentityDropListFieldBuilder( Obx(() => IdentityDropListFieldBuilder(
_imagePaths, controller.imagePaths,
AppLocalizations.of(context).reply_to, AppLocalizations.of(context).reply_to,
controller.replyToOfIdentity.value, controller.replyToOfIdentity.value,
controller.listEmailAddressOfReplyTo, controller.listEmailAddressOfReplyTo,
@@ -291,7 +286,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
buildIconWeb( buildIconWeb(
iconSize: 24, iconSize: 24,
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icComposerClose, controller.imagePaths.icComposerClose,
fit: BoxFit.fill, fit: BoxFit.fill,
colorFilter: AppColor.colorDeleteContactIcon.asFilter() colorFilter: AppColor.colorDeleteContactIcon.asFilter()
), ),
@@ -317,7 +312,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
padding: const EdgeInsetsDirectional.only(end: 4.0), padding: const EdgeInsetsDirectional.only(end: 4.0),
child: buildWrapIconStyleText( child: buildWrapIconStyleText(
icon: buildIconWithTooltip( icon: buildIconWithTooltip(
path: _imagePaths.icAddPicture, path: controller.imagePaths.icAddPicture,
tooltip: AppLocalizations.of(context).insertImage tooltip: AppLocalizations.of(context).insertImage
), ),
hasDropdown: false, hasDropdown: false,
@@ -405,7 +400,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
return Obx(() { return Obx(() {
if (controller.isDefaultIdentitySupported.isTrue) { if (controller.isDefaultIdentitySupported.isTrue) {
return SetDefaultIdentityCheckboxBuilder( return SetDefaultIdentityCheckboxBuilder(
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
isCheck: controller.isDefaultIdentity.value, isCheck: controller.isDefaultIdentity.value,
onCheckboxChanged: controller.onCheckboxChanged); onCheckboxChanged: controller.onCheckboxChanged);
} else { } else {
@@ -460,16 +455,16 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController>
} }
bool _isMobile(BuildContext context) => bool _isMobile(BuildContext context) =>
_responsiveUtils.isPortraitMobile(context) || controller.responsiveUtils.isPortraitMobile(context) ||
_responsiveUtils.isLandscapeMobile(context); controller.responsiveUtils.isLandscapeMobile(context);
double _getMaxWidth(BuildContext context) { double _getMaxWidth(BuildContext context) {
if (_isMobile(context)) { if (_isMobile(context)) {
return _responsiveUtils.getSizeScreenWidth(context); return controller.responsiveUtils.getSizeScreenWidth(context);
} else if (_responsiveUtils.isDesktop(context)) { } else if (controller.responsiveUtils.isDesktop(context)) {
return math.max(_responsiveUtils.getSizeScreenWidth(context) * 0.4, 800); return math.max(controller.responsiveUtils.getSizeScreenWidth(context) * 0.4, 800);
} else { } else {
return math.max(_responsiveUtils.getSizeScreenWidth(context) * 0.4, 700); return math.max(controller.responsiveUtils.getSizeScreenWidth(context) * 0.4, 700);
} }
} }
} }
@@ -15,7 +15,7 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class LoginView extends BaseLoginView { class LoginView extends BaseLoginView {
LoginView({Key? key}) : super(key: key); const LoginView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -66,7 +66,7 @@ class LoginView extends BaseLoginView {
children: [ children: [
Padding( Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: responsiveUtils.isHeightShortest(context) ? 64 : 0), top: controller.responsiveUtils.isHeightShortest(context) ? 64 : 0),
child: Text( child: Text(
AppLocalizations.of(context).login, AppLocalizations.of(context).login,
style: const TextStyle(fontSize: 32, color: AppColor.colorNameEmail, fontWeight: FontWeight.w900) style: const TextStyle(fontSize: 32, color: AppColor.colorNameEmail, fontWeight: FontWeight.w900)
@@ -102,7 +102,7 @@ class LoginView extends BaseLoginView {
key: const Key('login_arrow_back_button'), key: const Key('login_arrow_back_button'),
onPressed: () => controller.handleBackInCredentialForm(), onPressed: () => controller.handleBackInCredentialForm(),
icon: SvgPicture.asset( icon: SvgPicture.asset(
imagePaths.icBack, controller.imagePaths.icBack,
alignment: Alignment.center, alignment: Alignment.center,
colorFilter: AppColor.primaryColor.asFilter() colorFilter: AppColor.primaryColor.asFilter()
) )
@@ -127,7 +127,7 @@ class LoginView extends BaseLoginView {
controller.formatUrl(pattern); controller.formatUrl(pattern);
return controller.getAllRecentLoginUrlAction(pattern); return controller.getAllRecentLoginUrlAction(pattern);
}, },
itemBuilder: (context, loginUrl) => RecentItemTileWidget(loginUrl, imagePath: imagePaths), itemBuilder: (context, loginUrl) => RecentItemTileWidget(loginUrl, imagePath: controller.imagePaths),
onSuggestionSelected: (loginUrl) => controller.formatUrl(loginUrl.url), onSuggestionSelected: (loginUrl) => controller.formatUrl(loginUrl.url),
suggestionsBoxDecoration: const SuggestionsBoxDecoration(borderRadius: BorderRadius.all(Radius.circular(14))), suggestionsBoxDecoration: const SuggestionsBoxDecoration(borderRadius: BorderRadius.all(Radius.circular(14))),
noItemsFoundBuilder: (context) => const SizedBox(), noItemsFoundBuilder: (context) => const SizedBox(),
@@ -149,7 +149,7 @@ class LoginView extends BaseLoginView {
Widget _buildNextButton(BuildContext context) { Widget _buildNextButton(BuildContext context) {
return Container( return Container(
margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24), margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24),
width: responsiveUtils.getDeviceWidth(context),height: 48, width: controller.responsiveUtils.getDeviceWidth(context),height: 48,
child: ElevatedButton( child: ElevatedButton(
key: const Key('nextToCredentialForm'), key: const Key('nextToCredentialForm'),
style: ButtonStyle( style: ButtonStyle(
@@ -184,7 +184,7 @@ class LoginView extends BaseLoginView {
} }
bool _supportScrollForm(BuildContext context) { bool _supportScrollForm(BuildContext context) {
return !(responsiveUtils.isMobile(context) && responsiveUtils.isPortrait(context)); return !(controller.responsiveUtils.isMobile(context) && controller.responsiveUtils.isPortrait(context));
} }
Widget _buildLoadingProgress(BuildContext context) { Widget _buildLoadingProgress(BuildContext context) {
@@ -12,7 +12,7 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class LoginView extends BaseLoginView { class LoginView extends BaseLoginView {
LoginView({Key? key}) : super(key: key); const LoginView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -20,7 +20,7 @@ class LoginView extends BaseLoginView {
backgroundColor: AppColor.primaryLightColor, backgroundColor: AppColor.primaryLightColor,
body: Center(child: SingleChildScrollView( body: Center(child: SingleChildScrollView(
child: ResponsiveWidget( child: ResponsiveWidget(
responsiveUtils: responsiveUtils, responsiveUtils: controller.responsiveUtils,
mobile: _buildMobileForm(context), mobile: _buildMobileForm(context),
desktop: _buildWebForm(context), desktop: _buildWebForm(context),
))), ))),
@@ -71,7 +71,7 @@ class LoginView extends BaseLoginView {
child: Align( child: Align(
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
child: SvgPicture.asset( child: SvgPicture.asset(
imagePaths.icPowerByLinagora, controller.imagePaths.icPowerByLinagora,
width: 97, width: 97,
height: 44, height: 44,
fit: BoxFit.fill))) fit: BoxFit.fill)))
@@ -101,7 +101,7 @@ class LoginView extends BaseLoginView {
padding: const EdgeInsets.only(top: 24), padding: const EdgeInsets.only(top: 24),
child: SloganBuilder( child: SloganBuilder(
arrangedByHorizontal: true, arrangedByHorizontal: true,
logoSVG: imagePaths.icJMAPStandard, logoSVG: controller.imagePaths.icJMAPStandard,
sizeLogo: 48.0, sizeLogo: 48.0,
paddingText: const EdgeInsets.only(left: 12), paddingText: const EdgeInsets.only(left: 12),
text: AppLocalizations.of(context).jmapStandard, text: AppLocalizations.of(context).jmapStandard,
@@ -112,7 +112,7 @@ class LoginView extends BaseLoginView {
padding: const EdgeInsets.only(top: 16), padding: const EdgeInsets.only(top: 16),
child: SloganBuilder( child: SloganBuilder(
arrangedByHorizontal: true, arrangedByHorizontal: true,
logoSVG: imagePaths.icEncrypted, logoSVG: controller.imagePaths.icEncrypted,
sizeLogo: 48.0, sizeLogo: 48.0,
paddingText: const EdgeInsets.only(left: 12), paddingText: const EdgeInsets.only(left: 12),
text: AppLocalizations.of(context).encryptedMailbox, text: AppLocalizations.of(context).encryptedMailbox,
@@ -123,7 +123,7 @@ class LoginView extends BaseLoginView {
padding: const EdgeInsets.only(top: 16), padding: const EdgeInsets.only(top: 16),
child: SloganBuilder( child: SloganBuilder(
arrangedByHorizontal: true, arrangedByHorizontal: true,
logoSVG: imagePaths.icTeam, logoSVG: controller.imagePaths.icTeam,
sizeLogo: 48.0, sizeLogo: 48.0,
paddingText: const EdgeInsets.only(left: 12), paddingText: const EdgeInsets.only(left: 12),
text: AppLocalizations.of(context).manageEmailAsATeam, text: AppLocalizations.of(context).manageEmailAsATeam,
@@ -134,7 +134,7 @@ class LoginView extends BaseLoginView {
padding: const EdgeInsets.only(top: 16), padding: const EdgeInsets.only(top: 16),
child: SloganBuilder( child: SloganBuilder(
arrangedByHorizontal: true, arrangedByHorizontal: true,
logoSVG: imagePaths.icIntegration, logoSVG: controller.imagePaths.icIntegration,
sizeLogo: 48.0, sizeLogo: 48.0,
paddingText: const EdgeInsets.only(left: 12), paddingText: const EdgeInsets.only(left: 12),
text: AppLocalizations.of(context).multipleIntegrations, text: AppLocalizations.of(context).multipleIntegrations,
@@ -144,7 +144,7 @@ class LoginView extends BaseLoginView {
Padding( Padding(
padding: const EdgeInsets.only(top: 44), padding: const EdgeInsets.only(top: 44),
child: SvgPicture.asset( child: SvgPicture.asset(
imagePaths.icLoginGraphic, controller.imagePaths.icLoginGraphic,
fit: BoxFit.fill, fit: BoxFit.fill,
alignment: Alignment.center alignment: Alignment.center
) )
@@ -202,7 +202,7 @@ class LoginView extends BaseLoginView {
), ),
Padding( Padding(
padding: const EdgeInsets.only(top: 44, bottom: 10), padding: const EdgeInsets.only(top: 44, bottom: 10),
child: SvgPicture.asset(imagePaths.icPowerByLinagora, width: 97, height: 44, fit: BoxFit.fill) child: SvgPicture.asset(controller.imagePaths.icPowerByLinagora, width: 97, height: 44, fit: BoxFit.fill)
) )
] ]
) )
@@ -216,7 +216,7 @@ class LoginView extends BaseLoginView {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
imagePaths.icTMailLogo, controller.imagePaths.icTMailLogo,
fit: BoxFit.fill, fit: BoxFit.fill,
width: 36, width: 36,
height: 36, height: 36,
@@ -235,7 +235,7 @@ class LoginView extends BaseLoginView {
Widget _buildSSOButton(BuildContext context) { Widget _buildSSOButton(BuildContext context) {
return Container( return Container(
margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24), margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24),
width: responsiveUtils.getDeviceWidth(context),height: 48, width: controller.responsiveUtils.getDeviceWidth(context),height: 48,
child: ElevatedButton( child: ElevatedButton(
key: const Key('ssoSubmitForm'), key: const Key('ssoSubmitForm'),
style: ButtonStyle( style: ButtonStyle(
@@ -1,5 +1,3 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
@@ -12,7 +10,4 @@ abstract class BaseMailboxView extends GetWidget<MailboxController>
MailboxWidgetMixin { MailboxWidgetMixin {
BaseMailboxView({Key? key}) : super(key: key); BaseMailboxView({Key? key}) : super(key: key);
final responsiveUtils = Get.find<ResponsiveUtils>();
final imagePaths = Get.find<ImagePaths>();
} }
@@ -84,15 +84,10 @@ import 'package:tmail_ui_user/main/routes/dialog_router.dart';
import 'package:tmail_ui_user/main/routes/navigation_router.dart'; import 'package:tmail_ui_user/main/routes/navigation_router.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/routes/route_utils.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:uuid/uuid.dart';
class MailboxController extends BaseMailboxController with MailboxActionHandlerMixin { class MailboxController extends BaseMailboxController with MailboxActionHandlerMixin {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>(); final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final _appToast = Get.find<AppToast>();
final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _uuid = Get.find<Uuid>();
final isMailboxListScrollable = false.obs; final isMailboxListScrollable = false.obs;
final CreateNewMailboxInteractor _createNewMailboxInteractor; final CreateNewMailboxInteractor _createNewMailboxInteractor;
final DeleteMultipleMailboxInteractor _deleteMultipleMailboxInteractor; final DeleteMultipleMailboxInteractor _deleteMultipleMailboxInteractor;
@@ -302,7 +297,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
void _initCollapseMailboxCategories() { void _initCollapseMailboxCategories() {
if (kIsWeb && currentContext != null if (kIsWeb && currentContext != null
&& (_responsiveUtils.isMobile(currentContext!) || _responsiveUtils.isTablet(currentContext!))) { && (responsiveUtils.isMobile(currentContext!) || responsiveUtils.isTablet(currentContext!))) {
mailboxCategoriesExpandMode.value = MailboxCategoriesExpandMode( mailboxCategoriesExpandMode.value = MailboxCategoriesExpandMode(
defaultMailbox: ExpandMode.COLLAPSE, defaultMailbox: ExpandMode.COLLAPSE,
personalFolders: ExpandMode.COLLAPSE, personalFolders: ExpandMode.COLLAPSE,
@@ -533,7 +528,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
: await push(AppRoutes.mailboxCreator, arguments: arguments); : await push(AppRoutes.mailboxCreator, arguments: arguments);
if (result != null && result is NewMailboxArguments) { if (result != null && result is NewMailboxArguments) {
final generateCreateId = Id(_uuid.v1()); final generateCreateId = Id(uuid.v1());
_createNewMailboxAction(session, accountId, CreateNewMailboxRequest( _createNewMailboxAction(session, accountId, CreateNewMailboxRequest(
generateCreateId, generateCreateId,
result.newName, result.newName,
@@ -548,11 +543,11 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
void _createNewMailboxSuccess(CreateNewMailboxSuccess success) { void _createNewMailboxSuccess(CreateNewMailboxSuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).createFolderSuccessfullyMessage(success.newMailbox.name?.name ?? ''), AppLocalizations.of(currentContext!).createFolderSuccessfullyMessage(success.newMailbox.name?.name ?? ''),
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
leadingSVGIcon: _imagePaths.icFolderMailbox); leadingSVGIcon: imagePaths.icFolderMailbox);
_newFolderId = success.newMailbox.id; _newFolderId = success.newMailbox.id;
} }
@@ -567,7 +562,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
if (exception is ErrorMethodResponse) { if (exception is ErrorMethodResponse) {
messageError = exception.description ?? AppLocalizations.of(currentContext!).createNewFolderFailure; messageError = exception.description ?? AppLocalizations.of(currentContext!).createNewFolderFailure;
} }
_appToast.showToastErrorMessage(currentOverlayContext!, messageError); appToast.showToastErrorMessage(currentOverlayContext!, messageError);
} }
} }
@@ -650,7 +645,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
openDialogRenameMailboxAction( openDialogRenameMailboxAction(
context, context,
selectedMailboxList.first, selectedMailboxList.first,
_responsiveUtils, responsiveUtils,
onRenameMailboxAction: _renameMailboxAction onRenameMailboxAction: _renameMailboxAction
); );
break; break;
@@ -705,7 +700,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
jmap.State? currentMailboxState jmap.State? currentMailboxState
) { ) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).deleteFoldersSuccessfully); AppLocalizations.of(currentContext!).deleteFoldersSuccessfully);
} }
@@ -721,8 +716,8 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
BuildContext context, BuildContext context,
List<PresentationMailbox> selectedMailboxList List<PresentationMailbox> selectedMailboxList
) { ) {
if (_responsiveUtils.isLandscapeMobile(context) || if (responsiveUtils.isLandscapeMobile(context) ||
_responsiveUtils.isPortraitMobile(context)) { responsiveUtils.isPortraitMobile(context)) {
(ConfirmationDialogActionSheetBuilder(context) (ConfirmationDialogActionSheetBuilder(context)
..messageText(AppLocalizations.of(context) ..messageText(AppLocalizations.of(context)
.messageConfirmationDialogDeleteMultipleFolder(selectedMailboxList.length)) .messageConfirmationDialogDeleteMultipleFolder(selectedMailboxList.length))
@@ -735,12 +730,12 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
showDialog( showDialog(
context: context, context: context,
barrierColor: AppColor.colorDefaultCupertinoActionSheet, barrierColor: AppColor.colorDefaultCupertinoActionSheet,
builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths) builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(imagePaths)
..key(const Key('confirm_dialog_delete_multiple_mailbox')) ..key(const Key('confirm_dialog_delete_multiple_mailbox'))
..title(AppLocalizations.of(context).deleteFolders) ..title(AppLocalizations.of(context).deleteFolders)
..content(AppLocalizations.of(context) ..content(AppLocalizations.of(context)
.messageConfirmationDialogDeleteMultipleFolder(selectedMailboxList.length)) .messageConfirmationDialogDeleteMultipleFolder(selectedMailboxList.length))
..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog, ..addIcon(SvgPicture.asset(imagePaths.icRemoveDialog,
fit: BoxFit.fill)) fit: BoxFit.fill))
..colorConfirmButton(AppColor.colorConfirmActionDialog) ..colorConfirmButton(AppColor.colorConfirmActionDialog)
..styleTextConfirmButton(const TextStyle( ..styleTextConfirmButton(const TextStyle(
@@ -789,10 +784,10 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
void _deleteMailboxFailure(DeleteMultipleMailboxFailure failure) { void _deleteMailboxFailure(DeleteMultipleMailboxFailure failure) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).deleteFoldersFailure, AppLocalizations.of(currentContext!).deleteFoldersFailure,
leadingSVGIcon: _imagePaths.icDeleteToast leadingSVGIcon: imagePaths.icDeleteToast
); );
} }
} }
@@ -835,7 +830,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
if (success.moveAction == MoveAction.moving if (success.moveAction == MoveAction.moving
&& currentOverlayContext != null && currentOverlayContext != null
&& currentContext != null) { && currentContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).movedToFolder( AppLocalizations.of(currentContext!).movedToFolder(
success.destinationMailboxDisplayName ?? AppLocalizations.of(currentContext!).allFolders), success.destinationMailboxDisplayName ?? AppLocalizations.of(currentContext!).allFolders),
@@ -847,11 +842,11 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
destinationMailboxId: success.parentId, destinationMailboxId: success.parentId,
parentId: success.destinationMailboxId)); parentId: success.destinationMailboxId));
}, },
leadingSVGIcon: _imagePaths.icFolderMailbox, leadingSVGIcon: imagePaths.icFolderMailbox,
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
backgroundColor: AppColor.toastSuccessBackgroundColor, backgroundColor: AppColor.toastSuccessBackgroundColor,
textColor: Colors.white, textColor: Colors.white,
actionIcon: SvgPicture.asset(_imagePaths.icUndo)); actionIcon: SvgPicture.asset(imagePaths.icUndo));
} }
_refreshMailboxChanges( _refreshMailboxChanges(
@@ -934,8 +929,8 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
case MailboxActions.delete: case MailboxActions.delete:
openConfirmationDialogDeleteMailboxAction( openConfirmationDialogDeleteMailboxAction(
context, context,
_responsiveUtils, responsiveUtils,
_imagePaths, imagePaths,
mailbox, mailbox,
onDeleteMailboxAction: _deleteMailboxAction onDeleteMailboxAction: _deleteMailboxAction
); );
@@ -944,7 +939,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
openDialogRenameMailboxAction( openDialogRenameMailboxAction(
context, context,
mailbox, mailbox,
_responsiveUtils, responsiveUtils,
onRenameMailboxAction: _renameMailboxAction onRenameMailboxAction: _renameMailboxAction
); );
break; break;
@@ -1168,7 +1163,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
{List<MailboxId>? listDescendantMailboxIds} {List<MailboxId>? listDescendantMailboxIds}
) { ) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toastMsgHideFolderSuccess, AppLocalizations.of(currentContext!).toastMsgHideFolderSuccess,
actionName: AppLocalizations.of(currentContext!).undo, actionName: AppLocalizations.of(currentContext!).undo,
@@ -1176,11 +1171,11 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
mailboxIdSubscribed, mailboxIdSubscribed,
listDescendantMailboxIds: listDescendantMailboxIds listDescendantMailboxIds: listDescendantMailboxIds
), ),
leadingSVGIcon: _imagePaths.icFolderMailbox, leadingSVGIcon: imagePaths.icFolderMailbox,
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
backgroundColor: AppColor.toastSuccessBackgroundColor, backgroundColor: AppColor.toastSuccessBackgroundColor,
textColor: Colors.white, textColor: Colors.white,
actionIcon: SvgPicture.asset(_imagePaths.icUndo)); actionIcon: SvgPicture.asset(imagePaths.icUndo));
} }
} }
@@ -27,9 +27,9 @@ class MailboxView extends BaseMailboxView {
ThemeUtils.setStatusBarTransparentColor(); ThemeUtils.setStatusBarTransparentColor();
return SafeArea(bottom: false, left: false, right: false, return SafeArea(bottom: false, left: false, right: false,
top: responsiveUtils.isMobile(context), top: controller.responsiveUtils.isMobile(context),
child: ClipRRect( child: ClipRRect(
borderRadius: responsiveUtils.isPortraitMobile(context) borderRadius: controller.responsiveUtils.isPortraitMobile(context)
? const BorderRadius.only( ? const BorderRadius.only(
topRight: Radius.circular(14), topRight: Radius.circular(14),
topLeft: Radius.circular(14)) topLeft: Radius.circular(14))
@@ -88,7 +88,7 @@ class MailboxView extends BaseMailboxView {
final appInformation = controller.mailboxDashBoardController.appInformation.value; final appInformation = controller.mailboxDashBoardController.appInformation.value;
if (appInformation != null if (appInformation != null
&& !controller.isSelectionEnabled()) { && !controller.isSelectionEnabled()) {
if (responsiveUtils.isLandscapeMobile(context)) { if (controller.responsiveUtils.isLandscapeMobile(context)) {
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
return _buildVersionInformation(context, appInformation); return _buildVersionInformation(context, appInformation);
@@ -108,7 +108,7 @@ class MailboxView extends BaseMailboxView {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Padding( Padding(
padding: EdgeInsets.only(top: responsiveUtils.isMobile(context) ? 10 : 30, bottom: 8), padding: EdgeInsets.only(top: controller.responsiveUtils.isMobile(context) ? 10 : 30, bottom: 8),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
@@ -124,7 +124,7 @@ class MailboxView extends BaseMailboxView {
] ]
) )
), ),
if (!responsiveUtils.isTabletLarge(context)) if (!controller.responsiveUtils.isTabletLarge(context))
const Divider(color: AppColor.colorDividerMailbox, height: 1), const Divider(color: AppColor.colorDividerMailbox, height: 1),
] ]
); );
@@ -132,7 +132,7 @@ class MailboxView extends BaseMailboxView {
Widget _buildCloseScreenButton(BuildContext context) { Widget _buildCloseScreenButton(BuildContext context) {
return buildIconWeb( return buildIconWeb(
icon: SvgPicture.asset(imagePaths.icCircleClose, width: 28, height: 28, fit: BoxFit.fill), icon: SvgPicture.asset(controller.imagePaths.icCircleClose, width: 28, height: 28, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).close, tooltip: AppLocalizations.of(context).close,
onTap: () => controller.closeMailboxScreen(context)); onTap: () => controller.closeMailboxScreen(context));
} }
@@ -163,7 +163,7 @@ class MailboxView extends BaseMailboxView {
padding: const EdgeInsets.only(bottom: 16), padding: const EdgeInsets.only(bottom: 16),
child: Column(children: [ child: Column(children: [
Obx(() { Obx(() {
if (controller.isSelectionEnabled() && responsiveUtils.isLandscapeMobile(context)) { if (controller.isSelectionEnabled() && controller.responsiveUtils.isLandscapeMobile(context)) {
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
return UserInformationWidget( return UserInformationWidget(
@@ -180,7 +180,7 @@ class MailboxView extends BaseMailboxView {
}), }),
Obx(() => MailboxLoadingBarWidget(viewState: controller.viewState.value)), Obx(() => MailboxLoadingBarWidget(viewState: controller.viewState.value)),
AppConfig.appGridDashboardAvailable AppConfig.appGridDashboardAvailable
? buildAppGridDashboard(context, responsiveUtils, imagePaths, controller) ? buildAppGridDashboard(context, controller.responsiveUtils, controller.imagePaths, controller)
: const SizedBox.shrink(), : const SizedBox.shrink(),
const SizedBox(height: 8), const SizedBox(height: 8),
Obx(() { Obx(() {
@@ -212,7 +212,7 @@ class MailboxView extends BaseMailboxView {
const SizedBox(height: 12), const SizedBox(height: 12),
Container( Container(
margin: EdgeInsetsDirectional.only( margin: EdgeInsetsDirectional.only(
start: responsiveUtils.isLandscapeMobile(context) ? 0 : 8, start: controller.responsiveUtils.isLandscapeMobile(context) ? 0 : 8,
end: 16), end: 16),
padding: const EdgeInsetsDirectional.only(start: 8), padding: const EdgeInsetsDirectional.only(start: 8),
child: Row( child: Row(
@@ -232,7 +232,7 @@ class MailboxView extends BaseMailboxView {
minSize: 40, minSize: 40,
iconPadding: EdgeInsets.zero, iconPadding: EdgeInsets.zero,
icon: SvgPicture.asset( icon: SvgPicture.asset(
imagePaths.icSearchBar, controller.imagePaths.icSearchBar,
colorFilter: AppColor.colorTextButton.asFilter(), colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill fit: BoxFit.fill
), ),
@@ -245,7 +245,7 @@ class MailboxView extends BaseMailboxView {
iconPadding: EdgeInsets.zero, iconPadding: EdgeInsets.zero,
splashRadius: 15, splashRadius: 15,
icon: SvgPicture.asset( icon: SvgPicture.asset(
imagePaths.icAddNewFolder, controller.imagePaths.icAddNewFolder,
colorFilter: AppColor.colorTextButton.asFilter(), colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).newFolder, tooltip: AppLocalizations.of(context).newFolder,
@@ -285,7 +285,7 @@ class MailboxView extends BaseMailboxView {
return Padding( return Padding(
padding: EdgeInsetsDirectional.only( padding: EdgeInsetsDirectional.only(
start: 4, start: 4,
end: responsiveUtils.isLandscapeMobile(context) ? 8 : 28), end: controller.responsiveUtils.isLandscapeMobile(context) ? 8 : 28),
child: Row(children: [ child: Row(children: [
buildIconWeb( buildIconWeb(
minSize: 40, minSize: 40,
@@ -294,8 +294,8 @@ class MailboxView extends BaseMailboxView {
splashRadius: 15, splashRadius: 15,
icon: SvgPicture.asset( icon: SvgPicture.asset(
categories.getExpandMode(controller.mailboxCategoriesExpandMode.value) == ExpandMode.EXPAND categories.getExpandMode(controller.mailboxCategoriesExpandMode.value) == ExpandMode.EXPAND
? imagePaths.icArrowBottom ? controller.imagePaths.icArrowBottom
: DirectionUtils.isDirectionRTLByLanguage(context) ? imagePaths.icArrowLeft : imagePaths.icArrowRight, : DirectionUtils.isDirectionRTLByLanguage(context) ? controller.imagePaths.icArrowLeft : controller.imagePaths.icArrowRight,
colorFilter: AppColor.primaryColor.asFilter(), colorFilter: AppColor.primaryColor.asFilter(),
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).collapse, tooltip: AppLocalizations.of(context).collapse,
@@ -312,7 +312,7 @@ class MailboxView extends BaseMailboxView {
return Container( return Container(
margin: EdgeInsetsDirectional.only( margin: EdgeInsetsDirectional.only(
start: responsiveUtils.isLandscapeMobile(context) ? 0 : 8, start: controller.responsiveUtils.isLandscapeMobile(context) ? 0 : 8,
end: 16 end: 16
), ),
padding: const EdgeInsetsDirectional.only(start: 12), padding: const EdgeInsetsDirectional.only(start: 12),
@@ -348,7 +348,7 @@ class MailboxView extends BaseMailboxView {
mailboxNode: mailboxNode, mailboxNode: mailboxNode,
selectionMode: controller.currentSelectMode.value, selectionMode: controller.currentSelectMode.value,
mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value, mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value,
onLongPressMailboxNodeAction: (mailboxNode) => openMailboxMenuActionOnMobile(context, imagePaths, mailboxNode.item, controller), onLongPressMailboxNodeAction: (mailboxNode) => openMailboxMenuActionOnMobile(context, controller.imagePaths, mailboxNode.item, controller),
onOpenMailboxFolderClick: (mailboxNode) => controller.openMailbox(context, mailboxNode.item), onOpenMailboxFolderClick: (mailboxNode) => controller.openMailbox(context, mailboxNode.item),
onExpandFolderActionClick: (mailboxNode) => controller.toggleMailboxFolder(mailboxNode, controller.mailboxListScrollController), onExpandFolderActionClick: (mailboxNode) => controller.toggleMailboxFolder(mailboxNode, controller.mailboxListScrollController),
onSelectMailboxFolderClick: (mailboxNode) => controller.selectMailboxNode(mailboxNode), onSelectMailboxFolderClick: (mailboxNode) => controller.selectMailboxNode(mailboxNode),
@@ -360,7 +360,7 @@ class MailboxView extends BaseMailboxView {
mailboxNode: mailboxNode, mailboxNode: mailboxNode,
selectionMode: controller.currentSelectMode.value, selectionMode: controller.currentSelectMode.value,
mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value, mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value,
onLongPressMailboxNodeAction: (mailboxNode) => openMailboxMenuActionOnMobile(context, imagePaths, mailboxNode.item, controller), onLongPressMailboxNodeAction: (mailboxNode) => openMailboxMenuActionOnMobile(context, controller.imagePaths, mailboxNode.item, controller),
onOpenMailboxFolderClick: (mailboxNode) => controller.openMailbox(context, mailboxNode.item), onOpenMailboxFolderClick: (mailboxNode) => controller.openMailbox(context, mailboxNode.item),
onSelectMailboxFolderClick: (mailboxNode) => controller.selectMailboxNode(mailboxNode) onSelectMailboxFolderClick: (mailboxNode) => controller.selectMailboxNode(mailboxNode)
)); ));
@@ -22,25 +22,25 @@ class MailboxView extends BaseMailboxView {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Drawer( return Drawer(
elevation: responsiveUtils.isDesktop(context) ? 0 : 16.0, elevation: controller.responsiveUtils.isDesktop(context) ? 0 : 16.0,
child: Scaffold( child: Scaffold(
backgroundColor: responsiveUtils.isWebDesktop(context) backgroundColor: controller.responsiveUtils.isWebDesktop(context)
? AppColor.colorBgDesktop ? AppColor.colorBgDesktop
: Colors.white, : Colors.white,
body: Column(children: [ body: Column(children: [
if (!responsiveUtils.isDesktop(context)) _buildLogoApp(context), if (!controller.responsiveUtils.isDesktop(context)) _buildLogoApp(context),
if (!responsiveUtils.isDesktop(context)) if (!controller.responsiveUtils.isDesktop(context))
const Divider( const Divider(
color: AppColor.colorDividerMailbox, color: AppColor.colorDividerMailbox,
height: 0.5, height: 0.5,
thickness: 0.2), thickness: 0.2),
Expanded(child: Container( Expanded(child: Container(
padding: EdgeInsetsDirectional.only(start: responsiveUtils.isDesktop(context) ? 16 : 0), padding: EdgeInsetsDirectional.only(start: controller.responsiveUtils.isDesktop(context) ? 16 : 0),
color: responsiveUtils.isDesktop(context) color: controller.responsiveUtils.isDesktop(context)
? AppColor.colorBgDesktop ? AppColor.colorBgDesktop
: Colors.white, : Colors.white,
child: Container( child: Container(
color: responsiveUtils.isDesktop(context) color: controller.responsiveUtils.isDesktop(context)
? AppColor.colorBgDesktop ? AppColor.colorBgDesktop
: Colors.white, : Colors.white,
child: _buildListMailbox(context), child: _buildListMailbox(context),
@@ -56,9 +56,9 @@ class MailboxView extends BaseMailboxView {
return Container( return Container(
color: Colors.white, color: Colors.white,
padding: EdgeInsetsDirectional.only( padding: EdgeInsetsDirectional.only(
top: responsiveUtils.isDesktop(context) ? 25 : 16, top: controller.responsiveUtils.isDesktop(context) ? 25 : 16,
bottom: responsiveUtils.isDesktop(context) ? 25 : 16, bottom: controller.responsiveUtils.isDesktop(context) ? 25 : 16,
start: responsiveUtils.isDesktop(context) ? 32 : 16, start: controller.responsiveUtils.isDesktop(context) ? 32 : 16,
), ),
child: Row(children: [ child: Row(children: [
SloganBuilder( SloganBuilder(
@@ -66,7 +66,7 @@ class MailboxView extends BaseMailboxView {
text: AppLocalizations.of(context).app_name, text: AppLocalizations.of(context).app_name,
textAlign: TextAlign.center, textAlign: TextAlign.center,
textStyle: const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold), textStyle: const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold),
logoSVG: imagePaths.icTMailLogo logoSVG: controller.imagePaths.icTMailLogo
), ),
Obx(() { Obx(() {
if (controller.mailboxDashBoardController.appInformation.value != null) { if (controller.mailboxDashBoardController.appInformation.value != null) {
@@ -98,9 +98,9 @@ class MailboxView extends BaseMailboxView {
controller: controller.mailboxListScrollController, controller: controller.mailboxListScrollController,
key: const PageStorageKey('mailbox_list'), key: const PageStorageKey('mailbox_list'),
physics: const AlwaysScrollableScrollPhysics(), physics: const AlwaysScrollableScrollPhysics(),
padding: EdgeInsetsDirectional.only(end: responsiveUtils.isDesktop(context) ? 16 : 0), padding: EdgeInsetsDirectional.only(end: controller.responsiveUtils.isDesktop(context) ? 16 : 0),
child: Column(children: [ child: Column(children: [
if (!responsiveUtils.isDesktop(context)) if (!controller.responsiveUtils.isDesktop(context))
Obx(() => UserInformationWidget( Obx(() => UserInformationWidget(
userProfile: controller.mailboxDashBoardController.userProfile.value, userProfile: controller.mailboxDashBoardController.userProfile.value,
subtitle: AppLocalizations.of(context).manage_account, subtitle: AppLocalizations.of(context).manage_account,
@@ -113,8 +113,8 @@ class MailboxView extends BaseMailboxView {
), ),
)), )),
Obx(() => MailboxLoadingBarWidget(viewState: controller.viewState.value)), Obx(() => MailboxLoadingBarWidget(viewState: controller.viewState.value)),
AppConfig.appGridDashboardAvailable && responsiveUtils.isWebNotDesktop(context) AppConfig.appGridDashboardAvailable && controller.responsiveUtils.isWebNotDesktop(context)
? buildAppGridDashboard(context, responsiveUtils, imagePaths, controller) ? buildAppGridDashboard(context, controller.responsiveUtils, controller.imagePaths, controller)
: const SizedBox.shrink(), : const SizedBox.shrink(),
const SizedBox(height: 8), const SizedBox(height: 8),
Obx(() { Obx(() {
@@ -133,7 +133,7 @@ class MailboxView extends BaseMailboxView {
const SizedBox(height: 13), const SizedBox(height: 13),
Padding( Padding(
padding: EdgeInsetsDirectional.only( padding: EdgeInsetsDirectional.only(
start: responsiveUtils.isDesktop(context) ? 0 : 12, start: controller.responsiveUtils.isDesktop(context) ? 0 : 12,
bottom: 8 bottom: 8
), ),
child: Row( child: Row(
@@ -148,14 +148,14 @@ class MailboxView extends BaseMailboxView {
) )
)), )),
Padding( Padding(
padding: EdgeInsetsDirectional.only(end: responsiveUtils.isDesktop(context) ? 0 : 12), padding: EdgeInsetsDirectional.only(end: controller.responsiveUtils.isDesktop(context) ? 0 : 12),
child: Row( child: Row(
children: [ children: [
buildIconWeb( buildIconWeb(
minSize: 40, minSize: 40,
iconPadding: EdgeInsets.zero, iconPadding: EdgeInsets.zero,
icon: SvgPicture.asset( icon: SvgPicture.asset(
imagePaths.icSearchBar, controller.imagePaths.icSearchBar,
colorFilter: AppColor.colorTextButton.asFilter(), colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill fit: BoxFit.fill
), ),
@@ -167,7 +167,7 @@ class MailboxView extends BaseMailboxView {
iconPadding: EdgeInsets.zero, iconPadding: EdgeInsets.zero,
splashRadius: 15, splashRadius: 15,
icon: SvgPicture.asset( icon: SvgPicture.asset(
imagePaths.icAddNewFolder, controller.imagePaths.icAddNewFolder,
colorFilter: AppColor.colorTextButton.asFilter(), colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).newFolder, tooltip: AppLocalizations.of(context).newFolder,
@@ -233,8 +233,8 @@ class MailboxView extends BaseMailboxView {
return Container( return Container(
padding: EdgeInsets.only( padding: EdgeInsets.only(
right: responsiveUtils.isDesktop(context) ? 0 : 16, right: controller.responsiveUtils.isDesktop(context) ? 0 : 16,
left: responsiveUtils.isDesktop(context) ? 0 : 16), left: controller.responsiveUtils.isDesktop(context) ? 0 : 16),
child: TreeView( child: TreeView(
key: Key('${categories.keyValue}_mailbox_list'), key: Key('${categories.keyValue}_mailbox_list'),
children: _buildListChildTileWidget( children: _buildListChildTileWidget(
@@ -255,8 +255,8 @@ class MailboxView extends BaseMailboxView {
children: [ children: [
buildHeaderMailboxCategory( buildHeaderMailboxCategory(
context, context,
responsiveUtils, controller.responsiveUtils,
imagePaths, controller.imagePaths,
categories, categories,
controller, controller,
toggleMailboxCategories: controller.toggleMailboxCategories toggleMailboxCategories: controller.toggleMailboxCategories
@@ -295,8 +295,8 @@ class MailboxView extends BaseMailboxView {
onMenuActionClick: (position, mailboxNode) { onMenuActionClick: (position, mailboxNode) {
openMailboxMenuActionOnWeb( openMailboxMenuActionOnWeb(
context, context,
imagePaths, controller.imagePaths,
responsiveUtils, controller.responsiveUtils,
position, position,
mailboxNode.item, mailboxNode.item,
controller controller
@@ -316,8 +316,8 @@ class MailboxView extends BaseMailboxView {
onMenuActionClick: (position, mailboxNode) { onMenuActionClick: (position, mailboxNode) {
openMailboxMenuActionOnWeb( openMailboxMenuActionOnWeb(
context, context,
imagePaths, controller.imagePaths,
responsiveUtils, controller.responsiveUtils,
position, position,
mailboxNode.item, mailboxNode.item,
controller controller
@@ -1,6 +1,4 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/style_utils.dart'; import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/presentation/views/text/text_field_builder.dart'; import 'package:core/presentation/views/text/text_field_builder.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
@@ -19,8 +17,6 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class MailboxCreatorView extends GetWidget<MailboxCreatorController> { class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
final _maxHeight = 656.0; final _maxHeight = 656.0;
final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
@override @override
final controller = Get.find<MailboxCreatorController>(); final controller = Get.find<MailboxCreatorController>();
@@ -38,7 +34,7 @@ class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
borderOnForeground: false, borderOnForeground: false,
color: Colors.transparent, color: Colors.transparent,
child: SafeArea( child: SafeArea(
top: PlatformInfo.isMobile && _responsiveUtils.isPortraitMobile(context), top: PlatformInfo.isMobile && controller.responsiveUtils.isPortraitMobile(context),
bottom: false, bottom: false,
left: false, left: false,
right: false, right: false,
@@ -69,8 +65,8 @@ class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
child: SafeArea( child: SafeArea(
top: false, top: false,
bottom: false, bottom: false,
left: PlatformInfo.isMobile && _responsiveUtils.isLandscapeMobile(context), left: PlatformInfo.isMobile && controller.responsiveUtils.isLandscapeMobile(context),
right: PlatformInfo.isMobile && _responsiveUtils.isLandscapeMobile(context), right: PlatformInfo.isMobile && controller.responsiveUtils.isLandscapeMobile(context),
child: Column(children: [ child: Column(children: [
_buildAppBar(context), _buildAppBar(context),
const Divider(color: AppColor.colorDividerDestinationPicker, height: 1), const Divider(color: AppColor.colorDividerDestinationPicker, height: 1),
@@ -148,7 +144,7 @@ class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
child: Row(children: [ child: Row(children: [
const SizedBox(width: 12), const SizedBox(width: 12),
Obx(() => SvgPicture.asset( Obx(() => SvgPicture.asset(
controller.selectedMailbox.value?.getMailboxIcon(_imagePaths) ?? _imagePaths.icFolderMailbox, controller.selectedMailbox.value?.getMailboxIcon(controller.imagePaths) ?? controller.imagePaths.icFolderMailbox,
width: PlatformInfo.isWeb ? 20 : 24, width: PlatformInfo.isWeb ? 20 : 24,
height: PlatformInfo.isWeb ? 20 : 24, height: PlatformInfo.isWeb ? 20 : 24,
fit: BoxFit.fill)), fit: BoxFit.fill)),
@@ -168,7 +164,9 @@ class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
IconButton( IconButton(
color: AppColor.primaryColor, color: AppColor.primaryColor,
icon: SvgPicture.asset( icon: SvgPicture.asset(
DirectionUtils.isDirectionRTLByLanguage(context) ? _imagePaths.icBack : _imagePaths.icCollapseFolder, DirectionUtils.isDirectionRTLByLanguage(context)
? controller.imagePaths.icBack
: controller.imagePaths.icCollapseFolder,
colorFilter: AppColor.colorCollapseMailbox.asFilter(), colorFilter: AppColor.colorCollapseMailbox.asFilter(),
fit: BoxFit.fill), fit: BoxFit.fill),
onPressed: () => controller.selectMailboxLocation(context)) onPressed: () => controller.selectMailboxLocation(context))
@@ -180,14 +178,14 @@ class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
double _getWidthView(BuildContext context) { double _getWidthView(BuildContext context) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
if (_responsiveUtils.isMobile(context)) { if (controller.responsiveUtils.isMobile(context)) {
return double.infinity; return double.infinity;
} else { } else {
return 556; return 556;
} }
} else { } else {
if (_responsiveUtils.isLandscapeMobile(context) || if (controller.responsiveUtils.isLandscapeMobile(context) ||
_responsiveUtils.isPortraitMobile(context)) { controller.responsiveUtils.isPortraitMobile(context)) {
return double.infinity; return double.infinity;
} else { } else {
return 556; return 556;
@@ -197,21 +195,21 @@ class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
double _getHeightView(BuildContext context) { double _getHeightView(BuildContext context) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
if (_responsiveUtils.isMobile(context)) { if (controller.responsiveUtils.isMobile(context)) {
return double.infinity; return double.infinity;
} else { } else {
if (_responsiveUtils.getSizeScreenHeight(context) > _maxHeight) { if (controller.responsiveUtils.getSizeScreenHeight(context) > _maxHeight) {
return _maxHeight; return _maxHeight;
} else { } else {
return double.infinity; return double.infinity;
} }
} }
} else { } else {
if (_responsiveUtils.isLandscapeMobile(context) || if (controller.responsiveUtils.isLandscapeMobile(context) ||
_responsiveUtils.isPortraitMobile(context)) { controller.responsiveUtils.isPortraitMobile(context)) {
return double.infinity; return double.infinity;
} else { } else {
if (_responsiveUtils.getSizeScreenHeight(context) > _maxHeight) { if (controller.responsiveUtils.getSizeScreenHeight(context) > _maxHeight) {
return _maxHeight; return _maxHeight;
} else { } else {
return double.infinity; return double.infinity;
@@ -223,21 +221,21 @@ class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
EdgeInsets _getMarginView(BuildContext context) { EdgeInsets _getMarginView(BuildContext context) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
if (_responsiveUtils.isMobile(context)) { if (controller.responsiveUtils.isMobile(context)) {
return EdgeInsets.zero; return EdgeInsets.zero;
} else { } else {
if (_responsiveUtils.getSizeScreenHeight(context) > _maxHeight) { if (controller.responsiveUtils.getSizeScreenHeight(context) > _maxHeight) {
return const EdgeInsets.symmetric(vertical: 12); return const EdgeInsets.symmetric(vertical: 12);
} else { } else {
return const EdgeInsets.symmetric(vertical: 50); return const EdgeInsets.symmetric(vertical: 50);
} }
} }
} else { } else {
if (_responsiveUtils.isLandscapeMobile(context) || if (controller.responsiveUtils.isLandscapeMobile(context) ||
_responsiveUtils.isPortraitMobile(context)) { controller.responsiveUtils.isPortraitMobile(context)) {
return EdgeInsets.zero; return EdgeInsets.zero;
} else { } else {
if (_responsiveUtils.getSizeScreenHeight(context) > _maxHeight) { if (controller.responsiveUtils.getSizeScreenHeight(context) > _maxHeight) {
return const EdgeInsets.symmetric(vertical: 12); return const EdgeInsets.symmetric(vertical: 12);
} else { } else {
return const EdgeInsets.symmetric(vertical: 50); return const EdgeInsets.symmetric(vertical: 50);
@@ -247,9 +245,9 @@ class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
} }
BorderRadius _getRadiusView(BuildContext context) { BorderRadius _getRadiusView(BuildContext context) {
if (PlatformInfo.isMobile && _responsiveUtils.isLandscapeMobile(context)) { if (PlatformInfo.isMobile && controller.responsiveUtils.isLandscapeMobile(context)) {
return BorderRadius.zero; return BorderRadius.zero;
} else if (_responsiveUtils.isMobile(context)) { } else if (controller.responsiveUtils.isMobile(context)) {
return const BorderRadius.only( return const BorderRadius.only(
topRight: Radius.circular(16), topRight: Radius.circular(16),
topLeft: Radius.circular(16)); topLeft: Radius.circular(16));
@@ -1,5 +1,3 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
@@ -11,7 +9,4 @@ abstract class BaseMailboxDashBoardView extends GetWidget<MailboxDashBoardContro
with UserSettingPopupMenuMixin, FilterEmailPopupMenuMixin, with UserSettingPopupMenuMixin, FilterEmailPopupMenuMixin,
AppLoaderMixin { AppLoaderMixin {
BaseMailboxDashBoardView({Key? key}) : super(key: key); BaseMailboxDashBoardView({Key? key}) : super(key: key);
final responsiveUtils = Get.find<ResponsiveUtils>();
final imagePaths = Get.find<ImagePaths>();
} }
@@ -27,9 +27,8 @@ import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_int
import 'package:tmail_ui_user/features/email/presentation/controller/email_supervisor_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/controller/email_supervisor_controller.dart';
import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart';
import 'package:tmail_ui_user/features/email/presentation/bindings/email_bindings.dart'; import 'package:tmail_ui_user/features/email/presentation/bindings/email_bindings.dart';
import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart'; import 'package:tmail_ui_user/features/home/domain/repository/session_repository.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; import 'package:tmail_ui_user/features/home/domain/usecases/store_session_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.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/datasource_impl/mailbox_cache_datasource_impl.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart';
@@ -93,8 +92,6 @@ import 'package:tmail_ui_user/features/sending_queue/domain/usecases/update_send
import 'package:tmail_ui_user/features/sending_queue/presentation/bindings/sending_queue_bindings.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/bindings/sending_queue_bindings.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/bindings/sending_queue_interactor_bindings.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/bindings/sending_queue_interactor_bindings.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/sending_queue_controller.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/sending_queue_controller.dart';
import 'package:tmail_ui_user/features/session/domain/repository/session_repository.dart';
import 'package:tmail_ui_user/features/session/domain/usecases/store_session_interactor.dart';
import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart'; import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart';
import 'package:tmail_ui_user/features/thread/data/datasource_impl/local_thread_datasource_impl.dart'; import 'package:tmail_ui_user/features/thread/data/datasource_impl/local_thread_datasource_impl.dart';
import 'package:tmail_ui_user/features/thread/data/datasource_impl/thread_datasource_impl.dart'; import 'package:tmail_ui_user/features/thread/data/datasource_impl/thread_datasource_impl.dart';
@@ -147,8 +144,6 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.find<GetSpamMailboxCachedInteractor>())); Get.find<GetSpamMailboxCachedInteractor>()));
Get.put(MailboxDashBoardController( Get.put(MailboxDashBoardController(
Get.find<GetAuthenticatedAccountInteractor>(),
Get.find<UpdateAuthenticationAccountInteractor>(),
Get.find<MoveToMailboxInteractor>(), Get.find<MoveToMailboxInteractor>(),
Get.find<DeleteEmailPermanentlyInteractor>(), Get.find<DeleteEmailPermanentlyInteractor>(),
Get.find<MarkAsMailboxReadInteractor>(), Get.find<MarkAsMailboxReadInteractor>(),
@@ -288,7 +283,6 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.lazyPut(() => GetEmailByIdInteractor( Get.lazyPut(() => GetEmailByIdInteractor(
Get.find<ThreadRepository>(), Get.find<ThreadRepository>(),
Get.find<EmailRepository>())); Get.find<EmailRepository>()));
Get.lazyPut(() => UpdateAuthenticationAccountInteractor(Get.find<AccountRepository>()));
Get.lazyPut(() => StoreSpamReportInteractor( Get.lazyPut(() => StoreSpamReportInteractor(
Get.find<SpamReportRepository>())); Get.find<SpamReportRepository>()));
Get.lazyPut(() => GetUnreadSpamMailboxInteractor( Get.lazyPut(() => GetUnreadSpamMailboxInteractor(
@@ -57,8 +57,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_int
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.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/email/presentation/utils/email_utils.dart'; import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; import 'package:tmail_ui_user/features/home/domain/usecases/store_session_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/mark_as_mailbox_read_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/mark_as_mailbox_read_interactor.dart';
@@ -118,7 +117,6 @@ import 'package:tmail_ui_user/features/sending_queue/domain/usecases/get_all_sen
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/store_sending_email_interactor.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/usecases/store_sending_email_interactor.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/update_sending_email_interactor.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/usecases/update_sending_email_interactor.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_arguments.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_arguments.dart';
import 'package:tmail_ui_user/features/session/domain/usecases/store_session_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.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';
import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart';
@@ -143,22 +141,17 @@ import 'package:tmail_ui_user/main/routes/navigation_router.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/routes/route_utils.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart'; import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
import 'package:uuid/uuid.dart';
import 'package:workmanager/workmanager.dart' as work_manager; import 'package:workmanager/workmanager.dart' as work_manager;
class MailboxDashBoardController extends ReloadableController { class MailboxDashBoardController extends ReloadableController {
final AppToast _appToast = Get.find<AppToast>();
final ImagePaths _imagePaths = Get.find<ImagePaths>();
final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find<RemoveEmailDraftsInteractor>(); final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find<RemoveEmailDraftsInteractor>();
final ResponsiveUtils _responsiveUtils = Get.find<ResponsiveUtils>();
final EmailReceiveManager _emailReceiveManager = Get.find<EmailReceiveManager>(); final EmailReceiveManager _emailReceiveManager = Get.find<EmailReceiveManager>();
final search.SearchController searchController = Get.find<search.SearchController>(); final search.SearchController searchController = Get.find<search.SearchController>();
final DownloadController downloadController = Get.find<DownloadController>(); final DownloadController downloadController = Get.find<DownloadController>();
final AppGridDashboardController appGridDashboardController = Get.find<AppGridDashboardController>(); final AppGridDashboardController appGridDashboardController = Get.find<AppGridDashboardController>();
final SpamReportController spamReportController = Get.find<SpamReportController>(); final SpamReportController spamReportController = Get.find<SpamReportController>();
final NetworkConnectionController networkConnectionController = Get.find<NetworkConnectionController>(); final NetworkConnectionController networkConnectionController = Get.find<NetworkConnectionController>();
final Uuid _uuid = Get.find<Uuid>();
final MoveToMailboxInteractor _moveToMailboxInteractor; final MoveToMailboxInteractor _moveToMailboxInteractor;
final DeleteEmailPermanentlyInteractor _deleteEmailPermanentlyInteractor; final DeleteEmailPermanentlyInteractor _deleteEmailPermanentlyInteractor;
@@ -237,8 +230,6 @@ class MailboxDashBoardController extends ReloadableController {
final _fcmService = FcmService.instance; final _fcmService = FcmService.instance;
MailboxDashBoardController( MailboxDashBoardController(
GetAuthenticatedAccountInteractor getAuthenticatedAccountInteractor,
UpdateAuthenticationAccountInteractor updateAuthenticationAccountInteractor,
this._moveToMailboxInteractor, this._moveToMailboxInteractor,
this._deleteEmailPermanentlyInteractor, this._deleteEmailPermanentlyInteractor,
this._markAsMailboxReadInteractor, this._markAsMailboxReadInteractor,
@@ -260,9 +251,6 @@ class MailboxDashBoardController extends ReloadableController {
this._saveEmailAsDraftsInteractor, this._saveEmailAsDraftsInteractor,
this._updateEmailDraftsInteractor, this._updateEmailDraftsInteractor,
this._deleteSendingEmailInteractor, this._deleteSendingEmailInteractor,
) : super(
getAuthenticatedAccountInteractor,
updateAuthenticationAccountInteractor
); );
@override @override
@@ -297,10 +285,10 @@ class MailboxDashBoardController extends ReloadableController {
super.handleSuccessViewState(success); super.handleSuccessViewState(success);
if (success is SendEmailLoading) { if (success is SendEmailLoading) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).your_email_being_sent, AppLocalizations.of(currentContext!).your_email_being_sent,
leadingSVGIcon: _imagePaths.icSendToast); leadingSVGIcon: imagePaths.icSendToast);
} }
} else if (success is GetEmailStateToRefreshSuccess) { } else if (success is GetEmailStateToRefreshSuccess) {
dispatchEmailUIAction(RefreshChangeEmailAction(success.storedState)); dispatchEmailUIAction(RefreshChangeEmailAction(success.storedState));
@@ -607,7 +595,7 @@ class MailboxDashBoardController extends ReloadableController {
} }
void hideMailboxMenuWhenScreenSizeChange(BuildContext context) { void hideMailboxMenuWhenScreenSizeChange(BuildContext context) {
if (isDrawerOpen && _responsiveUtils.isWebDesktop(context)) { if (isDrawerOpen && responsiveUtils.isWebDesktop(context)) {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
closeMailboxMenuDrawer(); closeMailboxMenuDrawer();
}); });
@@ -635,7 +623,7 @@ class MailboxDashBoardController extends ReloadableController {
bool _searchInsideEmailDetailedViewIsActive(BuildContext context) { bool _searchInsideEmailDetailedViewIsActive(BuildContext context) {
return PlatformInfo.isWeb return PlatformInfo.isWeb
&& _responsiveUtils.isDesktop(context) && responsiveUtils.isDesktop(context)
&& dashboardRoute.value == DashboardRoutes.emailDetailed; && dashboardRoute.value == DashboardRoutes.emailDetailed;
} }
@@ -656,16 +644,16 @@ class MailboxDashBoardController extends ReloadableController {
void _saveEmailAsDraftsSuccess(SaveEmailAsDraftsSuccess success) { void _saveEmailAsDraftsSuccess(SaveEmailAsDraftsSuccess success) {
if (currentContext != null && currentOverlayContext != null) { if (currentContext != null && currentOverlayContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).drafts_saved, AppLocalizations.of(currentContext!).drafts_saved,
actionName: AppLocalizations.of(currentContext!).discard, actionName: AppLocalizations.of(currentContext!).discard,
onActionClick: () => _discardEmail(success.emailAsDrafts), onActionClick: () => _discardEmail(success.emailAsDrafts),
leadingSVGIcon: _imagePaths.icMailboxDrafts, leadingSVGIcon: imagePaths.icMailboxDrafts,
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
backgroundColor: AppColor.toastSuccessBackgroundColor, backgroundColor: AppColor.toastSuccessBackgroundColor,
textColor: Colors.white, textColor: Colors.white,
actionIcon: SvgPicture.asset(_imagePaths.icUndo)); actionIcon: SvgPicture.asset(imagePaths.icUndo));
} }
} }
@@ -675,7 +663,7 @@ class MailboxDashBoardController extends ReloadableController {
void _moveToMailboxSuccess(MoveToMailboxSuccess success) { void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) { if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
success.emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: success.destinationPath), success.emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: success.destinationPath),
actionName: AppLocalizations.of(currentContext!).undo, actionName: AppLocalizations.of(currentContext!).undo,
@@ -687,11 +675,11 @@ class MailboxDashBoardController extends ReloadableController {
success.emailActionType success.emailActionType
)); ));
}, },
leadingSVGIcon: _imagePaths.icFolderMailbox, leadingSVGIcon: imagePaths.icFolderMailbox,
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
backgroundColor: AppColor.toastSuccessBackgroundColor, backgroundColor: AppColor.toastSuccessBackgroundColor,
textColor: Colors.white, textColor: Colors.white,
actionIcon: SvgPicture.asset(_imagePaths.icUndo)); actionIcon: SvgPicture.asset(imagePaths.icUndo));
} }
} }
@@ -721,10 +709,10 @@ class MailboxDashBoardController extends ReloadableController {
void _deleteEmailPermanentlySuccess(DeleteEmailPermanentlySuccess success) { void _deleteEmailPermanentlySuccess(DeleteEmailPermanentlySuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toast_message_delete_a_email_permanently_success, AppLocalizations.of(currentContext!).toast_message_delete_a_email_permanently_success,
leadingSVGIcon: _imagePaths.icDeleteToast leadingSVGIcon: imagePaths.icDeleteToast
); );
} }
} }
@@ -778,12 +766,12 @@ class MailboxDashBoardController extends ReloadableController {
? AppLocalizations.of(currentContext!).marked_message_toast(AppLocalizations.of(currentContext!).unread) ? AppLocalizations.of(currentContext!).marked_message_toast(AppLocalizations.of(currentContext!).unread)
: AppLocalizations.of(currentContext!).marked_message_toast(AppLocalizations.of(currentContext!).read); : AppLocalizations.of(currentContext!).marked_message_toast(AppLocalizations.of(currentContext!).read);
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
message, message,
leadingSVGIcon: readActions == ReadActions.markAsUnread leadingSVGIcon: readActions == ReadActions.markAsUnread
? _imagePaths.icUnreadToast ? imagePaths.icUnreadToast
: _imagePaths.icReadToast : imagePaths.icReadToast
); );
} }
} }
@@ -806,17 +794,17 @@ class MailboxDashBoardController extends ReloadableController {
final undoAction = readActions == ReadActions.markAsUnread ? ReadActions.markAsRead : ReadActions.markAsUnread; final undoAction = readActions == ReadActions.markAsUnread ? ReadActions.markAsRead : ReadActions.markAsUnread;
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
message, message,
actionName: AppLocalizations.of(currentContext!).undo, actionName: AppLocalizations.of(currentContext!).undo,
onActionClick: () { onActionClick: () {
markAsEmailRead(presentationEmail!, undoAction, MarkReadAction.undo); markAsEmailRead(presentationEmail!, undoAction, MarkReadAction.undo);
}, },
leadingSVGIcon: _imagePaths.icToastSuccessMessage, leadingSVGIcon: imagePaths.icToastSuccessMessage,
backgroundColor: AppColor.toastSuccessBackgroundColor, backgroundColor: AppColor.toastSuccessBackgroundColor,
textColor: Colors.white, textColor: Colors.white,
actionIcon: SvgPicture.asset(_imagePaths.icUndo), actionIcon: SvgPicture.asset(imagePaths.icUndo),
); );
} }
} }
@@ -852,12 +840,12 @@ class MailboxDashBoardController extends ReloadableController {
: AppLocalizations.of(currentContext!).marked_star_multiple_item(countMarkStarSuccess); : AppLocalizations.of(currentContext!).marked_star_multiple_item(countMarkStarSuccess);
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
message, message,
leadingSVGIcon: markStarAction == MarkStarAction.unMarkStar leadingSVGIcon: markStarAction == MarkStarAction.unMarkStar
? _imagePaths.icUnStar ? imagePaths.icUnStar
: _imagePaths.icStar); : imagePaths.icStar);
} }
} }
} }
@@ -1037,7 +1025,7 @@ class MailboxDashBoardController extends ReloadableController {
currentOverlayContext != null && currentOverlayContext != null &&
emailActionType != null && emailActionType != null &&
moveAction == MoveAction.moving) { moveAction == MoveAction.moving) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
emailActionType.getToastMessageMoveToMailboxSuccess( emailActionType.getToastMessageMoveToMailboxSuccess(
currentContext!, currentContext!,
@@ -1057,10 +1045,10 @@ class MailboxDashBoardController extends ReloadableController {
} }
}, },
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
leadingSVGIcon: _imagePaths.icFolderMailbox, leadingSVGIcon: imagePaths.icFolderMailbox,
backgroundColor: AppColor.toastSuccessBackgroundColor, backgroundColor: AppColor.toastSuccessBackgroundColor,
textColor: Colors.white, textColor: Colors.white,
actionIcon: SvgPicture.asset(_imagePaths.icUndo), actionIcon: SvgPicture.asset(imagePaths.icUndo),
); );
} }
} }
@@ -1129,7 +1117,7 @@ class MailboxDashBoardController extends ReloadableController {
Function? onCancelSelectionEmail, Function? onCancelSelectionEmail,
} }
) { ) {
if (_responsiveUtils.isScreenWithShortestSide(context)) { if (responsiveUtils.isScreenWithShortestSide(context)) {
(ConfirmationDialogActionSheetBuilder(context) (ConfirmationDialogActionSheetBuilder(context)
..messageText(actionType.getContentDialog( ..messageText(actionType.getContentDialog(
context, context,
@@ -1147,14 +1135,14 @@ class MailboxDashBoardController extends ReloadableController {
showDialog( showDialog(
context: context, context: context,
barrierColor: AppColor.colorDefaultCupertinoActionSheet, barrierColor: AppColor.colorDefaultCupertinoActionSheet,
builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths) builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(imagePaths)
..key(const Key('confirm_dialog_delete_emails_permanently')) ..key(const Key('confirm_dialog_delete_emails_permanently'))
..title(actionType.getTitleDialog(context)) ..title(actionType.getTitleDialog(context))
..content(actionType.getContentDialog( ..content(actionType.getContentDialog(
context, context,
count: listEmails?.length, count: listEmails?.length,
mailboxName: mailboxCurrent?.getDisplayName(context))) mailboxName: mailboxCurrent?.getDisplayName(context)))
..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog, fit: BoxFit.fill)) ..addIcon(SvgPicture.asset(imagePaths.icRemoveDialog, fit: BoxFit.fill))
..colorConfirmButton(AppColor.colorConfirmActionDialog) ..colorConfirmButton(AppColor.colorConfirmActionDialog)
..styleTextConfirmButton(const TextStyle( ..styleTextConfirmButton(const TextStyle(
fontSize: 17, fontSize: 17,
@@ -1202,7 +1190,7 @@ class MailboxDashBoardController extends ReloadableController {
void _emptyTrashFolderSuccess(EmptyTrashFolderSuccess success) { void _emptyTrashFolderSuccess(EmptyTrashFolderSuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toast_message_empty_trash_folder_success); AppLocalizations.of(currentContext!).toast_message_empty_trash_folder_success);
} }
@@ -1228,7 +1216,7 @@ class MailboxDashBoardController extends ReloadableController {
} }
if (currentOverlayContext != null && currentContext != null && listEmailIdResult.isNotEmpty) { if (currentOverlayContext != null && currentContext != null && listEmailIdResult.isNotEmpty) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toast_message_delete_multiple_email_permanently_success(listEmailIdResult.length)); AppLocalizations.of(currentContext!).toast_message_delete_multiple_email_permanently_success(listEmailIdResult.length));
} }
@@ -1348,17 +1336,17 @@ class MailboxDashBoardController extends ReloadableController {
if (success is MarkAsMailboxReadAllSuccess) { if (success is MarkAsMailboxReadAllSuccess) {
if (currentContext != null && currentOverlayContext != null) { if (currentContext != null && currentOverlayContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toastMessageMarkAsMailboxReadSuccess(success.mailboxDisplayName), AppLocalizations.of(currentContext!).toastMessageMarkAsMailboxReadSuccess(success.mailboxDisplayName),
leadingSVGIcon: _imagePaths.icReadToast); leadingSVGIcon: imagePaths.icReadToast);
} }
} else if (success is MarkAsMailboxReadHasSomeEmailFailure) { } else if (success is MarkAsMailboxReadHasSomeEmailFailure) {
if (currentContext != null && currentOverlayContext != null) { if (currentContext != null && currentOverlayContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toastMessageMarkAsMailboxReadHasSomeEmailFailure(success.mailboxDisplayName, success.countEmailsRead), AppLocalizations.of(currentContext!).toastMessageMarkAsMailboxReadHasSomeEmailFailure(success.mailboxDisplayName, success.countEmailsRead),
leadingSVGIcon: _imagePaths.icReadToast); leadingSVGIcon: imagePaths.icReadToast);
} }
} }
} }
@@ -1366,7 +1354,7 @@ class MailboxDashBoardController extends ReloadableController {
void _markAsReadMailboxFailure(MarkAsMailboxReadFailure failure) { void _markAsReadMailboxFailure(MarkAsMailboxReadFailure failure) {
viewStateMarkAsReadMailbox.value = Right(UIState.idle); viewStateMarkAsReadMailbox.value = Right(UIState.idle);
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toastMessageMarkAsReadFolderFailureWithReason( AppLocalizations.of(currentContext!).toastMessageMarkAsReadFolderFailureWithReason(
failure.mailboxDisplayName, failure.mailboxDisplayName,
@@ -1379,7 +1367,7 @@ class MailboxDashBoardController extends ReloadableController {
void _markAsReadMailboxAllFailure(MarkAsMailboxReadAllFailure failure) { void _markAsReadMailboxAllFailure(MarkAsMailboxReadAllFailure failure) {
viewStateMarkAsReadMailbox.value = Right(UIState.idle); viewStateMarkAsReadMailbox.value = Right(UIState.idle);
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toastMessageMarkAsReadFolderAllFailure(failure.mailboxDisplayName) AppLocalizations.of(currentContext!).toastMessageMarkAsReadFolderAllFailure(failure.mailboxDisplayName)
); );
@@ -1487,7 +1475,7 @@ class MailboxDashBoardController extends ReloadableController {
void _handleUpdateVacationSuccess(UpdateVacationSuccess success) { void _handleUpdateVacationSuccess(UpdateVacationSuccess success) {
if (success.listVacationResponse.isNotEmpty) { if (success.listVacationResponse.isNotEmpty) {
if (currentContext != null && currentOverlayContext != null) { if (currentContext != null && currentOverlayContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).yourVacationResponderIsDisabledSuccessfully); AppLocalizations.of(currentContext!).yourVacationResponderIsDisabledSuccessfully);
} }
@@ -1547,7 +1535,7 @@ class MailboxDashBoardController extends ReloadableController {
selectedMailbox.value!.isTrash && selectedMailbox.value!.isTrash &&
selectedMailbox.value!.countTotalEmails > 0 && selectedMailbox.value!.countTotalEmails > 0 &&
!searchController.isSearchActive() && !searchController.isSearchActive() &&
_responsiveUtils.isWebDesktop(context); responsiveUtils.isWebDesktop(context);
} }
bool isEmptyTrashBannerEnabledOnMobile(BuildContext context) { bool isEmptyTrashBannerEnabledOnMobile(BuildContext context) {
@@ -1555,7 +1543,7 @@ class MailboxDashBoardController extends ReloadableController {
selectedMailbox.value!.isTrash && selectedMailbox.value!.isTrash &&
selectedMailbox.value!.countTotalEmails > 0 && selectedMailbox.value!.countTotalEmails > 0 &&
!searchController.isSearchActive() && !searchController.isSearchActive() &&
!_responsiveUtils.isWebDesktop(context); !responsiveUtils.isWebDesktop(context);
} }
void emptyTrashAction(BuildContext context) { void emptyTrashAction(BuildContext context) {
@@ -1795,10 +1783,10 @@ class MailboxDashBoardController extends ReloadableController {
void _showToastSendMessageFailure(String message) { void _showToastSendMessageFailure(String message) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
message, message,
leadingSVGIcon: _imagePaths.icSendSuccessToast); leadingSVGIcon: imagePaths.icSendSuccessToast);
} }
} }
@@ -1880,7 +1868,7 @@ class MailboxDashBoardController extends ReloadableController {
CreateNewMailboxRequest? mailboxRequest, CreateNewMailboxRequest? mailboxRequest,
) { ) {
log('MailboxDashBoardController::_handleStoreSendingEmail:'); log('MailboxDashBoardController::_handleStoreSendingEmail:');
final sendingEmail = emailRequest.toSendingEmail(_uuid.v1(), mailboxRequest: mailboxRequest); final sendingEmail = emailRequest.toSendingEmail(uuid.v1(), mailboxRequest: mailboxRequest);
consumeState(_storeSendingEmailInteractor.execute( consumeState(_storeSendingEmailInteractor.execute(
accountId, accountId,
session.username, session.username,
@@ -1920,11 +1908,11 @@ class MailboxDashBoardController extends ReloadableController {
} }
getAllSendingEmails(); getAllSendingEmails();
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).messageHasBeenSavedToTheSendingQueue, AppLocalizations.of(currentContext!).messageHasBeenSavedToTheSendingQueue,
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
leadingSVGIcon: _imagePaths.icEmail); leadingSVGIcon: imagePaths.icEmail);
} }
} }
@@ -1998,7 +1986,7 @@ class MailboxDashBoardController extends ReloadableController {
void _emptySpamFolderSuccess(EmptySpamFolderSuccess success) { void _emptySpamFolderSuccess(EmptySpamFolderSuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toast_message_empty_trash_folder_success); AppLocalizations.of(currentContext!).toast_message_empty_trash_folder_success);
} }
@@ -2009,7 +1997,7 @@ class MailboxDashBoardController extends ReloadableController {
selectedMailbox.value!.isSpam && selectedMailbox.value!.isSpam &&
selectedMailbox.value!.countTotalEmails > 0 && selectedMailbox.value!.countTotalEmails > 0 &&
!searchController.isSearchActive() && !searchController.isSearchActive() &&
_responsiveUtils.isWebDesktop(context); responsiveUtils.isWebDesktop(context);
} }
bool isEmptySpamBannerEnabledOnMobile(BuildContext context) { bool isEmptySpamBannerEnabledOnMobile(BuildContext context) {
@@ -2017,7 +2005,7 @@ class MailboxDashBoardController extends ReloadableController {
selectedMailbox.value!.isSpam && selectedMailbox.value!.isSpam &&
selectedMailbox.value!.countTotalEmails > 0 && selectedMailbox.value!.countTotalEmails > 0 &&
!searchController.isSearchActive() && !searchController.isSearchActive() &&
!_responsiveUtils.isWebDesktop(context); !responsiveUtils.isWebDesktop(context);
} }
void openDialogEmptySpamFolder(BuildContext context) { void openDialogEmptySpamFolder(BuildContext context) {
@@ -2027,7 +2015,7 @@ class MailboxDashBoardController extends ReloadableController {
return; return;
} }
if (_responsiveUtils.isScreenWithShortestSide(context)) { if (responsiveUtils.isScreenWithShortestSide(context)) {
(ConfirmationDialogActionSheetBuilder(context) (ConfirmationDialogActionSheetBuilder(context)
..messageText(AppLocalizations.of(context).emptySpamMessageDialog) ..messageText(AppLocalizations.of(context).emptySpamMessageDialog)
..onCancelAction(AppLocalizations.of(context).cancel, popBack) ..onCancelAction(AppLocalizations.of(context).cancel, popBack)
@@ -2036,7 +2024,7 @@ class MailboxDashBoardController extends ReloadableController {
if (spamMailbox.countTotalEmails > 0) { if (spamMailbox.countTotalEmails > 0) {
emptySpamFolderAction(spamFolderId: spamMailbox.id); emptySpamFolderAction(spamFolderId: spamMailbox.id);
} else { } else {
_appToast.showToastWarningMessage( appToast.showToastWarningMessage(
context, context,
AppLocalizations.of(context).noEmailInYourCurrentFolder AppLocalizations.of(context).noEmailInYourCurrentFolder
); );
@@ -2047,11 +2035,11 @@ class MailboxDashBoardController extends ReloadableController {
showDialog( showDialog(
context: context, context: context,
barrierColor: AppColor.colorDefaultCupertinoActionSheet, barrierColor: AppColor.colorDefaultCupertinoActionSheet,
builder: (context) => PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths) builder: (context) => PointerInterceptor(child: (ConfirmDialogBuilder(imagePaths)
..key(const Key('confirm_dialog_empty_spam')) ..key(const Key('confirm_dialog_empty_spam'))
..title(AppLocalizations.of(context).emptySpamFolder) ..title(AppLocalizations.of(context).emptySpamFolder)
..content(AppLocalizations.of(context).emptySpamMessageDialog) ..content(AppLocalizations.of(context).emptySpamMessageDialog)
..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog, fit: BoxFit.fill)) ..addIcon(SvgPicture.asset(imagePaths.icRemoveDialog, fit: BoxFit.fill))
..colorConfirmButton(AppColor.colorConfirmActionDialog) ..colorConfirmButton(AppColor.colorConfirmActionDialog)
..styleTextConfirmButton(const TextStyle( ..styleTextConfirmButton(const TextStyle(
fontSize: 17, fontSize: 17,
@@ -2063,7 +2051,7 @@ class MailboxDashBoardController extends ReloadableController {
if (spamMailbox.countTotalEmails > 0) { if (spamMailbox.countTotalEmails > 0) {
emptySpamFolderAction(spamFolderId: spamMailbox.id); emptySpamFolderAction(spamFolderId: spamMailbox.id);
} else { } else {
_appToast.showToastWarningMessage( appToast.showToastWarningMessage(
context, context,
AppLocalizations.of(context).noEmailInYourCurrentFolder AppLocalizations.of(context).noEmailInYourCurrentFolder
); );
@@ -2146,10 +2134,10 @@ class MailboxDashBoardController extends ReloadableController {
)); ));
} }
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).message_has_been_sent_successfully, AppLocalizations.of(currentContext!).message_has_been_sent_successfully,
leadingSVGIcon: _imagePaths.icSendSuccessToast leadingSVGIcon: imagePaths.icSendSuccessToast
); );
} }
} }
@@ -26,34 +26,34 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
width: ResponsiveUtils.defaultSizeLeftMenuMobile, width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: _buildScaffoldHaveDrawer(body: ThreadView())), child: _buildScaffoldHaveDrawer(body: ThreadView())),
const VerticalDivider(color: AppColor.lineItemListColor, width: 12), const VerticalDivider(color: AppColor.lineItemListColor, width: 12),
Expanded(child: EmailView()), const Expanded(child: EmailView()),
], ],
); );
return FocusDetector( return FocusDetector(
onForegroundGained: controller.handleOnForegroundGained, onForegroundGained: controller.handleOnForegroundGained,
child: Scaffold( child: Scaffold(
drawerEnableOpenDragGesture: responsiveUtils.hasLeftMenuDrawerActive(context), drawerEnableOpenDragGesture: controller.responsiveUtils.hasLeftMenuDrawerActive(context),
body: Obx(() { body: Obx(() {
var bodyView = controller.searchController.isSearchEmailRunning var bodyView = controller.searchController.isSearchEmailRunning
? EmailView() ? const EmailView()
: bodyLandscapeTablet; : bodyLandscapeTablet;
switch(controller.dashboardRoute.value) { switch(controller.dashboardRoute.value) {
case DashboardRoutes.thread: case DashboardRoutes.thread:
return ResponsiveWidget( return ResponsiveWidget(
responsiveUtils: responsiveUtils, responsiveUtils: controller.responsiveUtils,
desktop: bodyView, desktop: bodyView,
tabletLarge: bodyView, tabletLarge: bodyView,
landscapeTablet: bodyView, landscapeTablet: bodyView,
mobile: _buildScaffoldHaveDrawer(body: ThreadView())); mobile: _buildScaffoldHaveDrawer(body: ThreadView()));
case DashboardRoutes.emailDetailed: case DashboardRoutes.emailDetailed:
return ResponsiveWidget( return ResponsiveWidget(
responsiveUtils: responsiveUtils, responsiveUtils: controller.responsiveUtils,
desktop: bodyView, desktop: bodyView,
tabletLarge: bodyView, tabletLarge: bodyView,
landscapeTablet: bodyView, landscapeTablet: bodyView,
mobile: EmailView()); mobile: const EmailView());
case DashboardRoutes.searchEmail: case DashboardRoutes.searchEmail:
return SafeArea(child: SearchEmailView()); return SafeArea(child: SearchEmailView());
case DashboardRoutes.sendingQueue: case DashboardRoutes.sendingQueue:
@@ -64,11 +64,11 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
width: ResponsiveUtils.defaultSizeLeftMenuMobile, width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: _buildScaffoldHaveDrawer(body: const SendingQueueView())), child: _buildScaffoldHaveDrawer(body: const SendingQueueView())),
const VerticalDivider(color: AppColor.lineItemListColor, width: 12), const VerticalDivider(color: AppColor.lineItemListColor, width: 12),
Expanded(child: EmailView()), const Expanded(child: EmailView()),
], ],
); );
return ResponsiveWidget( return ResponsiveWidget(
responsiveUtils: responsiveUtils, responsiveUtils: controller.responsiveUtils,
desktop: bodyView, desktop: bodyView,
tabletLarge: bodyView, tabletLarge: bodyView,
landscapeTablet: bodyView, landscapeTablet: bodyView,
@@ -81,7 +81,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
child: CupertinoActivityIndicator(color: AppColor.colorLoading))); child: CupertinoActivityIndicator(color: AppColor.colorLoading)));
default: default:
return ResponsiveWidget( return ResponsiveWidget(
responsiveUtils: responsiveUtils, responsiveUtils: controller.responsiveUtils,
desktop: bodyView, desktop: bodyView,
tabletLarge: bodyView, tabletLarge: bodyView,
landscapeTablet: bodyView, landscapeTablet: bodyView,
@@ -97,7 +97,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
key: controller.scaffoldKey, key: controller.scaffoldKey,
body: body, body: body,
drawer: ResponsiveWidget( drawer: ResponsiveWidget(
responsiveUtils: responsiveUtils, responsiveUtils: controller.responsiveUtils,
mobile: SizedBox( mobile: SizedBox(
width: double.infinity, width: double.infinity,
child: MailboxView() child: MailboxView()
@@ -50,7 +50,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
return Portal( return Portal(
child: Stack(children: [ child: Stack(children: [
ResponsiveWidget( ResponsiveWidget(
responsiveUtils: responsiveUtils, responsiveUtils: controller.responsiveUtils,
desktop: Scaffold( desktop: Scaffold(
body: GestureDetector( body: GestureDetector(
onTap: () => FocusScope.of(context).unfocus(), onTap: () => FocusScope.of(context).unfocus(),
@@ -73,7 +73,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
text: AppLocalizations.of(context).app_name, text: AppLocalizations.of(context).app_name,
textAlign: TextAlign.center, textAlign: TextAlign.center,
textStyle: const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold), textStyle: const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold),
logoSVG: imagePaths.icTMailLogo, logoSVG: controller.imagePaths.icTMailLogo,
onTapCallback: controller.redirectToInboxAction, onTapCallback: controller.redirectToInboxAction,
), ),
Obx(() { Obx(() {
@@ -160,7 +160,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
case DashboardRoutes.thread: case DashboardRoutes.thread:
return _buildThreadViewForWebDesktop(context); return _buildThreadViewForWebDesktop(context);
case DashboardRoutes.emailDetailed: case DashboardRoutes.emailDetailed:
return EmailView(); return const EmailView();
default: default:
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
@@ -177,7 +177,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
return SearchEmailView(); return SearchEmailView();
case DashboardRoutes.emailDetailed: case DashboardRoutes.emailDetailed:
return controller.searchController.isSearchEmailRunning return controller.searchController.isSearchEmailRunning
? EmailView() ? const EmailView()
: _buildScaffoldHaveDrawer( : _buildScaffoldHaveDrawer(
body: Row( body: Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@@ -186,7 +186,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
width: ResponsiveUtils.defaultSizeLeftMenuMobile, width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: ThreadView()), child: ThreadView()),
const VerticalDivider(color: AppColor.lineItemListColor, width: 12), const VerticalDivider(color: AppColor.lineItemListColor, width: 12),
Expanded(child: EmailView()), const Expanded(child: EmailView()),
], ],
), ),
); );
@@ -199,7 +199,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
width: ResponsiveUtils.defaultSizeLeftMenuMobile, width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: ThreadView()), child: ThreadView()),
const VerticalDivider(color: AppColor.lineItemListColor, width: 12), const VerticalDivider(color: AppColor.lineItemListColor, width: 12),
Expanded(child: EmailView()), const Expanded(child: EmailView()),
], ],
), ),
); );
@@ -210,7 +210,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
case DashboardRoutes.thread: case DashboardRoutes.thread:
return _buildScaffoldHaveDrawer(body: ThreadView()); return _buildScaffoldHaveDrawer(body: ThreadView());
case DashboardRoutes.emailDetailed: case DashboardRoutes.emailDetailed:
return EmailView(); return const EmailView();
case DashboardRoutes.searchEmail: case DashboardRoutes.searchEmail:
return SearchEmailView(); return SearchEmailView();
default: default:
@@ -219,10 +219,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
}), }),
), ),
Obx(() => controller.composerOverlayState.value == ComposerOverlayState.active Obx(() => controller.composerOverlayState.value == ComposerOverlayState.active
? ComposerView() ? const ComposerView()
: const SizedBox.shrink() : const SizedBox.shrink()
), ),
Obx(() => controller.searchMailboxActivated.value == true && !responsiveUtils.isWebDesktop(context) Obx(() => controller.searchMailboxActivated.value == true && !controller.responsiveUtils.isWebDesktop(context)
? const SearchMailboxView() ? const SearchMailboxView()
: const SizedBox.shrink() : const SizedBox.shrink()
), ),
@@ -235,7 +235,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
return Scaffold( return Scaffold(
key: controller.scaffoldKey, key: controller.scaffoldKey,
drawer: ResponsiveWidget( drawer: ResponsiveWidget(
responsiveUtils: responsiveUtils, responsiveUtils: controller.responsiveUtils,
mobile: SizedBox(width: ResponsiveUtils.defaultSizeDrawer, child: MailboxView()), mobile: SizedBox(width: ResponsiveUtils.defaultSizeDrawer, child: MailboxView()),
tabletLarge: SizedBox(width: ResponsiveUtils.defaultSizeLeftMenuMobile, child: MailboxView()), tabletLarge: SizedBox(width: ResponsiveUtils.defaultSizeLeftMenuMobile, child: MailboxView()),
desktop: const SizedBox.shrink() desktop: const SizedBox.shrink()
@@ -326,7 +326,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
onTap: controller.showAppDashboardAction, onTap: controller.showAppDashboardAction,
splashRadius: 20, splashRadius: 20,
icon: SvgPicture.asset( icon: SvgPicture.asset(
imagePaths.icAppDashboard, controller.imagePaths.icAppDashboard,
width: 28, width: 28,
height: 28, height: 28,
fit: BoxFit.fill fit: BoxFit.fill
@@ -370,7 +370,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
(failure) { (failure) {
return TMailButtonWidget.fromIcon( return TMailButtonWidget.fromIcon(
key: const Key('refresh_mailbox_button'), key: const Key('refresh_mailbox_button'),
icon: imagePaths.icRefresh, icon: controller.imagePaths.icRefresh,
borderRadius: 10, borderRadius: 10,
iconSize: 16, iconSize: 16,
onTapActionCallback: controller.refreshMailboxAction, onTapActionCallback: controller.refreshMailboxAction,
@@ -385,7 +385,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
} else { } else {
return TMailButtonWidget.fromIcon( return TMailButtonWidget.fromIcon(
key: const Key('refresh_mailbox_button'), key: const Key('refresh_mailbox_button'),
icon: imagePaths.icRefresh, icon: controller.imagePaths.icRefresh,
borderRadius: 10, borderRadius: 10,
iconSize: 16, iconSize: 16,
onTapActionCallback: controller.refreshMailboxAction, onTapActionCallback: controller.refreshMailboxAction,
@@ -398,7 +398,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
TMailButtonWidget( TMailButtonWidget(
key: const Key('select_all_emails_button'), key: const Key('select_all_emails_button'),
text: AppLocalizations.of(context).select_all, text: AppLocalizations.of(context).select_all,
icon: imagePaths.icSelectAll, icon: controller.imagePaths.icSelectAll,
borderRadius: 10, borderRadius: 10,
iconSize: 16, iconSize: 16,
padding: const EdgeInsetsDirectional.symmetric(horizontal: 12, vertical: 8), padding: const EdgeInsetsDirectional.symmetric(horizontal: 12, vertical: 8),
@@ -410,7 +410,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
child: TMailButtonWidget( child: TMailButtonWidget(
key: const Key('mark_as_read_emails_button'), key: const Key('mark_as_read_emails_button'),
text: AppLocalizations.of(context).mark_all_as_read, text: AppLocalizations.of(context).mark_all_as_read,
icon: imagePaths.icSelectAll, icon: controller.imagePaths.icSelectAll,
borderRadius: 10, borderRadius: 10,
iconSize: 16, iconSize: 16,
padding: const EdgeInsetsDirectional.symmetric(horizontal: 12, vertical: 8), padding: const EdgeInsetsDirectional.symmetric(horizontal: 12, vertical: 8),
@@ -423,13 +423,13 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
text: controller.filterMessageOption.value == FilterMessageOption.all text: controller.filterMessageOption.value == FilterMessageOption.all
? AppLocalizations.of(context).filter_messages ? AppLocalizations.of(context).filter_messages
: controller.filterMessageOption.value.getTitle(context), : controller.filterMessageOption.value.getTitle(context),
icon: controller.filterMessageOption.value.getIconSelected(imagePaths), icon: controller.filterMessageOption.value.getIconSelected(controller.imagePaths),
borderRadius: 10, borderRadius: 10,
iconSize: 16, iconSize: 16,
padding: const EdgeInsetsDirectional.symmetric(horizontal: 12, vertical: 8), padding: const EdgeInsetsDirectional.symmetric(horizontal: 12, vertical: 8),
backgroundColor: controller.filterMessageOption.value.getBackgroundColor(), backgroundColor: controller.filterMessageOption.value.getBackgroundColor(),
textStyle: controller.filterMessageOption.value.getTextStyle(), textStyle: controller.filterMessageOption.value.getTextStyle(),
trailingIcon: imagePaths.icArrowDown, trailingIcon: controller.imagePaths.icArrowDown,
onTapActionAtPositionCallback: (position) { onTapActionAtPositionCallback: (position) {
return controller.openPopupMenuAction( return controller.openPopupMenuAction(
context, context,
@@ -455,19 +455,19 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
if (success is MarkAsMailboxReadLoading) { if (success is MarkAsMailboxReadLoading) {
return Padding( return Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: responsiveUtils.isDesktop(context) ? 16 : 0, top: controller.responsiveUtils.isDesktop(context) ? 16 : 0,
left: 16, left: 16,
right: 16, right: 16,
bottom: responsiveUtils.isDesktop(context) ? 0 : 16), bottom: controller.responsiveUtils.isDesktop(context) ? 0 : 16),
child: horizontalLoadingWidget); child: horizontalLoadingWidget);
} else if (success is UpdatingMarkAsMailboxReadState) { } else if (success is UpdatingMarkAsMailboxReadState) {
final percent = success.countRead / success.totalUnread; final percent = success.countRead / success.totalUnread;
return Padding( return Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: responsiveUtils.isDesktop(context) ? 16 : 0, top: controller.responsiveUtils.isDesktop(context) ? 16 : 0,
left: 16, left: 16,
right: 16, right: 16,
bottom: responsiveUtils.isDesktop(context) ? 0 : 16), bottom: controller.responsiveUtils.isDesktop(context) ? 0 : 16),
child: horizontalPercentLoadingWidget(percent)); child: horizontalPercentLoadingWidget(percent));
} }
return const SizedBox.shrink(); return const SizedBox.shrink();
@@ -622,7 +622,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
SvgPicture.asset( SvgPicture.asset(
filter.getIcon(imagePaths, isFilterSelected: isFilterSelected), filter.getIcon(controller.imagePaths, isFilterSelected: isFilterSelected),
width: 16, width: 16,
height: 16, height: 16,
fit: BoxFit.fill), fit: BoxFit.fill),
@@ -643,7 +643,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
... [ ... [
const SizedBox(width: 4), const SizedBox(width: 4),
SvgPicture.asset( SvgPicture.asset(
imagePaths.icChevronDown, controller.imagePaths.icChevronDown,
width: 16, width: 16,
height: 16, height: 16,
fit: BoxFit.fill), fit: BoxFit.fill),
@@ -664,7 +664,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemNoIconWidget( child: PopupItemNoIconWidget(
receiveTime.getTitle(context), receiveTime.getTitle(context),
svgIconSelected: imagePaths.icFilterSelected, svgIconSelected: controller.imagePaths.icFilterSelected,
maxWidth: 320, maxWidth: 320,
isSelected: receiveTimeSelected == receiveTime, isSelected: receiveTimeSelected == receiveTime,
onCallbackAction: () => onCallBack?.call(receiveTime), onCallbackAction: () => onCallBack?.call(receiveTime),
@@ -682,7 +682,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemNoIconWidget( child: PopupItemNoIconWidget(
sortType.getTitle(context), sortType.getTitle(context),
svgIconSelected: imagePaths.icFilterSelected, svgIconSelected: controller.imagePaths.icFilterSelected,
maxWidth: 332, maxWidth: 332,
isSelected: sortOrderSelected == sortType, isSelected: sortOrderSelected == sortType,
onCallbackAction: () => onCallBack?.call(sortType), onCallbackAction: () => onCallBack?.call(sortType),
@@ -703,7 +703,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
child: TMailButtonWidget( child: TMailButtonWidget(
key: const Key('compose_email_button'), key: const Key('compose_email_button'),
text: AppLocalizations.of(context).compose, text: AppLocalizations.of(context).compose,
icon: imagePaths.icComposeWeb, icon: controller.imagePaths.icComposeWeb,
borderRadius: 10, borderRadius: 10,
iconSize: 24, iconSize: 24,
iconColor: Colors.white, iconColor: Colors.white,
@@ -21,10 +21,8 @@ class AdvancedSearchFilterFormBottomView extends GetWidget<AdvancedFilterControl
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final responsiveUtils = Get.find<ResponsiveUtils>();
return Padding( return Padding(
padding: EdgeInsets.only(top: !responsiveUtils.isWebDesktop(context) ? 8 : 20), padding: EdgeInsets.only(top: !controller.responsiveUtils.isWebDesktop(context) ? 8 : 20),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@@ -35,7 +33,7 @@ class AdvancedSearchFilterFormBottomView extends GetWidget<AdvancedFilterControl
currentFocusNode: focusManager?.attachmentCheckboxFocusNode, currentFocusNode: focusManager?.attachmentCheckboxFocusNode,
nextFocusNode: focusManager?.searchButtonFocusNode), nextFocusNode: focusManager?.searchButtonFocusNode),
), ),
_buildListButton(context, responsiveUtils), _buildListButton(context, controller.responsiveUtils),
], ],
), ),
); );
@@ -22,9 +22,6 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
Key? key, Key? key,
}) : super(key: key); }) : super(key: key);
final ImagePaths _imagePaths = Get.find<ImagePaths>();
final ResponsiveUtils _responsiveUtils = Get.find<ResponsiveUtils>();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return FocusTraversalGroup( return FocusTraversalGroup(
@@ -102,7 +99,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
const SizedBox(width: 10), const SizedBox(width: 10),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icCalendarSB, controller.imagePaths.icCalendarSB,
width: 24, width: 24,
height: 24, height: 24,
fit: BoxFit.fill), fit: BoxFit.fill),
@@ -126,7 +123,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: PopupItemNoIconWidget( child: PopupItemNoIconWidget(
receiveTime.getTitle(context), receiveTime.getTitle(context),
svgIconSelected: _imagePaths.icFilterSelected, svgIconSelected: controller.imagePaths.icFilterSelected,
maxWidth: 320, maxWidth: 320,
isSelected: controller.dateFilterSelectedFormAdvancedSearch.value == receiveTime, isSelected: controller.dateFilterSelectedFormAdvancedSearch.value == receiveTime,
onCallbackAction: () => controller.updateReceiveDateSearchFilter(context, receiveTime), onCallbackAction: () => controller.updateReceiveDateSearchFilter(context, receiveTime),
@@ -146,7 +143,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
}) { }) {
final child = [ final child = [
SizedBox( SizedBox(
width: _responsiveUtils.isMobile(context) || _responsiveUtils.landscapeTabletSupported(context) width: controller.responsiveUtils.isMobile(context) || controller.responsiveUtils.landscapeTabletSupported(context)
? null : 112, ? null : 112,
child: Text( child: Text(
advancedSearchFilterField.getTitle(context), advancedSearchFilterField.getTitle(context),
@@ -157,7 +154,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
), ),
), ),
const Padding(padding: EdgeInsets.all(4)), const Padding(padding: EdgeInsets.all(4)),
if (_responsiveUtils.isMobile(context)) if (controller.responsiveUtils.isMobile(context))
_buildTextField( _buildTextField(
isSelectFormList: isSelectFormList, isSelectFormList: isSelectFormList,
onTap: onTap, onTap: onTap,
@@ -168,10 +165,10 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
advancedSearchFilterField: advancedSearchFilterField, advancedSearchFilterField: advancedSearchFilterField,
textEditingController: textEditingController, textEditingController: textEditingController,
) )
else if (_responsiveUtils.landscapeTabletSupported(context)) else if (controller.responsiveUtils.landscapeTabletSupported(context))
if (advancedSearchFilterField == AdvancedSearchFilterField.date) if (advancedSearchFilterField == AdvancedSearchFilterField.date)
Obx(() => DateDropDownButton( Obx(() => DateDropDownButton(
_imagePaths, controller.imagePaths,
startDate: controller.startDate.value, startDate: controller.startDate.value,
endDate: controller.endDate.value, endDate: controller.endDate.value,
receiveTimeSelected: controller.dateFilterSelectedFormAdvancedSearch.value, receiveTimeSelected: controller.dateFilterSelectedFormAdvancedSearch.value,
@@ -179,7 +176,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
)) ))
else if (advancedSearchFilterField == AdvancedSearchFilterField.sortBy) else if (advancedSearchFilterField == AdvancedSearchFilterField.sortBy)
Obx(() => SortByDropDownButton( Obx(() => SortByDropDownButton(
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
sortOrderSelected: controller.searchController.sortOrderFiltered.value, sortOrderSelected: controller.searchController.sortOrderFiltered.value,
onSortOrderSelected: controller.updateSortOrder, onSortOrderSelected: controller.updateSortOrder,
)) ))
@@ -210,7 +207,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
]; ];
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 8), padding: const EdgeInsets.symmetric(vertical: 8),
child: _responsiveUtils.isMobile(context) || _responsiveUtils.landscapeTabletSupported(context) child: controller.responsiveUtils.isMobile(context) || controller.responsiveUtils.landscapeTabletSupported(context)
? Column( ? Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@@ -234,7 +231,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
switch (advancedSearchFilterField) { switch (advancedSearchFilterField) {
case AdvancedSearchFilterField.date: case AdvancedSearchFilterField.date:
return Obx(() => DateDropDownButton( return Obx(() => DateDropDownButton(
_imagePaths, controller.imagePaths,
startDate: controller.startDate.value, startDate: controller.startDate.value,
endDate: controller.endDate.value, endDate: controller.endDate.value,
receiveTimeSelected: controller.dateFilterSelectedFormAdvancedSearch.value, receiveTimeSelected: controller.dateFilterSelectedFormAdvancedSearch.value,
@@ -242,7 +239,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
)); ));
case AdvancedSearchFilterField.sortBy: case AdvancedSearchFilterField.sortBy:
return Obx(() => SortByDropDownButton( return Obx(() => SortByDropDownButton(
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
sortOrderSelected: controller.searchController.sortOrderFiltered.value, sortOrderSelected: controller.searchController.sortOrderFiltered.value,
onSortOrderSelected: controller.updateSortOrder, onSortOrderSelected: controller.updateSortOrder,
)); ));
@@ -336,7 +333,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
suffixIcon: isSelectFormList suffixIcon: isSelectFormList
? buildIconWeb( ? buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icDropDown, controller.imagePaths.icDropDown,
), ),
) )
: null, : null,
@@ -1,34 +1,10 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart';
import 'package:tmail_ui_user/features/mailto/presentation/mailto_url_controller.dart'; import 'package:tmail_ui_user/features/mailto/presentation/mailto_url_controller.dart';
class MailtoUrlBindings extends BaseBindings { class MailtoUrlBindings extends Bindings {
@override @override
void bindingsController() { void dependencies() {
Get.lazyPut(() => MailtoUrlController( Get.lazyPut(() => MailtoUrlController());
Get.find<GetAuthenticatedAccountInteractor>(),
Get.find<UpdateAuthenticationAccountInteractor>(),
));
} }
@override
void bindingsDataSource() {}
@override
void bindingsDataSourceImpl() {}
@override
void bindingsInteractor() {
Get.lazyPut(() => UpdateAuthenticationAccountInteractor(Get.find<AccountRepository>()));
}
@override
void bindingsRepository() {}
@override
void bindingsRepositoryImpl() {}
} }
@@ -2,8 +2,6 @@ import 'package:core/utils/app_logger.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart';
import 'package:tmail_ui_user/features/mailto/presentation/model/mailto_arguments.dart'; import 'package:tmail_ui_user/features/mailto/presentation/model/mailto_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/navigation_router.dart'; import 'package:tmail_ui_user/main/routes/navigation_router.dart';
@@ -12,14 +10,6 @@ import 'package:tmail_ui_user/main/routes/route_utils.dart';
class MailtoUrlController extends ReloadableController { class MailtoUrlController extends ReloadableController {
MailtoUrlController(
GetAuthenticatedAccountInteractor getAuthenticatedAccountInteractor,
UpdateAuthenticationAccountInteractor updateAuthenticationAccountInteractor,
) : super(
getAuthenticatedAccountInteractor,
updateAuthenticationAccountInteractor
);
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
@@ -1,8 +1,5 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart'; import 'package:core/presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart';
import 'package:core/presentation/views/dialog/confirmation_dialog_builder.dart'; import 'package:core/presentation/views/dialog/confirmation_dialog_builder.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
@@ -42,9 +39,6 @@ class EmailRulesController extends BaseController {
EditEmailRuleFilterInteractor? _editEmailRuleFilterInteractor; EditEmailRuleFilterInteractor? _editEmailRuleFilterInteractor;
final _accountDashBoardController = Get.find<ManageAccountDashBoardController>(); final _accountDashBoardController = Get.find<ManageAccountDashBoardController>();
final _imagePaths = Get.find<ImagePaths>();
final _appToast = Get.find<AppToast>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
final listEmailRule = <TMailRule>[].obs; final listEmailRule = <TMailRule>[].obs;
@@ -111,7 +105,7 @@ class EmailRulesController extends BaseController {
void _createNewRuleFilterSuccess(CreateNewRuleFilterSuccess success) { void _createNewRuleFilterSuccess(CreateNewRuleFilterSuccess success) {
if (success.newListRules.isNotEmpty == true) { if (success.newListRules.isNotEmpty == true) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).newFilterWasCreated); AppLocalizations.of(currentContext!).newFilterWasCreated);
} }
@@ -152,7 +146,7 @@ class EmailRulesController extends BaseController {
void _editEmailRuleFilterSuccess(EditEmailRuleFilterSuccess success) { void _editEmailRuleFilterSuccess(EditEmailRuleFilterSuccess success) {
if (success.listRulesUpdated.isNotEmpty == true) { if (success.listRulesUpdated.isNotEmpty == true) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).yourFilterHasBeenUpdated); AppLocalizations.of(currentContext!).yourFilterHasBeenUpdated);
} }
@@ -162,7 +156,7 @@ class EmailRulesController extends BaseController {
} }
void deleteEmailRule(BuildContext context, TMailRule emailRule) { void deleteEmailRule(BuildContext context, TMailRule emailRule) {
if (_responsiveUtils.isMobile(context)) { if (responsiveUtils.isMobile(context)) {
(ConfirmationDialogActionSheetBuilder(context) (ConfirmationDialogActionSheetBuilder(context)
..messageText(AppLocalizations.of(context).messageConfirmationDialogDeleteEmailRule(emailRule.name)) ..messageText(AppLocalizations.of(context).messageConfirmationDialogDeleteEmailRule(emailRule.name))
..onCancelAction(AppLocalizations.of(context).cancel, () => ..onCancelAction(AppLocalizations.of(context).cancel, () =>
@@ -176,10 +170,10 @@ class EmailRulesController extends BaseController {
context: context, context: context,
barrierColor: AppColor.colorDefaultCupertinoActionSheet, barrierColor: AppColor.colorDefaultCupertinoActionSheet,
builder: (BuildContext context) => builder: (BuildContext context) =>
PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths) PointerInterceptor(child: (ConfirmDialogBuilder(imagePaths)
..title(AppLocalizations.of(context).deleteEmailRule) ..title(AppLocalizations.of(context).deleteEmailRule)
..content(AppLocalizations.of(context).messageConfirmationDialogDeleteEmailRule(emailRule.name)) ..content(AppLocalizations.of(context).messageConfirmationDialogDeleteEmailRule(emailRule.name))
..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog, ..addIcon(SvgPicture.asset(imagePaths.icRemoveDialog,
fit: BoxFit.fill)) fit: BoxFit.fill))
..marginIcon(EdgeInsets.zero) ..marginIcon(EdgeInsets.zero)
..colorConfirmButton(AppColor.colorConfirmActionDialog) ..colorConfirmButton(AppColor.colorConfirmActionDialog)
@@ -236,7 +230,7 @@ class EmailRulesController extends BaseController {
void _handleDeleteEmailRuleSuccess(DeleteEmailRuleSuccess success) { void _handleDeleteEmailRuleSuccess(DeleteEmailRuleSuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toastMessageDeleteEmailRuleSuccessfully); AppLocalizations.of(currentContext!).toastMessageDeleteEmailRuleSuccessfully);
} }
@@ -267,7 +261,7 @@ class EmailRulesController extends BaseController {
return (EmailRuleBottomSheetActionTileBuilder( return (EmailRuleBottomSheetActionTileBuilder(
const Key('delete_emailRule_action'), const Key('delete_emailRule_action'),
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icDeleteComposer, imagePaths.icDeleteComposer,
colorFilter: AppColor.colorActionDeleteConfirmDialog.asFilter()), colorFilter: AppColor.colorActionDeleteConfirmDialog.asFilter()),
AppLocalizations.of(context).deleteRule, AppLocalizations.of(context).deleteRule,
rule, rule,
@@ -284,7 +278,7 @@ class EmailRulesController extends BaseController {
Widget _editEmailRuleActionTile(BuildContext context, TMailRule rule) { Widget _editEmailRuleActionTile(BuildContext context, TMailRule rule) {
return (EmailRuleBottomSheetActionTileBuilder( return (EmailRuleBottomSheetActionTileBuilder(
const Key('edit_emailRule_action'), const Key('edit_emailRule_action'),
SvgPicture.asset(_imagePaths.icEdit), SvgPicture.asset(imagePaths.icEdit),
AppLocalizations.of(context).editRule, AppLocalizations.of(context).editRule,
rule, rule,
iconLeftPadding: const EdgeInsets.only(left: 12, right: 16), iconLeftPadding: const EdgeInsets.only(left: 12, right: 16),
@@ -8,31 +8,29 @@ import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/w
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart';
class EmailRulesView extends GetWidget<EmailRulesController> with AppLoaderMixin { class EmailRulesView extends GetWidget<EmailRulesController> with AppLoaderMixin {
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _imagePaths = Get.find<ImagePaths>();
EmailRulesView({Key? key}) : super(key: key); EmailRulesView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
backgroundColor: _responsiveUtils.isWebDesktop(context) backgroundColor: controller.responsiveUtils.isWebDesktop(context)
? AppColor.colorBgDesktop ? AppColor.colorBgDesktop
: Colors.white, : Colors.white,
body: Container( body: Container(
width: double.infinity, width: double.infinity,
margin: SettingsUtils.getMarginViewForSettingDetails(context, _responsiveUtils), margin: SettingsUtils.getMarginViewForSettingDetails(context, controller.responsiveUtils),
child: SingleChildScrollView( child: SingleChildScrollView(
physics: const ClampingScrollPhysics(), physics: const ClampingScrollPhysics(),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
EmailRulesHeaderWidget( EmailRulesHeaderWidget(
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
createRule: () => controller.goToCreateNewRule(context), createRule: () => controller.goToCreateNewRule(context),
), ),
SizedBox(height: _responsiveUtils.isWebDesktop(context) ? 24 : 16), SizedBox(height: controller.responsiveUtils.isWebDesktop(context) ? 24 : 16),
_buildLoadingView(), _buildLoadingView(),
const ListEmailRulesWidget() const ListEmailRulesWidget()
], ],
@@ -1,8 +1,6 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/presentation/utils/keyboard_utils.dart'; import 'package:core/presentation/utils/keyboard_utils.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -41,8 +39,6 @@ class ForwardController extends BaseController {
EditLocalCopyInForwardingInteractor? _editLocalCopyInForwardingInteractor; EditLocalCopyInForwardingInteractor? _editLocalCopyInForwardingInteractor;
final accountDashBoardController = Get.find<ManageAccountDashBoardController>(); final accountDashBoardController = Get.find<ManageAccountDashBoardController>();
final _imagePaths = Get.find<ImagePaths>();
final _appToast = Get.find<AppToast>();
final selectionMode = Rx<SelectMode>(SelectMode.INACTIVE); final selectionMode = Rx<SelectMode>(SelectMode.INACTIVE);
final listRecipientForward = RxList<RecipientForward>(); final listRecipientForward = RxList<RecipientForward>();
@@ -120,7 +116,7 @@ class ForwardController extends BaseController {
AppLocalizations.of(context).remove, AppLocalizations.of(context).remove,
onConfirmAction: () => _handleDeleteRecipientAction({emailAddress}), onConfirmAction: () => _handleDeleteRecipientAction({emailAddress}),
showAsBottomSheet: true, showAsBottomSheet: true,
icon: SvgPicture.asset(_imagePaths.icDeleteDialogRecipients, fit: BoxFit.fill), icon: SvgPicture.asset(imagePaths.icDeleteDialogRecipients, fit: BoxFit.fill),
titleStyle: const TextStyle( titleStyle: const TextStyle(
fontSize: 20, fontSize: 20,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@@ -153,7 +149,7 @@ class ForwardController extends BaseController {
void _handleDeleteRecipientSuccess(DeleteRecipientInForwardingSuccess success) { void _handleDeleteRecipientSuccess(DeleteRecipientInForwardingSuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toastMessageDeleteRecipientSuccessfully); AppLocalizations.of(currentContext!).toastMessageDeleteRecipientSuccessfully);
} }
@@ -205,7 +201,7 @@ class ForwardController extends BaseController {
AppLocalizations.of(currentContext!).remove, AppLocalizations.of(currentContext!).remove,
onConfirmAction: () => _handleDeleteRecipientAction(listEmailAddress), onConfirmAction: () => _handleDeleteRecipientAction(listEmailAddress),
showAsBottomSheet: true, showAsBottomSheet: true,
icon: SvgPicture.asset(_imagePaths.icDeleteDialogRecipients, fit: BoxFit.fill), icon: SvgPicture.asset(imagePaths.icDeleteDialogRecipients, fit: BoxFit.fill),
titleStyle: const TextStyle( titleStyle: const TextStyle(
fontSize: 20, fontSize: 20,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@@ -255,7 +251,7 @@ class ForwardController extends BaseController {
void _handleAddRecipientsSuccess(AddRecipientsInForwardingSuccess success) { void _handleAddRecipientsSuccess(AddRecipientsInForwardingSuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toastMessageAddRecipientsSuccessfully); AppLocalizations.of(currentContext!).toastMessageAddRecipientsSuccessfully);
} }
@@ -281,7 +277,7 @@ class ForwardController extends BaseController {
void _handleEditLocalCopySuccess(EditLocalCopyInForwardingSuccess success) { void _handleEditLocalCopySuccess(EditLocalCopyInForwardingSuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
success.forward.localCopy success.forward.localCopy
? AppLocalizations.of(currentContext!).toastMessageLocalCopyEnable ? AppLocalizations.of(currentContext!).toastMessageLocalCopyEnable
@@ -306,11 +302,11 @@ class ForwardController extends BaseController {
void handleExceptionCallback(BuildContext context, bool isListEmailEmpty) { void handleExceptionCallback(BuildContext context, bool isListEmailEmpty) {
if (isListEmailEmpty) { if (isListEmailEmpty) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
context, context,
AppLocalizations.of(context).emptyListEmailForward); AppLocalizations.of(context).emptyListEmailForward);
} else { } else {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
context, context,
AppLocalizations.of(context).incorrectEmailFormat); AppLocalizations.of(context).incorrectEmailFormat);
} }
@@ -1,7 +1,5 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/style_utils.dart'; import 'package:core/presentation/utils/style_utils.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';
@@ -15,33 +13,31 @@ import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class ForwardView extends GetWidget<ForwardController> with AppLoaderMixin { class ForwardView extends GetWidget<ForwardController> with AppLoaderMixin {
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _imagePaths = Get.find<ImagePaths>();
ForwardView({Key? key}) : super(key: key); ForwardView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
backgroundColor: SettingsUtils.getBackgroundColor(context, _responsiveUtils), backgroundColor: SettingsUtils.getBackgroundColor(context, controller.responsiveUtils),
body: Container( body: Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
color: SettingsUtils.getContentBackgroundColor(context, _responsiveUtils), color: SettingsUtils.getContentBackgroundColor(context, controller.responsiveUtils),
decoration: SettingsUtils.getBoxDecorationForContent(context, _responsiveUtils), decoration: SettingsUtils.getBoxDecorationForContent(context, controller.responsiveUtils),
margin: SettingsUtils.getMarginViewForForwardSettingDetails(context, _responsiveUtils), margin: SettingsUtils.getMarginViewForForwardSettingDetails(context, controller.responsiveUtils),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (_responsiveUtils.isWebDesktop(context)) if (controller.responsiveUtils.isWebDesktop(context))
...[ ...[
ForwardHeaderWidget(imagePaths: _imagePaths, responsiveUtils: _responsiveUtils), ForwardHeaderWidget(imagePaths: controller.imagePaths, responsiveUtils: controller.responsiveUtils),
const Divider(height: 1, color: AppColor.colorDividerHeaderSetting) const Divider(height: 1, color: AppColor.colorDividerHeaderSetting)
], ],
Expanded(child: SingleChildScrollView( Expanded(child: SingleChildScrollView(
physics: const ClampingScrollPhysics(), physics: const ClampingScrollPhysics(),
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
if (!_responsiveUtils.isWebDesktop(context)) if (!controller.responsiveUtils.isWebDesktop(context))
_buildTitleHeader(context), _buildTitleHeader(context),
_buildKeepLocalSwitchButton(context), _buildKeepLocalSwitchButton(context),
Obx(() => controller.currentForward.value != null Obx(() => controller.currentForward.value != null
@@ -51,7 +47,7 @@ class ForwardView extends GetWidget<ForwardController> with AppLoaderMixin {
_buildLoadingView(), _buildLoadingView(),
Obx(() { Obx(() {
if (controller.listRecipientForward.isNotEmpty) { if (controller.listRecipientForward.isNotEmpty) {
return ListEmailForwardsWidget(); return const ListEmailForwardsWidget();
} else { } else {
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
@@ -68,7 +64,7 @@ class ForwardView extends GetWidget<ForwardController> with AppLoaderMixin {
return Container( return Container(
color: Colors.transparent, color: Colors.transparent,
width: double.infinity, width: double.infinity,
padding: SettingsUtils.getPaddingTitleHeaderForwarding(context, _responsiveUtils), padding: SettingsUtils.getPaddingTitleHeaderForwarding(context, controller.responsiveUtils),
child: Text( child: Text(
AppLocalizations.of(context).forwardingSettingExplanation, AppLocalizations.of(context).forwardingSettingExplanation,
style: const TextStyle( style: const TextStyle(
@@ -85,7 +81,7 @@ class ForwardView extends GetWidget<ForwardController> with AppLoaderMixin {
return controller.listRecipientForward.isNotEmpty return controller.listRecipientForward.isNotEmpty
? Container( ? Container(
color: Colors.transparent, color: Colors.transparent,
padding: SettingsUtils.getPaddingKeepLocalSwitchButtonForwarding(context, _responsiveUtils), padding: SettingsUtils.getPaddingKeepLocalSwitchButtonForwarding(context, controller.responsiveUtils),
child: Row(children: [ child: Row(children: [
Padding( Padding(
padding: const EdgeInsets.only(right: 16), padding: const EdgeInsets.only(right: 16),
@@ -93,8 +89,8 @@ class ForwardView extends GetWidget<ForwardController> with AppLoaderMixin {
onTap: controller.handleEditLocalCopy, onTap: controller.handleEditLocalCopy,
child: SvgPicture.asset( child: SvgPicture.asset(
controller.currentForwardLocalCopyState controller.currentForwardLocalCopyState
? _imagePaths.icSwitchOn ? controller.imagePaths.icSwitchOn
: _imagePaths.icSwitchOff, : controller.imagePaths.icSwitchOff,
fit: BoxFit.fill, fit: BoxFit.fill,
width: 36, width: 36,
height: 24))), height: 24))),
@@ -1,6 +1,4 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/button/icon_button_web.dart'; import 'package:core/presentation/views/button/icon_button_web.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';
@@ -15,16 +13,13 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class ListEmailForwardsWidget extends GetWidget<ForwardController> { class ListEmailForwardsWidget extends GetWidget<ForwardController> {
final _imagePaths = Get.find<ImagePaths>(); const ListEmailForwardsWidget({Key? key}) : super(key: key);
final _responsiveUtils = Get.find<ResponsiveUtils>();
ListEmailForwardsWidget({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
color: Colors.transparent, color: Colors.transparent,
padding: SettingsUtils.getPaddingListRecipientForwarding(context, _responsiveUtils), padding: SettingsUtils.getPaddingListRecipientForwarding(context, controller.responsiveUtils),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@@ -106,7 +101,7 @@ class ListEmailForwardsWidget extends GetWidget<ForwardController> {
children: [ children: [
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icClose, controller.imagePaths.icClose,
colorFilter: AppColor.colorTextButton.asFilter(), colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).cancel, tooltip: AppLocalizations.of(context).cancel,
@@ -1,6 +1,5 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_portal/flutter_portal.dart'; import 'package:flutter_portal/flutter_portal.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -12,24 +11,22 @@ import 'package:tmail_ui_user/main/utils/app_utils.dart';
class LanguageAndRegionView extends GetWidget<LanguageAndRegionController> { class LanguageAndRegionView extends GetWidget<LanguageAndRegionController> {
final _responsiveUtils = Get.find<ResponsiveUtils>(); const LanguageAndRegionView({Key? key}) : super(key: key);
LanguageAndRegionView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Portal( return Portal(
child: Scaffold( child: Scaffold(
backgroundColor: _responsiveUtils.isWebDesktop(context) backgroundColor: controller.responsiveUtils.isWebDesktop(context)
? AppColor.colorBgDesktop ? AppColor.colorBgDesktop
: Colors.white, : Colors.white,
body: Container( body: Container(
width: double.infinity, width: double.infinity,
margin: _responsiveUtils.isWebDesktop(context) margin: controller.responsiveUtils.isWebDesktop(context)
? const EdgeInsets.all(24) ? const EdgeInsets.all(24)
: EdgeInsets.symmetric(horizontal: SettingsUtils.getHorizontalPadding(context, _responsiveUtils)), : EdgeInsets.symmetric(horizontal: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils)),
color: _responsiveUtils.isWebDesktop(context) ? null : Colors.white, color: controller.responsiveUtils.isWebDesktop(context) ? null : Colors.white,
decoration: _responsiveUtils.isWebDesktop(context) decoration: controller.responsiveUtils.isWebDesktop(context)
? BoxDecoration( ? BoxDecoration(
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), border: Border.all(color: AppColor.colorBorderBodyThread, width: 1),
@@ -37,15 +34,15 @@ class LanguageAndRegionView extends GetWidget<LanguageAndRegionController> {
: null, : null,
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular( borderRadius: BorderRadius.circular(
_responsiveUtils.isWebDesktop(context) ? 20 : 0), controller.responsiveUtils.isWebDesktop(context) ? 20 : 0),
child: Padding( child: Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) right: AppUtils.isDirectionRTL(context)
? _responsiveUtils.isWebDesktop(context) ? 24 : 0 ? controller.responsiveUtils.isWebDesktop(context) ? 24 : 0
: 0, : 0,
left: AppUtils.isDirectionRTL(context) left: AppUtils.isDirectionRTL(context)
? 0 ? 0
: _responsiveUtils.isWebDesktop(context) ? 24 : 0, : controller.responsiveUtils.isWebDesktop(context) ? 24 : 0,
top: 24 top: 24
), ),
child: Column( child: Column(
@@ -1,7 +1,5 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -40,8 +38,6 @@ class MailboxVisibilityController extends BaseMailboxController {
SubscribeMailboxInteractor? _subscribeMailboxInteractor; SubscribeMailboxInteractor? _subscribeMailboxInteractor;
SubscribeMultipleMailboxInteractor? _subscribeMultipleMailboxInteractor; SubscribeMultipleMailboxInteractor? _subscribeMultipleMailboxInteractor;
final _accountDashBoardController = Get.find<ManageAccountDashBoardController>(); final _accountDashBoardController = Get.find<ManageAccountDashBoardController>();
final _appToast = Get.find<AppToast>();
final _imagePaths = Get.find<ImagePaths>();
final mailboxListScrollController = ScrollController(); final mailboxListScrollController = ScrollController();
MailboxVisibilityController( MailboxVisibilityController(
@@ -221,7 +217,7 @@ class MailboxVisibilityController extends BaseMailboxController {
{List<MailboxId>? listDescendantMailboxIds} {List<MailboxId>? listDescendantMailboxIds}
) { ) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toastMsgHideFolderSuccess, AppLocalizations.of(currentContext!).toastMsgHideFolderSuccess,
actionName: AppLocalizations.of(currentContext!).undo, actionName: AppLocalizations.of(currentContext!).undo,
@@ -233,10 +229,10 @@ class MailboxVisibilityController extends BaseMailboxController {
) )
), ),
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
leadingSVGIcon: _imagePaths.icFolderMailbox, leadingSVGIcon: imagePaths.icFolderMailbox,
backgroundColor: AppColor.toastSuccessBackgroundColor, backgroundColor: AppColor.toastSuccessBackgroundColor,
textColor: Colors.white, textColor: Colors.white,
actionIcon: SvgPicture.asset(_imagePaths.icUndo), actionIcon: SvgPicture.asset(imagePaths.icUndo),
); );
} }
} }
@@ -1,7 +1,5 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/list/tree_view.dart'; import 'package:core/presentation/views/list/tree_view.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -21,19 +19,16 @@ class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
with AppLoaderMixin, with AppLoaderMixin,
MailboxWidgetMixin { MailboxWidgetMixin {
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _imagePaths = Get.find<ImagePaths>();
MailboxVisibilityView({Key? key}) : super(key: key); MailboxVisibilityView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SettingDetailViewBuilder( return SettingDetailViewBuilder(
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (_responsiveUtils.isWebDesktop(context)) if (controller.responsiveUtils.isWebDesktop(context))
...[ ...[
const SizedBox(height: 24), const SizedBox(height: 24),
const MailboxVisibilityHeaderWidget(), const MailboxVisibilityHeaderWidget(),
@@ -46,7 +41,7 @@ class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
], ],
_buildLoadingView(), _buildLoadingView(),
Expanded(child: Padding( Expanded(child: Padding(
padding: MailboxVisibilityUtils.getPaddingListView(context, _responsiveUtils), padding: MailboxVisibilityUtils.getPaddingListView(context, controller.responsiveUtils),
child: _buildListMailbox(context) child: _buildListMailbox(context)
)) ))
] ]
@@ -100,8 +95,8 @@ class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
return Column(children: [ return Column(children: [
buildHeaderMailboxCategory( buildHeaderMailboxCategory(
context, context,
_responsiveUtils, controller.responsiveUtils,
_imagePaths, controller.imagePaths,
categories, categories,
controller, controller,
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
@@ -139,7 +134,7 @@ class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND, isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
paddingChild: const EdgeInsetsDirectional.only(start: 10), paddingChild: const EdgeInsetsDirectional.only(start: 10),
parent: MailBoxVisibilityFolderTileBuilder( parent: MailBoxVisibilityFolderTileBuilder(
_imagePaths, controller.imagePaths,
mailboxNode, mailboxNode,
onClickExpandMailboxNodeAction: (mailboxNode) { onClickExpandMailboxNodeAction: (mailboxNode) {
controller.toggleMailboxFolder(mailboxNode, controller.mailboxListScrollController); controller.toggleMailboxFolder(mailboxNode, controller.mailboxListScrollController);
@@ -148,7 +143,7 @@ class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
), ),
children: _buildListChildTileWidget(context, mailboxNode)).build() children: _buildListChildTileWidget(context, mailboxNode)).build()
: MailBoxVisibilityFolderTileBuilder( : MailBoxVisibilityFolderTileBuilder(
_imagePaths, controller.imagePaths,
mailboxNode, mailboxNode,
onClickExpandMailboxNodeAction: (mailboxNode) { onClickExpandMailboxNodeAction: (mailboxNode) {
controller.toggleMailboxFolder(mailboxNode, controller.mailboxListScrollController); controller.toggleMailboxFolder(mailboxNode, controller.mailboxListScrollController);
@@ -1,8 +1,5 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart';
import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart';
import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart';
@@ -26,10 +23,7 @@ class ManageAccountDashBoardBindings extends BaseBindings {
@override @override
void bindingsController() { void bindingsController() {
Get.put(ManageAccountDashBoardController( Get.put(ManageAccountDashBoardController());
Get.find<GetAuthenticatedAccountInteractor>(),
Get.find<UpdateAuthenticationAccountInteractor>()
));
} }
@override @override
@@ -45,9 +39,7 @@ class ManageAccountDashBoardBindings extends BaseBindings {
} }
@override @override
void bindingsInteractor() { void bindingsInteractor() {}
Get.lazyPut(() => UpdateAuthenticationAccountInteractor(Get.find<AccountRepository>()));
}
@override @override
void bindingsRepository() { void bindingsRepository() {
@@ -1,6 +1,5 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:forward/forward/capability_forward.dart'; import 'package:forward/forward/capability_forward.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -13,8 +12,6 @@ import 'package:package_info_plus/package_info_plus.dart';
import 'package:rule_filter/rule_filter/capability_rule_filter.dart'; import 'package:rule_filter/rule_filter/capability_rule_filter.dart';
import 'package:tmail_ui_user/features/base/action/ui_action.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart';
import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_vacation_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_vacation_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacation_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacation_state.dart';
@@ -40,9 +37,6 @@ import 'package:tmail_ui_user/main/routes/route_utils.dart';
class ManageAccountDashBoardController extends ReloadableController { class ManageAccountDashBoardController extends ReloadableController {
final _appToast = Get.find<AppToast>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
GetAllVacationInteractor? _getAllVacationInteractor; GetAllVacationInteractor? _getAllVacationInteractor;
UpdateVacationInteractor? _updateVacationInteractor; UpdateVacationInteractor? _updateVacationInteractor;
@@ -56,14 +50,6 @@ class ManageAccountDashBoardController extends ReloadableController {
Session? sessionCurrent; Session? sessionCurrent;
ManageAccountDashBoardController(
GetAuthenticatedAccountInteractor getAuthenticatedAccountInteractor,
UpdateAuthenticationAccountInteractor updateAuthenticationAccountInteractor
) : super(
getAuthenticatedAccountInteractor,
updateAuthenticationAccountInteractor
);
@override @override
void onReady() { void onReady() {
_initialPageLevel(); _initialPageLevel();
@@ -74,7 +60,6 @@ class ManageAccountDashBoardController extends ReloadableController {
@override @override
void handleSuccessViewState(Success success) { void handleSuccessViewState(Success success) {
super.handleSuccessViewState(success);
if (success is GetUserProfileSuccess) { if (success is GetUserProfileSuccess) {
userProfile.value = success.userProfile; userProfile.value = success.userProfile;
} else if (success is GetAllVacationSuccess) { } else if (success is GetAllVacationSuccess) {
@@ -83,13 +68,15 @@ class ManageAccountDashBoardController extends ReloadableController {
} }
} else if (success is UpdateVacationSuccess) { } else if (success is UpdateVacationSuccess) {
_handleUpdateVacationSuccess(success); _handleUpdateVacationSuccess(success);
} else {
super.handleSuccessViewState(success);
} }
} }
@override @override
void handleReloaded(Session session) { void handleReloaded(Session session) {
sessionCurrent = session; sessionCurrent = session;
accountId.value = session.accounts.keys.first; accountId.value = session.personalAccount.accountId;
_getUserProfile(); _getUserProfile();
_bindingInteractorForMenuItemView(sessionCurrent, accountId.value); _bindingInteractorForMenuItemView(sessionCurrent, accountId.value);
_getVacationResponse(); _getVacationResponse();
@@ -100,22 +87,20 @@ class ManageAccountDashBoardController extends ReloadableController {
log('ManageAccountDashBoardController::_getArguments(): $arguments'); log('ManageAccountDashBoardController::_getArguments(): $arguments');
if (arguments is ManageAccountArguments) { if (arguments is ManageAccountArguments) {
sessionCurrent = arguments.session; sessionCurrent = arguments.session;
accountId.value = arguments.session?.accounts.keys.first; accountId.value = arguments.session?.personalAccount.accountId;
_getUserProfile(); _getUserProfile();
_bindingInteractorForMenuItemView(sessionCurrent, accountId.value); _bindingInteractorForMenuItemView(sessionCurrent, accountId.value);
_getVacationResponse(); _getVacationResponse();
if (arguments.menuSettingCurrent != null) { if (arguments.menuSettingCurrent != null) {
_goToSettingMenuCurrent(arguments.menuSettingCurrent!); _goToSettingMenuCurrent(arguments.menuSettingCurrent!);
} }
} else { } else if (PlatformInfo.isWeb) {
if (kIsWeb) { reload();
reload();
}
} }
} }
void _initialPageLevel() { void _initialPageLevel() {
if (currentContext != null && _responsiveUtils.isWebDesktop(currentContext!)) { if (currentContext != null && responsiveUtils.isWebDesktop(currentContext!)) {
settingsPageLevel.value = SettingsPageLevel.level1; settingsPageLevel.value = SettingsPageLevel.level1;
} else { } else {
settingsPageLevel.value = SettingsPageLevel.universal; settingsPageLevel.value = SettingsPageLevel.universal;
@@ -261,7 +246,7 @@ class ManageAccountDashBoardController extends ReloadableController {
void _handleUpdateVacationSuccess(UpdateVacationSuccess success) { void _handleUpdateVacationSuccess(UpdateVacationSuccess success) {
if (success.listVacationResponse.isNotEmpty) { if (success.listVacationResponse.isNotEmpty) {
if (currentContext != null && currentOverlayContext != null) { if (currentContext != null && currentOverlayContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).yourVacationResponderIsDisabledSuccessfully); AppLocalizations.of(currentContext!).yourVacationResponderIsDisabledSuccessfully);
} }
@@ -1,6 +1,5 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/image/avatar_builder.dart'; import 'package:core/presentation/views/image/avatar_builder.dart';
import 'package:core/presentation/views/responsive/responsive_widget.dart'; import 'package:core/presentation/views/responsive/responsive_widget.dart';
@@ -28,9 +27,6 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardController> class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardController>
with UserSettingPopupMenuMixin { with UserSettingPopupMenuMixin {
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _imagePaths = Get.find<ImagePaths>();
ManageAccountDashBoardView({Key? key}) : super(key: key); ManageAccountDashBoardView({Key? key}) : super(key: key);
@override @override
@@ -43,7 +39,7 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
body: GestureDetector( body: GestureDetector(
onTap: () => FocusScope.of(context).unfocus(), onTap: () => FocusScope.of(context).unfocus(),
child: ResponsiveWidget( child: ResponsiveWidget(
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
desktop: Column(children: [ desktop: Column(children: [
Row(children: [ Row(children: [
Container(width: 256, color: Colors.white, Container(width: 256, color: Colors.white,
@@ -54,7 +50,7 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
text: AppLocalizations.of(context).app_name, text: AppLocalizations.of(context).app_name,
textAlign: TextAlign.center, textAlign: TextAlign.center,
textStyle: const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold), textStyle: const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold),
logoSVG: _imagePaths.icTMailLogo, logoSVG: controller.imagePaths.icTMailLogo,
onTapCallback: () => controller.backToMailboxDashBoard(context), onTapCallback: () => controller.backToMailboxDashBoard(context),
), ),
Obx(() { Obx(() {
@@ -78,7 +74,10 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
Expanded(child: Row( Expanded(child: Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
SizedBox(width: ResponsiveUtils.defaultSizeMenu, child: ManageAccountMenuView()), const SizedBox(
width: ResponsiveUtils.defaultSizeMenu,
child: ManageAccountMenuView()
),
Expanded(child: Container( Expanded(child: Container(
color: AppColor.colorBgDesktop, color: AppColor.colorBgDesktop,
child: Column(children: [ child: Column(children: [
@@ -162,7 +161,7 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
case AccountMenuItem.profiles: case AccountMenuItem.profiles:
return ProfilesView(); return ProfilesView();
case AccountMenuItem.languageAndRegion: case AccountMenuItem.languageAndRegion:
return LanguageAndRegionView(); return const LanguageAndRegionView();
case AccountMenuItem.emailRules: case AccountMenuItem.emailRules:
if(controller.isRuleFilterCapabilitySupported){ if(controller.isRuleFilterCapabilitySupported){
return EmailRulesView(); return EmailRulesView();
@@ -1,5 +1,6 @@
import 'package:core/core.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
@@ -9,7 +10,8 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class ManageAccountMenuController extends GetxController { class ManageAccountMenuController extends GetxController {
final dashBoardController = Get.find<ManageAccountDashBoardController>(); final dashBoardController = Get.find<ManageAccountDashBoardController>();
final _responsiveUtils = Get.find<ResponsiveUtils>(); final responsiveUtils = Get.find<ResponsiveUtils>();
final imagePaths = Get.find<ImagePaths>();
final listAccountMenuItem = RxList<AccountMenuItem>([ final listAccountMenuItem = RxList<AccountMenuItem>([
AccountMenuItem.profiles, AccountMenuItem.profiles,
@@ -46,7 +48,7 @@ class ManageAccountMenuController extends GetxController {
listAccountMenuItem.value = newListMenuSetting; listAccountMenuItem.value = newListMenuSetting;
if (listAccountMenuItem.isNotEmpty) { if (listAccountMenuItem.isNotEmpty) {
if (currentContext != null && _responsiveUtils.isWebDesktop(currentContext!)) { if (currentContext != null && responsiveUtils.isWebDesktop(currentContext!)) {
selectAccountMenuItem(listAccountMenuItem.first); selectAccountMenuItem(listAccountMenuItem.first);
} else { } else {
selectAccountMenuItem(AccountMenuItem.none); selectAccountMenuItem(AccountMenuItem.none);
@@ -10,21 +10,18 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> { class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
final _responsiveUtils = Get.find<ResponsiveUtils>(); const ManageAccountMenuView({Key? key}) : super(key: key);
final _imagePaths = Get.find<ImagePaths>();
ManageAccountMenuView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Drawer( return Drawer(
elevation: _responsiveUtils.isDesktop(context) ? 0 : 16.0, elevation: controller.responsiveUtils.isDesktop(context) ? 0 : 16.0,
child: Scaffold( child: Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
body: SafeArea(right: false, bottom: false, body: SafeArea(right: false, bottom: false,
child: Column( child: Column(
children: [ children: [
if (!_responsiveUtils.isWebDesktop(context)) if (!controller.responsiveUtils.isWebDesktop(context))
Container( Container(
color: Colors.white, color: Colors.white,
padding: const EdgeInsets.only(top: 16, bottom: 16, left: 16), padding: const EdgeInsets.only(top: 16, bottom: 16, left: 16),
@@ -34,7 +31,7 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
text: AppLocalizations.of(context).app_name, text: AppLocalizations.of(context).app_name,
textAlign: TextAlign.center, textAlign: TextAlign.center,
textStyle: const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold), textStyle: const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold),
logoSVG: _imagePaths.icTMailLogo logoSVG: controller.imagePaths.icTMailLogo
), ),
Obx(() { Obx(() {
if (controller.dashBoardController.appInformation.value != null) { if (controller.dashBoardController.appInformation.value != null) {
@@ -52,10 +49,10 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
}), }),
]) ])
), ),
if (!_responsiveUtils.isWebDesktop(context)) if (!controller.responsiveUtils.isWebDesktop(context))
const Divider(color: AppColor.colorDividerMailbox, height: 1), const Divider(color: AppColor.colorDividerMailbox, height: 1),
Expanded(child: Container( Expanded(child: Container(
color: _responsiveUtils.isWebDesktop(context) ? AppColor.colorBgDesktop : Colors.white, color: controller.responsiveUtils.isWebDesktop(context) ? AppColor.colorBgDesktop : Colors.white,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@@ -65,8 +62,8 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
key: const Key('back_to_dashboard_button'), key: const Key('back_to_dashboard_button'),
text: AppLocalizations.of(context).back, text: AppLocalizations.of(context).back,
icon: DirectionUtils.isDirectionRTLByLanguage(context) icon: DirectionUtils.isDirectionRTLByLanguage(context)
? _imagePaths.icArrowRight ? controller.imagePaths.icArrowRight
: _imagePaths.icBack, : controller.imagePaths.icBack,
borderRadius: 10, borderRadius: 10,
backgroundColor: AppColor.colorBgMailboxSelected, backgroundColor: AppColor.colorBgMailboxSelected,
iconColor: AppColor.colorTextButton, iconColor: AppColor.colorTextButton,
@@ -133,7 +130,7 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
child: Row(children: [ child: Row(children: [
SvgPicture.asset(_imagePaths.icSignOut, fit: BoxFit.fill), SvgPicture.asset(controller.imagePaths.icSignOut, fit: BoxFit.fill),
const SizedBox(width: 12), const SizedBox(width: 12),
Expanded(child: Text( Expanded(child: Text(
AppLocalizations.of(context).sign_out, AppLocalizations.of(context).sign_out,
@@ -1,3 +1,5 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
@@ -6,6 +8,8 @@ import 'package:tmail_ui_user/features/manage_account/presentation/model/setting
class SettingsController extends GetxController { class SettingsController extends GetxController {
final manageAccountDashboardController = Get.find<ManageAccountDashBoardController>(); final manageAccountDashboardController = Get.find<ManageAccountDashBoardController>();
final responsiveUtils = Get.find<ResponsiveUtils>();
final imagePaths = Get.find<ImagePaths>();
void selectSettings(AccountMenuItem accountMenuItem) { void selectSettings(AccountMenuItem accountMenuItem) {
log('SettingsController::selectSettings(): $accountMenuItem'); log('SettingsController::selectSettings(): $accountMenuItem');
@@ -1,6 +1,4 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget.dart';
@@ -11,10 +9,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/model/account
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class SettingsFirstLevelView extends GetWidget<SettingsController> { class SettingsFirstLevelView extends GetWidget<SettingsController> {
SettingsFirstLevelView({Key? key}) : super(key: key); const SettingsFirstLevelView({Key? key}) : super(key: key);
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _imagePaths = Get.find<ImagePaths>();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -22,40 +17,40 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
child: Column(children: [ child: Column(children: [
Obx(() => UserInformationWidget( Obx(() => UserInformationWidget(
userProfile: controller.manageAccountDashboardController.userProfile.value, userProfile: controller.manageAccountDashboardController.userProfile.value,
padding: SettingsUtils.getPaddingInFirstLevel(context, _responsiveUtils), padding: SettingsUtils.getPaddingInFirstLevel(context, controller.responsiveUtils),
titlePadding: const EdgeInsetsDirectional.only(start: 16))), titlePadding: const EdgeInsetsDirectional.only(start: 16))),
Divider( Divider(
color: AppColor.colorDividerComposer, color: AppColor.colorDividerComposer,
height: 1, height: 1,
indent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils), indent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils),
endIndent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils) endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils)
), ),
SettingFirstLevelTileBuilder( SettingFirstLevelTileBuilder(
AppLocalizations.of(context).profiles, AppLocalizations.of(context).profiles,
AccountMenuItem.profiles.getIcon(_imagePaths), AccountMenuItem.profiles.getIcon(controller.imagePaths),
subtitle: AppLocalizations.of(context).profilesSettingExplanation, subtitle: AppLocalizations.of(context).profilesSettingExplanation,
() => controller.selectSettings(AccountMenuItem.profiles) () => controller.selectSettings(AccountMenuItem.profiles)
), ),
Divider( Divider(
color: AppColor.colorDividerComposer, color: AppColor.colorDividerComposer,
height: 1, height: 1,
indent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils), indent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils),
endIndent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils) endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils)
), ),
Obx(() { Obx(() {
if (controller.manageAccountDashboardController.isRuleFilterCapabilitySupported) { if (controller.manageAccountDashboardController.isRuleFilterCapabilitySupported) {
return Column(children: [ return Column(children: [
SettingFirstLevelTileBuilder( SettingFirstLevelTileBuilder(
AccountMenuItem.emailRules.getName(context), AccountMenuItem.emailRules.getName(context),
AccountMenuItem.emailRules.getIcon(_imagePaths), AccountMenuItem.emailRules.getIcon(controller.imagePaths),
subtitle: AppLocalizations.of(context).emailRuleSettingExplanation, subtitle: AppLocalizations.of(context).emailRuleSettingExplanation,
() => controller.selectSettings(AccountMenuItem.emailRules) () => controller.selectSettings(AccountMenuItem.emailRules)
), ),
Divider( Divider(
color: AppColor.colorDividerComposer, color: AppColor.colorDividerComposer,
height: 1, height: 1,
indent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils), indent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils),
endIndent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils) endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils)
), ),
]); ]);
} else { } else {
@@ -67,15 +62,15 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
return Column(children: [ return Column(children: [
SettingFirstLevelTileBuilder( SettingFirstLevelTileBuilder(
AccountMenuItem.forward.getName(context), AccountMenuItem.forward.getName(context),
AccountMenuItem.forward.getIcon(_imagePaths), AccountMenuItem.forward.getIcon(controller.imagePaths),
subtitle: AppLocalizations.of(context).forwardingSettingExplanation, subtitle: AppLocalizations.of(context).forwardingSettingExplanation,
() => controller.selectSettings(AccountMenuItem.forward) () => controller.selectSettings(AccountMenuItem.forward)
), ),
Divider( Divider(
color: AppColor.colorDividerComposer, color: AppColor.colorDividerComposer,
height: 1, height: 1,
indent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils), indent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils),
endIndent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils) endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils)
), ),
]); ]);
} else { } else {
@@ -87,15 +82,15 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
return Column(children: [ return Column(children: [
SettingFirstLevelTileBuilder( SettingFirstLevelTileBuilder(
AccountMenuItem.vacation.getName(context), AccountMenuItem.vacation.getName(context),
AccountMenuItem.vacation.getIcon(_imagePaths), AccountMenuItem.vacation.getIcon(controller.imagePaths),
subtitle: AppLocalizations.of(context).vacationSettingExplanation, subtitle: AppLocalizations.of(context).vacationSettingExplanation,
() => controller.selectSettings(AccountMenuItem.vacation) () => controller.selectSettings(AccountMenuItem.vacation)
), ),
Divider( Divider(
color: AppColor.colorDividerComposer, color: AppColor.colorDividerComposer,
height: 1, height: 1,
indent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils), indent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils),
endIndent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils) endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils)
), ),
]); ]);
} else { } else {
@@ -105,31 +100,31 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
Column(children: [ Column(children: [
SettingFirstLevelTileBuilder( SettingFirstLevelTileBuilder(
AccountMenuItem.mailboxVisibility.getName(context), AccountMenuItem.mailboxVisibility.getName(context),
AccountMenuItem.mailboxVisibility.getIcon(_imagePaths), AccountMenuItem.mailboxVisibility.getIcon(controller.imagePaths),
subtitle: AppLocalizations.of(context).folderVisibilitySubtitle, subtitle: AppLocalizations.of(context).folderVisibilitySubtitle,
() => controller.selectSettings(AccountMenuItem.mailboxVisibility) () => controller.selectSettings(AccountMenuItem.mailboxVisibility)
), ),
Divider( Divider(
color: AppColor.colorDividerComposer, color: AppColor.colorDividerComposer,
height: 1, height: 1,
indent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils), indent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils),
endIndent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils) endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils)
), ),
]), ]),
SettingFirstLevelTileBuilder( SettingFirstLevelTileBuilder(
AccountMenuItem.languageAndRegion.getName(context), AccountMenuItem.languageAndRegion.getName(context),
AccountMenuItem.languageAndRegion.getIcon(_imagePaths), AccountMenuItem.languageAndRegion.getIcon(controller.imagePaths),
() => controller.selectSettings(AccountMenuItem.languageAndRegion) () => controller.selectSettings(AccountMenuItem.languageAndRegion)
), ),
Divider( Divider(
color: AppColor.colorDividerComposer, color: AppColor.colorDividerComposer,
height: 1, height: 1,
indent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils), indent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils),
endIndent: SettingsUtils.getHorizontalPadding(context, _responsiveUtils) endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils)
), ),
SettingFirstLevelTileBuilder( SettingFirstLevelTileBuilder(
AppLocalizations.of(context).sign_out, AppLocalizations.of(context).sign_out,
_imagePaths.icSignOut, controller.imagePaths.icSignOut,
() => controller.manageAccountDashboardController.logout( () => controller.manageAccountDashboardController.logout(
controller.manageAccountDashboardController.sessionCurrent, controller.manageAccountDashboardController.sessionCurrent,
controller.manageAccountDashboardController.accountId.value) controller.manageAccountDashboardController.accountId.value)
@@ -1,6 +1,4 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/style_utils.dart'; import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/presentation/views/button/icon_button_web.dart'; import 'package:core/presentation/views/button/icon_button_web.dart';
import 'package:core/utils/direction_utils.dart'; import 'package:core/utils/direction_utils.dart';
@@ -27,10 +25,8 @@ import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef CloseSettingsViewAction = void Function(); typedef CloseSettingsViewAction = void Function();
class SettingsView extends GetWidget<SettingsController> { class SettingsView extends GetWidget<SettingsController> {
SettingsView({Key? key, this.closeAction}) : super(key: key); const SettingsView({Key? key, this.closeAction}) : super(key: key);
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _imagePaths = Get.find<ImagePaths>();
final CloseSettingsViewAction? closeAction; final CloseSettingsViewAction? closeAction;
@override @override
@@ -44,7 +40,7 @@ class SettingsView extends GetWidget<SettingsController> {
SizedBox.fromSize( SizedBox.fromSize(
size: const Size.fromHeight(52), size: const Size.fromHeight(52),
child: Padding( child: Padding(
padding: SettingsUtils.getPaddingAppBar(context, _responsiveUtils), padding: SettingsUtils.getPaddingAppBar(context, controller.responsiveUtils),
child: _buildAppbar(context))), child: _buildAppbar(context))),
const Divider(color: AppColor.colorDividerComposer, height: 1), const Divider(color: AppColor.colorDividerComposer, height: 1),
Obx(() { Obx(() {
@@ -138,8 +134,8 @@ class SettingsView extends GetWidget<SettingsController> {
child: Row(mainAxisSize: MainAxisSize.min, children: [ child: Row(mainAxisSize: MainAxisSize.min, children: [
SvgPicture.asset( SvgPicture.asset(
DirectionUtils.isDirectionRTLByLanguage(context) DirectionUtils.isDirectionRTLByLanguage(context)
? _imagePaths.icCollapseFolder ? controller.imagePaths.icCollapseFolder
: _imagePaths.icBack, : controller.imagePaths.icBack,
colorFilter: AppColor.colorTextButton.asFilter(), colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill), fit: BoxFit.fill),
Container( Container(
@@ -179,7 +175,7 @@ class SettingsView extends GetWidget<SettingsController> {
Widget _buildCloseSettingButton(BuildContext context) { Widget _buildCloseSettingButton(BuildContext context) {
return buildIconWeb( return buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icClose, width: 28, height: 28, fit: BoxFit.fill), icon: SvgPicture.asset(controller.imagePaths.icClose, width: 28, height: 28, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).close, tooltip: AppLocalizations.of(context).close,
onTap: closeAction); onTap: closeAction);
} }
@@ -188,7 +184,7 @@ class SettingsView extends GetWidget<SettingsController> {
return Obx(() { return Obx(() {
switch (controller.manageAccountDashboardController.settingsPageLevel.value) { switch (controller.manageAccountDashboardController.settingsPageLevel.value) {
case SettingsPageLevel.universal: case SettingsPageLevel.universal:
return SettingsFirstLevelView(); return const SettingsFirstLevelView();
case SettingsPageLevel.level1: case SettingsPageLevel.level1:
return _viewDisplayedOfAccountMenuItem(); return _viewDisplayedOfAccountMenuItem();
} }
@@ -201,7 +197,7 @@ class SettingsView extends GetWidget<SettingsController> {
case AccountMenuItem.profiles: case AccountMenuItem.profiles:
return ProfilesView(); return ProfilesView();
case AccountMenuItem.languageAndRegion: case AccountMenuItem.languageAndRegion:
return LanguageAndRegionView(); return const LanguageAndRegionView();
case AccountMenuItem.emailRules: case AccountMenuItem.emailRules:
if (controller.manageAccountDashboardController.isRuleFilterCapabilitySupported) { if (controller.manageAccountDashboardController.isRuleFilterCapabilitySupported) {
return EmailRulesView(); return EmailRulesView();
@@ -1,10 +1,7 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/dialog/confirmation_dialog_builder.dart'; import 'package:core/presentation/views/dialog/confirmation_dialog_builder.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -42,9 +39,6 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class IdentitiesController extends BaseController { class IdentitiesController extends BaseController {
final _accountDashBoardController = Get.find<ManageAccountDashBoardController>(); final _accountDashBoardController = Get.find<ManageAccountDashBoardController>();
final _appToast = Get.find<AppToast>();
final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
final GetAllIdentitiesInteractor _getAllIdentitiesInteractor; final GetAllIdentitiesInteractor _getAllIdentitiesInteractor;
final CreateNewIdentityInteractor _createNewIdentityInteractor; final CreateNewIdentityInteractor _createNewIdentityInteractor;
@@ -179,7 +173,7 @@ class IdentitiesController extends BaseController {
void _createNewIdentitySuccess(CreateNewIdentitySuccess success) { void _createNewIdentitySuccess(CreateNewIdentitySuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).you_have_created_a_new_identity); AppLocalizations.of(currentContext!).you_have_created_a_new_identity);
} }
@@ -189,7 +183,7 @@ class IdentitiesController extends BaseController {
void _createNewDefaultIdentitySuccess(CreateNewDefaultIdentitySuccess success) { void _createNewDefaultIdentitySuccess(CreateNewDefaultIdentitySuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).you_have_created_a_new_default_identity); AppLocalizations.of(currentContext!).you_have_created_a_new_default_identity);
} }
@@ -202,8 +196,8 @@ class IdentitiesController extends BaseController {
context: context, context: context,
barrierColor: AppColor.colorDefaultCupertinoActionSheet, barrierColor: AppColor.colorDefaultCupertinoActionSheet,
builder: (BuildContext context) => DeleteIdentityDialogBuilder( builder: (BuildContext context) => DeleteIdentityDialogBuilder(
responsiveUtils: _responsiveUtils, responsiveUtils: responsiveUtils,
imagePaths: _imagePaths, imagePaths: imagePaths,
onDeleteIdentityAction: () => _deleteIdentityAction(identity), onDeleteIdentityAction: () => _deleteIdentityAction(identity),
)); ));
} }
@@ -220,10 +214,10 @@ class IdentitiesController extends BaseController {
void _deleteIdentitySuccess(DeleteIdentitySuccess success) { void _deleteIdentitySuccess(DeleteIdentitySuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).identity_has_been_deleted, AppLocalizations.of(currentContext!).identity_has_been_deleted,
leadingSVGIcon: _imagePaths.icDeleteToast); leadingSVGIcon: imagePaths.icDeleteToast);
} }
_refreshAllIdentities(); _refreshAllIdentities();
@@ -234,10 +228,10 @@ class IdentitiesController extends BaseController {
showDialog( showDialog(
context: currentContext!, context: currentContext!,
barrierColor: AppColor.colorDefaultCupertinoActionSheet, barrierColor: AppColor.colorDefaultCupertinoActionSheet,
builder: (BuildContext context) => (ConfirmDialogBuilder(_imagePaths) builder: (BuildContext context) => (ConfirmDialogBuilder(imagePaths)
..key(const Key('dialog_message_delete_identity_failed')) ..key(const Key('dialog_message_delete_identity_failed'))
..title(AppLocalizations.of(context).delete_failed) ..title(AppLocalizations.of(context).delete_failed)
..addIcon(SvgPicture.asset(_imagePaths.icDeleteDialogFailed, fit: BoxFit.fill)) ..addIcon(SvgPicture.asset(imagePaths.icDeleteDialogFailed, fit: BoxFit.fill))
..marginIcon(EdgeInsets.zero) ..marginIcon(EdgeInsets.zero)
..styleTitle(const TextStyle(fontSize: 20, ..styleTitle(const TextStyle(fontSize: 20,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@@ -291,7 +285,7 @@ class IdentitiesController extends BaseController {
void _editIdentitySuccess(EditIdentitySuccess success) { void _editIdentitySuccess(EditIdentitySuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).you_are_changed_your_identity_successfully); AppLocalizations.of(currentContext!).you_are_changed_your_identity_successfully);
} }
@@ -299,7 +293,5 @@ class IdentitiesController extends BaseController {
_refreshAllIdentities(); _refreshAllIdentities();
} }
ImagePaths get imagePaths => _imagePaths;
bool get isSignatureShow => identitySelected.value != null; bool get isSignatureShow => identitySelected.value != null;
} }
@@ -1,5 +1,3 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
@@ -10,16 +8,13 @@ import 'package:tmail_ui_user/features/manage_account/presentation/profiles/iden
class IdentitiesView extends GetWidget<IdentitiesController> with PopupMenuWidgetMixin, AppLoaderMixin { class IdentitiesView extends GetWidget<IdentitiesController> with PopupMenuWidgetMixin, AppLoaderMixin {
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _imagePaths = Get.find<ImagePaths>();
IdentitiesView({Key? key}) : super(key: key); IdentitiesView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
margin: const EdgeInsets.all(24), margin: const EdgeInsets.all(24),
child: _responsiveUtils.isWebDesktop(context) child: controller.responsiveUtils.isWebDesktop(context)
? _buildIdentitiesViewWebDesktop(context) ? _buildIdentitiesViewWebDesktop(context)
: _buildIdentitiesViewMobile(context), : _buildIdentitiesViewMobile(context),
); );
@@ -35,8 +30,8 @@ class IdentitiesView extends GetWidget<IdentitiesController> with PopupMenuWidge
const SizedBox(height: 12), const SizedBox(height: 12),
IdentitiesRadioListBuilder( IdentitiesRadioListBuilder(
controller: controller, controller: controller,
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
imagePaths: _imagePaths imagePaths: controller.imagePaths
) )
], ],
); );
@@ -55,8 +50,8 @@ class IdentitiesView extends GetWidget<IdentitiesController> with PopupMenuWidge
const SizedBox(width: 12), const SizedBox(width: 12),
Expanded(child: IdentitiesRadioListBuilder( Expanded(child: IdentitiesRadioListBuilder(
controller: controller, controller: controller,
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
imagePaths: _imagePaths imagePaths: controller.imagePaths
)), )),
], ],
); );
@@ -26,7 +26,6 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class VacationController extends BaseController { class VacationController extends BaseController {
final _accountDashBoardController = Get.find<ManageAccountDashBoardController>(); final _accountDashBoardController = Get.find<ManageAccountDashBoardController>();
final _appToast = Get.find<AppToast>();
final _settingController = Get.find<SettingsController>(); final _settingController = Get.find<SettingsController>();
final GetAllVacationInteractor _getAllVacationInteractor; final GetAllVacationInteractor _getAllVacationInteractor;
@@ -242,7 +241,7 @@ class VacationController extends BaseController {
final fromDate = vacationPresentation.value.fromDate; final fromDate = vacationPresentation.value.fromDate;
if (fromDate == null) { if (fromDate == null) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).errorMessageWhenStartDateVacationIsEmpty); AppLocalizations.of(currentContext!).errorMessageWhenStartDateVacationIsEmpty);
} }
@@ -253,7 +252,7 @@ class VacationController extends BaseController {
final toDate = vacationPresentation.value.toDate; final toDate = vacationPresentation.value.toDate;
if (vacationStopEnabled && toDate != null && toDate.isBefore(fromDate)) { if (vacationStopEnabled && toDate != null && toDate.isBefore(fromDate)) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).errorMessageWhenEndDateVacationIsInValid); AppLocalizations.of(currentContext!).errorMessageWhenEndDateVacationIsInValid);
} }
@@ -263,7 +262,7 @@ class VacationController extends BaseController {
final messageHtmlText = (PlatformInfo.isWeb ? _vacationMessageHtmlText : await _getMessageHtmlText()) ?? ''; final messageHtmlText = (PlatformInfo.isWeb ? _vacationMessageHtmlText : await _getMessageHtmlText()) ?? '';
if (messageHtmlText.isEmpty && context.mounted) { if (messageHtmlText.isEmpty && context.mounted) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).errorMessageWhenMessageVacationIsEmpty); AppLocalizations.of(currentContext!).errorMessageWhenMessageVacationIsEmpty);
} }
@@ -299,7 +298,7 @@ class VacationController extends BaseController {
void _handleUpdateVacationSuccess(UpdateVacationSuccess success) { void _handleUpdateVacationSuccess(UpdateVacationSuccess success) {
if (success.listVacationResponse.isNotEmpty) { if (success.listVacationResponse.isNotEmpty) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).vacationSettingSaved); AppLocalizations.of(currentContext!).vacationSettingSaved);
} }
@@ -22,9 +22,6 @@ import 'package:tmail_ui_user/main/utils/app_utils.dart';
class VacationView extends GetWidget<VacationController> with RichTextButtonMixin { class VacationView extends GetWidget<VacationController> with RichTextButtonMixin {
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _imagePaths = Get.find<ImagePaths>();
VacationView({Key? key}) : super(key: key); VacationView({Key? key}) : super(key: key);
@override @override
@@ -52,18 +49,18 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
Widget _buildVacationFormView(BuildContext context) { Widget _buildVacationFormView(BuildContext context) {
return SettingDetailViewBuilder( return SettingDetailViewBuilder(
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
padding: const EdgeInsets.symmetric(horizontal: 4), padding: const EdgeInsets.symmetric(horizontal: 4),
onTapGestureDetector: () => controller.clearFocusEditor(context), onTapGestureDetector: () => controller.clearFocusEditor(context),
child: SingleChildScrollView( child: SingleChildScrollView(
physics: const ClampingScrollPhysics(), physics: const ClampingScrollPhysics(),
controller: controller.scrollController, controller: controller.scrollController,
child: Padding( child: Padding(
padding: VacationUtils.getPaddingView(context, _responsiveUtils), padding: VacationUtils.getPaddingView(context, controller.responsiveUtils),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (_responsiveUtils.isWebDesktop(context)) if (controller.responsiveUtils.isWebDesktop(context))
...[ ...[
Text( Text(
AppLocalizations.of(context).vacation, AppLocalizations.of(context).vacation,
@@ -94,7 +91,9 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
controller.updateVacationPresentation(newStatus: newStatus); controller.updateVacationPresentation(newStatus: newStatus);
}, },
child: SvgPicture.asset( child: SvgPicture.asset(
controller.isVacationDeactivated ? _imagePaths.icSwitchOff : _imagePaths.icSwitchOn, controller.isVacationDeactivated
? controller.imagePaths.icSwitchOff
: controller.imagePaths.icSwitchOn,
fit: BoxFit.fill, fit: BoxFit.fill,
width: 24, width: 24,
height: 24 height: 24
@@ -121,7 +120,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
absorbing: controller.isVacationDeactivated, absorbing: controller.isVacationDeactivated,
child: Opacity( child: Opacity(
opacity: controller.isVacationDeactivated ? 0.3 : 1.0, opacity: controller.isVacationDeactivated ? 0.3 : 1.0,
child: _responsiveUtils.isPortraitMobile(context) child: controller.responsiveUtils.isPortraitMobile(context)
? Column(children: [ ? Column(children: [
BorderButtonField<DateTime>( BorderButtonField<DateTime>(
label: AppLocalizations.of(context).startDate, label: AppLocalizations.of(context).startDate,
@@ -175,8 +174,8 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
}, },
child: SvgPicture.asset( child: SvgPicture.asset(
controller.vacationPresentation.value.vacationStopEnabled controller.vacationPresentation.value.vacationStopEnabled
? _imagePaths.icSwitchOn ? controller.imagePaths.icSwitchOn
: _imagePaths.icSwitchOff, : controller.imagePaths.icSwitchOff,
fit: BoxFit.fill, fit: BoxFit.fill,
width: 24, width: 24,
height: 24 height: 24
@@ -201,7 +200,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
absorbing: !controller.canChangeEndDate, absorbing: !controller.canChangeEndDate,
child: Opacity( child: Opacity(
opacity: !controller.canChangeEndDate ? 0.3 : 1.0, opacity: !controller.canChangeEndDate ? 0.3 : 1.0,
child: _responsiveUtils.isPortraitMobile(context) child: controller.responsiveUtils.isPortraitMobile(context)
? Column(children: [ ? Column(children: [
BorderButtonField<DateTime>( BorderButtonField<DateTime>(
label: AppLocalizations.of(context).endDate, label: AppLocalizations.of(context).endDate,
@@ -245,7 +244,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
const SizedBox(height: 24), const SizedBox(height: 24),
Obx(() => AbsorbPointer( Obx(() => AbsorbPointer(
absorbing: controller.isVacationDeactivated, absorbing: controller.isVacationDeactivated,
child: _responsiveUtils.isPortraitMobile(context) child: controller.responsiveUtils.isPortraitMobile(context)
? Opacity( ? Opacity(
opacity: controller.isVacationDeactivated ? 0.3 : 1.0, opacity: controller.isVacationDeactivated ? 0.3 : 1.0,
child: TextInputFieldBuilder( child: TextInputFieldBuilder(
@@ -289,7 +288,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
} }
Widget _buildListButtonAction(BuildContext context) { Widget _buildListButtonAction(BuildContext context) {
if (_responsiveUtils.isWebDesktop(context)) { if (controller.responsiveUtils.isWebDesktop(context)) {
return Align( return Align(
alignment: Alignment.centerRight, alignment: Alignment.centerRight,
child: buildTextButton( child: buildTextButton(
@@ -305,7 +304,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
onTap: () => controller.saveVacation(context)), onTap: () => controller.saveVacation(context)),
); );
} else { } else {
if (_responsiveUtils.isPortraitMobile(context)) { if (controller.responsiveUtils.isPortraitMobile(context)) {
return Row(children: [ return Row(children: [
Expanded( Expanded(
child: buildTextButton( child: buildTextButton(
@@ -1,6 +1,4 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/responsive_utils.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/capability/capability_identifier.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
@@ -15,8 +13,6 @@ import 'package:tmail_ui_user/main/error/capability_validator.dart';
class QuotasController extends BaseController { class QuotasController extends BaseController {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>(); final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final responsiveUtils = Get.find<ResponsiveUtils>();
final imagePaths = Get.find<ImagePaths>();
final GetQuotasInteractor _getQuotasInteractor; final GetQuotasInteractor _getQuotasInteractor;
@@ -1,5 +1,4 @@
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/presentation/utils/keyboard_utils.dart'; import 'package:core/presentation/utils/keyboard_utils.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
@@ -47,8 +46,6 @@ import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/r
class RulesFilterCreatorController extends BaseMailboxController { class RulesFilterCreatorController extends BaseMailboxController {
final _appToast = Get.find<AppToast>();
final GetAllMailboxInteractor _getAllMailboxInteractor; final GetAllMailboxInteractor _getAllMailboxInteractor;
GetAllRulesInteractor? _getAllRulesInteractor; GetAllRulesInteractor? _getAllRulesInteractor;
@@ -373,7 +370,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
} }
final int duplicatedIndex = listEmailRuleFilterActionSelected.indexWhere((filterAction) => filterAction.action == newAction); final int duplicatedIndex = listEmailRuleFilterActionSelected.indexWhere((filterAction) => filterAction.action == newAction);
if (duplicatedIndex != -1) { if (duplicatedIndex != -1) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).duplicatedActionError, AppLocalizations.of(currentContext!).duplicatedActionError,
); );
@@ -440,7 +437,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
if (listRuleCondition.isEmpty == true || listEmailRuleFilterActionSelected.isEmpty == true) { if (listRuleCondition.isEmpty == true || listEmailRuleFilterActionSelected.isEmpty == true) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).toastErrorMessageWhenCreateNewRule); AppLocalizations.of(currentContext!).toastErrorMessageWhenCreateNewRule);
} }
@@ -454,7 +451,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
log('RulesFilterCreatorController::createNewRuleFilter:errorAction: $errorAction'); log('RulesFilterCreatorController::createNewRuleFilter:errorAction: $errorAction');
if (errorAction?.isNotEmpty == true) { if (errorAction?.isNotEmpty == true) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).notSelectedMailboxToMoveMessage); AppLocalizations.of(currentContext!).notSelectedMailboxToMoveMessage);
} }
@@ -23,9 +23,6 @@ import 'model/rule_filter_condition_type.dart';
class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> { class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
@override @override
final controller = Get.find<RulesFilterCreatorController>(); final controller = Get.find<RulesFilterCreatorController>();
@@ -35,7 +32,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return PointerInterceptor( return PointerInterceptor(
child: ResponsiveWidget( child: ResponsiveWidget(
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
mobile: Scaffold( mobile: Scaffold(
backgroundColor: PlatformInfo.isWeb backgroundColor: PlatformInfo.isWeb
? Colors.black.withAlpha(24) ? Colors.black.withAlpha(24)
@@ -75,7 +72,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
topRight: Radius.circular(16), topRight: Radius.circular(16),
)), )),
width: double.infinity, width: double.infinity,
height: _responsiveUtils.getSizeScreenHeight(context) * 0.7, height: controller.responsiveUtils.getSizeScreenHeight(context) * 0.7,
child: ClipRRect( child: ClipRRect(
borderRadius: const BorderRadius.only( borderRadius: const BorderRadius.only(
topLeft: Radius.circular(16), topLeft: Radius.circular(16),
@@ -97,8 +94,8 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(16))), borderRadius: BorderRadius.all(Radius.circular(16))),
width: _responsiveUtils.getSizeScreenWidth(context) * 0.6, width: controller.responsiveUtils.getSizeScreenWidth(context) * 0.6,
height: _responsiveUtils.getSizeScreenHeight(context) * 0.7, height: controller.responsiveUtils.getSizeScreenHeight(context) * 0.7,
child: ClipRRect( child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(16)), borderRadius: const BorderRadius.all(Radius.circular(16)),
child: _buildRulesFilterFormOnDesktop(context) child: _buildRulesFilterFormOnDesktop(context)
@@ -153,7 +150,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icAddNewFolder, controller.imagePaths.icAddNewFolder,
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
const SizedBox(width: 15,), const SizedBox(width: 15,),
@@ -182,7 +179,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
const SizedBox(height: 24), const SizedBox(height: 24),
Obx(() { Obx(() {
return RuleFilterActionListWidget( return RuleFilterActionListWidget(
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
actionList: controller.listEmailRuleFilterActionSelected, actionList: controller.listEmailRuleFilterActionSelected,
onActionChanged: (newAction, index) { onActionChanged: (newAction, index) {
controller.selectEmailRuleFilterAction(newAction, index); controller.selectEmailRuleFilterAction(newAction, index);
@@ -195,7 +192,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
controller.selectMailbox(context, index); controller.selectMailbox(context, index);
}, },
tapRemoveCallback: (index) => controller.tapRemoveAction(index), tapRemoveCallback: (index) => controller.tapRemoveAction(index),
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
errorForwardEmail: controller.errorForwardEmailValue.value, errorForwardEmail: controller.errorForwardEmailValue.value,
errorMailboxSelected: controller.errorMailboxSelectedValue.value, errorMailboxSelected: controller.errorMailboxSelectedValue.value,
); );
@@ -210,7 +207,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icAddNewFolder, controller.imagePaths.icAddNewFolder,
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
const SizedBox(width: 15,), const SizedBox(width: 15,),
@@ -264,7 +261,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
Positioned(top: 8, right: 8, Positioned(top: 8, right: 8,
child: buildIconWeb( child: buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icCircleClose, controller.imagePaths.icCircleClose,
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).close, tooltip: AppLocalizations.of(context).close,
onTap: () => controller.closeView(context))) onTap: () => controller.closeView(context)))
@@ -314,7 +311,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icAddNewFolder, controller.imagePaths.icAddNewFolder,
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
const SizedBox(width: 15,), const SizedBox(width: 15,),
@@ -343,7 +340,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
const SizedBox(height: 24), const SizedBox(height: 24),
Obx(() { Obx(() {
return RuleFilterActionListWidget( return RuleFilterActionListWidget(
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
actionList: controller.listEmailRuleFilterActionSelected, actionList: controller.listEmailRuleFilterActionSelected,
onActionChanged: (newAction, index) { onActionChanged: (newAction, index) {
controller.selectEmailRuleFilterAction(newAction, index); controller.selectEmailRuleFilterAction(newAction, index);
@@ -356,7 +353,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
controller.selectMailbox(context, index); controller.selectMailbox(context, index);
}, },
tapRemoveCallback: (index) => controller.tapRemoveAction(index), tapRemoveCallback: (index) => controller.tapRemoveAction(index),
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
errorForwardEmail: controller.errorForwardEmailValue.value, errorForwardEmail: controller.errorForwardEmailValue.value,
errorMailboxSelected: controller.errorMailboxSelectedValue.value, errorMailboxSelected: controller.errorMailboxSelectedValue.value,
); );
@@ -371,7 +368,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icAddNewFolder, controller.imagePaths.icAddNewFolder,
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
const SizedBox(width: 15,), const SizedBox(width: 15,),
@@ -424,7 +421,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
Positioned(top: 8, right: 8, Positioned(top: 8, right: 8,
child: buildIconWeb( child: buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icCircleClose, controller.imagePaths.icCircleClose,
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).close, tooltip: AppLocalizations.of(context).close,
onTap: () => controller.closeView(context))) onTap: () => controller.closeView(context)))
@@ -489,7 +486,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icAddNewFolder, controller.imagePaths.icAddNewFolder,
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
const SizedBox(width: 15,), const SizedBox(width: 15,),
@@ -523,7 +520,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
const SizedBox(height: 24), const SizedBox(height: 24),
Obx(() { Obx(() {
return RuleFilterActionListWidget( return RuleFilterActionListWidget(
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
actionList: controller.listEmailRuleFilterActionSelected, actionList: controller.listEmailRuleFilterActionSelected,
onActionChangeMobile: (currentAction, index) { onActionChangeMobile: (currentAction, index) {
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
@@ -544,7 +541,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
controller.selectMailbox(context, index); controller.selectMailbox(context, index);
}, },
tapRemoveCallback: (index) => controller.tapRemoveAction(index), tapRemoveCallback: (index) => controller.tapRemoveAction(index),
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
errorForwardEmail: controller.errorForwardEmailValue.value, errorForwardEmail: controller.errorForwardEmailValue.value,
errorMailboxSelected: controller.errorMailboxSelectedValue.value, errorMailboxSelected: controller.errorMailboxSelectedValue.value,
); );
@@ -560,7 +557,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icAddNewFolder, controller.imagePaths.icAddNewFolder,
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
const SizedBox(width: 15,), const SizedBox(width: 15,),
@@ -613,7 +610,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
Positioned(top: 8, right: 8, Positioned(top: 8, right: 8,
child: buildIconWeb( child: buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icCircleClose, controller.imagePaths.icCircleClose,
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).close, tooltip: AppLocalizations.of(context).close,
onTap: () => controller.closeView(context))) onTap: () => controller.closeView(context)))
@@ -634,7 +631,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
key: ValueKey(controller.listRuleConditionValueArguments[index].focusNode), key: ValueKey(controller.listRuleConditionValueArguments[index].focusNode),
ruleFilterConditionScreenType: ruleFilterConditionScreenType, ruleFilterConditionScreenType: ruleFilterConditionScreenType,
ruleCondition: controller.listRuleCondition[index], ruleCondition: controller.listRuleCondition[index],
imagePaths: _imagePaths, imagePaths: controller.imagePaths,
conditionValueErrorText: controller.listRuleConditionValueArguments[index].errorText, conditionValueErrorText: controller.listRuleConditionValueArguments[index].errorText,
conditionValueFocusNode: controller.listRuleConditionValueArguments[index].focusNode, conditionValueFocusNode: controller.listRuleConditionValueArguments[index].focusNode,
conditionValueEditingController: controller.listRuleConditionValueArguments[index].controller, conditionValueEditingController: controller.listRuleConditionValueArguments[index].controller,
@@ -702,7 +699,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
iconLeftPadding: const EdgeInsets.only(left: 12, right: 16), iconLeftPadding: const EdgeInsets.only(left: 12, right: 16),
iconRightPadding: const EdgeInsets.only(right: 12), iconRightPadding: const EdgeInsets.only(right: 12),
actionSelected: SvgPicture.asset( actionSelected: SvgPicture.asset(
_imagePaths.icFilterSelected, controller.imagePaths.icFilterSelected,
width: 20, width: 20,
height: 20, height: 20,
fit: BoxFit.fill)) fit: BoxFit.fill))
@@ -737,7 +734,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
iconLeftPadding: const EdgeInsets.only(left: 12, right: 16), iconLeftPadding: const EdgeInsets.only(left: 12, right: 16),
iconRightPadding: const EdgeInsets.only(right: 12), iconRightPadding: const EdgeInsets.only(right: 12),
actionSelected: SvgPicture.asset( actionSelected: SvgPicture.asset(
_imagePaths.icFilterSelected, controller.imagePaths.icFilterSelected,
width: 20, width: 20,
height: 20, height: 20,
fit: BoxFit.fill)) fit: BoxFit.fill))
@@ -770,7 +767,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
iconLeftPadding: const EdgeInsets.only(left: 12, right: 16), iconLeftPadding: const EdgeInsets.only(left: 12, right: 16),
iconRightPadding: const EdgeInsets.only(right: 12), iconRightPadding: const EdgeInsets.only(right: 12),
actionSelected: SvgPicture.asset( actionSelected: SvgPicture.asset(
_imagePaths.icFilterSelected, controller.imagePaths.icFilterSelected,
width: 20, width: 20,
height: 20, height: 20,
fit: BoxFit.fill)) fit: BoxFit.fill))
@@ -808,7 +805,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
iconLeftPadding: const EdgeInsets.only(left: 12, right: 16), iconLeftPadding: const EdgeInsets.only(left: 12, right: 16),
iconRightPadding: const EdgeInsets.only(right: 12), iconRightPadding: const EdgeInsets.only(right: 12),
actionSelected: SvgPicture.asset( actionSelected: SvgPicture.asset(
_imagePaths.icFilterSelected, controller.imagePaths.icFilterSelected,
width: 20, width: 20,
height: 20, height: 20,
fit: BoxFit.fill)) fit: BoxFit.fill))
@@ -1,7 +1,5 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/style_utils.dart'; import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/presentation/views/button/icon_button_web.dart'; import 'package:core/presentation/views/button/icon_button_web.dart';
import 'package:core/presentation/views/text/text_field_builder.dart'; import 'package:core/presentation/views/text/text_field_builder.dart';
@@ -35,14 +33,11 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class SearchEmailView extends GetWidget<SearchEmailController> class SearchEmailView extends GetWidget<SearchEmailController>
with AppLoaderMixin { with AppLoaderMixin {
final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
SearchEmailView({Key? key}) : super(key: key); SearchEmailView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (_responsiveUtils.isWebDesktop(context)) { if (controller.responsiveUtils.isWebDesktop(context)) {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
controller.closeSearchView(context); controller.closeSearchView(context);
}); });
@@ -57,7 +52,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
Container( Container(
height: 52, height: 52,
color: Colors.white, color: Colors.white,
padding: SearchEmailUtils.getPaddingAppBar(context, _responsiveUtils), padding: SearchEmailUtils.getPaddingAppBar(context, controller.responsiveUtils),
child: Obx(() { child: Obx(() {
if (controller.selectionMode.value == SelectMode.ACTIVE) { if (controller.selectionMode.value == SelectMode.ACTIVE) {
return AppBarSelectionMode( return AppBarSelectionMode(
@@ -110,7 +105,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
children: [ children: [
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
DirectionUtils.isDirectionRTLByLanguage(context) ? _imagePaths.icCollapseFolder : _imagePaths.icBack, DirectionUtils.isDirectionRTLByLanguage(context) ? controller.imagePaths.icCollapseFolder : controller.imagePaths.icBack,
colorFilter: AppColor.colorTextButton.asFilter(), colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill fit: BoxFit.fill
), ),
@@ -138,7 +133,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
return return
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icClearTextSearch, controller.imagePaths.icClearTextSearch,
width: 18, width: 18,
height: 18, height: 18,
fit: BoxFit.fill), fit: BoxFit.fill),
@@ -154,8 +149,8 @@ class SearchEmailView extends GetWidget<SearchEmailController>
Widget _buildListSearchFilterAction(BuildContext context) { Widget _buildListSearchFilterAction(BuildContext context) {
return Container( return Container(
margin: SearchEmailUtils.getMarginSearchFilterButton(context, _responsiveUtils), margin: SearchEmailUtils.getMarginSearchFilterButton(context, controller.responsiveUtils),
padding: SearchEmailUtils.getPaddingSearchFilterButton(context, _responsiveUtils), padding: SearchEmailUtils.getPaddingSearchFilterButton(context, controller.responsiveUtils),
height: 60, height: 60,
child: ListView( child: ListView(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
@@ -181,7 +176,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
onTap: () { onTap: () {
if (filter != QuickSearchFilter.last7Days) { if (filter != QuickSearchFilter.last7Days) {
controller.selectQuickSearchFilter(context, filter); controller.selectQuickSearchFilter(context, filter);
} else if (_responsiveUtils.isMobile(context)) { } else if (controller.responsiveUtils.isMobile(context)) {
controller.openContextMenuAction( controller.openContextMenuAction(
context, context,
_emailReceiveTimeCupertinoActionTile( _emailReceiveTimeCupertinoActionTile(
@@ -192,7 +187,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
}, },
onTapDown: (detail) { onTapDown: (detail) {
if (filter == QuickSearchFilter.last7Days && if (filter == QuickSearchFilter.last7Days &&
!_responsiveUtils.isMobile(context)) { !controller.responsiveUtils.isMobile(context)) {
final screenSize = MediaQuery.of(context).size; final screenSize = MediaQuery.of(context).size;
final offset = detail.globalPosition; final offset = detail.globalPosition;
final position = RelativeRect.fromLTRB( final position = RelativeRect.fromLTRB(
@@ -218,7 +213,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
SvgPicture.asset( SvgPicture.asset(
filter.getIcon(_imagePaths, isFilterSelected: filterSelected), filter.getIcon(controller.imagePaths, isFilterSelected: filterSelected),
width: 16, width: 16,
height: 16, height: 16,
fit: BoxFit.fill), fit: BoxFit.fill),
@@ -239,7 +234,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
... [ ... [
const SizedBox(width: 4), const SizedBox(width: 4),
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icChevronDownOutline, controller.imagePaths.icChevronDownOutline,
colorFilter: filterSelected colorFilter: filterSelected
? AppColor.primaryColor.asFilter() ? AppColor.primaryColor.asFilter()
: AppColor.colorDefaultRichTextButton.asFilter(), : AppColor.colorDefaultRichTextButton.asFilter(),
@@ -278,14 +273,14 @@ class SearchEmailView extends GetWidget<SearchEmailController>
timeType.getTitle(context), timeType.getTitle(context),
timeType, timeType,
timeTypeCurrent: receiveTimeSelected, timeTypeCurrent: receiveTimeSelected,
iconLeftPadding: _responsiveUtils.isMobile(context) iconLeftPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16) ? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12), : const EdgeInsets.only(right: 12),
iconRightPadding: _responsiveUtils.isMobile(context) iconRightPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12) ? const EdgeInsets.only(right: 12)
: EdgeInsets.zero, : EdgeInsets.zero,
actionSelected: SvgPicture.asset( actionSelected: SvgPicture.asset(
_imagePaths.icFilterSelected, controller.imagePaths.icFilterSelected,
width: 20, width: 20,
height: 20, height: 20,
fit: BoxFit.fill)) fit: BoxFit.fill))
@@ -306,7 +301,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
} }
}, },
child: Padding( child: Padding(
padding: SearchEmailUtils.getPaddingShowAllResultButton(context, _responsiveUtils), padding: SearchEmailUtils.getPaddingShowAllResultButton(context, controller.responsiveUtils),
child: Row(children: [ child: Row(children: [
Text(AppLocalizations.of(context).showingResultsFor, Text(AppLocalizations.of(context).showingResultsFor,
style: const TextStyle(fontSize: 13.0, style: const TextStyle(fontSize: 13.0,
@@ -331,7 +326,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
) { ) {
return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Padding( Padding(
padding: SearchEmailUtils.getPaddingSearchRecentTitle(context, _responsiveUtils), padding: SearchEmailUtils.getPaddingSearchRecentTitle(context, controller.responsiveUtils),
child: Text(AppLocalizations.of(context).recent, child: Text(AppLocalizations.of(context).recent,
style: const TextStyle(fontSize: 13.0, style: const TextStyle(fontSize: 13.0,
color: AppColor.colorTextButtonHeaderThread, color: AppColor.colorTextButtonHeaderThread,
@@ -349,7 +344,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
child: InkWell( child: InkWell(
child: RecentSearchItemTileWidget( child: RecentSearchItemTileWidget(
recentSearch, recentSearch,
contentPadding: SearchEmailUtils.getPaddingListRecentSearch(context, _responsiveUtils)), contentPadding: SearchEmailUtils.getPaddingListRecentSearch(context, controller.responsiveUtils)),
onTap: () => controller.searchEmailByRecentAction(context, recentSearch), onTap: () => controller.searchEmailByRecentAction(context, recentSearch),
), ),
); );
@@ -372,7 +367,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
child: EmailQuickSearchItemTileWidget( child: EmailQuickSearchItemTileWidget(
listSuggestionSearch[index], listSuggestionSearch[index],
controller.currentMailbox, controller.currentMailbox,
contentPadding: SearchEmailUtils.getPaddingSearchSuggestionList(context, _responsiveUtils)), contentPadding: SearchEmailUtils.getPaddingSearchSuggestionList(context, controller.responsiveUtils)),
onTap: () { onTap: () {
final emailPreview = listSuggestionSearch[index]; final emailPreview = listSuggestionSearch[index];
final mailboxContain = emailPreview final mailboxContain = emailPreview
@@ -395,7 +390,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
? EmptyEmailsWidget( ? EmptyEmailsWidget(
key: const Key('empty_search_email_view'), key: const Key('empty_search_email_view'),
title: AppLocalizations.of(context).no_emails_matching_your_search, title: AppLocalizations.of(context).no_emails_matching_your_search,
iconSVG: _imagePaths.icEmptyEmail iconSVG: controller.imagePaths.icEmptyEmail
) )
: const SizedBox.shrink()) : const SizedBox.shrink())
); );
@@ -426,12 +421,12 @@ class SearchEmailView extends GetWidget<SearchEmailController>
controller.searchQuery, controller.searchQuery,
controller.mailboxDashBoardController.selectedEmail.value?.id == currentPresentationEmail.id, controller.mailboxDashBoardController.selectedEmail.value?.id == currentPresentationEmail.id,
isSearchEmailRunning: true, isSearchEmailRunning: true,
padding: SearchEmailUtils.getPaddingSearchResultList(context, _responsiveUtils), padding: SearchEmailUtils.getPaddingSearchResultList(context, controller.responsiveUtils),
paddingDivider: SearchEmailUtils.getPaddingDividerSearchResultList(context, _responsiveUtils), paddingDivider: SearchEmailUtils.getPaddingDividerSearchResultList(context, controller.responsiveUtils),
mailboxContain: currentPresentationEmail.mailboxContain) mailboxContain: currentPresentationEmail.mailboxContain)
..addOnPressEmailActionClick((action, email) => ..addOnPressEmailActionClick((action, email) =>
controller.pressEmailAction(context, action, email, mailboxContain: currentPresentationEmail.mailboxContain)) controller.pressEmailAction(context, action, email, mailboxContain: currentPresentationEmail.mailboxContain))
..addOnMoreActionClick((email, position) => _responsiveUtils.isScreenWithShortestSide(context) ..addOnMoreActionClick((email, position) => controller.responsiveUtils.isScreenWithShortestSide(context)
? controller.openContextMenuAction(context, _contextMenuActionTile(context, email)) ? controller.openContextMenuAction(context, _contextMenuActionTile(context, email))
: controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email))) : controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email)))
).build()); ).build());
@@ -441,7 +436,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
double? _getItemExtent(BuildContext context) { double? _getItemExtent(BuildContext context) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
return _responsiveUtils.isDesktop(context) ? 52 : 95; return controller.responsiveUtils.isDesktop(context) ? 52 : 95;
} else { } else {
return null; return null;
} }
@@ -469,7 +464,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
return (EmailActionCupertinoActionSheetActionBuilder( return (EmailActionCupertinoActionSheetActionBuilder(
const Key('mark_as_spam_or_un_spam_action'), const Key('mark_as_spam_or_un_spam_action'),
SvgPicture.asset( SvgPicture.asset(
mailboxContain?.isSpam == true ? _imagePaths.icNotSpam : _imagePaths.icSpam, mailboxContain?.isSpam == true ? controller.imagePaths.icNotSpam : controller.imagePaths.icSpam,
width: 28, width: 28,
height: 28, height: 28,
fit: BoxFit.fill, fit: BoxFit.fill,
@@ -478,10 +473,10 @@ class SearchEmailView extends GetWidget<SearchEmailController>
? AppLocalizations.of(context).remove_from_spam ? AppLocalizations.of(context).remove_from_spam
: AppLocalizations.of(context).mark_as_spam, : AppLocalizations.of(context).mark_as_spam,
email, email,
iconLeftPadding: _responsiveUtils.isMobile(context) iconLeftPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16) ? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12), : const EdgeInsets.only(right: 12),
iconRightPadding: _responsiveUtils.isMobile(context) iconRightPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12) ? const EdgeInsets.only(right: 12)
: EdgeInsets.zero) : EdgeInsets.zero)
..onActionClick((email) => controller.pressEmailAction(context, ..onActionClick((email) => controller.pressEmailAction(context,
@@ -531,7 +526,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
SvgPicture.asset( SvgPicture.asset(
filterSelected ? _imagePaths.icSelectedSB : _imagePaths.icFolderMailbox, filterSelected ? controller.imagePaths.icSelectedSB : controller.imagePaths.icFolderMailbox,
width: 16, width: 16,
height: 16, height: 16,
fit: BoxFit.fill), fit: BoxFit.fill),
@@ -555,7 +550,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
), ),
const SizedBox(width: 4), const SizedBox(width: 4),
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icChevronDownOutline, controller.imagePaths.icChevronDownOutline,
colorFilter: filterSelected colorFilter: filterSelected
? AppColor.primaryColor.asFilter() ? AppColor.primaryColor.asFilter()
: AppColor.colorDefaultRichTextButton.asFilter(), : AppColor.colorDefaultRichTextButton.asFilter(),
@@ -585,7 +580,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
SvgPicture.asset( SvgPicture.asset(
filterSelected ? _imagePaths.icSelectedSB : _imagePaths.icUserSB, filterSelected ? controller.imagePaths.icSelectedSB : controller.imagePaths.icUserSB,
width: 16, width: 16,
height: 16, height: 16,
fit: BoxFit.fill), fit: BoxFit.fill),
@@ -609,7 +604,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
), ),
const SizedBox(width: 4), const SizedBox(width: 4),
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icChevronDownOutline, controller.imagePaths.icChevronDownOutline,
colorFilter: filterSelected colorFilter: filterSelected
? AppColor.primaryColor.asFilter() ? AppColor.primaryColor.asFilter()
: AppColor.colorDefaultRichTextButton.asFilter(), : AppColor.colorDefaultRichTextButton.asFilter(),
@@ -1,11 +1,8 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/presentation/utils/keyboard_utils.dart'; import 'package:core/presentation/utils/keyboard_utils.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
import 'package:debounce_throttle/debounce_throttle.dart'; import 'package:debounce_throttle/debounce_throttle.dart';
@@ -69,7 +66,6 @@ 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/dialog_router.dart'; import 'package:tmail_ui_user/main/routes/dialog_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:uuid/uuid.dart';
class SearchMailboxController extends BaseMailboxController with MailboxActionHandlerMixin { class SearchMailboxController extends BaseMailboxController with MailboxActionHandlerMixin {
@@ -82,10 +78,6 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
final CreateNewMailboxInteractor _createNewMailboxInteractor; final CreateNewMailboxInteractor _createNewMailboxInteractor;
final dashboardController = Get.find<MailboxDashBoardController>(); final dashboardController = Get.find<MailboxDashBoardController>();
final responsiveUtils = Get.find<ResponsiveUtils>();
final imagePaths = Get.find<ImagePaths>();
final _appToast = Get.find<AppToast>();
final _uuid = Get.find<Uuid>();
final currentSearchQuery = RxString(''); final currentSearchQuery = RxString('');
final listMailboxSearched = RxList<PresentationMailbox>(); final listMailboxSearched = RxList<PresentationMailbox>();
@@ -387,7 +379,7 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
void _moveMailboxSuccess(MoveMailboxSuccess success) { void _moveMailboxSuccess(MoveMailboxSuccess success) {
if (success.moveAction == MoveAction.moving && currentOverlayContext != null && currentContext != null) { if (success.moveAction == MoveAction.moving && currentOverlayContext != null && currentContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).movedToFolder(success.destinationMailboxDisplayName ?? AppLocalizations.of(currentContext!).allFolders), AppLocalizations.of(currentContext!).movedToFolder(success.destinationMailboxDisplayName ?? AppLocalizations.of(currentContext!).allFolders),
actionName: AppLocalizations.of(currentContext!).undo, actionName: AppLocalizations.of(currentContext!).undo,
@@ -449,7 +441,7 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
void _deleteMultipleMailboxSuccess(List<MailboxId> listMailboxIdDeleted, jmap.State? currentMailboxState) { void _deleteMultipleMailboxSuccess(List<MailboxId> listMailboxIdDeleted, jmap.State? currentMailboxState) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).deleteFoldersSuccessfully); AppLocalizations.of(currentContext!).deleteFoldersSuccessfully);
} }
@@ -464,7 +456,7 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
void _deleteMailboxFailure(DeleteMultipleMailboxFailure failure) { void _deleteMailboxFailure(DeleteMultipleMailboxFailure failure) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).deleteFoldersFailure); AppLocalizations.of(currentContext!).deleteFoldersFailure);
} }
@@ -563,7 +555,7 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
{List<MailboxId>? listDescendantMailboxIds} {List<MailboxId>? listDescendantMailboxIds}
) { ) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
subscribeAction.getToastMessageSuccess(currentContext!), subscribeAction.getToastMessageSuccess(currentContext!),
actionName: AppLocalizations.of(currentContext!).undo, actionName: AppLocalizations.of(currentContext!).undo,
@@ -683,7 +675,7 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
: await push(AppRoutes.mailboxCreator, arguments: arguments); : await push(AppRoutes.mailboxCreator, arguments: arguments);
if (result != null && result is NewMailboxArguments) { if (result != null && result is NewMailboxArguments) {
final generateCreateId = Id(_uuid.v1()); final generateCreateId = Id(uuid.v1());
_createNewMailboxAction(session, accountId, CreateNewMailboxRequest( _createNewMailboxAction(session, accountId, CreateNewMailboxRequest(
generateCreateId, generateCreateId,
result.newName, result.newName,
@@ -698,7 +690,7 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
void _createNewMailboxSuccess(CreateNewMailboxSuccess success) { void _createNewMailboxSuccess(CreateNewMailboxSuccess success) {
if (currentOverlayContext != null && currentContext != null) { if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).createFolderSuccessfullyMessage(success.newMailbox.name?.name ?? ''), AppLocalizations.of(currentContext!).createFolderSuccessfullyMessage(success.newMailbox.name?.name ?? ''),
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
@@ -715,7 +707,7 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
if (exception is ErrorMethodResponse) { if (exception is ErrorMethodResponse) {
messageError = exception.description ?? AppLocalizations.of(currentContext!).createNewFolderFailure; messageError = exception.description ?? AppLocalizations.of(currentContext!).createNewFolderFailure;
} }
_appToast.showToastErrorMessage(currentOverlayContext!, messageError); appToast.showToastErrorMessage(currentOverlayContext!, messageError);
} }
} }
@@ -1,9 +1,7 @@
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.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';
@@ -53,8 +51,6 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi
final dashboardController = Get.find<MailboxDashBoardController>(); final dashboardController = Get.find<MailboxDashBoardController>();
final _networkConnectionController = Get.find<NetworkConnectionController>(); final _networkConnectionController = Get.find<NetworkConnectionController>();
final _sendingQueueIsolateManager = getBinding<SendingQueueIsolateManager>(); final _sendingQueueIsolateManager = getBinding<SendingQueueIsolateManager>();
final _imagePaths = Get.find<ImagePaths>();
final _appToast = Get.find<AppToast>();
final listSendingEmailController = ScrollController(); final listSendingEmailController = ScrollController();
@@ -210,7 +206,7 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi
AppLocalizations.of(context).messageDialogDeleteSendingEmail, AppLocalizations.of(context).messageDialogDeleteSendingEmail,
AppLocalizations.of(currentContext!).delete, AppLocalizations.of(currentContext!).delete,
title: AppLocalizations.of(currentContext!).deleteOfflineEmail, title: AppLocalizations.of(currentContext!).deleteOfflineEmail,
icon: SvgPicture.asset(_imagePaths.icDeleteDialogRecipients), icon: SvgPicture.asset(imagePaths.icDeleteDialogRecipients),
alignCenter: true, alignCenter: true,
messageStyle: const TextStyle( messageStyle: const TextStyle(
color: AppColor.colorTitleSendingItem, color: AppColor.colorTitleSendingItem,
@@ -259,7 +255,7 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi
} }
if (currentContext != null && currentOverlayContext != null) { if (currentContext != null && currentOverlayContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).messageHaveBeenDeletedSuccessfully); AppLocalizations.of(currentContext!).messageHaveBeenDeletedSuccessfully);
} }
@@ -329,7 +325,7 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi
} }
if (currentContext != null && currentOverlayContext != null) { if (currentContext != null && currentOverlayContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).messagesHaveBeenResent); AppLocalizations.of(currentContext!).messagesHaveBeenResent);
} }
@@ -1,7 +1,5 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
@@ -85,8 +83,6 @@ typedef EndRangeSelection = int;
class ThreadController extends BaseController with EmailActionController { class ThreadController extends BaseController with EmailActionController {
final _imagePaths = Get.find<ImagePaths>();
final _appToast = Get.find<AppToast>();
final networkConnectionController = Get.find<NetworkConnectionController>(); final networkConnectionController = Get.find<NetworkConnectionController>();
final GetEmailsInMailboxInteractor _getEmailsInMailboxInteractor; final GetEmailsInMailboxInteractor _getEmailsInMailboxInteractor;
@@ -377,6 +373,14 @@ class ThreadController extends BaseController with EmailActionController {
await cachingManager.clearEmailCacheAndAllStateCache(); await cachingManager.clearEmailCacheAndAllStateCache();
} }
_getAllEmailAction(); _getAllEmailAction();
} else if (error is MethodLevelErrors) {
if (currentOverlayContext != null && error.message?.isNotEmpty == true) {
appToast.showToastErrorMessage(
currentOverlayContext!,
error.message!
);
}
clearState();
} }
} }
@@ -683,10 +687,10 @@ class ThreadController extends BaseController with EmailActionController {
mailboxDashBoardController.filterMessageOption.value = newFilterOption; mailboxDashBoardController.filterMessageOption.value = newFilterOption;
_appToast.showToastMessage( appToast.showToastMessage(
context, context,
newFilterOption.getMessageToast(context), newFilterOption.getMessageToast(context),
leadingSVGIcon: newFilterOption.getIconToast(_imagePaths), leadingSVGIcon: newFilterOption.getIconToast(imagePaths),
); );
if (searchController.isSearchEmailRunning) { if (searchController.isSearchEmailRunning) {
@@ -1060,7 +1064,7 @@ class ThreadController extends BaseController with EmailActionController {
if (success.newListRules.isNotEmpty == true && if (success.newListRules.isNotEmpty == true &&
currentOverlayContext != null && currentOverlayContext != null &&
currentContext != null) { currentContext != null) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).newFilterWasCreated AppLocalizations.of(currentContext!).newFilterWasCreated
); );
@@ -44,9 +44,6 @@ class ThreadView extends GetWidget<ThreadController>
FilterEmailPopupMenuMixin, FilterEmailPopupMenuMixin,
PopupMenuWidgetMixin { PopupMenuWidgetMixin {
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _imagePaths = Get.find<ImagePaths>();
ThreadView({Key? key}) : super(key: key); ThreadView({Key? key}) : super(key: key);
@override @override
@@ -63,12 +60,12 @@ class ThreadView extends GetWidget<ThreadController>
if (supportVerticalDivider(context)) if (supportVerticalDivider(context))
const VerticalDivider(color: AppColor.colorDividerVertical, width: 1), const VerticalDivider(color: AppColor.colorDividerVertical, width: 1),
Expanded(child: SafeArea( Expanded(child: SafeArea(
right: _responsiveUtils.isLandscapeMobile(context), right: controller.responsiveUtils.isLandscapeMobile(context),
left: _responsiveUtils.isLandscapeMobile(context), left: controller.responsiveUtils.isLandscapeMobile(context),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (!_responsiveUtils.isWebDesktop(context)) if (!controller.responsiveUtils.isWebDesktop(context))
... [ ... [
Obx(() { Obx(() {
return AppBarThreadWidget( return AppBarThreadWidget(
@@ -86,13 +83,13 @@ class ThreadView extends GetWidget<ThreadController>
selectionEmail selectionEmail
); );
}, },
onContextMenuFilterEmailAction: _responsiveUtils.isScreenWithShortestSide(context) onContextMenuFilterEmailAction: controller.responsiveUtils.isScreenWithShortestSide(context)
? (filterOption) => controller.openContextMenuAction( ? (filterOption) => controller.openContextMenuAction(
context, context,
_filterMessagesCupertinoActionTile(context, filterOption) _filterMessagesCupertinoActionTile(context, filterOption)
) )
: null, : null,
onPopupMenuFilterEmailAction: !_responsiveUtils.isScreenWithShortestSide(context) onPopupMenuFilterEmailAction: !controller.responsiveUtils.isScreenWithShortestSide(context)
? (filterOption, position) => controller.openPopupMenuAction( ? (filterOption, position) => controller.openPopupMenuAction(
context, context,
position, position,
@@ -148,7 +145,7 @@ class ThreadView extends GetWidget<ThreadController>
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
}), }),
if (!_responsiveUtils.isDesktop(context)) if (!controller.responsiveUtils.isDesktop(context))
_buildMarkAsMailboxReadLoading(context), _buildMarkAsMailboxReadLoading(context),
Obx(() => ThreadViewLoadingBarWidget(viewState: controller.viewState.value)), Obx(() => ThreadViewLoadingBarWidget(viewState: controller.viewState.value)),
Expanded(child: _buildListEmail(context)), Expanded(child: _buildListEmail(context)),
@@ -167,9 +164,9 @@ class ThreadView extends GetWidget<ThreadController>
child: ScrollToTopButtonWidget( child: ScrollToTopButtonWidget(
scrollController: controller.listEmailController, scrollController: controller.listEmailController,
onTap: controller.scrollToTop, onTap: controller.scrollToTop,
responsiveUtils: _responsiveUtils, responsiveUtils: controller.responsiveUtils,
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icArrowUpOutline, controller.imagePaths.icArrowUpOutline,
width: ScrollToTopButtonWidgetStyles.iconWidth, width: ScrollToTopButtonWidgetStyles.iconWidth,
height: ScrollToTopButtonWidgetStyles.iconHeight, height: ScrollToTopButtonWidgetStyles.iconHeight,
fit: BoxFit.fill, fit: BoxFit.fill,
@@ -188,11 +185,11 @@ class ThreadView extends GetWidget<ThreadController>
bool supportVerticalDivider(BuildContext context) { bool supportVerticalDivider(BuildContext context) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
return _responsiveUtils.isTabletLarge(context); return controller.responsiveUtils.isTabletLarge(context);
} else { } else {
return _responsiveUtils.isDesktop(context) || return controller.responsiveUtils.isDesktop(context) ||
_responsiveUtils.isTabletLarge(context) || controller.responsiveUtils.isTabletLarge(context) ||
_responsiveUtils.isLandscapeTablet(context); controller.responsiveUtils.isLandscapeTablet(context);
} }
} }
@@ -201,9 +198,9 @@ class ThreadView extends GetWidget<ThreadController>
color: Colors.white, color: Colors.white,
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: 16, horizontal: 16,
vertical: _responsiveUtils.isWebNotDesktop(context) ? 8 : 0), vertical: controller.responsiveUtils.isWebNotDesktop(context) ? 8 : 0),
margin: EdgeInsets.only(bottom: PlatformInfo.isMobile ? 8 : 0), margin: EdgeInsets.only(bottom: PlatformInfo.isMobile ? 8 : 0),
child: SearchBarView(_imagePaths, child: SearchBarView(controller.imagePaths,
hintTextSearch: AppLocalizations.of(context).search_emails, hintTextSearch: AppLocalizations.of(context).search_emails,
onOpenSearchViewAction: controller.goToSearchView)); onOpenSearchViewAction: controller.goToSearchView));
} }
@@ -226,11 +223,11 @@ class ThreadView extends GetWidget<ThreadController>
Widget _buildListButtonSelectionForMobile(BuildContext context) { Widget _buildListButtonSelectionForMobile(BuildContext context) {
return Obx(() { return Obx(() {
if ((PlatformInfo.isMobile || (PlatformInfo.isWeb && controller.isSelectionEnabled() if ((PlatformInfo.isMobile || (PlatformInfo.isWeb && controller.isSelectionEnabled()
&& controller.isSearchActive() && !_responsiveUtils.isDesktop(context))) && controller.isSearchActive() && !controller.responsiveUtils.isDesktop(context)))
&& controller.mailboxDashBoardController.emailsInCurrentMailbox.listEmailSelected.isNotEmpty) { && controller.mailboxDashBoardController.emailsInCurrentMailbox.listEmailSelected.isNotEmpty) {
return BottomBarThreadSelectionWidget( return BottomBarThreadSelectionWidget(
_imagePaths, controller.imagePaths,
_responsiveUtils, controller.responsiveUtils,
controller.mailboxDashBoardController.emailsInCurrentMailbox.listEmailSelected, controller.mailboxDashBoardController.emailsInCurrentMailbox.listEmailSelected,
controller.mailboxDashBoardController.selectedMailbox.value, controller.mailboxDashBoardController.selectedMailbox.value,
onPressEmailSelectionActionClick: (actionType, selectionEmail) => onPressEmailSelectionActionClick: (actionType, selectionEmail) =>
@@ -247,7 +244,7 @@ class ThreadView extends GetWidget<ThreadController>
} }
Widget _buildFloatingButtonCompose(BuildContext context) { Widget _buildFloatingButtonCompose(BuildContext context) {
if (_responsiveUtils.isWebDesktop(context)) { if (controller.responsiveUtils.isWebDesktop(context)) {
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
@@ -255,7 +252,7 @@ class ThreadView extends GetWidget<ThreadController>
if (controller.isAllSearchInActive) { if (controller.isAllSearchInActive) {
return Container( return Container(
padding: PlatformInfo.isMobile && controller.listEmailSelected.isNotEmpty padding: PlatformInfo.isMobile && controller.listEmailSelected.isNotEmpty
? EdgeInsets.only(bottom: _responsiveUtils.isTabletLarge(context) ? 85 : 70) ? EdgeInsets.only(bottom: controller.responsiveUtils.isTabletLarge(context) ? 85 : 70)
: EdgeInsets.zero, : EdgeInsets.zero,
child: ComposeFloatingButton( child: ComposeFloatingButton(
scrollController: controller.listEmailController, scrollController: controller.listEmailController,
@@ -278,7 +275,7 @@ class ThreadView extends GetWidget<ThreadController>
return listFilter.map((filter) => (FilterMessageCupertinoActionSheetActionBuilder( return listFilter.map((filter) => (FilterMessageCupertinoActionSheetActionBuilder(
Key('filter_email_${filter.name}'), Key('filter_email_${filter.name}'),
SvgPicture.asset( SvgPicture.asset(
filter.getIcon(_imagePaths), filter.getIcon(controller.imagePaths),
width: 20, width: 20,
height: 20, height: 20,
fit: BoxFit.fill, fit: BoxFit.fill,
@@ -288,14 +285,14 @@ class ThreadView extends GetWidget<ThreadController>
filter.getName(context), filter.getName(context),
filter, filter,
optionCurrent: optionCurrent, optionCurrent: optionCurrent,
iconLeftPadding: _responsiveUtils.isMobile(context) iconLeftPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16) ? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12), : const EdgeInsets.only(right: 12),
iconRightPadding: _responsiveUtils.isMobile(context) iconRightPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12) ? const EdgeInsets.only(right: 12)
: EdgeInsets.zero, : EdgeInsets.zero,
actionSelected: SvgPicture.asset( actionSelected: SvgPicture.asset(
_imagePaths.icFilterSelected, controller.imagePaths.icFilterSelected,
width: 20, width: 20,
height: 20, height: 20,
fit: BoxFit.fill)) fit: BoxFit.fill))
@@ -305,7 +302,7 @@ class ThreadView extends GetWidget<ThreadController>
Widget _buildListEmail(BuildContext context) { Widget _buildListEmail(BuildContext context) {
return Container( return Container(
margin: PlatformInfo.isWeb && _responsiveUtils.isDesktop(context) margin: PlatformInfo.isWeb && controller.responsiveUtils.isDesktop(context)
? const EdgeInsets.symmetric(horizontal: 4) ? const EdgeInsets.symmetric(horizontal: 4)
: EdgeInsets.zero, : EdgeInsets.zero,
alignment: Alignment.center, alignment: Alignment.center,
@@ -371,7 +368,7 @@ class ThreadView extends GetWidget<ThreadController>
} }
Widget _buildEmailItem(BuildContext context, PresentationEmail presentationEmail) { Widget _buildEmailItem(BuildContext context, PresentationEmail presentationEmail) {
if (_responsiveUtils.isWebDesktop(context)) { if (controller.responsiveUtils.isWebDesktop(context)) {
return _buildEmailItemDraggable(context, presentationEmail); return _buildEmailItemDraggable(context, presentationEmail);
} else { } else {
return _buildEmailItemNotDraggable(context, presentationEmail); return _buildEmailItemNotDraggable(context, presentationEmail);
@@ -421,7 +418,7 @@ class ThreadView extends GetWidget<ThreadController>
return Dismissible( return Dismissible(
key: ValueKey<EmailId?>(presentationEmail.id), key: ValueKey<EmailId?>(presentationEmail.id),
direction: controller.getSwipeDirection(_responsiveUtils.isWebDesktop(context), selectModeAll), direction: controller.getSwipeDirection(controller.responsiveUtils.isWebDesktop(context), selectModeAll),
background: Container( background: Container(
color: AppColor.colorItemRecipientSelected, color: AppColor.colorItemRecipientSelected,
child: Padding( child: Padding(
@@ -435,11 +432,11 @@ class ThreadView extends GetWidget<ThreadController>
radius: 24, radius: 24,
child: !presentationEmail.hasRead child: !presentationEmail.hasRead
? SvgPicture.asset( ? SvgPicture.asset(
_imagePaths.icMarkAsRead, controller.imagePaths.icMarkAsRead,
fit: BoxFit.fill, fit: BoxFit.fill,
) )
: SvgPicture.asset( : SvgPicture.asset(
_imagePaths.icUnreadEmail, controller.imagePaths.icUnreadEmail,
fit: BoxFit.fill, fit: BoxFit.fill,
colorFilter: AppColor.primaryColor.asFilter(), colorFilter: AppColor.primaryColor.asFilter(),
), ),
@@ -493,7 +490,7 @@ class ThreadView extends GetWidget<ThreadController>
PresentationEmail presentationEmail, PresentationEmail presentationEmail,
RelativeRect? position RelativeRect? position
) { ) {
if (_responsiveUtils.isScreenWithShortestSide(context)) { if (controller.responsiveUtils.isScreenWithShortestSide(context)) {
controller.openContextMenuAction( controller.openContextMenuAction(
context, context,
_contextMenuActionTile(context, presentationEmail) _contextMenuActionTile(context, presentationEmail)
@@ -519,7 +516,7 @@ class ThreadView extends GetWidget<ThreadController>
child: Row( child: Row(
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icFilterMessageAll, controller.imagePaths.icFilterMessageAll,
width: 24, width: 24,
height: 24, height: 24,
fit: BoxFit.fill, fit: BoxFit.fill,
@@ -546,7 +543,7 @@ class ThreadView extends GetWidget<ThreadController>
double? _getItemExtent(BuildContext context) { double? _getItemExtent(BuildContext context) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
return _responsiveUtils.isDesktop(context) ? 52 : 98; return controller.responsiveUtils.isDesktop(context) ? 52 : 98;
} else { } else {
return null; return null;
} }
@@ -559,7 +556,7 @@ class ThreadView extends GetWidget<ThreadController>
? EmptyEmailsWidget( ? EmptyEmailsWidget(
key: const Key('empty_thread_view'), key: const Key('empty_thread_view'),
title: _getMessageEmptyEmail(context), title: _getMessageEmptyEmail(context),
iconSVG: _imagePaths.icEmptyEmail, iconSVG: controller.imagePaths.icEmptyEmail,
subTitle: _getSubMessageEmptyEmail(context), subTitle: _getSubMessageEmptyEmail(context),
onCreateFiltersActionCallback: controller.isNewFolderCreated onCreateFiltersActionCallback: controller.isNewFolderCreated
? controller.goToCreateEmailRuleView ? controller.goToCreateEmailRuleView
@@ -612,7 +609,7 @@ class ThreadView extends GetWidget<ThreadController>
return (EmailActionCupertinoActionSheetActionBuilder( return (EmailActionCupertinoActionSheetActionBuilder(
const Key('mark_as_spam_or_un_spam_action'), const Key('mark_as_spam_or_un_spam_action'),
SvgPicture.asset( SvgPicture.asset(
mailboxContain?.isSpam == true ? _imagePaths.icNotSpam : _imagePaths.icSpam, mailboxContain?.isSpam == true ? controller.imagePaths.icNotSpam : controller.imagePaths.icSpam,
width: 24, width: 24,
height: 24, height: 24,
fit: BoxFit.fill, fit: BoxFit.fill,
@@ -621,10 +618,10 @@ class ThreadView extends GetWidget<ThreadController>
? AppLocalizations.of(context).remove_from_spam ? AppLocalizations.of(context).remove_from_spam
: AppLocalizations.of(context).mark_as_spam, : AppLocalizations.of(context).mark_as_spam,
email, email,
iconLeftPadding: _responsiveUtils.isMobile(context) iconLeftPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16) ? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12), : const EdgeInsets.only(right: 12),
iconRightPadding: _responsiveUtils.isMobile(context) iconRightPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12) ? const EdgeInsets.only(right: 12)
: EdgeInsets.zero) : EdgeInsets.zero)
..onActionClick((email) => controller.pressEmailAction(context, ..onActionClick((email) => controller.pressEmailAction(context,
@@ -639,17 +636,17 @@ class ThreadView extends GetWidget<ThreadController>
return (EmailActionCupertinoActionSheetActionBuilder( return (EmailActionCupertinoActionSheetActionBuilder(
const Key('open_in_new_tab_action'), const Key('open_in_new_tab_action'),
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icOpenInNewTab, controller.imagePaths.icOpenInNewTab,
width: 24, width: 24,
height: 24, height: 24,
fit: BoxFit.fill, fit: BoxFit.fill,
colorFilter: AppColor.colorTextButton.asFilter()), colorFilter: AppColor.colorTextButton.asFilter()),
AppLocalizations.of(context).openInNewTab, AppLocalizations.of(context).openInNewTab,
email, email,
iconLeftPadding: _responsiveUtils.isMobile(context) iconLeftPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16) ? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12), : const EdgeInsets.only(right: 12),
iconRightPadding: _responsiveUtils.isMobile(context) iconRightPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12) ? const EdgeInsets.only(right: 12)
: EdgeInsets.zero) : EdgeInsets.zero)
..onActionClick((email) { ..onActionClick((email) {
@@ -677,7 +674,7 @@ class ThreadView extends GetWidget<ThreadController>
return PopupMenuItem( return PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: popupItem( child: popupItem(
mailboxContain?.isSpam == true ? _imagePaths.icNotSpam : _imagePaths.icSpam, mailboxContain?.isSpam == true ? controller.imagePaths.icNotSpam : controller.imagePaths.icSpam,
mailboxContain?.isSpam == true mailboxContain?.isSpam == true
? AppLocalizations.of(context).remove_from_spam ? AppLocalizations.of(context).remove_from_spam
: AppLocalizations.of(context).mark_as_spam, : AppLocalizations.of(context).mark_as_spam,
@@ -705,7 +702,7 @@ class ThreadView extends GetWidget<ThreadController>
return PopupMenuItem( return PopupMenuItem(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: popupItem( child: popupItem(
_imagePaths.icOpenInNewTab, controller.imagePaths.icOpenInNewTab,
AppLocalizations.of(context).openInNewTab, AppLocalizations.of(context).openInNewTab,
colorIcon: AppColor.colorTextButton, colorIcon: AppColor.colorTextButton,
styleName: const TextStyle( styleName: const TextStyle(
@@ -730,19 +727,19 @@ class ThreadView extends GetWidget<ThreadController>
if (success is MarkAsMailboxReadLoading) { if (success is MarkAsMailboxReadLoading) {
return Padding( return Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: _responsiveUtils.isDesktop(context) ? 16 : 0, top: controller.responsiveUtils.isDesktop(context) ? 16 : 0,
left: 16, left: 16,
right: 16, right: 16,
bottom: _responsiveUtils.isDesktop(context) ? 0 : 16), bottom: controller.responsiveUtils.isDesktop(context) ? 0 : 16),
child: horizontalLoadingWidget); child: horizontalLoadingWidget);
} else if (success is UpdatingMarkAsMailboxReadState) { } else if (success is UpdatingMarkAsMailboxReadState) {
final percent = success.countRead / success.totalUnread; final percent = success.countRead / success.totalUnread;
return Padding( return Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: _responsiveUtils.isDesktop(context) ? 16 : 0, top: controller.responsiveUtils.isDesktop(context) ? 16 : 0,
left: 16, left: 16,
right: 16, right: 16,
bottom: _responsiveUtils.isDesktop(context) ? 0 : 16), bottom: controller.responsiveUtils.isDesktop(context) ? 0 : 16),
child: horizontalPercentLoadingWidget(percent)); child: horizontalPercentLoadingWidget(percent));
} }
return const SizedBox.shrink(); return const SizedBox.shrink();
@@ -1,10 +1,8 @@
import 'package:async/async.dart'; import 'package:async/async.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
@@ -27,13 +25,9 @@ import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_sta
import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_status.dart'; import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_status.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/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:uuid/uuid.dart';
class UploadController extends BaseController { class UploadController extends BaseController {
final _imagePaths = Get.find<ImagePaths>();
final _appToast = Get.find<AppToast>();
final _uuid = Get.find<Uuid>();
final _mailboxDashBoardController = Get.find<MailboxDashBoardController>(); final _mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final UploadAttachmentInteractor _uploadAttachmentInteractor; final UploadAttachmentInteractor _uploadAttachmentInteractor;
@@ -130,11 +124,11 @@ class UploadController extends BaseController {
_deleteInlineFileUploaded(failure.uploadId); _deleteInlineFileUploaded(failure.uploadId);
if (currentContext != null && currentOverlayContext != null) { if (currentContext != null && currentOverlayContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).thisImageCannotBeAdded, AppLocalizations.of(currentContext!).thisImageCannotBeAdded,
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
leadingSVGIcon: _imagePaths.icInsertImage); leadingSVGIcon: imagePaths.icInsertImage);
} }
} }
}, },
@@ -158,7 +152,7 @@ class UploadController extends BaseController {
log('UploadController::_handleProgressUploadInlineImageStateStream():succeed[${success.uploadId}]'); log('UploadController::_handleProgressUploadInlineImageStateStream():succeed[${success.uploadId}]');
final inlineAttachment = success.attachment.toAttachmentWithDisposition( final inlineAttachment = success.attachment.toAttachmentWithDisposition(
disposition: ContentDisposition.inline, disposition: ContentDisposition.inline,
cid: _uuid.v1() cid: uuid.v1()
); );
final uploadFileState = _uploadingStateInlineFiles.getUploadFileStateById(success.uploadId); final uploadFileState = _uploadingStateInlineFiles.getUploadFileStateById(success.uploadId);
@@ -256,21 +250,21 @@ class UploadController extends BaseController {
void _handleUploadAttachmentsFailure(ErrorAttachmentUploadState failure) { void _handleUploadAttachmentsFailure(ErrorAttachmentUploadState failure) {
if (currentContext != null && currentOverlayContext != null) { if (currentContext != null && currentOverlayContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
'${AppLocalizations.of(currentContext!).can_not_upload_this_file_as_attachments}. ${failure.exception ?? ''}', '${AppLocalizations.of(currentContext!).can_not_upload_this_file_as_attachments}. ${failure.exception ?? ''}',
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
leadingSVGIcon: _imagePaths.icAttachment); leadingSVGIcon: imagePaths.icAttachment);
} }
} }
void _handleUploadAttachmentsSuccess(SuccessAttachmentUploadState success) { void _handleUploadAttachmentsSuccess(SuccessAttachmentUploadState success) {
if (currentContext != null && currentOverlayContext != null && _uploadingStateFiles.allSuccess) { if (currentContext != null && currentOverlayContext != null && _uploadingStateFiles.allSuccess) {
_appToast.showToastSuccessMessage( appToast.showToastSuccessMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).attachments_uploaded_successfully, AppLocalizations.of(currentContext!).attachments_uploaded_successfully,
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
leadingSVGIcon: _imagePaths.icAttachment); leadingSVGIcon: imagePaths.icAttachment);
} }
} }
@@ -361,19 +355,19 @@ class UploadController extends BaseController {
if (failure is UploadAttachmentFailure) { if (failure is UploadAttachmentFailure) {
if (failure.isInline) { if (failure.isInline) {
if (currentContext != null && currentOverlayContext != null) { if (currentContext != null && currentOverlayContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).thisImageCannotBeAdded, AppLocalizations.of(currentContext!).thisImageCannotBeAdded,
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
leadingSVGIcon: _imagePaths.icInsertImage); leadingSVGIcon: imagePaths.icInsertImage);
} }
} else { } else {
if (currentContext != null && currentOverlayContext != null) { if (currentContext != null && currentOverlayContext != null) {
_appToast.showToastErrorMessage( appToast.showToastErrorMessage(
currentOverlayContext!, currentOverlayContext!,
AppLocalizations.of(currentContext!).can_not_upload_this_file_as_attachments, AppLocalizations.of(currentContext!).can_not_upload_this_file_as_attachments,
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
leadingSVGIcon: _imagePaths.icAttachment); leadingSVGIcon: imagePaths.icAttachment);
} }
} }
} }
@@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_i
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_token_oidc_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
@@ -59,6 +60,7 @@ class CredentialBindings extends InteractorsBindings {
Get.find<CredentialRepository>(), Get.find<CredentialRepository>(),
Get.find<AccountRepository>() Get.find<AccountRepository>()
)); ));
Get.put(UpdateAuthenticationAccountInteractor(Get.find<AccountRepository>()));
} }
@override @override