import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:unit2/model/location/address_category.dart'; import 'package:unit2/model/location/barangay.dart'; import 'package:unit2/model/location/city.dart'; import 'package:unit2/model/location/country.dart'; import 'package:unit2/model/location/region.dart'; import 'package:unit2/sevices/profile/references_services.dart'; import '../../../model/location/provinces.dart'; import '../../../model/profile/references.dart'; import '../../../utils/location_utilities.dart'; part 'references_event.dart'; part 'references_state.dart'; class ReferencesBloc extends Bloc { List references = []; List globalCountries = []; List globalRegions = []; List globalCategories = []; ReferencesBloc() : super(ReferencesInitial()) { on((event, emit) async { emit(ReferencesLoadingState()); try { if (references.isEmpty) { List refs = await ReferencesServices.instace .getRefences(event.profileId, event.token); references = refs; emit(ReferencesLoadedState(references: references)); } emit(ReferencesLoadedState(references: references)); } catch (e) { emit( ReferencesErrorState(message: e.toString())); } }); ////SHOW FORM FOR ADDING REFERENCES on((event, emit) async { emit(ReferencesLoadingState()); try { if (globalRegions.isEmpty) { List regions = await LocationUtils.instance.getRegions(); globalRegions = regions; } if (globalCountries.isEmpty) { List countries = await LocationUtils.instance.getCountries(); globalCountries = countries; } if (globalCategories.isEmpty) { List categories = await LocationUtils.instance.getAddressCategory(); globalCategories = categories; } emit(AddReferenceState( countries: globalCountries, regions: globalRegions, categories: globalCategories)); } catch (e) { emit(ReferencesErrorState(message: e.toString())); } ////SHOW EDIT FORM }); on((event, emit) async { Region? selectedRegion; Province? selectedProvince; CityMunicipality? selectedCity; AddressCategory? selectedCategory; Country selectedCountry; Barangay? selectedBarangay; try { if (globalRegions.isEmpty) { List regions = await LocationUtils.instance.getRegions(); globalRegions = regions; } if (globalCountries.isEmpty) { List countries = await LocationUtils.instance.getCountries(); globalCountries = countries; } if (globalCategories.isEmpty) { List categories = await LocationUtils.instance.getAddressCategory(); globalCategories = categories; } //// checck if address is overseas bool overseas = event.personalReference.address!.country!.id! != 175 ? true : false; selectedCategory = globalCategories.firstWhere( (AddressCategory element) => event.personalReference.address!.addressCategory!.id == element.id); ////if address is not overseas set initial values for address if (!overseas) { selectedRegion = globalRegions.firstWhere((Region element) => event.personalReference.address!.cityMunicipality!.province! .region!.code == element.code); List provinces = await LocationUtils.instance .getProvinces(regionCode: selectedRegion.code.toString()); selectedProvince = provinces.firstWhere((Province province) => event.personalReference.address!.cityMunicipality!.province! .code == province.code); List cities = await LocationUtils.instance .getCities(code: selectedProvince.code!); selectedCity = cities.firstWhere((CityMunicipality city) => event.personalReference.address!.cityMunicipality!.code == city.code); List barangays = await LocationUtils.instance .getBarangay(code: selectedCity.code.toString()); if (event.personalReference.address?.barangay != null) { selectedBarangay = barangays.firstWhere((Barangay barangay) => event.personalReference.address?.barangay?.code == barangay.code); } else { selectedBarangay = null; } emit(EditReferenceState( selectedRegion: selectedRegion, ref: event.personalReference, countries: globalCountries, regions: globalRegions, barangays: barangays, categories: globalCategories, isOverseas: overseas, provinces: provinces, selectedProvince: selectedProvince, cities: cities, selectedCity: selectedCity, selectedCategory: selectedCategory, selectedBarangay: selectedBarangay)); } else { //// if address is overseas set initial value for country selectedCountry = globalCountries.firstWhere((Country element) => event.personalReference.address!.country!.id == element.id); emit(EditReferenceState( selectedCountry: selectedCountry, selectedCategory: selectedCategory, selectedRegion: null, ref: event.personalReference, countries: globalCountries, regions: globalRegions, categories: globalCategories, isOverseas: overseas)); } } catch (e) { emit(ReferencesErrorState(message: e.toString())); } }); //// CALL THE ERROR STATE EVEN T on((event, emit) async { emit(const ReferencesErrorState( message: "Something went wrong. Please try again")); //// EDIT REFERENCES EVENT }); on((event, emit) async { Map status = await ReferencesServices.instace.update( ref: event.reference, token: event.token, profileId: event.profileId); if (status['success']) { PersonalReference ref = PersonalReference.fromJson(status['data']); references.removeWhere( (PersonalReference element) => element.id == event.reference.id); references.add(ref); emit(ReferenceEditedState(response: status)); } else { emit(ReferenceEditedState(response: status)); } }); //// add reference event on((event, emit) async { try { Map status = await ReferencesServices.instace .addReference( ref: event.reference, token: event.token, profileId: event.profileId); if (status['success']) { PersonalReference ref = PersonalReference.fromJson(status['data']); references.add(ref); emit(ReferencesAddedState(response: status)); } else { emit(ReferencesAddedState(response: status)); } } catch (e) { emit(ReferencesErrorState(message: e.toString())); } }); ////LOAD REFERENCE on((event, emit) { emit(ReferencesLoadingState()); emit(ReferencesLoadedState(references: references)); }); ////DELETE REFERENCE on((event, emit) async { try { final bool success = await ReferencesServices.instace.delete( profileId: event.profileId, token: event.token, id: event.refId); if (success) { event.references.removeWhere( (PersonalReference element) => element.id == event.refId); references = event.references; emit(DeleteReferenceState(success: success)); } else { emit(DeleteReferenceState(success: success)); } } catch (e) { emit(ReferencesErrorState(message: e.toString())); } }); } }