import 'package:flutter/material.dart'; import 'package:muaawana/config/style.dart'; import 'package:muaawana/providers/language_provider.dart'; import 'package:muaawana/utils/text_style.dart'; import '../config/lang_enum.dart'; import '../config/provider.dart'; enum CustomTextFieldIconPosition { none, start, end, both } class CustomTextField extends StatefulWidget { final TextEditingController controller; final String hintText; final bool isRTL; final CustomTextFieldIconPosition iconPosition; final Widget? startIcon; final Widget? endIcon; final Color? startIconColor; final Color? endIconColor; final Color fillColor; final Color borderColor; final Function(String)? validation; final bool obscure; final bool phoneNumber; final TextInputType keyboardType ; const CustomTextField({ super.key, required this.controller, required this.hintText, this.isRTL = false, this.iconPosition = CustomTextFieldIconPosition.none, this.startIcon, this.endIcon, this.startIconColor, this.endIconColor, this.fillColor = AppStyle.white, this.borderColor = AppStyle.buttonBlue, this.validation, this.obscure = false, this.phoneNumber = false, this.keyboardType = TextInputType.text }); @override State createState() => _CustomTextFieldState(); } class _CustomTextFieldState extends State { @override Widget build(BuildContext context) { final prefixIcon = _getPrefixIcon(); final suffixIcon = _getSuffixIcon(); final langP = Provider.of(context); final isArabic = langP.currentLangCode == Language.ar; return TextFormField( obscureText: widget.obscure, autovalidateMode: AutovalidateMode.onUserInteraction, controller: widget.controller, textAlign: widget.isRTL ? TextAlign.end : TextAlign.start, textDirection: widget.isRTL ? TextDirection.rtl : TextDirection.ltr, keyboardType: widget.keyboardType , textAlignVertical: TextAlignVertical.center, decoration: InputDecoration( isDense: true, hintText: widget.hintText, hintTextDirection: widget.isRTL ? TextDirection.rtl : TextDirection.ltr, hintStyle: TextStyle( color: const Color(0xB2828282), fontSize: 12, fontFamily: isArabic ? "Readex_Pro" : 'Inter', fontWeight: FontWeight.w400, ), enabledBorder: OutlineInputBorder( borderRadius: widget.phoneNumber ? BorderRadius.only( topLeft: langP.currentLangCode == Language.en ? Radius.zero : const Radius.circular(20.0), bottomLeft: langP.currentLangCode == Language.en ? Radius.zero : const Radius.circular(20.0), topRight: langP.currentLangCode == Language.ar ? Radius.zero : const Radius.circular(20.0), bottomRight: langP.currentLangCode == Language.ar ? Radius.zero : const Radius.circular(20.0), ) : BorderRadius.circular(8.0), borderSide: BorderSide( color: Theme.of(context).brightness == Brightness.dark ? AppNewStyle.darkInputFieldColor : AppNewStyle.inputFieldColor, width: 0.4, ), ), focusedBorder: OutlineInputBorder( borderRadius: widget.phoneNumber ? BorderRadius.only( topLeft: langP.currentLangCode == Language.en ? Radius.zero : const Radius.circular(20.0), bottomLeft: langP.currentLangCode == Language.en ? Radius.zero : const Radius.circular(20.0), topRight: langP.currentLangCode == Language.ar ? Radius.zero : const Radius.circular(20.0), bottomRight: langP.currentLangCode == Language.ar ? Radius.zero : const Radius.circular(20.0), ) : BorderRadius.circular(8.0), borderSide: const BorderSide( color: AppStyle.primary, width: 0.4, ), ), filled: true, fillColor: Theme.of(context).brightness == Brightness.dark ? AppNewStyle.darkInputFieldColor : AppNewStyle.inputFieldColor, prefixIcon: prefixIcon, suffixIcon: suffixIcon, suffixIconConstraints: const BoxConstraints(maxHeight: 20), // contentPadding: // const EdgeInsets.symmetric(vertical: 0.0, horizontal: 0), errorBorder: OutlineInputBorder( borderRadius: widget.phoneNumber ? BorderRadius.only( topLeft: langP.currentLangCode == Language.en ? Radius.zero : const Radius.circular(20.0), bottomLeft: langP.currentLangCode == Language.en ? Radius.zero : const Radius.circular(20.0), topRight: langP.currentLangCode == Language.ar ? Radius.zero : const Radius.circular(20.0), bottomRight: langP.currentLangCode == Language.ar ? Radius.zero : const Radius.circular(20.0), ) : BorderRadius.circular(8.0), borderSide: const BorderSide(color: Colors.red, width: 1)), ), validator: (val) { if (widget.validation != null) { widget.validation!(val!); } else { if (val != null) { if (widget.hintText == "Full Name" || widget.hintText == "Full Name*" || widget.hintText == "Full Name*") { if (val.isEmpty) { return "Please enter your name"; } else if (val.length < 2) { return "Too short"; } if (!RegExp("^[\u0000-\u007F]+\$").hasMatch(val)) { return "Use Latin keyboard"; } return null; } if (widget.hintText == "Last name*") { if (val.isEmpty) { return "Please enter your last name"; } else if (val.length < 2) { return "Too short"; } if (!RegExp("^[\u0000-\u007F]+\$").hasMatch(val)) { return "Use Latin keyboard"; } return null; } else if (widget.hintText == "Email Address" || widget.hintText == "Email*" || widget.hintText == "Email") { if (val.isEmpty) { return "Please enter your email address"; } if (!RegExp("^[\u0000-\u007F]+\$").hasMatch(val)) { return "Use Latin keyboard"; } if (!RegExp( r"^[a-zA-Z0-9.a-zA-Z0-9!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9-_-]+\.[a-zA-Z]+") .hasMatch(val)) { return 'Please enter a valid email !'; } return null; } else if (widget.hintText == "Password" || widget.hintText == "Password*") { if (val.isEmpty) { return "Please enter your password"; } if (val.length < 8) { return "Weak"; } if (!RegExp("^[\u0000-\u007F]+\$").hasMatch(val)) { return "Use Latin keyboard"; } } else if (widget.hintText == "Phone Number" || widget.hintText == "Mobile No*") { if (val.isEmpty) { return "Please enter your phone number"; } if (val.isNotEmpty) { if (!RegExp("^[\u0000-\u007F]+\$").hasMatch(val)) { return "Use Latin keyboard"; } if (!RegExp(r'^[0-9]+$').hasMatch(val)) { return "Only numbers are accepted"; } // if (val.length != 4) { // return "Enter a valid phone number"; // } } } else if (widget.hintText == "City*") { if (val.isEmpty) { return "Please enter your city"; } if (val.isNotEmpty) { if (!RegExp("^[\u0000-\u007F]+\$").hasMatch(val)) { return "Use Latin keyboard"; } } } } } return null; }, ); } Widget? _getPrefixIcon() { if (widget.iconPosition == CustomTextFieldIconPosition.none || widget.iconPosition == CustomTextFieldIconPosition.end) { return null; } return Padding( padding: const EdgeInsets.symmetric(horizontal: 10), child: widget.startIcon); } Widget? _getSuffixIcon() { if (widget.iconPosition == CustomTextFieldIconPosition.none || widget.iconPosition == CustomTextFieldIconPosition.start) { return null; } if (widget.iconPosition == CustomTextFieldIconPosition.both) { return Row( mainAxisAlignment: MainAxisAlignment.end, children: [ widget.startIcon ?? Container(), // const SizedBox(width: 10), widget.endIcon ?? Container(), ], ); } return widget.endIcon; } }