diff --git a/lib/features/email_recovery/presentation/styles/text_input_field/text_input_field_widget_styles.dart b/lib/features/email_recovery/presentation/styles/text_input_field/text_input_field_widget_styles.dart new file mode 100644 index 000000000..16e5e6ced --- /dev/null +++ b/lib/features/email_recovery/presentation/styles/text_input_field/text_input_field_widget_styles.dart @@ -0,0 +1,50 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + +class TextInputFieldWidgetStyles { + static const double titleWidth = 112.0; + static const double borderWidth = 1.0; + static const double suffixIconSize = 8.0; + static const double space = 12.0; + static const double spaceMobile = 8.0; + + static const EdgeInsetsGeometry padding = EdgeInsets.symmetric( + vertical: 8.0 + ); + static const EdgeInsetsGeometry suffixIconPadding = EdgeInsets.only( + right: 12.0 + ); + static const EdgeInsetsGeometry contentPadding = EdgeInsetsDirectional.symmetric( + horizontal: 12.0 + ); + + static const BorderRadius borderRadius = BorderRadius.all(Radius.circular(10)); + + static const InputBorder border = OutlineInputBorder( + borderRadius: borderRadius, + borderSide: BorderSide( + width: borderWidth, + color: AppColor.colorInputBorderCreateMailbox, + ) + ); + static const InputBorder enableBorder = OutlineInputBorder( + borderRadius: borderRadius, + borderSide: BorderSide( + width: borderWidth, + color: AppColor.colorInputBorderCreateMailbox, + ) + ); + static const InputBorder focusedBorder = OutlineInputBorder( + borderRadius: borderRadius, + borderSide: BorderSide( + width: borderWidth, + color: AppColor.primaryColor, + ) + ); + + static const TextStyle inputtedTextStyle = TextStyle( + fontSize: 16, + fontWeight: FontWeight.w400, + color: Colors.black, + ); +} \ No newline at end of file diff --git a/lib/features/email_recovery/presentation/widgets/text_input_field/text_input_field_widget.dart b/lib/features/email_recovery/presentation/widgets/text_input_field/text_input_field_widget.dart new file mode 100644 index 000000000..7b9a8c590 --- /dev/null +++ b/lib/features/email_recovery/presentation/widgets/text_input_field/text_input_field_widget.dart @@ -0,0 +1,102 @@ +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:core/presentation/views/text/text_field_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/features/base/isolate/background_isolate_binary_messenger/background_isolate_binary_messenger_mobile.dart'; +import 'package:tmail_ui_user/features/email_recovery/presentation/model/email_recovery_field.dart'; +import 'package:tmail_ui_user/features/email_recovery/presentation/styles/text_input_field/text_input_field_widget_styles.dart'; + +typedef OnTextSubmitted = void Function(String text)?; + +class TextInputFieldWidget extends StatelessWidget { + final EmailRecoveryField field; + final ResponsiveUtils responsiveUtils; + final ImagePaths imagePaths; + final TextEditingController textEditingController; + final VoidCallback? onTap; + final MouseCursor? mouseCursor; + final FocusNode? currentFocusNode; + final FocusNode? nextFocusNode; + final OnTextSubmitted? onTextSubmitted; + + const TextInputFieldWidget({ + super.key, + required this.field, + required this.responsiveUtils, + required this.imagePaths, + required this.textEditingController, + this.onTap, + this.mouseCursor, + this.currentFocusNode, + this.nextFocusNode, + this.onTextSubmitted, + }); + + @override + Widget build(BuildContext context) { + final title = SizedBox( + width: responsiveUtils.isMobile(context) + ? null + : TextInputFieldWidgetStyles.titleWidth, + child: Text( + field.getTitle(context), + style: field.getTitleTextStyle(), + ), + ); + final inputField = TextFieldBuilder( + controller: textEditingController, + readOnly: false, + mouseCursor: mouseCursor, + maxLines: 1, + textInputAction: TextInputAction.next, + textStyle: TextInputFieldWidgetStyles.inputtedTextStyle, + onTap: onTap, + onTextSubmitted: onTextSubmitted, + decoration: InputDecoration( + filled: true, + fillColor: Colors.white, + contentPadding: TextInputFieldWidgetStyles.contentPadding, + enabledBorder: TextInputFieldWidgetStyles.enableBorder, + border: TextInputFieldWidgetStyles.border, + focusedBorder: TextInputFieldWidgetStyles.focusedBorder, + hintText: field.getHintText(context), + hintStyle: field.getHintTextStyle(), + ), + ); + + return RawKeyboardListener( + focusNode: currentFocusNode ?? FocusNode(), + onKey: (event) { + if (event is RawKeyDownEvent && event.logicalKey == LogicalKeyboardKey.tab) { + nextFocusNode?.requestFocus(); + } + }, + child: Padding( + padding: TextInputFieldWidgetStyles.padding, + child: responsiveUtils.isMobile(context) + ? Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + title, + const SizedBox(height: TextInputFieldWidgetStyles.spaceMobile), + inputField, + ] + ) + : SizedBox( + height: 44, + child: Row( + children: [ + title, + const SizedBox(width: TextInputFieldWidgetStyles.space), + Expanded( + child: inputField, + ) + ], + ), + ), + ) + ); + } +} \ No newline at end of file