diff --git a/lib/features/search/email/presentation/search_email_controller.dart b/lib/features/search/email/presentation/search_email_controller.dart index ea261087f..348bb97a0 100644 --- a/lib/features/search/email/presentation/search_email_controller.dart +++ b/lib/features/search/email/presentation/search_email_controller.dart @@ -50,6 +50,8 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/sear import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart'; +import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart' + if (dart.library.html) 'package:tmail_ui_user/features/network_connection/presentation/web_network_connection_controller.dart'; import 'package:tmail_ui_user/features/search/email/domain/state/refresh_changes_search_email_state.dart'; import 'package:tmail_ui_user/features/search/email/domain/usecases/refresh_changes_search_email_interactor.dart'; import 'package:tmail_ui_user/features/search/email/presentation/model/search_more_state.dart'; @@ -79,6 +81,8 @@ class SearchEmailController extends BaseController with EmailActionController, DateRangePickerMixin { + final networkConnectionController = Get.find(); + final QuickSearchEmailInteractor _quickSearchEmailInteractor; final SaveRecentSearchInteractor _saveRecentSearchInteractor; final GetAllRecentSearchLatestInteractor _getAllRecentSearchLatestInteractor; diff --git a/lib/features/search/email/presentation/search_email_view.dart b/lib/features/search/email/presentation/search_email_view.dart index a13708275..d9761e1e8 100644 --- a/lib/features/search/email/presentation/search_email_view.dart +++ b/lib/features/search/email/presentation/search_email_view.dart @@ -469,6 +469,7 @@ class SearchEmailView extends GetWidget (success) => success is! SearchingState ? EmptyEmailsWidget( key: const Key('empty_search_email_view'), + isNetworkConnectionAvailable: controller.networkConnectionController.isNetworkConnectionAvailable(), isSearchActive: true) : const SizedBox.shrink()) ); diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 697884e27..9992a9e10 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -698,6 +698,7 @@ class ThreadView extends GetWidget } else { return EmptyEmailsWidget( key: const Key('empty_thread_view'), + isNetworkConnectionAvailable: controller.networkConnectionController.isNetworkConnectionAvailable(), isSearchActive: controller.isSearchActive, isFilterMessageActive: controller.mailboxDashBoardController.filterMessageOption.value != FilterMessageOption.all, onCreateFiltersActionCallback: controller.goToCreateEmailRuleView diff --git a/lib/features/thread/presentation/widgets/empty_emails_widget.dart b/lib/features/thread/presentation/widgets/empty_emails_widget.dart index 0371ad943..84f2f65f4 100644 --- a/lib/features/thread/presentation/widgets/empty_emails_widget.dart +++ b/lib/features/thread/presentation/widgets/empty_emails_widget.dart @@ -13,6 +13,7 @@ class EmptyEmailsWidget extends StatelessWidget { final bool isSearchActive; final bool isFilterMessageActive; + final bool isNetworkConnectionAvailable; final OnCreateFiltersActionCallback? onCreateFiltersActionCallback; final _responsiveUtils = Get.find(); @@ -22,6 +23,7 @@ class EmptyEmailsWidget extends StatelessWidget { Key? key, this.isSearchActive = false, this.isFilterMessageActive = false, + this.isNetworkConnectionAvailable = true, this.onCreateFiltersActionCallback, }) : super(key: key); @@ -45,14 +47,10 @@ class EmptyEmailsWidget extends StatelessWidget { child: Text( key: const Key('empty_email_message'), _getMessageEmptyEmail(context), - style: TextStyle( + style: const TextStyle( color: EmptyEmailsWidgetStyles.labelTextColor, - fontSize: _validateShowCreateRuleButton - ? EmptyEmailsWidgetStyles.createFilterLabelTextSize - : EmptyEmailsWidgetStyles.labelTextSize, - fontWeight: _validateShowCreateRuleButton - ? EmptyEmailsWidgetStyles.createFilterLabelFontWeight - : EmptyEmailsWidgetStyles.labelFontWeight + fontSize: EmptyEmailsWidgetStyles.createFilterLabelTextSize, + fontWeight: EmptyEmailsWidgetStyles.createFilterLabelFontWeight ), textAlign: TextAlign.center, ), @@ -100,10 +98,14 @@ class EmptyEmailsWidget extends StatelessWidget { } } - bool get _validateShowCreateRuleButton => - !isFilterMessageActive && !isSearchActive && onCreateFiltersActionCallback != null; + bool get _validateShowCreateRuleButton => isNetworkConnectionAvailable + && !isFilterMessageActive && !isSearchActive && onCreateFiltersActionCallback != null; String _getMessageEmptyEmail(BuildContext context) { + if (!isNetworkConnectionAvailable) { + return AppLocalizations.of(context).no_internet_connection_try_again_later; + } + if (isSearchActive) { return AppLocalizations.of(context).no_emails_matching_your_search; } else { diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 734af4ad0..5daaf1dd3 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2024-08-19T14:44:31.528161", + "@@last_modified": "2024-08-20T10:36:35.487743", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -962,6 +962,12 @@ "placeholders_order": [], "placeholders": {} }, + "no_internet_connection_try_again_later": "No internet connection, try again later.", + "@no_internet_connection_try_again_later": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, "page_name": "Twake Mail", "@page_name": { "type": "text", @@ -2604,12 +2610,6 @@ "placeholders_order": [], "placeholders": {} }, - "reduceSomeFiltersAndTryAgain": "Let's reduce some filters and try again", - "@reduceSomeFiltersAndTryAgain": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, "sendMessageFailure": "Failure to send your message.", "@sendMessageFailure": { "type": "text", @@ -3126,18 +3126,6 @@ "folderName": {} } }, - "folderCreatedTitle": "Your folder is just created", - "@folderCreatedTitle": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, - "folderCreatedMessage": "To begin using this folder, you should add some rules to organize all of your mail in your own way.", - "@folderCreatedMessage": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, "createFilters": "Create filters", "@createFilters": { "type": "text", diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index c2c82f9fb..3630205ee 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -998,6 +998,13 @@ class AppLocalizations { ); } + String get no_internet_connection_try_again_later { + return Intl.message( + 'No internet connection, try again later.', + name: 'no_internet_connection_try_again_later' + ); + } + String get page_name { return Intl.message( 'Twake Mail', diff --git a/test/features/thread/presentation/widgets/empty_email_widget_test.dart b/test/features/thread/presentation/widgets/empty_email_widget_test.dart index e736a77e6..5e3438bbc 100644 --- a/test/features/thread/presentation/widgets/empty_email_widget_test.dart +++ b/test/features/thread/presentation/widgets/empty_email_widget_test.dart @@ -111,5 +111,104 @@ void main() { emptyEmailMessageWidget.data, 'No emails are matching your search'); }); + + testWidgets( + 'should have message correctly and do not have CreateRuleFilter button\n' + 'when no network', (tester) async { + final widget = makeTestableWidget( + child: EmptyEmailsWidget( + isNetworkConnectionAvailable: false, + ), + ); + + 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 internet connection, try again later.'); + }); + + testWidgets( + 'should have message correctly and do not have CreateRuleFilter button\n' + 'when no network, but search are still active', (tester) async { + final widget = makeTestableWidget( + child: EmptyEmailsWidget( + isNetworkConnectionAvailable: false, + 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 internet connection, try again later.'); + }); + + testWidgets( + 'should have message correctly and do not have CreateRuleFilter button\n' + 'when no network, but filter are still active', (tester) async { + final widget = makeTestableWidget( + child: EmptyEmailsWidget( + isNetworkConnectionAvailable: 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, + 'No internet connection, try again later.'); + }); + + testWidgets( + 'should have message correctly and do not have CreateRuleFilter button\n' + 'when no network, but filter and search are still active', (tester) async { + final widget = makeTestableWidget( + child: EmptyEmailsWidget( + isNetworkConnectionAvailable: 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, + 'No internet connection, try again later.'); + }); }); }