212 lines
9.5 KiB
Dart
212 lines
9.5 KiB
Dart
import 'package:cached_network_image/cached_network_image.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
import 'package:gap/gap.dart';
|
|
import 'package:google_fonts/google_fonts.dart';
|
|
import 'package:tanami_app/core/styles/app_text.dart';
|
|
import 'package:tanami_app/core/utils/phone_number_hint_generator/phone_number_hint_generator.dart';
|
|
|
|
import '../../../../Globalconst.dart';
|
|
import '../../../../core/styles/app_color.dart';
|
|
import '../../../../core/utils/language/localizations_delegate.dart';
|
|
import '../../../../shared/api/api_endpoints.dart';
|
|
import '../../../../shared/components/bloc/password_field/password_visibility_bloc.dart';
|
|
import '../../../../shared/components/form_label_textfield.dart';
|
|
import '../../../countrySelection/bloc/GetCountry/get_country_bloc.dart';
|
|
import '../../../countrySelection/bloc/GetCountry/get_country_state.dart';
|
|
import '../../../countrySelection/bloc/choose_country_bloc.dart';
|
|
import '../../../countrySelection/bloc/choose_country_state.dart';
|
|
import '../bloc/login_bloc.dart';
|
|
|
|
class LoginForm extends StatelessWidget {
|
|
const LoginForm({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
var localizations = AppLocalizations.of(context);
|
|
final loginBloc = context.read<LoginBloc>();
|
|
final countrydata = context.read<GetCountryBlock>();
|
|
|
|
String flag = "";
|
|
|
|
// Reset fields when the screen is built
|
|
loginBloc.resetFields();
|
|
|
|
String hintText = '00 000 000';
|
|
|
|
return BlocConsumer<RadioBloc, RadioState>(listener: (context, state) {
|
|
int selectedCountry = -1;
|
|
if (state is RadioSelectionChanged) {
|
|
selectedCountry = state.selectedIndex;
|
|
final countryState = countrydata.state;
|
|
if (countryState is CountryLoaded) {
|
|
loginBloc.countrySelectionTextField.text = countryState
|
|
.countryModel.data![selectedCountry].countryName
|
|
.toString();
|
|
loginBloc.phoneNumberTextField.text = "";
|
|
loginBloc.isdcode =
|
|
"${countryState.countryModel.data![selectedCountry].iSDcode}";
|
|
if (PhoneNumberHintGenerator().countryPhoneLengths.containsKey(
|
|
loginBloc.isdcode,
|
|
)) {
|
|
final expectedLength = PhoneNumberHintGenerator()
|
|
.countryPhoneLengths[loginBloc.isdcode];
|
|
hintText = PhoneNumberHintGenerator()
|
|
.formatPhoneNumber(loginBloc.isdcode, expectedLength!);
|
|
}
|
|
loginBloc.countryId =
|
|
"${countryState.countryModel.data![selectedCountry].id}";
|
|
flag =
|
|
"${ApiEndpoints.base}${countryState.countryModel.data![selectedCountry].flagIcon}";
|
|
Globalconst.phonenumber = loginBloc.phoneNumberTextField.text;
|
|
|
|
Globalconst.name = countryState
|
|
.countryModel.data![selectedCountry].countryName
|
|
.toString();
|
|
Globalconst.isdcode =
|
|
"${countryState.countryModel.data![selectedCountry].iSDcode}";
|
|
}
|
|
}
|
|
}, builder: (context, state) {
|
|
int selectedCountry = -1;
|
|
if (state is RadioSelectionChanged) {
|
|
selectedCountry = state.selectedIndex;
|
|
}
|
|
return Form(
|
|
key: loginBloc.formKey,
|
|
child: Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 14,
|
|
),
|
|
child: Align(
|
|
alignment: Alignment.topLeft,
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
const Gap(50),
|
|
FormLabelTextField(
|
|
prefixWidget: selectedCountry == -1
|
|
? null
|
|
: Padding(
|
|
padding: EdgeInsets.only(left: 12.w),
|
|
child: SizedBox(
|
|
height: 50.h,
|
|
width: 30.w,
|
|
child: Align(
|
|
alignment: Alignment.centerLeft,
|
|
child: SizedBox(
|
|
height: 30.h,
|
|
width: 30.w,
|
|
child: ClipRRect(
|
|
borderRadius: const BorderRadius.all(
|
|
Radius.circular(100)),
|
|
child: CachedNetworkImage(
|
|
maxHeightDiskCache: 200,
|
|
maxWidthDiskCache: 200,
|
|
cacheKey: loginBloc
|
|
.countrySelectionTextField.text,
|
|
key: UniqueKey(),
|
|
imageUrl: "${ApiEndpoints.baseurl}$flag",
|
|
height: 30.h,
|
|
width: 30.w,
|
|
placeholder: (context, url) => SizedBox(
|
|
height: 30.h,
|
|
width: 30.w,
|
|
child:
|
|
const CircularProgressIndicator(),
|
|
),
|
|
errorWidget: (context, url, error) =>
|
|
const Icon(Icons.error),
|
|
fit: BoxFit.cover),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
hintText: localizations.translate(AppText.chooseCountry),
|
|
title: localizations.translate(AppText.countryOfResidence),
|
|
type: "country selection",
|
|
textEditingController: loginBloc.countrySelectionTextField,
|
|
),
|
|
const Gap(20),
|
|
FormLabelTextField(
|
|
prefixWidget: selectedCountry == -1
|
|
? null
|
|
: Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
const Gap(10),
|
|
SizedBox(
|
|
height: 50.h,
|
|
width: 30.w,
|
|
child: Align(
|
|
alignment: Alignment.centerLeft,
|
|
child: SizedBox(
|
|
height: 30.h,
|
|
width: 30.w,
|
|
child: ClipRRect(
|
|
borderRadius: const BorderRadius.all(
|
|
Radius.circular(100)),
|
|
child: CachedNetworkImage(
|
|
maxHeightDiskCache: 200,
|
|
maxWidthDiskCache: 200,
|
|
cacheKey: loginBloc
|
|
.countrySelectionTextField.text,
|
|
key: UniqueKey(),
|
|
imageUrl: flag,
|
|
height: 30.h,
|
|
width: 30.w,
|
|
placeholder: (context, url) => SizedBox(
|
|
height: 30.h,
|
|
width: 30.w,
|
|
child:
|
|
const CircularProgressIndicator(),
|
|
),
|
|
errorWidget: (context, url, error) =>
|
|
const Icon(Icons.error),
|
|
fit: BoxFit.cover),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
const Gap(5),
|
|
Container(
|
|
margin: const EdgeInsets.only(top: 10),
|
|
height: 30.h,
|
|
width: 40.w,
|
|
child: Text(
|
|
loginBloc.isdcode,
|
|
style: GoogleFonts.dmSans(
|
|
color: AppColor.charcoalColor,
|
|
fontSize: 14,
|
|
fontWeight: FontWeight.w500,
|
|
),
|
|
)),
|
|
],
|
|
),
|
|
hintText: hintText,
|
|
title: localizations.translate(AppText.phoneNumber),
|
|
type: "phone number",
|
|
textEditingController: loginBloc.phoneNumberTextField,
|
|
),
|
|
const Gap(20),
|
|
BlocProvider(
|
|
create: (_) => PasswordVisibilityBloc(),
|
|
child: FormLabelTextField(
|
|
hintText: localizations.translate(AppText.enterPassword),
|
|
title: localizations.translate(AppText.password),
|
|
type: "login-password",
|
|
textEditingController: loginBloc.passwordTextField,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
});
|
|
}
|
|
}
|