TF-3005 Apply new design search result list contact view

This commit is contained in:
dab246
2024-10-08 18:37:18 +07:00
committed by Dat H. Pham
parent 4cdd55ed82
commit 6d0c7ed7f5
16 changed files with 461 additions and 277 deletions
@@ -1,16 +1,14 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/suggestion_email_address.dart';
import 'package:tmail_ui_user/features/contact/presentation/contact_controller.dart';
import 'package:tmail_ui_user/features/contact/presentation/styles/contact_view_style.dart';
import 'package:tmail_ui_user/features/contact/presentation/utils/contact_utils.dart';
import 'package:tmail_ui_user/features/contact/presentation/widgets/app_bar_contact_widget.dart';
import 'package:tmail_ui_user/features/contact/presentation/widgets/contact_suggestion_box_item.dart';
import 'package:tmail_ui_user/features/contact/presentation/widgets/contact_item_widget.dart';
import 'package:tmail_ui_user/features/contact/presentation/widgets/contact_list_action_widget.dart';
import 'package:tmail_ui_user/features/contact/presentation/widgets/contact_loading_bar_widget.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/search_app_bar_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -68,10 +66,11 @@ class ContactView extends GetWidget<ContactController> {
hasBackButton: false,
hasSearchButton: true,
searchIconSize: 20,
autoFocus: false,
searchIconColor: AppColor.colorHintSearchBar,
margin: ContactViewStyle.getSearchInputFormMargin(
context,
controller.responsiveUtils
controller.responsiveUtils,
),
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(12)),
@@ -84,94 +83,22 @@ class ContactView extends GetWidget<ContactController> {
onTextChangeSearchAction: controller.onTextSearchChange,
onSearchTextAction: controller.onSearchTextAction,
)),
if (PlatformInfo.isWeb)
Obx(() {
final username = controller.session.value?.username.value ?? '';
if (username.isNotEmpty) {
final userEmailAddress = EmailAddress(
AppLocalizations.of(context).me,
username);
final fromMeSuggestionEmailAddress = SuggestionEmailAddress(userEmailAddress, state: SuggestionEmailState.valid);
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 4),
child: Column(
children: [
ContactSuggestionBoxItem(
fromMeSuggestionEmailAddress,
padding: ContactUtils.getPaddingSearchResultList(context, controller.responsiveUtils),
selectedContactCallbackAction: (contact) {
controller.selectContact(context, contact);
},
),
Padding(
padding: ContactUtils.getPaddingDividerSearchResultList(context, controller.responsiveUtils),
child: const Divider(height: 1, color: AppColor.colorDivider),
),
],
),
);
Obx(() => ContactLoadingBarWidget(
viewState: controller.searchViewState.value,
)),
Expanded(
child: Obx(() {
if (controller.searchStatus.value == SearchStatus.ACTIVE) {
return _buildSearchedContactListView();
} else {
return const SizedBox.shrink();
return _buildSelectedContactListView();
}
}),
Expanded(child: Obx(() {
if (controller.listContactSearched.isNotEmpty) {
if (PlatformInfo.isMobile) {
return Container(
color: Colors.white,
child: ListView.separated(
itemCount: controller.listContactSearched.length,
separatorBuilder: (context, index) {
return Padding(
padding: ContactUtils.getPaddingDividerSearchResultList(context, controller.responsiveUtils),
child: const Divider(height: 1, color: AppColor.colorDivider),
);
},
itemBuilder: (context, index) {
final emailAddress = controller.listContactSearched[index];
final suggestionEmailAddress = _toSuggestionEmailAddress(
emailAddress,
controller.contactSelected != null ? [controller.contactSelected!] : []
);
return ContactSuggestionBoxItem(
suggestionEmailAddress,
padding: ContactUtils.getPaddingSearchResultList(context, controller.responsiveUtils),
selectedContactCallbackAction: (contact) => controller.selectContact(context, contact),
);
}
)
);
} else {
return Container(
color: Colors.white,
padding: const EdgeInsets.symmetric(horizontal: 4),
child: ListView.separated(
itemCount: controller.listContactSearched.length,
separatorBuilder: (context, index) {
return Padding(
padding: ContactUtils.getPaddingDividerSearchResultList(context, controller.responsiveUtils),
child: const Divider(height: 1, color: AppColor.colorDivider),
);
},
itemBuilder: (context, index) {
final emailAddress = controller.listContactSearched[index];
final suggestionEmailAddress = _toSuggestionEmailAddress(
emailAddress,
controller.contactSelected != null ? [controller.contactSelected!] : []
);
return ContactSuggestionBoxItem(
suggestionEmailAddress,
padding: ContactUtils.getPaddingSearchResultList(context, controller.responsiveUtils),
selectedContactCallbackAction: (contact) => controller.selectContact(context, contact),
);
}
)
);
}
} else {
return const SizedBox.shrink();
}
})),
})
),
ContactListActionWidget(
onClearFilterAction: controller.handleOnClearFilterAction,
onDoneAction: controller.handleOnDoneAction,
),
]
),
)
@@ -183,11 +110,65 @@ class ContactView extends GetWidget<ContactController> {
);
}
SuggestionEmailAddress _toSuggestionEmailAddress(EmailAddress item, List<EmailAddress> addedEmailAddresses) {
if (addedEmailAddresses.contains(item)) {
return SuggestionEmailAddress(item, state: SuggestionEmailState.duplicated);
} else {
return SuggestionEmailAddress(item);
}
Widget _buildSearchedContactListView() {
return Obx(() {
if (controller.searchedContactList.isEmpty) {
return const SizedBox.shrink();
}
return ListView.separated(
itemCount: controller.searchedContactList.length,
separatorBuilder: (context, index) {
return Padding(
padding: ContactViewStyle.getDividerSearchResultListPadding(
context,
controller.responsiveUtils
),
child: const Divider(height: 1, color: AppColor.colorDivider),
);
},
itemBuilder: (context, index) {
return ContactItemWidget(
emailAddress: controller.searchedContactList[index],
selectedContactList: controller.selectedContactList,
imagePaths: controller.imagePaths,
responsiveUtils: controller.responsiveUtils,
onSelectContactAction: controller.handleOnSelectContactAction,
onDeleteContactAction: controller.handleOnDeleteContactAction,
);
}
);
});
}
Widget _buildSelectedContactListView() {
return Obx(() {
if (controller.selectedContactList.isEmpty) {
return const SizedBox.shrink();
}
return ListView.separated(
itemCount: controller.selectedContactList.length,
separatorBuilder: (context, index) {
return Padding(
padding: ContactViewStyle.getDividerSearchResultListPadding(
context,
controller.responsiveUtils
),
child: const Divider(height: 1, color: AppColor.colorDivider),
);
},
itemBuilder: (context, index) {
return ContactItemWidget(
emailAddress: controller.selectedContactList[index],
selectedContactList: controller.selectedContactList,
imagePaths: controller.imagePaths,
responsiveUtils: controller.responsiveUtils,
onSelectContactAction: controller.handleOnSelectContactAction,
onDeleteContactAction: controller.handleOnDeleteContactAction,
);
}
);
});
}
}