TF-3005 Apply new design search result list contact view
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user