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,57 +0,0 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/views/text/input_decoration_builder.dart';
import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart';
class ContactInputDecorationBuilder extends InputDecorationBuilder {
@override
InputDecoration build() {
return InputDecoration(
enabledBorder: enabledBorder ?? const OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(12)),
borderSide: BorderSide(
width: 0.5,
color: AppColor.colorInputBorderCreateMailbox)),
focusedBorder: enabledBorder ?? const OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(12)),
borderSide: BorderSide(
width: 1,
color: AppColor.colorTextButton)),
errorBorder: errorBorder ?? const OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(12)),
borderSide: BorderSide(
width: 1,
color: AppColor.colorInputBorderErrorVerifyName)),
focusedErrorBorder: errorBorder ?? const OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(12)),
borderSide: BorderSide(
width: 0.5,
color: AppColor.colorInputBorderErrorVerifyName)),
prefixText: prefixText,
labelText: labelText,
floatingLabelBehavior: FloatingLabelBehavior.never,
labelStyle: labelStyle ?? const TextStyle(
color: Colors.black,
fontSize: 16,
fontWeight: FontWeight.w500),
hintText: hintText,
isDense: true,
hintStyle: hintStyle ?? const TextStyle(
color: AppColor.colorEmailAddressFull,
fontWeight: FontWeight.w500,
fontSize: 16),
contentPadding: EdgeInsets.symmetric(
vertical: PlatformInfo.isWeb ? 16 : 12,
horizontal: 12),
errorText: errorText,
errorStyle: errorTextStyle ?? const TextStyle(
color: AppColor.colorInputBorderErrorVerifyName,
fontSize: 13),
filled: true,
fillColor: errorText?.isNotEmpty == true
? AppColor.colorInputBackgroundErrorVerifyName
: AppColor.colorInputBackgroundCreateMailbox);
}
}
@@ -0,0 +1,102 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/avatar/gradient_circle_avatar_icon.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/extensions/email_address_extension.dart';
import 'package:tmail_ui_user/features/contact/presentation/styles/contact_item_widget_style.dart';
typedef OnSelectContactAction = Function(EmailAddress emailAddress);
typedef OnDeleteContactAction = Function(EmailAddress emailAddress);
class ContactItemWidget extends StatelessWidget {
final EmailAddress emailAddress;
final List<EmailAddress> selectedContactList;
final ImagePaths imagePaths;
final ResponsiveUtils responsiveUtils;
final OnSelectContactAction onSelectContactAction;
final OnDeleteContactAction onDeleteContactAction;
const ContactItemWidget({
Key? key,
required this.emailAddress,
required this.selectedContactList,
required this.imagePaths,
required this.responsiveUtils,
required this.onSelectContactAction,
required this.onDeleteContactAction,
}) : super(key: key);
@override
Widget build(BuildContext context) {
final childWidget = Padding(
padding: ContactItemWidgetStyle.getItemPadding(
context,
responsiveUtils
),
child: Row(
children: [
GradientCircleAvatarIcon(
colors: emailAddress.avatarColors,
label: emailAddress.labelAvatar,
),
const SizedBox(width: 12),
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
emailAddress.asString(),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: ContactItemWidgetStyle.nameAddressTextStyle
),
if (emailAddress.displayName.isNotEmpty)
Padding(
padding: const EdgeInsets.only(top: 2),
child: Text(
emailAddress.emailAddress,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: ContactItemWidgetStyle.emailAddressTextStyle
)
)
]
)
),
Padding(
padding: const EdgeInsetsDirectional.symmetric(horizontal: 12),
child: SvgPicture.asset(
_isSelectedEmailAddress
? imagePaths.icCheckboxSelected
: imagePaths.icCheckboxUnselected,
width: 20,
height: 20,
colorFilter: _isSelectedEmailAddress
? AppColor.primaryColor.asFilter()
: AppColor.colorEmailTileCheckboxUnhover.asFilter(),
),
),
]
),
);
return Material(
color: Colors.transparent,
child: InkWell(
onTap: () => _isSelectedEmailAddress
? onDeleteContactAction(emailAddress)
: onSelectContactAction(emailAddress),
child: childWidget,
),
);
}
bool get _isSelectedEmailAddress => selectedContactList
.any((contact) => contact.emailAddress == emailAddress.emailAddress);
}
@@ -0,0 +1,66 @@
import 'package:core/presentation/extensions/capitalize_extension.dart';
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class ContactListActionWidget extends StatelessWidget {
final VoidCallback onClearFilterAction;
final VoidCallback onDoneAction;
const ContactListActionWidget({
super.key,
required this.onClearFilterAction,
required this.onDoneAction
});
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(16),
width: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Flexible(
child: TMailButtonWidget.fromText(
text: AppLocalizations.of(context).clearFilter.capitalizeFirstEach,
backgroundColor: AppColor.colorContactViewClearFilterButton.withOpacity(0.05),
borderRadius: 10,
maxHeight: 44,
minWidth: 156,
maxLines: 1,
textAlign: TextAlign.center,
textStyle: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 17,
color: AppColor.primaryColor
),
onTapActionCallback: onClearFilterAction,
),
),
const SizedBox(width: 12),
Flexible(
child: TMailButtonWidget.fromText(
text: AppLocalizations.of(context).done,
backgroundColor: AppColor.primaryColor,
borderRadius: 10,
maxHeight: 44,
minWidth: 156,
maxLines: 1,
textAlign: TextAlign.center,
textStyle: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 17,
color: Colors.white
),
onTapActionCallback: onDoneAction,
),
),
],
),
);
}
}
@@ -0,0 +1,31 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/views/loading/cupertino_loading_widget.dart';
import 'package:dartz/dartz.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
class ContactLoadingBarWidget extends StatelessWidget {
final Either<Failure, Success> viewState;
const ContactLoadingBarWidget({super.key, required this.viewState});
@override
Widget build(BuildContext context) {
return viewState.fold(
(failure) => const SizedBox.shrink(),
(success) {
if (success is SearchingState) {
return const CupertinoLoadingWidget(
padding: EdgeInsets.symmetric(vertical: 12)
);
} else {
return const SizedBox.shrink();
}
}
);
}
}