diff --git a/lib/features/search/email/presentation/search_email_view.dart b/lib/features/search/email/presentation/search_email_view.dart index cc73dca65..a13708275 100644 --- a/lib/features/search/email/presentation/search_email_view.dart +++ b/lib/features/search/email/presentation/search_email_view.dart @@ -469,9 +469,7 @@ class SearchEmailView extends GetWidget (success) => success is! SearchingState ? EmptyEmailsWidget( key: const Key('empty_search_email_view'), - title: AppLocalizations.of(context).no_emails_matching_your_search, - iconSVG: controller.imagePaths.icEmptyEmail - ) + isSearchActive: true) : const SizedBox.shrink()) ); } diff --git a/lib/features/thread/presentation/styles/empty_emails_widget_styles.dart b/lib/features/thread/presentation/styles/empty_emails_widget_styles.dart index da0e79710..c3781946c 100644 --- a/lib/features/thread/presentation/styles/empty_emails_widget_styles.dart +++ b/lib/features/thread/presentation/styles/empty_emails_widget_styles.dart @@ -26,5 +26,5 @@ class EmptyEmailsWidgetStyles { static const EdgeInsetsGeometry padding = EdgeInsetsDirectional.all(16); static const EdgeInsetsGeometry labelPadding = EdgeInsetsDirectional.symmetric(vertical: 12); static const EdgeInsetsGeometry createFilterButtonPadding = EdgeInsetsDirectional.symmetric(vertical: 12, horizontal: 24); - static const EdgeInsetsGeometry createFilterButtonMargin = EdgeInsetsDirectional.only(top: 28); + static const EdgeInsetsGeometry createFilterButtonMargin = EdgeInsetsDirectional.only(top: 12); } \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 45e0166a5..1ea351432 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -1216,12 +1216,6 @@ class ThreadController extends BaseController with EmailActionController { mailboxDashBoardController.onDragMailbox(isDrag); } - bool get isNewFolderCreated { - return selectedMailbox != null && - selectedMailbox!.isPersonal && - !selectedMailbox!.isDefault; - } - void goToCreateEmailRuleView() async { final accountId = mailboxDashBoardController.accountId.value; final session = mailboxDashBoardController.sessionCurrent; diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index e5192f4de..697884e27 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -698,41 +698,13 @@ class ThreadView extends GetWidget } else { return EmptyEmailsWidget( key: const Key('empty_thread_view'), - title: _getMessageEmptyEmail(context), - iconSVG: controller.imagePaths.icEmptyEmail, - subTitle: _getSubMessageEmptyEmail(context), - onCreateFiltersActionCallback: controller.isNewFolderCreated - ? controller.goToCreateEmailRuleView - : null, + isSearchActive: controller.isSearchActive, + isFilterMessageActive: controller.mailboxDashBoardController.filterMessageOption.value != FilterMessageOption.all, + onCreateFiltersActionCallback: controller.goToCreateEmailRuleView ); } - }) - ); - } - - String _getMessageEmptyEmail(BuildContext context) { - if (controller.isSearchActive) { - return AppLocalizations.of(context).no_emails_matching_your_search; - } else { - if (controller.mailboxDashBoardController.filterMessageOption.value == FilterMessageOption.all && - controller.isNewFolderCreated) { - return AppLocalizations.of(context).folderCreatedTitle; - } else { - return AppLocalizations.of(context).noEmailMatchYourCurrentFilter; } - } - } - - String? _getSubMessageEmptyEmail(BuildContext context) { - if (!controller.isSearchActive - && controller.mailboxDashBoardController.filterMessageOption.value != FilterMessageOption.all) { - return AppLocalizations.of(context).reduceSomeFiltersAndTryAgain; - } else if (controller.mailboxDashBoardController.filterMessageOption.value == FilterMessageOption.all && - controller.isNewFolderCreated) { - return AppLocalizations.of(context).folderCreatedMessage; - } else { - return null; - } + )); } List _contextMenuActionTile(BuildContext context, PresentationEmail email) { diff --git a/lib/features/thread/presentation/widgets/empty_emails_widget.dart b/lib/features/thread/presentation/widgets/empty_emails_widget.dart index d229c8982..0371ad943 100644 --- a/lib/features/thread/presentation/widgets/empty_emails_widget.dart +++ b/lib/features/thread/presentation/widgets/empty_emails_widget.dart @@ -1,4 +1,4 @@ - +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:flutter/material.dart'; @@ -11,72 +11,61 @@ typedef OnCreateFiltersActionCallback = Function(); class EmptyEmailsWidget extends StatelessWidget { - final String title; - final String? iconSVG; - final String? subTitle; + final bool isSearchActive; + final bool isFilterMessageActive; final OnCreateFiltersActionCallback? onCreateFiltersActionCallback; - final Color? titleColor; - const EmptyEmailsWidget({ + final _responsiveUtils = Get.find(); + final _imagePaths = Get.find(); + + EmptyEmailsWidget({ Key? key, - required this.title, - this.iconSVG, - this.subTitle, + this.isSearchActive = false, + this.isFilterMessageActive = false, this.onCreateFiltersActionCallback, - this.titleColor, }) : super(key: key); @override Widget build(BuildContext context) { - final responsiveUtils = Get.find(); final childWidget = Padding( padding: EmptyEmailsWidgetStyles.padding, child: Column( - mainAxisAlignment: responsiveUtils.isScreenWithShortestSide(context) + mainAxisAlignment: _responsiveUtils.isScreenWithShortestSide(context) ? MainAxisAlignment.start : MainAxisAlignment.center, children: [ - if (iconSVG != null) - SvgPicture.asset( - iconSVG!, - width: _getIconSize(context, responsiveUtils), - height: _getIconSize(context, responsiveUtils), - fit: BoxFit.fill - ), + SvgPicture.asset( + _imagePaths.icEmptyEmail, + width: _getIconSize(context, _responsiveUtils), + height: _getIconSize(context, _responsiveUtils), + fit: BoxFit.fill + ), Padding( padding: EmptyEmailsWidgetStyles.labelPadding, child: Text( - title, + key: const Key('empty_email_message'), + _getMessageEmptyEmail(context), style: TextStyle( color: EmptyEmailsWidgetStyles.labelTextColor, - fontSize: onCreateFiltersActionCallback != null + fontSize: _validateShowCreateRuleButton ? EmptyEmailsWidgetStyles.createFilterLabelTextSize : EmptyEmailsWidgetStyles.labelTextSize, - fontWeight: onCreateFiltersActionCallback != null + fontWeight: _validateShowCreateRuleButton ? EmptyEmailsWidgetStyles.createFilterLabelFontWeight : EmptyEmailsWidgetStyles.labelFontWeight ), textAlign: TextAlign.center, ), ), - if (subTitle != null) - Text( - subTitle!, - style: const TextStyle( - color: EmptyEmailsWidgetStyles.messageTextColor, - fontSize: EmptyEmailsWidgetStyles.messageTextSize, - fontWeight: EmptyEmailsWidgetStyles.messageFontWeight - ), - textAlign: TextAlign.center, - ), - if (onCreateFiltersActionCallback != null) + if (_validateShowCreateRuleButton) TMailButtonWidget.fromText( + key: const Key('create_filter_rule_button_within_empty_email'), text: AppLocalizations.of(context).createFilters, padding: EmptyEmailsWidgetStyles.createFilterButtonPadding, margin: EmptyEmailsWidgetStyles.createFilterButtonMargin, backgroundColor: EmptyEmailsWidgetStyles.createFilterButtonBackgroundColor, borderRadius: EmptyEmailsWidgetStyles.createFilterButtonBorderRadius, - width: responsiveUtils.isPortraitMobile(context) ? double.infinity : null, + width: _responsiveUtils.isPortraitMobile(context) ? double.infinity : null, textAlign: TextAlign.center, textStyle: const TextStyle( fontSize: EmptyEmailsWidgetStyles.createFilterButtonTextSize, @@ -91,7 +80,7 @@ class EmptyEmailsWidget extends StatelessWidget { return Container( constraints: const BoxConstraints(maxWidth: EmptyEmailsWidgetStyles.maxWidth), alignment: AlignmentDirectional.center, - child: responsiveUtils.isScreenWithShortestSide(context) + child: _responsiveUtils.isScreenWithShortestSide(context) ? SingleChildScrollView(child: childWidget) : CustomScrollView( slivers: [ @@ -110,4 +99,19 @@ class EmptyEmailsWidget extends StatelessWidget { return EmptyEmailsWidgetStyles.tabletIconSize; } } + + bool get _validateShowCreateRuleButton => + !isFilterMessageActive && !isSearchActive && onCreateFiltersActionCallback != null; + + String _getMessageEmptyEmail(BuildContext context) { + if (isSearchActive) { + return AppLocalizations.of(context).no_emails_matching_your_search; + } else { + if (isFilterMessageActive) { + return AppLocalizations.of(context).noEmailMatchYourCurrentFilter; + } else { + return AppLocalizations.of(context).noEmailInYourCurrentFolder; + } + } + } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index f09d6534b..c2c82f9fb 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -2673,12 +2673,6 @@ class AppLocalizations { name: 'noEmailMatchYourCurrentFilter'); } - String get reduceSomeFiltersAndTryAgain { - return Intl.message( - 'Let\'s reduce some filters and try again', - name: 'reduceSomeFiltersAndTryAgain'); - } - String get sendMessageFailure { return Intl.message( 'Failure to send your message.', @@ -3225,18 +3219,6 @@ class AppLocalizations { ); } - String get folderCreatedTitle { - return Intl.message( - 'Your folder is just created', - name: 'folderCreatedTitle'); - } - - String get folderCreatedMessage { - return Intl.message( - 'To begin using this folder, you should add some rules to organize all of your mail in your own way.', - name: 'folderCreatedMessage'); - } - String get createFilters { return Intl.message( 'Create filters', diff --git a/test/features/thread/presentation/widgets/empty_email_widget_test.dart b/test/features/thread/presentation/widgets/empty_email_widget_test.dart new file mode 100644 index 000000000..e736a77e6 --- /dev/null +++ b/test/features/thread/presentation/widgets/empty_email_widget_test.dart @@ -0,0 +1,115 @@ +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/thread/presentation/widgets/empty_emails_widget.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations_delegate.dart'; +import 'package:tmail_ui_user/main/localizations/localization_service.dart'; + +void main() { + group('EmptyEmailsWidget::widgetTest', () { + final responsiveUtils = ResponsiveUtils(); + final imagePaths = ImagePaths(); + + setUp(() { + Get.put(responsiveUtils); + Get.put(imagePaths); + + Get.testMode = true; + }); + + Widget makeTestableWidget({required Widget child}) { + return GetMaterialApp( + localizationsDelegates: const [ + AppLocalizationsDelegate(), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + supportedLocales: LocalizationService.supportedLocales, + locale: LocalizationService.defaultLocale, + home: Scaffold(body: child), + ); + } + + testWidgets( + 'should have CreateRuleFilter button and message correctly\n' + 'when search inactive and filter inactive', + (tester) async { + final widget = makeTestableWidget( + child: EmptyEmailsWidget( + isSearchActive: false, + isFilterMessageActive: false, + onCreateFiltersActionCallback: () {}, + ), + ); + + await tester.pumpWidget(widget); + + await tester.pumpAndSettle(); + + expect( + find.byKey(const Key('create_filter_rule_button_within_empty_email')), + findsOneWidget); + + final emptyEmailMessageWidgetFinder = find.byKey(const Key('empty_email_message')); + final emptyEmailMessageWidget = tester.widget(emptyEmailMessageWidgetFinder); + expect( + emptyEmailMessageWidget.data, + 'We\'re sorry, there are no emails in your current folder'); + }); + + testWidgets( + 'should have message correctly and do not have CreateRuleFilter button\n' + 'when search inactive and filter active', + (tester) async { + final widget = makeTestableWidget( + child: EmptyEmailsWidget( + isSearchActive: false, + isFilterMessageActive: true, + ), + ); + + await tester.pumpWidget(widget); + + await tester.pumpAndSettle(); + + expect( + find.byKey(const Key('create_filter_rule_button_within_empty_email')), + findsNothing); + + final emptyEmailMessageWidgetFinder = find.byKey(const Key('empty_email_message')); + final emptyEmailMessageWidget = tester.widget(emptyEmailMessageWidgetFinder); + expect( + emptyEmailMessageWidget.data, + 'We\'re sorry, there are no emails that match your current filter.'); + }); + + testWidgets( + 'should have message correctly and do not have CreateRuleFilter button\n' + 'when search active', + (tester) async { + final widget = makeTestableWidget( + child: EmptyEmailsWidget( + isSearchActive: true, + ), + ); + + await tester.pumpWidget(widget); + + await tester.pumpAndSettle(); + + expect( + find.byKey(const Key('create_filter_rule_button_within_empty_email')), + findsNothing); + + final emptyEmailMessageWidgetFinder = find.byKey(const Key('empty_email_message')); + final emptyEmailMessageWidget = tester.widget(emptyEmailMessageWidgetFinder); + expect( + emptyEmailMessageWidget.data, + 'No emails are matching your search'); + }); + }); +}