Files
Tanami_App/lib/shared/components/form_label_textfield.dart
2024-07-18 18:51:01 +05:30

186 lines
7.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:gap/gap.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_text.dart';
import 'package:tanami_app/features/login/presentation/bloc/login_bloc.dart';
import 'package:tanami_app/shared/components/password_text_form_field.dart';
import 'package:tanami_app/shared/components/text_widget.dart';
import '../../core/routes/route_name.dart';
import '../../core/routes/routes.dart';
import '../../core/utils/language/localizations_delegate.dart';
import '../../features/forgotPassword/presentation/bloc/restore_password_phone_verification_bloc.dart';
import '../../features/register/presentation/bloc/register_bloc.dart';
import 'text_from_field_widget.dart';
class FormLabelTextField extends StatelessWidget {
const FormLabelTextField({
super.key,
required this.title,
required this.type,
required this.textEditingController,
required this.hintText,
this.prefixWidget,
this.onChangeFun,
this.originalPasswordController,
});
final String title;
final String type;
final String hintText;
final TextEditingController textEditingController;
final Widget? prefixWidget;
final Function(String)? onChangeFun;
final TextEditingController? originalPasswordController;
@override
Widget build(BuildContext context) {
// Map of country codes to phone number lengths
final Map<String, int> countryPhoneLengths = {
"+973": 8, // Bahrain
"+965": 8, // Kuwait
"+968": 8, // Oman
"+974": 8, // Qatar
"+966": 9, // Saudi Arabia
"+971": 9, // United Arab Emirates
"+91": 10,
};
var registerBloc = context.read<RegisterBloc>();
var loginBloc = context.read<LoginBloc>();
var restorePasswordBloc =
context.read<RestorePasswordPhoneVerificationBloc>();
var localizations = AppLocalizations.of(context);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget().text14W500(
title,
clr: AppColor.textLabelColor,
txtAlign: type == "description" ? TextAlign.start : TextAlign.center,
),
const Gap(10),
(type == "password" || type == "repeat-password")
? PasswordField(
controller: textEditingController,
hintText: hintText,
originalPasswordController: originalPasswordController,
)
: textFormField(
onInput: onChangeFun,
validator: (value) {
if (type == "phone number") {
if (value != null && value.isEmpty) {
return localizations.translate(AppText.enterPhoneNo);
}
if (registerBloc.isdcode.isNotEmpty) {
// Validate phone number length based on selected country
if (countryPhoneLengths.containsKey(
registerBloc.isdcode,
)) {
final expectedLength =
countryPhoneLengths[registerBloc.isdcode];
if (value.length != expectedLength) {
return localizations.translate(
"Invalid Phone Number",
);
}
}
} else if (loginBloc.isdcode.isNotEmpty) {
// Validate phone number length based on selected country
if (countryPhoneLengths.containsKey(
loginBloc.isdcode,
)) {
final expectedLength =
countryPhoneLengths[loginBloc.isdcode];
if (value.length != expectedLength) {
return localizations.translate(
"Invalid Phone Number",
);
}
}
} else if (restorePasswordBloc.isdcode.isNotEmpty) {
// Validate phone number length based on selected country
if (countryPhoneLengths.containsKey(
restorePasswordBloc.isdcode,
)) {
final expectedLength =
countryPhoneLengths[restorePasswordBloc.isdcode];
if (value.length != expectedLength) {
return localizations.translate(
"Invalid Phone Number",
);
}
}
}
return null;
} else if (type == "country selection") {
if (textEditingController.text.isEmpty) {
return localizations.translate(AppText.chooseCountry);
}
return null;
} else if (type == "description") {
if (textEditingController.text.isEmpty) {
return localizations
.translate(AppText.pleaseEnteraDescription);
}
return null;
} else if (type == "email") {
if (value == null || value.isEmpty) {
return 'Please enter an email address.';
}
// Email validation
if (!RegExp(r'^[^@]+@[^@]+\.[^@]+').hasMatch(value)) {
return 'Please enter a valid email address.';
}
return null;
} else {
return null;
}
},
inputFormatters: (type == "phone number")
? registerBloc.isdcode.isNotEmpty
? [
LengthLimitingTextInputFormatter(
countryPhoneLengths[registerBloc.isdcode]),
]
: restorePasswordBloc.isdcode.isNotEmpty
? [
LengthLimitingTextInputFormatter(
countryPhoneLengths[
restorePasswordBloc.isdcode]),
]
: [
LengthLimitingTextInputFormatter(
countryPhoneLengths[loginBloc.isdcode]),
]
: [
LengthLimitingTextInputFormatter(350),
],
maxlines: type == "description" ? 6 : 1,
texttype: type == "phone number"
? TextInputType.phone
: type == "Email"
? TextInputType.emailAddress
: TextInputType.name,
textEditingController: textEditingController,
readonly: type == "country selection" ? true : false,
hintText: hintText,
leadingIcon: prefixWidget,
suffixIcon: type == "country selection"
? const Icon(
Icons.arrow_forward_ios_rounded,
color: Color(0xFFB4B4B4),
)
: const SizedBox(),
onTap: () {
if (type == "country selection") {
goRouter.pushNamed(RouteName.chooseCountryScreen);
}
})
],
);
}
}