TF-2947 Update empty view also when no network connection

This commit is contained in:
Dat PHAM HOANG
2024-08-19 17:28:56 +07:00
committed by Dat H. Pham
parent b9b6d58b87
commit a5a8d42763
7 changed files with 130 additions and 28 deletions
@@ -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/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/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/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/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/domain/usecases/refresh_changes_search_email_interactor.dart';
import 'package:tmail_ui_user/features/search/email/presentation/model/search_more_state.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, with EmailActionController,
DateRangePickerMixin { DateRangePickerMixin {
final networkConnectionController = Get.find<NetworkConnectionController>();
final QuickSearchEmailInteractor _quickSearchEmailInteractor; final QuickSearchEmailInteractor _quickSearchEmailInteractor;
final SaveRecentSearchInteractor _saveRecentSearchInteractor; final SaveRecentSearchInteractor _saveRecentSearchInteractor;
final GetAllRecentSearchLatestInteractor _getAllRecentSearchLatestInteractor; final GetAllRecentSearchLatestInteractor _getAllRecentSearchLatestInteractor;
@@ -469,6 +469,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
(success) => success is! SearchingState (success) => success is! SearchingState
? EmptyEmailsWidget( ? EmptyEmailsWidget(
key: const Key('empty_search_email_view'), key: const Key('empty_search_email_view'),
isNetworkConnectionAvailable: controller.networkConnectionController.isNetworkConnectionAvailable(),
isSearchActive: true) isSearchActive: true)
: const SizedBox.shrink()) : const SizedBox.shrink())
); );
@@ -698,6 +698,7 @@ class ThreadView extends GetWidget<ThreadController>
} else { } else {
return EmptyEmailsWidget( return EmptyEmailsWidget(
key: const Key('empty_thread_view'), key: const Key('empty_thread_view'),
isNetworkConnectionAvailable: controller.networkConnectionController.isNetworkConnectionAvailable(),
isSearchActive: controller.isSearchActive, isSearchActive: controller.isSearchActive,
isFilterMessageActive: controller.mailboxDashBoardController.filterMessageOption.value != FilterMessageOption.all, isFilterMessageActive: controller.mailboxDashBoardController.filterMessageOption.value != FilterMessageOption.all,
onCreateFiltersActionCallback: controller.goToCreateEmailRuleView onCreateFiltersActionCallback: controller.goToCreateEmailRuleView
@@ -13,6 +13,7 @@ class EmptyEmailsWidget extends StatelessWidget {
final bool isSearchActive; final bool isSearchActive;
final bool isFilterMessageActive; final bool isFilterMessageActive;
final bool isNetworkConnectionAvailable;
final OnCreateFiltersActionCallback? onCreateFiltersActionCallback; final OnCreateFiltersActionCallback? onCreateFiltersActionCallback;
final _responsiveUtils = Get.find<ResponsiveUtils>(); final _responsiveUtils = Get.find<ResponsiveUtils>();
@@ -22,6 +23,7 @@ class EmptyEmailsWidget extends StatelessWidget {
Key? key, Key? key,
this.isSearchActive = false, this.isSearchActive = false,
this.isFilterMessageActive = false, this.isFilterMessageActive = false,
this.isNetworkConnectionAvailable = true,
this.onCreateFiltersActionCallback, this.onCreateFiltersActionCallback,
}) : super(key: key); }) : super(key: key);
@@ -45,14 +47,10 @@ class EmptyEmailsWidget extends StatelessWidget {
child: Text( child: Text(
key: const Key('empty_email_message'), key: const Key('empty_email_message'),
_getMessageEmptyEmail(context), _getMessageEmptyEmail(context),
style: TextStyle( style: const TextStyle(
color: EmptyEmailsWidgetStyles.labelTextColor, color: EmptyEmailsWidgetStyles.labelTextColor,
fontSize: _validateShowCreateRuleButton fontSize: EmptyEmailsWidgetStyles.createFilterLabelTextSize,
? EmptyEmailsWidgetStyles.createFilterLabelTextSize fontWeight: EmptyEmailsWidgetStyles.createFilterLabelFontWeight
: EmptyEmailsWidgetStyles.labelTextSize,
fontWeight: _validateShowCreateRuleButton
? EmptyEmailsWidgetStyles.createFilterLabelFontWeight
: EmptyEmailsWidgetStyles.labelFontWeight
), ),
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
@@ -100,10 +98,14 @@ class EmptyEmailsWidget extends StatelessWidget {
} }
} }
bool get _validateShowCreateRuleButton => bool get _validateShowCreateRuleButton => isNetworkConnectionAvailable
!isFilterMessageActive && !isSearchActive && onCreateFiltersActionCallback != null; && !isFilterMessageActive && !isSearchActive && onCreateFiltersActionCallback != null;
String _getMessageEmptyEmail(BuildContext context) { String _getMessageEmptyEmail(BuildContext context) {
if (!isNetworkConnectionAvailable) {
return AppLocalizations.of(context).no_internet_connection_try_again_later;
}
if (isSearchActive) { if (isSearchActive) {
return AppLocalizations.of(context).no_emails_matching_your_search; return AppLocalizations.of(context).no_emails_matching_your_search;
} else { } else {
+7 -19
View File
@@ -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": "Initializing data...",
"@initializing_data": { "@initializing_data": {
"type": "text", "type": "text",
@@ -962,6 +962,12 @@
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "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": "Twake Mail",
"@page_name": { "@page_name": {
"type": "text", "type": "text",
@@ -2604,12 +2610,6 @@
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "placeholders": {}
}, },
"reduceSomeFiltersAndTryAgain": "Let's reduce some filters and try again",
"@reduceSomeFiltersAndTryAgain": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"sendMessageFailure": "Failure to send your message.", "sendMessageFailure": "Failure to send your message.",
"@sendMessageFailure": { "@sendMessageFailure": {
"type": "text", "type": "text",
@@ -3126,18 +3126,6 @@
"folderName": {} "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": "Create filters",
"@createFilters": { "@createFilters": {
"type": "text", "type": "text",
@@ -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 { String get page_name {
return Intl.message( return Intl.message(
'Twake Mail', 'Twake Mail',
@@ -111,5 +111,104 @@ void main() {
emptyEmailMessageWidget.data, emptyEmailMessageWidget.data,
'No emails are matching your search'); '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<Text>(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<Text>(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<Text>(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<Text>(emptyEmailMessageWidgetFinder);
expect(
emptyEmailMessageWidget.data,
'No internet connection, try again later.');
});
}); });
} }