TF-3408 Auto load more when user uses arrow down of keyboard

This commit is contained in:
dab246
2025-01-16 14:52:11 +07:00
committed by Dat H. Pham
parent b73784742a
commit aceaebe869
18 changed files with 134 additions and 301 deletions
@@ -8,6 +8,7 @@ class ComposerStyle {
static const double radius = 28;
static const double keyboardToolBarHeight = 200;
static const double popupMenuRadius = 8;
static const double suggestionItemHeight = 60;
static const Color borderColor = AppColor.colorLineComposer;
static const Color backgroundEditorColor = Colors.white;
@@ -1,6 +1,7 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/features/composer/presentation/styles/composer_style.dart';
class RecipientComposerWidgetStyle {
static const double deleteRecipientFieldIconSize = 20;
@@ -10,6 +11,7 @@ class RecipientComposerWidgetStyle {
static const double suggestionsBoxRadius = 20;
static const double suggestionsBoxMaxHeight = 300;
static const double suggestionBoxWidth = 300;
static const double suggestionBoxItemHeight = ComposerStyle.suggestionItemHeight;
static const double minTextFieldWidth = 20;
static const double tagSpacing = 8;
@@ -6,7 +6,6 @@ class RecipientSuggestionItemWidgetStyle {
static const double selectedIconSize = 24;
static const EdgeInsetsGeometry suggestionDuplicatedMargin = EdgeInsets.all(8.0);
static const EdgeInsetsGeometry labelDuplicatedPadding = EdgeInsets.symmetric(horizontal: 8.0);
static const EdgeInsetsGeometry labelPadding = EdgeInsets.symmetric(horizontal: 16.0);
static const TextStyle labelTextStyle = TextStyle(
@@ -180,6 +180,7 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
suggestionsBoxBackgroundColor: RecipientComposerWidgetStyle.suggestionsBoxBackgroundColor,
suggestionsBoxRadius: RecipientComposerWidgetStyle.suggestionsBoxRadius,
suggestionsBoxMaxHeight: RecipientComposerWidgetStyle.suggestionsBoxMaxHeight,
suggestionItemHeight: RecipientComposerWidgetStyle.suggestionBoxItemHeight,
suggestionBoxWidth: _getSuggestionBoxWidth(widget.maxWidth),
textStyle: RecipientComposerWidgetStyle.inputTextStyle,
onFocusTagAction: (focused) => _handleFocusTagAction.call(focused, stateSetter),
@@ -270,6 +271,7 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
suggestionsBoxBackgroundColor: RecipientComposerWidgetStyle.suggestionsBoxBackgroundColor,
suggestionsBoxRadius: RecipientComposerWidgetStyle.suggestionsBoxRadius,
suggestionsBoxMaxHeight: RecipientComposerWidgetStyle.suggestionsBoxMaxHeight,
suggestionItemHeight: RecipientComposerWidgetStyle.suggestionBoxItemHeight,
suggestionBoxWidth: _getSuggestionBoxWidth(widget.maxWidth),
textStyle: RecipientComposerWidgetStyle.inputTextStyle,
onFocusTagAction: (focused) => _handleFocusTagAction.call(focused, stateSetter),
@@ -1,12 +1,14 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/text/rich_text_builder.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:super_tag_editor/widgets/rich_text_widget.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/suggestion_email_address.dart';
import 'package:tmail_ui_user/features/composer/presentation/styles/composer_style.dart';
import 'package:tmail_ui_user/features/composer/presentation/styles/recipient_suggestion_item_widget_style.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/avatar_suggestion_item_widget.dart';
@@ -38,59 +40,91 @@ class RecipientSuggestionItemWidget extends StatelessWidget {
margin: RecipientSuggestionItemWidgetStyle.suggestionDuplicatedMargin,
decoration: const BoxDecoration(
color: AppColor.colorBgMenuItemDropDownSelected,
borderRadius: BorderRadius.all(Radius.circular(RecipientSuggestionItemWidgetStyle.radius))
borderRadius: BorderRadius.all(Radius.circular(RecipientSuggestionItemWidgetStyle.radius)),
),
height: ComposerStyle.suggestionItemHeight,
child: Material(
type: MaterialType.transparency,
child: ListTile(
contentPadding: RecipientSuggestionItemWidgetStyle.labelDuplicatedPadding,
leading: AvatarSuggestionItemWidget(emailAddress: emailAddress),
title: RichTextWidget(
textOrigin: emailAddress.asString(),
wordSearched: suggestionValid ?? '',
overflow: TextOverflow.ellipsis,
),
subtitle: emailAddress.displayName.isNotEmpty
? RichTextWidget(
textOrigin: emailAddress.emailAddress,
wordSearched: suggestionValid ?? '',
overflow: TextOverflow.ellipsis,
styleTextOrigin: RecipientSuggestionItemWidgetStyle.labelTextStyle,
styleWordSearched: RecipientSuggestionItemWidgetStyle.labelHighlightTextStyle
)
: null,
trailing: SvgPicture.asset(
imagePaths.icFilterSelected,
width: RecipientSuggestionItemWidgetStyle.selectedIconSize,
height: RecipientSuggestionItemWidgetStyle.selectedIconSize,
fit: BoxFit.fill
child: InkWell(
onTap: () {},
child: Padding(
padding: RecipientSuggestionItemWidgetStyle.labelPadding,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
AvatarSuggestionItemWidget(emailAddress: emailAddress),
const SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
RichTextWidget(
textOrigin: emailAddress.asString(),
wordSearched: suggestionValid ?? '',
overflow: TextOverflow.ellipsis,
),
if (emailAddress.displayName.isNotEmpty)
RichTextBuilder(
textOrigin: emailAddress.emailAddress,
wordToStyle: suggestionValid ?? '',
styleOrigin: RecipientSuggestionItemWidgetStyle.labelTextStyle,
styleWord: RecipientSuggestionItemWidgetStyle.labelHighlightTextStyle,
),
],
),
),
const SizedBox(width: 8),
SvgPicture.asset(
imagePaths.icFilterSelected,
width: RecipientSuggestionItemWidgetStyle.selectedIconSize,
height: RecipientSuggestionItemWidgetStyle.selectedIconSize,
fit: BoxFit.fill,
),
],
),
),
),
)
),
);
} else {
return Container(
color: highlight ? AppColor.colorItemSelected : Colors.white,
height: ComposerStyle.suggestionItemHeight,
child: Material(
type: MaterialType.transparency,
child: ListTile(
contentPadding: RecipientSuggestionItemWidgetStyle.labelPadding,
leading: AvatarSuggestionItemWidget(emailAddress: emailAddress),
title: RichTextWidget(
textOrigin: emailAddress.asString(),
wordSearched: suggestionValid ?? '',
overflow: TextOverflow.ellipsis,
),
subtitle: emailAddress.displayName.isNotEmpty
? RichTextWidget(
textOrigin: emailAddress.emailAddress,
wordSearched: suggestionValid ?? '',
overflow: TextOverflow.ellipsis,
styleTextOrigin: RecipientSuggestionItemWidgetStyle.labelTextStyle,
styleWordSearched: RecipientSuggestionItemWidgetStyle.labelHighlightTextStyle
)
: null,
child: InkWell(
onTap: () => onSelectedAction?.call(emailAddress),
child: Padding(
padding: RecipientSuggestionItemWidgetStyle.labelPadding,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
AvatarSuggestionItemWidget(emailAddress: emailAddress),
const SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
RichTextWidget(
textOrigin: emailAddress.asString(),
wordSearched: suggestionValid ?? '',
overflow: TextOverflow.ellipsis,
),
if (emailAddress.displayName.isNotEmpty)
RichTextBuilder(
textOrigin: emailAddress.emailAddress,
wordToStyle: suggestionValid ?? '',
styleOrigin: RecipientSuggestionItemWidgetStyle.labelTextStyle,
styleWord: RecipientSuggestionItemWidgetStyle.labelHighlightTextStyle,
),
],
),
),
],
),
),
),
),
);