TF-2947 Update empty view also when no network connection
This commit is contained in:
committed by
Dat H. Pham
parent
b9b6d58b87
commit
a5a8d42763
@@ -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 {
|
||||||
|
|||||||
@@ -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.');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user