import 'package:date_time_picker/date_time_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_progress_hud/flutter_progress_hud.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:intl/intl.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:unit2/bloc/profile/profile_bloc.dart'; import 'package:unit2/bloc/user/user_bloc.dart'; import 'package:unit2/model/profile/eligibility.dart'; import '../../../../bloc/profile/eligibility/eligibility_bloc.dart'; import '../../../../model/location/city.dart'; import '../../../../model/location/country.dart'; import '../../../../model/location/provinces.dart'; import '../../../../model/location/region.dart'; import '../../../../model/utils/eligibility.dart'; import '../../../../theme-data.dart/btn-style.dart'; import '../../../../theme-data.dart/colors.dart'; import '../../../../theme-data.dart/form-style.dart'; import '../../../../utils/global.dart'; import '../../../../utils/location_utilities.dart'; import '../../../../utils/text_container.dart'; class AddEligibilityScreen extends StatefulWidget { const AddEligibilityScreen({super.key}); @override State createState() => _AddEligibilityScreenState(); } class _AddEligibilityScreenState extends State { final formKey = GlobalKey(); bool? overseas; DateFormat dteFormat2 = DateFormat.yMMMMd('en_US'); Region? selectedRegion; Province? selectedProvince; CityMunicipality? selectedMunicipality; Country? selectedCountry; Eligibility? selectedEligibility; List? provinces; List? citymuns; bool provinceCall = false; bool cityCall = false; final examDateController = TextEditingController(); final validityDateController = TextEditingController(); String? token; String? profileId; String? rating; String? license; @override Widget build(BuildContext context) { ////USERBLOC return BlocBuilder( builder: (context, state) { ////LOGGED IN USER STATE if (state is UserLoggedIn) { ////PROFIILE BLOC token = state.userData!.user!.login!.token; profileId = state.userData!.user!.login!.user!.profileId.toString(); return BlocBuilder( builder: (context, state) { if (state is ProfileLoaded) { return BlocBuilder( buildWhen: (previous, current) { if (state is EditEligibilityState) {} return false; }, builder: (context, state) { ////ADD ELIGIBILITY STATE if (state is AddEligibilityState) { return ProgressHUD( child: Center( child: Padding( padding: const EdgeInsets.symmetric( vertical: 25, horizontal: 18), child: FormBuilder( key: formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ ////ELIGIBILITIES DROPDOWN FormBuilderDropdown( onChanged: (Eligibility? eligibility) { selectedEligibility = eligibility; }, autovalidateMode: AutovalidateMode.onUserInteraction, validator: (value) => value == null ? 'required' : null, items: state.eligibilities .map>( (Eligibility eligibility) { return DropdownMenuItem( value: eligibility, child: Text(eligibility.title)); }).toList(), name: "eligibility", decoration: normalTextFieldStyle( "Eligibility", "Eligibility")), const SizedBox( height: 20, ), SizedBox( width: screenWidth, child: Row( children: [ ////LICENSE NUMBER Flexible( flex: 1, child: FormBuilderTextField( onChanged: (value) { license = value; }, name: 'license_number', decoration: normalTextFieldStyle( "license number", "license number"), ), ), const SizedBox( width: 12, ), ////RATING Flexible( flex: 1, child: FormBuilderTextField( keyboardType: const TextInputType .numberWithOptions(), onChanged: (value) { rating = value; }, name: 'rating', decoration: normalTextFieldStyle( 'rating %', 'rating'), ), ), ], ), ), const SizedBox( height: 20, ), SizedBox( width: screenWidth, child: Row( children: [ ////EXAM DATE Flexible( flex: 1, child: DateTimePicker( validator: FormBuilderValidators.required(errorText: "This field is required"), use24HourFormat: false, icon: const Icon( Icons.date_range), controller: examDateController, firstDate: DateTime(1970), lastDate: DateTime(2100), timeHintText: "Date of Examination/Conferment", decoration: normalTextFieldStyle( "Exam date", "") .copyWith( prefixIcon: const Icon( Icons.date_range, color: Colors.black87, )), initialValue: null, )), const SizedBox( width: 12, ), ////VALIDITY DATE Flexible( flex: 1, child: DateTimePicker( validator: FormBuilderValidators.required(errorText: "This field is required"), controller: validityDateController, firstDate: DateTime(1970), lastDate: DateTime(2100), decoration: normalTextFieldStyle( "Validity date", "Validity date") .copyWith( prefixIcon: const Icon( Icons.date_range, color: Colors.black87, )), initialValue: null, ), ), ], ), ), const SizedBox( height: 20, ), Text( "Placement of Examination/Conferment", style: Theme.of(context) .textTheme .displaySmall! .copyWith( fontSize: blockSizeVertical * 2), ), const SizedBox( height: 12, ), ////OVERSEAS ADDRESS SWITCH Column( children: [ FormBuilderSwitch( validator: FormBuilderValidators.required(errorText: 'This field is required'), initialValue: overseas, activeColor: second, onChanged: (value) { setState(() { overseas = value; }); }, decoration: normalTextFieldStyle("", ''), name: 'overseas', title: const Text("Overseas Address?"), ), const SizedBox( height: 20, ), ////COUNTRY DROPDOWN SizedBox( child: overseas == true ? FormBuilderDropdown( initialValue: null, validator: FormBuilderValidators.required(errorText: "This field is required"), items: state.countries.map< DropdownMenuItem< Country>>( (Country country) { return DropdownMenuItem< Country>( value: country, child: FittedBox( child: Text( country .name!))); }).toList(), name: 'country', decoration: normalTextFieldStyle( "Country*", "Country"), onChanged: (Country? value) { selectedCountry = value; }, ) : Column( children: [ ////REGION DROPDOWN FormBuilderDropdown< Region?>( autovalidateMode: AutovalidateMode .onUserInteraction, validator: FormBuilderValidators.required(errorText: "This field is required"), //// region onchange onChanged: (Region? region) async { setState(() { provinceCall = true; }); selectedRegion = region; getProvinces(); }, initialValue: selectedRegion, decoration: normalTextFieldStyle( "Region*", "Region"), name: 'region', items: state.regions.map< DropdownMenuItem< Region>>((Region region) { return DropdownMenuItem< Region>( value: region, child: Text(region .description!)); }).toList(), ), const SizedBox( height: 20, ), ////PROVINCE DROPDOWN SizedBox( height: 70, child: ModalProgressHUD( color: Colors .transparent, inAsyncCall: provinceCall, child: DropdownButtonFormField< Province?>( autovalidateMode: AutovalidateMode .onUserInteraction, validator: (value) => value == null ? 'required' : null, isExpanded: true, value: selectedProvince, onChanged: (Province? province) { setState(() { cityCall = true; }); selectedProvince = province; getCities(); }, items: provinces == null ? [] : provinces!.map< DropdownMenuItem< Province>>((Province province) { return DropdownMenuItem( value: province, child: FittedBox( child: Text(province.description!), )); }).toList(), decoration: normalTextFieldStyle( "Province*", "Province")), ), ), //// CityMunicipalities dropdown SizedBox( height: 70, child: ModalProgressHUD( color: Colors.white, inAsyncCall: cityCall, child: DropdownButtonFormField< CityMunicipality>( validator: (value) => value == null ? 'required' : null, isExpanded: true, onChanged: (CityMunicipality? city) { selectedMunicipality = city; }, decoration: normalTextFieldStyle( "Municipality*", "Municipality"), value: selectedMunicipality, items: citymuns == null ? [] : citymuns!.map< DropdownMenuItem< CityMunicipality>>( (CityMunicipality c) { return DropdownMenuItem( value: c, child: Text( c.description!)); }).toList(), ), ), ), const SizedBox( height: 20, ), ], )), ], ), const Expanded( child: SizedBox(), ), SizedBox( width: screenWidth, height: 60, child: ElevatedButton( style: mainBtnStyle(primary, Colors.transparent, second), onPressed: () { //rating double? rate = rating == null ? null : double.parse(rating!); //lisence String? licenseNumber = license; CityMunicipality? cityMunicipality = selectedMunicipality; DateTime? examDate = examDateController.text.isEmpty ? null : DateTime.parse( examDateController .text); DateTime? validityDate = validityDateController .text.isEmpty ? null : DateTime.parse( validityDateController .text); ExamAddress examAddress = ExamAddress( barangay: null, id: null, addressCategory: null, examAddressClass: null, country: selectedCountry ?? Country( id: 175, name: 'Philippines', code: 'PH'), cityMunicipality: cityMunicipality); EligibityCert eligibityCert = EligibityCert( id: null, rating: rate, examDate: examDate, attachments: null, eligibility: selectedEligibility, examAddress: examAddress, validityDate: validityDate, licenseNumber: licenseNumber, overseas: overseas); if (formKey.currentState! .saveAndValidate()) { context .read() .add(AddEligibility( eligibityCert: eligibityCert, profileId: profileId!, token: token!)); } // context.read().add(AddEligibility(eligibityCert: eligibityCert, profileId: profileId, token: token)) }, child: const Text(submit)), ), const SizedBox( height: 20, ), ]), ), ), ), ); } return Container(); }, ); } return Container(); }, ); } return Container(); }, ); } Future getProvinces() async { try { List newProvinces = await LocationUtils.instance .getProvinces(regionCode: selectedRegion!.code.toString()); setState(() { provinces = newProvinces; selectedProvince = provinces![0]; provinceCall = false; cityCall = true; getCities(); }); } catch (e) { context.read().add(CallErrorState()); } } Future getCities() async { try { List newCities = await LocationUtils.instance .getCities(code: selectedProvince!.code.toString()); citymuns = newCities; setState(() { selectedMunicipality = newCities[0]; cityCall = false; }); } catch (e) { context.read().add(CallErrorState()); } } }