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/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<NetworkConnectionController>();
final QuickSearchEmailInteractor _quickSearchEmailInteractor;
final SaveRecentSearchInteractor _saveRecentSearchInteractor;
final GetAllRecentSearchLatestInteractor _getAllRecentSearchLatestInteractor;
@@ -469,6 +469,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
(success) => success is! SearchingState
? EmptyEmailsWidget(
key: const Key('empty_search_email_view'),
isNetworkConnectionAvailable: controller.networkConnectionController.isNetworkConnectionAvailable(),
isSearchActive: true)
: const SizedBox.shrink())
);
@@ -698,6 +698,7 @@ class ThreadView extends GetWidget<ThreadController>
} 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
@@ -13,6 +13,7 @@ class EmptyEmailsWidget extends StatelessWidget {
final bool isSearchActive;
final bool isFilterMessageActive;
final bool isNetworkConnectionAvailable;
final OnCreateFiltersActionCallback? onCreateFiltersActionCallback;
final _responsiveUtils = Get.find<ResponsiveUtils>();
@@ -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 {
+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": {
"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",
@@ -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',
@@ -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<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.');
});
});
}