diff --git a/lib/bloc/eligibility/eligibility_bloc.dart b/lib/bloc/eligibility/eligibility_bloc.dart new file mode 100644 index 0000000..98de16c --- /dev/null +++ b/lib/bloc/eligibility/eligibility_bloc.dart @@ -0,0 +1,214 @@ +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import '../../model/location/city.dart'; +import '../../model/location/country.dart'; +import '../../model/location/provinces.dart'; +import '../../model/location/region.dart'; +import '../../model/profile/eligibility.dart'; +import '../../model/utils/eligibility.dart'; +import '../../sevices/profile/eligibility_services.dart'; +import '../../utils/location_utilities.dart'; +import '../../utils/profile_utilities.dart'; +part 'eligibility_event.dart'; +part 'eligibility_state.dart'; + +class EligibilityBloc extends Bloc { + EligibilityBloc() : super(EligibilityInitial()) { + List? globalCountries; + List? globalRegions; + List? globalEligibilities; + List? eligibilities; +////===================================================================== + on((event, emit) { + emit(EligibilityLoadingState()); + eligibilities = event.eligibilities; + emit(EligibilityLoaded(eligibilities: event.eligibilities)); + }); +////==================================================================== + on((event, emit) async { + try { + if (eligibilities != null) { + emit(EligibilityLoaded(eligibilities: eligibilities!)); + } else { + emit(EligibilityLoadingState()); + eligibilities = await EligibilityService.instance + .getEligibilities(event.profileId, event.token); + emit(EligibilityLoaded(eligibilities: eligibilities!)); + } + } catch (e) { + emit(EligibilityErrorState(message: e.toString())); + } + }); +////==================================================================== + on((event, emit) async { + try { + emit(EligibilityLoadingState()); + if (globalCountries == null) { + List countries = await LocationUtils.instance.getCountries(); + globalCountries = countries; + } + if (globalRegions == null) { + List regions = await LocationUtils.instance.getRegions(); + globalRegions = regions; + } + if (globalEligibilities == null) { + List eligibilities = + await ProfileUtilities.instance.getEligibilities(); + globalEligibilities = eligibilities; + } + Eligibility currentEligibility = globalEligibilities!.firstWhere( + (Eligibility eligibility) => + event.eligibityCert.eligibility!.id == eligibility.id); + bool? isOverseas = event.eligibityCert.overseas; + Country currentCountry = globalCountries!.firstWhere( + (Country country) => + event.eligibityCert.examAddress!.country!.code == country.code); + if (event.eligibityCert.examAddress?.cityMunicipality?.province + ?.region != + null) { + Region currrentRegion = globalRegions!.firstWhere((Region region) => + event.eligibityCert.examAddress!.cityMunicipality!.province! + .region!.code == + region.code); + List provinces = await LocationUtils.instance + .getProvinces(regionCode: currrentRegion.code.toString()); + Province currentProvince = provinces.firstWhere((Province province) => + event.eligibityCert.examAddress!.cityMunicipality!.province! + .code == + province.code); + List cities = await LocationUtils.instance + .getCities(code: currentProvince.code.toString()); + CityMunicipality currentCity = cities.firstWhere( + (CityMunicipality cityMunicipality) => + event.eligibityCert.examAddress!.cityMunicipality!.code == + cityMunicipality.code); + + emit(EditEligibilityState( + currentCity: currentCity, + selectedCountry: currentCountry, + currentProvince: currentProvince, + currentRegion: currrentRegion, + currentEligibility: currentEligibility, + provinces: provinces, + cities: cities, + isOverseas: isOverseas!, + eligibityCert: event.eligibityCert, + countries: globalCountries!, + regions: globalRegions!, + eligibilities: globalEligibilities!)); + } else { + emit(EditEligibilityState( + selectedCountry: currentCountry, + currentCity: null, + currentProvince: null, + currentRegion: null, + provinces: null, + cities: null, + currentEligibility: currentEligibility, + isOverseas: isOverseas!, + eligibityCert: event.eligibityCert, + countries: globalCountries!, + regions: globalRegions!, + eligibilities: globalEligibilities!)); + } + } catch (e) { + emit(EligibilityErrorState(message: e.toString())); + } + }); + + ////==================================================================== + on((event, emit) async { + try { + emit(EligibilityLoadingState()); + Map status = await EligibilityService.instance.update( + eligibityCert: event.eligibityCert, + token: event.token, + profileId: int.parse(event.profileId), + oldEligibility: event.oldEligibility); + if (status['success']) { + EligibityCert newEligibility = EligibityCert.fromJson(status['data']); + eligibilities!.removeWhere( + (EligibityCert element) => element.id == event.eligibityCert.id); + eligibilities!.add(newEligibility); + emit(EligibilityEditedState( + eligibilities: eligibilities!, response: status)); + } else { + emit(EligibilityEditedState( + eligibilities: eligibilities!, response: status)); + } + } catch (e) { + emit(EligibilityErrorState(message: e.toString())); + } + }); + on((event, emit) async { + emit(EligibilityLoadingState()); + if (globalRegions == null) { + List regions = await LocationUtils.instance.getRegions(); + globalRegions = regions; + } + if (globalEligibilities == null) { + List eligibilities = + await ProfileUtilities.instance.getEligibilities(); + globalEligibilities = eligibilities; + } + if (globalCountries == null) { + List countries = await LocationUtils.instance.getCountries(); + globalCountries = countries; + } + + emit(AddEligibilityState( + eligibilities: globalEligibilities!, + regions: globalRegions!, + countries: globalCountries!)); + }); + ////==================================================================== + on((event, emit) async { + emit(EligibilityLoadingState()); + try { + final bool success = await EligibilityService.instance.delete( + eligibilityId: event.eligibilityId, + profileId: int.parse(event.profileId), + token: event.token); + if (success) { + event.eligibilities.removeWhere( + ((EligibityCert element) => element.id == event.eligibilityId)); + List eligibilities = event.eligibilities; + emit(DeletedState(success: success, eligibilities: eligibilities)); + } else { + emit(DeletedState( + success: success, eligibilities: event.eligibilities)); + } + } catch (e) { + emit(EligibilityErrorState(message: e.toString())); + } + }); + ////==================================================================== + on( + (event, emit) async { + try { + emit(EligibilityLoadingState()); + Map status = await EligibilityService.instance.add( + eligibityCert: event.eligibityCert, + token: event.token, + profileId: int.parse(event.profileId)); + if (status['success']) { + EligibityCert? eligibityCert = + EligibityCert.fromJson(status['data']); + eligibilities!.add(eligibityCert); + emit(EligibilityAddedState( + eligibilities: eligibilities!, response: status)); + } else { + emit(EligibilityAddedState( + eligibilities: eligibilities!, response: status)); + } + } catch (e) { + emit(EligibilityErrorState(message: e.toString())); + } + }, + ); + on((event, emit) { + emit(const EligibilityErrorState( + message: "Something went wrong. Please try again")); + }); + } +} diff --git a/lib/bloc/eligibility/eligibility_event.dart b/lib/bloc/eligibility/eligibility_event.dart new file mode 100644 index 0000000..381ffd8 --- /dev/null +++ b/lib/bloc/eligibility/eligibility_event.dart @@ -0,0 +1,72 @@ +part of 'eligibility_bloc.dart'; + +abstract class EligibilityEvent extends Equatable { + const EligibilityEvent(); + + @override + List get props => []; +} + +class ShowAddEligibilityForm extends EligibilityEvent { + +} + +class GetEligibilities extends EligibilityEvent{ + final int profileId; + final String token; + const GetEligibilities({required this.profileId, required this.token}); + @override + List get props => [profileId,token]; +} + +class AddEligibility extends EligibilityEvent{ + final EligibityCert eligibityCert; + final String profileId; + final String token; + const AddEligibility({required this.eligibityCert, required this.profileId, required this.token}); + @override + List get props => [eligibityCert, profileId, token]; +} +class UpdateEligibility extends EligibilityEvent{ + final EligibityCert eligibityCert; + final String profileId; + final String token; + final int oldEligibility; + const UpdateEligibility({required this.eligibityCert, required this.oldEligibility,required this.profileId, required this.token}); + + @override + List get props =>[eligibityCert,profileId,token,oldEligibility]; +} +class LoadEligibility extends EligibilityEvent { + final List eligibilities; + const LoadEligibility({required this.eligibilities}); + @override + List get props => []; +} + +class ShowEditEligibilityForm extends EligibilityEvent { + final EligibityCert eligibityCert; + const ShowEditEligibilityForm({required this.eligibityCert}); + @override + List get props => []; +} + +class DeleteEligibility extends EligibilityEvent { + final List eligibilities; + final String profileId; + final int eligibilityId; + final String token; + const DeleteEligibility( + {required this.eligibilities, + required this.eligibilityId, + required this.profileId, + required this.token}); + @override + List get props => [eligibilities, profileId, eligibilityId, token]; +} + +class CallErrorState extends EligibilityEvent{ + +} + + diff --git a/lib/bloc/eligibility/eligibility_state.dart b/lib/bloc/eligibility/eligibility_state.dart new file mode 100644 index 0000000..63421db --- /dev/null +++ b/lib/bloc/eligibility/eligibility_state.dart @@ -0,0 +1,96 @@ +part of 'eligibility_bloc.dart'; + +abstract class EligibilityState extends Equatable { + const EligibilityState(); + + @override + List get props => []; +} + +class EligibilityInitial extends EligibilityState {} + + +class EditEligibilityState extends EligibilityState { + final EligibityCert eligibityCert; + final List eligibilities; + final List countries; + final List regions; + final List? provinces; + final List? cities; + final bool isOverseas; + final Eligibility currentEligibility; + final Region? currentRegion; + final Province? currentProvince; + final CityMunicipality? currentCity; + final Country selectedCountry; + const EditEligibilityState({ + required this.provinces, + required this.cities, + required this.currentProvince, + required this.currentCity, + required this.currentRegion, + required this.currentEligibility, + required this.isOverseas, + required this.eligibityCert, + required this.eligibilities, + required this.countries, + required this.regions, + required this.selectedCountry, + }); + @override + List get props => + [isOverseas, eligibityCert, eligibilities, regions, countries]; +} + +class DeletedState extends EligibilityState { + final List eligibilities; + final bool success; + const DeletedState({required this.eligibilities, required this.success}); + @override + List get props => [success, eligibilities]; +} + +class AddEligibilityState extends EligibilityState { + final List eligibilities; + final List countries; + final List regions; + const AddEligibilityState({ + required this.eligibilities, + required this.countries, + required this.regions, + }); + @override + List get props => [eligibilities,countries,regions]; +} +class EligibilityEditedState extends EligibilityState{ + final List eligibilities; + final Map response; + const EligibilityEditedState({required this.eligibilities, required this.response}); + @override + List get props =>[eligibilities, response]; +} + +class EligibilityAddedState extends EligibilityState{ + final List eligibilities; + final Map response; + + const EligibilityAddedState({required this.eligibilities, required this.response}); + @override + List get props =>[eligibilities,response]; +} +class EligibilityLoadingState extends EligibilityState{ + +} +class EligibilityErrorState extends EligibilityState{ + final String message; + const EligibilityErrorState({required this.message}); + @override + List get props =>[message]; +} + +class EligibilityLoaded extends EligibilityState { + final List eligibilities; + const EligibilityLoaded({required this.eligibilities}); + @override + List get props => [eligibilities]; +} diff --git a/lib/bloc/profile/profile_bloc.dart b/lib/bloc/profile/profile_bloc.dart index d6c2c50..6316746 100644 --- a/lib/bloc/profile/profile_bloc.dart +++ b/lib/bloc/profile/profile_bloc.dart @@ -1,27 +1,13 @@ import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; -import 'package:unit2/model/profile/eligibility.dart'; import 'package:unit2/model/profile/profileInfomation.dart'; -import 'package:unit2/model/utils/eligibility.dart'; -import 'package:unit2/sevices/profile/eligibility_services.dart'; import 'package:unit2/sevices/profile/profile_service.dart'; -import 'package:unit2/utils/location_utilities.dart'; -import 'package:unit2/utils/profile_utilities.dart'; -import '../../model/location/country.dart'; -import '../../model/location/region.dart'; -import '../../model/location/provinces.dart'; -import '../../model/location/city.dart'; part 'profile_event.dart'; part 'profile_state.dart'; class ProfileBloc extends Bloc { ProfileBloc() : super(ProfileInitial()) { ProfileInformation? globalProfileInformation; - List? globalCountries; - List? globalRegions; - List? globalEligibilities; - List? eligibilities; - ////========================================================================= on((event, emit) async { try { emit(ProfileLoading()); @@ -34,198 +20,6 @@ class ProfileBloc extends Bloc { } }); - on((event, emit) { - emit(const ProfileErrorState( - mesage: "Something went wrong. Please try again")); - }); -////===================================================================== - on((event, emit) { - emit(ProfileLoading()); - eligibilities = event.eligibilities; - emit(EligibilityLoaded(eligibilities: event.eligibilities)); - }); -////==================================================================== -on((event,emit)async{ - - print(eligibilities?.length); - try{ - if(eligibilities != null){ - emit(EligibilityLoaded(eligibilities: eligibilities!)); - }else{ - emit(ProfileLoading()); - eligibilities = await EligibilityService.instance.getEligibilities(event.profileId, event.token); - emit(EligibilityLoaded(eligibilities: eligibilities!)); - } - }catch(e){ - emit(ProfileErrorState(mesage: e.toString())); - } -}); -////==================================================================== - on((event, emit) async { - try { - emit(ProfileLoading()); - if (globalCountries == null) { - List countries = await LocationUtils.instance.getCountries(); - globalCountries = countries; - } - if (globalRegions == null) { - List regions = await LocationUtils.instance.getRegions(); - globalRegions = regions; - } - if (globalEligibilities == null) { - List eligibilities = - await ProfileUtilities.instance.getEligibilities(); - globalEligibilities = eligibilities; - } - Eligibility currentEligibility = globalEligibilities!.firstWhere( - (Eligibility eligibility) => - event.eligibityCert.eligibility!.id == eligibility.id); - bool? isOverseas = event.eligibityCert.overseas; - Country currentCountry = globalCountries!.firstWhere( - (Country country) => - event.eligibityCert.examAddress!.country!.code == country.code); - if (event.eligibityCert.examAddress?.cityMunicipality?.province - ?.region != - null) { - Region currrentRegion = globalRegions!.firstWhere((Region region) => - event.eligibityCert.examAddress!.cityMunicipality!.province! - .region!.code == - region.code); - List provinces = await LocationUtils.instance - .getProvinces(regionCode: currrentRegion.code.toString()); - Province currentProvince = provinces.firstWhere((Province province) => - event.eligibityCert.examAddress!.cityMunicipality!.province! - .code == - province.code); - List cities = await LocationUtils.instance - .getCities(code: currentProvince.code.toString()); - CityMunicipality currentCity = cities.firstWhere( - (CityMunicipality cityMunicipality) => - event.eligibityCert.examAddress!.cityMunicipality!.code == - cityMunicipality.code); - - emit(EditEligibilityState( - currentCity: currentCity, - selectedCountry: currentCountry, - currentProvince: currentProvince, - currentRegion: currrentRegion, - currentEligibility: currentEligibility, - provinces: provinces, - cities: cities, - isOverseas: isOverseas!, - eligibityCert: event.eligibityCert, - countries: globalCountries!, - regions: globalRegions!, - eligibilities: globalEligibilities!)); - } else { - emit(EditEligibilityState( - selectedCountry: currentCountry, - currentCity: null, - currentProvince: null, - currentRegion: null, - provinces: null, - cities: null, - currentEligibility: currentEligibility, - isOverseas: isOverseas!, - eligibityCert: event.eligibityCert, - countries: globalCountries!, - regions: globalRegions!, - eligibilities: globalEligibilities!)); - } - } catch (e) { - emit(ProfileErrorState(mesage: e.toString())); - } - }); - ////==================================================================== - on((event, emit) async { - try { - emit(ProfileLoading()); - Map status = await EligibilityService.instance.update( - eligibityCert: event.eligibityCert, - token: event.token, - profileId: int.parse(event.profileId), - oldEligibility: event.oldEligibility); - if (status['success']) { - EligibityCert newEligibility = EligibityCert.fromJson(status['data']); - eligibilities!.removeWhere( - (EligibityCert element) => element.id == event.eligibityCert.id); - eligibilities!.add(newEligibility); - emit(EligibilityEditedState( - eligibilities: eligibilities!, response: status)); - } else { - emit(EligibilityEditedState( - eligibilities: eligibilities!, response: status)); - } - } catch (e) { - emit(ProfileErrorState(mesage: e.toString())); - } - }); - on((event, emit) async { - emit(ProfileLoading()); - if (globalRegions == null) { - List regions = await LocationUtils.instance.getRegions(); - globalRegions = regions; - } - if (globalEligibilities == null) { - List eligibilities = - await ProfileUtilities.instance.getEligibilities(); - globalEligibilities = eligibilities; - } - if (globalCountries == null) { - List countries = await LocationUtils.instance.getCountries(); - globalCountries = countries; - } - - emit(AddEligibilityState( - eligibilities: globalEligibilities!, - regions: globalRegions!, - countries: globalCountries!)); - }); - ////==================================================================== - on((event, emit) async { - emit(ProfileLoading()); - try { - final bool success = await EligibilityService.instance.delete( - eligibilityId: event.eligibilityId, - profileId: int.parse(event.profileId), - token: event.token); - if (success) { - event.eligibilities.removeWhere( - ((EligibityCert element) => element.id == event.eligibilityId)); - List eligibilities = event.eligibilities; - emit(DeletedState(success: success, eligibilities: eligibilities)); - } else { - emit(DeletedState( - success: success, eligibilities: event.eligibilities)); - } - } catch (e) { - emit(ProfileErrorState(mesage: e.toString())); - } - }); - ////==================================================================== - on( - (event, emit) async { - try { - emit(ProfileLoading()); - Map status = await EligibilityService.instance.add( - eligibityCert: event.eligibityCert, - token: event.token, - profileId: int.parse(event.profileId)); - if (status['success']) { - EligibityCert? eligibityCert = - EligibityCert.fromJson(status['data']); - eligibilities!.add(eligibityCert); - emit(EligibilityAddedState( - eligibilities: eligibilities!, response: status)); - } else { - emit(EligibilityAddedState( - eligibilities: eligibilities!, response: status)); - } - } catch (e) { - emit(ProfileErrorState(mesage: e.toString())); - } - }, - ); } } diff --git a/lib/bloc/profile/profile_event.dart b/lib/bloc/profile/profile_event.dart index 5951ff8..218cb3e 100644 --- a/lib/bloc/profile/profile_event.dart +++ b/lib/bloc/profile/profile_event.dart @@ -20,65 +20,5 @@ class LoadProfileInformation extends ProfileEvent { List get props => []; } -class LoadEligibility extends ProfileEvent { - final List eligibilities; - const LoadEligibility({required this.eligibilities}); - @override - List get props => []; -} -class ShowEditEligibilityForm extends ProfileEvent { - final EligibityCert eligibityCert; - const ShowEditEligibilityForm({required this.eligibityCert}); - @override - List get props => []; -} -class DeleteEligibility extends ProfileEvent { - final List eligibilities; - final String profileId; - final int eligibilityId; - final String token; - const DeleteEligibility( - {required this.eligibilities, - required this.eligibilityId, - required this.profileId, - required this.token}); - @override - List get props => [eligibilities, profileId, eligibilityId, token]; -} - -class ShowAddEligibilityForm extends ProfileEvent { - -} - -class GetEligibilities extends ProfileEvent{ - final int profileId; - final String token; - const GetEligibilities({required this.profileId, required this.token}); - @override - List get props => [profileId,token]; -} - -class AddEligibility extends ProfileEvent{ - final EligibityCert eligibityCert; - final String profileId; - final String token; - const AddEligibility({required this.eligibityCert, required this.profileId, required this.token}); - @override - List get props => [eligibityCert, profileId, token]; -} -class UpdateEligibility extends ProfileEvent{ - final EligibityCert eligibityCert; - final String profileId; - final String token; - final int oldEligibility; - const UpdateEligibility({required this.eligibityCert, required this.oldEligibility,required this.profileId, required this.token}); - - @override - List get props =>[eligibityCert,profileId,token,oldEligibility]; -} - -class CallErrorState extends ProfileEvent{ - -} diff --git a/lib/bloc/profile/profile_state.dart b/lib/bloc/profile/profile_state.dart index a311398..7c2bddb 100644 --- a/lib/bloc/profile/profile_state.dart +++ b/lib/bloc/profile/profile_state.dart @@ -25,77 +25,5 @@ class ProfileErrorState extends ProfileState { class ProfileLoading extends ProfileState {} -class EligibilityLoaded extends ProfileState { - final List eligibilities; - const EligibilityLoaded({required this.eligibilities}); - @override - List get props => [eligibilities]; -} -class EditEligibilityState extends ProfileState { - final EligibityCert eligibityCert; - final List eligibilities; - final List countries; - final List regions; - final List? provinces; - final List? cities; - final bool isOverseas; - final Eligibility currentEligibility; - final Region? currentRegion; - final Province? currentProvince; - final CityMunicipality? currentCity; - final Country selectedCountry; - const EditEligibilityState({ - required this.provinces, - required this.cities, - required this.currentProvince, - required this.currentCity, - required this.currentRegion, - required this.currentEligibility, - required this.isOverseas, - required this.eligibityCert, - required this.eligibilities, - required this.countries, - required this.regions, - required this.selectedCountry, - }); - @override - List get props => - [isOverseas, eligibityCert, eligibilities, regions, countries]; -} -class DeletedState extends ProfileState { - final List eligibilities; - final bool success; - const DeletedState({required this.eligibilities, required this.success}); - @override - List get props => [success, eligibilities]; -} -class AddEligibilityState extends ProfileState { - final List eligibilities; - final List countries; - final List regions; - const AddEligibilityState({ - required this.eligibilities, - required this.countries, - required this.regions, - }); - @override - List get props => [eligibilities,countries,regions]; -} -class EligibilityEditedState extends ProfileState{ - final List eligibilities; - final Map response; - const EligibilityEditedState({required this.eligibilities, required this.response}); - @override - List get props =>[eligibilities, response]; -} - -class EligibilityAddedState extends ProfileState{ - final List eligibilities; - final Map response; - - const EligibilityAddedState({required this.eligibilities, required this.response}); - @override - List get props =>[eligibilities,response]; -} diff --git a/lib/bloc/workHistory/workHistory_bloc.dart b/lib/bloc/workHistory/workHistory_bloc.dart new file mode 100644 index 0000000..3c8d4a5 --- /dev/null +++ b/lib/bloc/workHistory/workHistory_bloc.dart @@ -0,0 +1,23 @@ +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:unit2/model/profile/work_history.dart'; +import 'package:unit2/sevices/profile/work_history_services.dart'; + +part 'workHistory_event.dart'; +part 'workHistory_state.dart'; + +class WorkHistoryBloc extends Bloc { + List workExperiences = []; + WorkHistoryBloc() : super(EducationInitial()) { + on((event, emit)async { + emit(WorkHistoryLoadingState()); + // try{ + List works = await WorkHistoryService.instance.getWorkExperiences(event.profileId, event.token); + workExperiences = works; + emit(WorkHistoryLoaded(workExperiences: workExperiences)); + // }catch(e){ + // emit(WorkHistoryErrorState(message: e.toString())); + // } + }); + } +} diff --git a/lib/bloc/workHistory/workHistory_event.dart b/lib/bloc/workHistory/workHistory_event.dart new file mode 100644 index 0000000..7f3e066 --- /dev/null +++ b/lib/bloc/workHistory/workHistory_event.dart @@ -0,0 +1,20 @@ +part of 'workHistory_bloc.dart'; + +abstract class WorkHistorytEvent extends Equatable { + const WorkHistorytEvent(); + + @override + List get props => []; +} + +class GetWorkHistories extends WorkHistorytEvent{ + final int profileId; + final String token; + const GetWorkHistories({required this.profileId, required this.token}); + + + @override + List get props => [profileId, token]; +} + + diff --git a/lib/bloc/workHistory/workHistory_state.dart b/lib/bloc/workHistory/workHistory_state.dart new file mode 100644 index 0000000..21158a9 --- /dev/null +++ b/lib/bloc/workHistory/workHistory_state.dart @@ -0,0 +1,28 @@ +part of 'workHistory_bloc.dart'; + +abstract class WorkHistoryState extends Equatable { + const WorkHistoryState(); + + @override + List get props => []; +} + +class EducationInitial extends WorkHistoryState {} + +class WorkHistoryLoaded extends WorkHistoryState{ + final List workExperiences; + const WorkHistoryLoaded({required this.workExperiences}); + @override + List get props => [workExperiences]; +} + +class WorkHistoryLoadingState extends WorkHistoryState{ + +} +class WorkHistoryErrorState extends WorkHistoryState{ + final String message; + const WorkHistoryErrorState({required this.message}); + + @override + List get props => [message]; +} diff --git a/lib/main.dart b/lib/main.dart index d4dcacd..ce06e14 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:device_preview/device_preview.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:unit2/bloc/profile/profile_bloc.dart'; import 'package:unit2/bloc/user/user_bloc.dart'; import 'package:unit2/theme-data.dart/colors.dart'; import 'package:unit2/utils/app_router.dart'; @@ -47,6 +48,9 @@ class MyApp extends StatelessWidget { BlocProvider( create: (_) => UserBloc(), ), + BlocProvider( + create: (_) => ProfileBloc(), + ), ], child: MaterialApp( navigatorKey: NavigationService.navigatorKey, diff --git a/lib/model/profile/work_history.dart b/lib/model/profile/work_history.dart index 687b1f7..821e603 100644 --- a/lib/model/profile/work_history.dart +++ b/lib/model/profile/work_history.dart @@ -35,7 +35,7 @@ class WorkHistory { final DateTime? fromDate; // final dynamic attachments; final int? salaryGrade; - final int? monthlySalary; + final double? monthlySalary; final String? appointmentStatus; factory WorkHistory.fromJson(Map json) => WorkHistory( diff --git a/lib/screens/profile/components/eligibility/add_modal.dart b/lib/screens/profile/components/eligibility/add_modal.dart index f57b2db..7e55df6 100644 --- a/lib/screens/profile/components/eligibility/add_modal.dart +++ b/lib/screens/profile/components/eligibility/add_modal.dart @@ -6,6 +6,7 @@ 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/eligibility/eligibility_bloc.dart'; import 'package:unit2/bloc/profile/profile_bloc.dart'; import 'package:unit2/bloc/user/user_bloc.dart'; import 'package:unit2/model/profile/eligibility.dart'; @@ -60,403 +61,428 @@ class _AddEligibilityScreenState extends State { token = state.userData!.user!.login!.token; profileId = state.userData!.user!.login!.user!.profileId.toString(); return BlocBuilder( - buildWhen: (previous, current) { - if (state is EditEligibilityState) {} - return false; - }, builder: (context, state) { - //EDIT 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( - 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( - 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( + if(state is ProfileLoaded){ + return BlocBuilder( + buildWhen: (previous, current) { + if (state is EditEligibilityState) {} + return false; + }, + builder: (context, state) { + //EDIT 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: [ - FormBuilderSwitch( - initialValue: overseas, - activeColor: second, - onChanged: (value) { - setState(() { - overseas = value; - }); - }, - decoration: normalTextFieldStyle("", ''), - name: 'overseas', - title: const Text("Overseas Address?"), + //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, ), - //COUNTRY DROPDOWN SizedBox( - child: overseas == true - ? FormBuilderDropdown( - initialValue: null, - validator: (value) => - value == null - ? 'required' - : null, - items: state.countries.map< - DropdownMenuItem< - Country>>( - (Country country) { - return DropdownMenuItem< - Country>( - value: country, - child: FittedBox( - child: Text( - country.name!))); - }).toList(), - name: 'country', + width: screenWidth, + child: Row( + children: [ + //EXAM DATE + Flexible( + flex: 1, + child: DateTimePicker( + use24HourFormat: false, + icon: + const Icon(Icons.date_range), + controller: examDateController, + firstDate: DateTime(1970), + lastDate: DateTime(2100), + timeHintText: + "Date of Examination/Conferment", decoration: normalTextFieldStyle( - "Country*", "Country"), - onChanged: (Country? value) { - selectedCountry = value; - }, - ) - : Column( - children: [ - //REGION DROPDOWN - FormBuilderDropdown( - autovalidateMode: - AutovalidateMode - .onUserInteraction, + "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( + 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( + 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: (value) => value == null ? 'required' : null, - onChanged: - (Region? region) async { - setState(() { - provinceCall = true; - }); - selectedRegion = region; - getProvinces(); - }, - initialValue: selectedRegion, + items: state.countries.map< + DropdownMenuItem< + Country>>( + (Country country) { + return DropdownMenuItem< + Country>( + value: country, + child: FittedBox( + child: Text(country + .name!))); + }).toList(), + name: 'country', 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>( + "Country*", + "Country"), + onChanged: (Country? value) { + selectedCountry = value; + }, + ) + : Column( + children: [ + //REGION DROPDOWN + FormBuilderDropdown< + Region?>( + autovalidateMode: + AutovalidateMode + .onUserInteraction, validator: (value) => value == null ? 'required' : null, - isExpanded: true, - onChanged: - (CityMunicipality? - city) { - selectedMunicipality = - city; + onChanged: (Region? + region) async { + setState(() { + provinceCall = true; + }); + selectedRegion = region; + getProvinces(); }, + initialValue: + selectedRegion, decoration: normalTextFieldStyle( - "Municipality*", - "Municipality"), - value: - selectedMunicipality, - items: citymuns == null - ? [] - : citymuns!.map< - DropdownMenuItem< - CityMunicipality>>( - (CityMunicipality - c) { - return DropdownMenuItem( - value: c, - child: Text(c - .description!)); - }).toList(), + "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")), + ), ), - ), - ), - const SizedBox( - height: 20, - ), - ], - )), - ], - ), - const Expanded( - child: SizedBox(), - ), + // 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, + ), + ], + )), + ], + ), - SizedBox( - width: screenWidth, - height: 60, - child: ElevatedButton( - style: mainBtnStyle( - primary, Colors.transparent, second), - onPressed: () { - //rating - double? rate = rating == null - ? null - : double.parse(rating!); + 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); + 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( + ExamAddress examAddress = ExamAddress( + barangay: null, 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, - ), - ]), + 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(); }, ); } @@ -477,7 +503,7 @@ class _AddEligibilityScreenState extends State { getCities(); }); } catch (e) { - context.read().add(CallErrorState()); + context.read().add(CallErrorState()); } } @@ -491,7 +517,7 @@ class _AddEligibilityScreenState extends State { cityCall = false; }); } catch (e) { - context.read().add(CallErrorState()); + context.read().add(CallErrorState()); } } } diff --git a/lib/screens/profile/components/eligibility/edit_modal.dart b/lib/screens/profile/components/eligibility/edit_modal.dart index 6f32e97..0241a5f 100644 --- a/lib/screens/profile/components/eligibility/edit_modal.dart +++ b/lib/screens/profile/components/eligibility/edit_modal.dart @@ -4,6 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:intl/intl.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; +import 'package:unit2/bloc/eligibility/eligibility_bloc.dart'; import 'package:unit2/bloc/profile/profile_bloc.dart'; import 'package:unit2/bloc/user/user_bloc.dart'; import 'package:unit2/model/location/city.dart'; @@ -59,446 +60,486 @@ class _EditEligibilityScreenState extends State { token = state.userData!.user!.login!.token; profileId = state.userData!.user!.login!.user!.profileId.toString(); return BlocBuilder( - buildWhen: (previous, current) { - if (state is EditEligibilityState) {} - return false; - }, builder: (context, state) { - //EDIT ELIGIBILITY STATE - if (state is EditEligibilityState) { - examDateController.text = state.eligibityCert.examDate == null?'': state.eligibityCert.examDate.toString(); - validityDateController.text = state.eligibityCert.validityDate == null?'': state.eligibityCert.validityDate.toString(); - - provinces = state.provinces; - citymuns = state.cities; - regions = state.regions; - overseas = state.isOverseas; - selectedRegion = state.currentRegion; - selectedProvince = state.currentProvince; - selectedMunicipality = state.currentCity; - selectedEligibility= state.currentEligibility; - rating = state.eligibityCert.rating?.toString(); - license = state.eligibityCert.licenseNumber; - return 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 - DropdownButtonFormField( - validator: (value) => - value == null ? 'required' : null, - isExpanded: true, - onChanged: (Eligibility? eligibility) { - selectedEligibility = eligibility; - }, - value: selectedEligibility, - items: state.eligibilities - .map>( - (Eligibility eligibility) { - return DropdownMenuItem( - value: eligibility, - child: Text(eligibility.title)); - }).toList(), - decoration: - normalTextFieldStyle("Eligibility", "")), - const SizedBox( - height: 20, - ), + if(state is ProfileLoaded){ + return BlocBuilder( + buildWhen: (previous, current) { + if (state is EditEligibilityState) {} + return false; + }, + builder: (context, state) { + //EDIT ELIGIBILITY STATE + if (state is EditEligibilityState) { + examDateController.text = + state.eligibityCert.examDate == null + ? '' + : state.eligibityCert.examDate.toString(); + validityDateController.text = + state.eligibityCert.validityDate == null + ? '' + : state.eligibityCert.validityDate.toString(); - SizedBox( - width: screenWidth, - child: Row( - children: [ - //LICENSE NUMBER - Flexible( - flex: 1, - child: FormBuilderTextField( - onChanged: (value) { - license = value; - }, - name: 'license_number', - initialValue: - license, - 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', - initialValue: rating == null - ? 'N/A' - : rating.toString(), - decoration: normalTextFieldStyle( - 'rating', 'rating'), - ), - ), - ], - ), - ), - const SizedBox( - height: 20, - ), - SizedBox( - width: screenWidth, - child: Row( - children: [ - //EXAM DATE - Flexible( - flex: 1, - child: DateTimePicker( - use24HourFormat: false, - controller: examDateController, - firstDate: DateTime(1970), - lastDate: DateTime(2100), - decoration: normalTextFieldStyle( - "Exam date", "") - .copyWith( - prefixIcon: const Icon( - Icons.date_range, - color: Colors.black87, - )), - )), - const SizedBox( - width: 12, - ), - //VALIDITY DATE - Flexible( - flex: 1, - child: DateTimePicker( - use24HourFormat: false, - controller: validityDateController, - firstDate: DateTime(1970), - lastDate: DateTime(2100), - decoration: normalTextFieldStyle( - "validity date", "") - .copyWith( - prefixIcon: const Icon( - Icons.date_range, - color: Colors.black87, - )), - ), - ), - ], - ), - ), - const SizedBox( - height: 20, - ), - Text( - "Placement of Examination/Confinement", - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith(fontSize: blockSizeVertical * 2), - ), - const SizedBox( - height: 12, - ), - //OVERSEAS ADDRESS SWITCH - StatefulBuilder( - builder: (context, StateSetter setState) { - return Column( - children: [ - FormBuilderSwitch( - initialValue: overseas, - activeColor: second, - onChanged: (value) { - setState(() { - overseas = value; - }); + provinces = state.provinces; + citymuns = state.cities; + regions = state.regions; + overseas = state.isOverseas; + selectedRegion = state.currentRegion; + selectedProvince = state.currentProvince; + selectedMunicipality = state.currentCity; + selectedEligibility = state.currentEligibility; + rating = state.eligibityCert.rating?.toString(); + license = state.eligibityCert.licenseNumber; + return 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 + DropdownButtonFormField( + validator: (value) => + value == null ? 'required' : null, + isExpanded: true, + onChanged: (Eligibility? eligibility) { + selectedEligibility = eligibility; }, - decoration: normalTextFieldStyle("", ''), - name: 'overseas', - title: const Text("Overseas Address?"), + value: selectedEligibility, + items: state.eligibilities + .map>( + (Eligibility eligibility) { + return DropdownMenuItem( + value: eligibility, + child: Text(eligibility.title)); + }).toList(), + decoration: normalTextFieldStyle( + "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', + initialValue: license, + 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', + initialValue: rating == null + ? 'N/A' + : rating.toString(), + decoration: normalTextFieldStyle( + 'rating', 'rating'), + ), + ), + ], ), - const SizedBox( - height: 20, + ), + const SizedBox( + height: 20, + ), + SizedBox( + width: screenWidth, + child: Row( + children: [ + //EXAM DATE + Flexible( + flex: 1, + child: DateTimePicker( + use24HourFormat: false, + controller: examDateController, + firstDate: DateTime(1970), + lastDate: DateTime(2100), + decoration: normalTextFieldStyle( + "Exam date", "") + .copyWith( + prefixIcon: const Icon( + Icons.date_range, + color: Colors.black87, + )), + )), + const SizedBox( + width: 12, + ), + //VALIDITY DATE + Flexible( + flex: 1, + child: DateTimePicker( + use24HourFormat: false, + controller: validityDateController, + firstDate: DateTime(1970), + lastDate: DateTime(2100), + decoration: normalTextFieldStyle( + "validity date", "") + .copyWith( + prefixIcon: const Icon( + Icons.date_range, + color: Colors.black87, + )), + ), + ), + ], ), - //COUNTRY DROPDOWN - SizedBox( - child: overseas == true - ? FormBuilderDropdown( - validator: (value) => - value == null - ? 'required' - : null, - initialValue: - state.selectedCountry, - 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 - DropdownButtonFormField< - Region?>( + ), + const SizedBox( + height: 20, + ), + Text( + "Placement of Examination/Confinement", + style: Theme.of(context) + .textTheme + .displaySmall! + .copyWith( + fontSize: blockSizeVertical * 2), + ), + const SizedBox( + height: 12, + ), + //OVERSEAS ADDRESS SWITCH + StatefulBuilder( + builder: (context, StateSetter setState) { + return Column( + children: [ + FormBuilderSwitch( + 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( validator: (value) => value == null ? 'required' : null, - isExpanded: true, - onChanged: - (Region? region) async { - setState(() { - provinceCall = true; - }); - selectedRegion = region; - provinces = await LocationUtils - .instance - .getProvinces( - regionCode: - selectedRegion! - .code - .toString()); - selectedProvince = - provinces![0]; - setState(() { - provinceCall = false; - cityCall = true; - }); - citymuns = await LocationUtils - .instance - .getCities( - code: - selectedProvince! - .code!); - selectedMunicipality = - citymuns![0]; - setState(() { - cityCall = false; - }); - }, - value: selectedRegion, + initialValue: + state.selectedCountry, + items: state.countries.map< + DropdownMenuItem< + Country>>( + (Country country) { + return DropdownMenuItem< + Country>( + value: country, + child: FittedBox( + child: Text(country + .name!))); + }).toList(), + name: 'country', decoration: normalTextFieldStyle( - "Region*", "Region"), - items: regions == null - ? [] - : 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?>( - validator: (value) => - value == null - ? 'required' - : null, - isExpanded: true, - value: selectedProvince, - onChanged: (Province? - province) async { - setState(() { - cityCall = true; - }); - selectedProvince = - province; - citymuns = await LocationUtils - .instance - .getCities( - code: selectedProvince! - .code - .toString()); - selectedMunicipality = - citymuns![0]; - setState(() { - cityCall = false; - }); - }, - items: provinces == null - ? [] - : provinces!.map< - DropdownMenuItem< - Province>>( - (Province - province) { - return DropdownMenuItem( - value: - province, - child: - FittedBox( - child: Text( - province - .description!), - )); - }).toList(), - decoration: - normalTextFieldStyle( - "Province*", - "Province")), - ), - ), - - // City municipality - SizedBox( - height: 70, - child: ModalProgressHUD( - color: Colors.transparent, - inAsyncCall: cityCall, - child: - DropdownButtonFormField< - CityMunicipality>( + "Country*", + "Country"), + onChanged: (Country? value) { + selectedCountry = value; + }, + ) + : Column( + children: [ + //REGION DROPDOWN + DropdownButtonFormField< + Region?>( validator: (value) => value == null ? 'required' : null, isExpanded: true, - onChanged: - (CityMunicipality? - city) { + onChanged: (Region? + region) async { + setState(() { + provinceCall = true; + }); + selectedRegion = region; + provinces = await LocationUtils + .instance + .getProvinces( + regionCode: + selectedRegion! + .code + .toString()); + selectedProvince = + provinces![0]; + setState(() { + provinceCall = false; + cityCall = true; + }); + citymuns = await LocationUtils + .instance + .getCities( + code: + selectedProvince! + .code!); selectedMunicipality = - city; + citymuns![0]; + setState(() { + cityCall = false; + }); }, + value: selectedRegion, decoration: normalTextFieldStyle( - "Municipality*", - "Municipality"), - value: - selectedMunicipality, - items: citymuns == null + "Region*", + "Region"), + items: regions == null ? [] - : citymuns!.map< - DropdownMenuItem< - CityMunicipality>>( - (CityMunicipality - c) { - return DropdownMenuItem( - value: c, - child: Text(c + : regions!.map< + DropdownMenuItem< + Region>>((Region + region) { + return DropdownMenuItem< + Region>( + value: region, + child: Text(region .description!)); }).toList(), ), - ), - ), - const SizedBox( - height: 20, - ), - ], - )), - ], - ); - }), + const SizedBox( + height: 20, + ), + //PROVINCE DROPDOWN + SizedBox( + height: 70, + child: ModalProgressHUD( + color: + Colors.transparent, + inAsyncCall: + provinceCall, + child: DropdownButtonFormField< + Province?>( + validator: (value) => + value == null + ? 'required' + : null, + isExpanded: true, + value: + selectedProvince, + onChanged: (Province? + province) async { + setState(() { + cityCall = true; + }); + selectedProvince = + province; + citymuns = await LocationUtils + .instance + .getCities( + code: selectedProvince! + .code + .toString()); + selectedMunicipality = + citymuns![0]; + setState(() { + cityCall = + false; + }); + }, + items: provinces == + null + ? [] + : provinces!.map< + DropdownMenuItem< + Province>>((Province + province) { + return DropdownMenuItem( + value: + province, + child: + FittedBox( + child: + Text(province.description!), + )); + }).toList(), + decoration: + normalTextFieldStyle( + "Province*", + "Province")), + ), + ), - const Expanded( - child: SizedBox(), - ), + // City municipality + SizedBox( + height: 70, + child: ModalProgressHUD( + color: + Colors.transparent, + 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, + ), + ], + )), + ], + ); + }), - SizedBox( - width: screenWidth, - height: 60, - child: ElevatedButton( - style: mainBtnStyle( - primary, Colors.transparent, second), - onPressed: () { - - //rating - double? rate = rating == null - ? null - : double.parse(rating!); - //license - String? newLicense = license; - //city municipality - CityMunicipality? cityMunicipality = - selectedMunicipality; - //exam date - DateTime? examDate = - examDateController.text.isEmpty - ? null - : DateTime.parse( - examDateController.text); - // validity date - DateTime? validityDate = - validityDateController.text.isEmpty - ? null - : DateTime.parse( - validityDateController.text); - // exam address - ExamAddress examAddress = ExamAddress( - barangay: state.eligibityCert.examAddress?.barangay, - id: state.eligibityCert.examAddress?.id, - addressCategory: state.eligibityCert.examAddress?.addressCategory, - examAddressClass: state.eligibityCert.examAddress?.examAddressClass, - country: selectedCountry ??= Country( - id: 175, - name: 'Philippines', - code: 'PH'), - cityMunicipality: cityMunicipality); - EligibityCert eligibityCert = - EligibityCert( - id: state.eligibityCert.id, - rating: rate, - examDate: examDate, - attachments: null, - eligibility: selectedEligibility, - examAddress: examAddress, - validityDate: validityDate, - licenseNumber: newLicense, - overseas: overseas); - if (formKey.currentState! - .saveAndValidate()) { - context.read().add(UpdateEligibility(eligibityCert: eligibityCert, oldEligibility: state.eligibityCert.eligibility!.id, profileId: profileId!, token: token!)); - } - }, - child: const Text(submit)), - ), - 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!); + //license + String? newLicense = license; + //city municipality + CityMunicipality? cityMunicipality = + selectedMunicipality; + //exam date + DateTime? examDate = + examDateController.text.isEmpty + ? null + : DateTime.parse( + examDateController.text); + // validity date + DateTime? validityDate = + validityDateController.text.isEmpty + ? null + : DateTime.parse( + validityDateController + .text); + // exam address + ExamAddress examAddress = ExamAddress( + barangay: state.eligibityCert + .examAddress?.barangay, + id: state + .eligibityCert.examAddress?.id, + addressCategory: state.eligibityCert + .examAddress?.addressCategory, + examAddressClass: state + .eligibityCert + .examAddress + ?.examAddressClass, + country: selectedCountry ??= + Country( + id: 175, + name: 'Philippines', + code: 'PH'), + cityMunicipality: cityMunicipality); + EligibityCert eligibityCert = + EligibityCert( + id: state.eligibityCert.id, + rating: rate, + examDate: examDate, + attachments: null, + eligibility: + selectedEligibility, + examAddress: examAddress, + validityDate: validityDate, + licenseNumber: newLicense, + overseas: overseas); + if (formKey.currentState! + .saveAndValidate()) { + context.read().add( + UpdateEligibility( + eligibityCert: eligibityCert, + oldEligibility: state + .eligibityCert + .eligibility! + .id, + profileId: profileId!, + token: token!)); + } + }, + child: const Text(submit)), + ), + const SizedBox( + height: 20, + ), + ]), + ), + ), + ); + } + return Container(); + }, + ); } return Container(); }, + ); } return Container(); diff --git a/lib/screens/profile/components/eligibility_screen.dart b/lib/screens/profile/components/eligibility_screen.dart index 3e3623a..2d3a75d 100644 --- a/lib/screens/profile/components/eligibility_screen.dart +++ b/lib/screens/profile/components/eligibility_screen.dart @@ -4,6 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_progress_hud/flutter_progress_hud.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:fluttericon/font_awesome_icons.dart'; +import 'package:unit2/bloc/eligibility/eligibility_bloc.dart'; import 'package:unit2/bloc/profile/profile_bloc.dart'; import 'package:unit2/bloc/user/user_bloc.dart'; import 'package:unit2/model/profile/eligibility.dart'; @@ -25,32 +26,33 @@ class EligibiltyScreen extends StatelessWidget { Widget build(BuildContext context) { String? token; String? profileId; - List? eligibilities; + return WillPopScope( onWillPop: () async { return true; }, child: Scaffold( appBar: AppBar( - title: context.watch().state is AddEligibilityState + title: context.watch().state is AddEligibilityState ? const Text("Add Eligiblity") - : context.watch().state is EditEligibilityState + : context.watch().state is EditEligibilityState ? const Text("Edit Eligibilty") : const Text(elibilityScreenTitle), centerTitle: true, backgroundColor: primary, - actions: (context.watch().state is EligibilityLoaded || - context.watch().state is ProfileLoading) + actions: (context.watch().state is EligibilityLoaded || + context.watch().state is ProfileLoading) ? [ AddLeading(onPressed: () { - context.read().add(ShowAddEligibilityForm()); + context + .read() + .add(ShowAddEligibilityForm()); }) ] : [ CloseLeading(onPressed: () { - context - .read() - .add(GetEligibilities(profileId: int.parse(profileId!), token: token!)); + context.read().add(GetEligibilities( + profileId: int.parse(profileId!), token: token!)); }) ], ), @@ -60,257 +62,278 @@ class EligibiltyScreen extends StatelessWidget { token = state.userData!.user!.login!.token; profileId = state.userData!.user!.login!.user!.profileId.toString(); - return ProgressHUD( - padding: const EdgeInsets.all(24), - indicatorWidget: const SpinKitFadingCircle( - color: Colors.white, - ), - backgroundColor: Colors.black87, - child: BlocConsumer( - listener: (context, state) { - if (state is ProfileLoading) { - final progress = ProgressHUD.of(context); - progress!.showWithText("Loading"); - } - if (state is EligibilityLoaded || - state is AddEligibilityState || - state is ProfileErrorState || - state is EditEligibilityState || - state is DeletedState || - state is EligibilityAddedState || - state is EligibilityEditedState) { - final progress = ProgressHUD.of(context); - progress!.dismiss(); - } - //DELETED STATE - if (state is DeletedState) { - if (state.success) { - successAlert(context, "Deletion Successfull", - "Eligibility has been deleted successfully", () { - Navigator.of(context).pop(); - context.read().add(LoadEligibility( - eligibilities: state.eligibilities)); - }); - } else { - errorAlert(context, "Deletion Failed", - "Error deleting eligibility", () { - Navigator.of(context).pop(); - context.read().add(LoadEligibility( - eligibilities: state.eligibilities)); - }); - } - } - //ADDED STATE - if (state is EligibilityAddedState) { - if (state.response['success']) { - successAlert(context, "Adding Successfull!", - state.response['message'], () { - Navigator.of(context).pop(); - context.read().add(LoadEligibility( - eligibilities: state.eligibilities)); - }); - } else { - errorAlert(context, "Adding Failed", - "Something went wrong. Please try again.", () { - Navigator.of(context).pop(); - context.read().add(LoadEligibility( - eligibilities: state.eligibilities)); - }); - } - } - //UPDATED STATE - if (state is EligibilityEditedState) { - if (state.response['success']) { - successAlert(context, "Update Successfull!", - state.response['message'], () { - Navigator.of(context).pop(); - context.read().add(LoadEligibility( - eligibilities: state.eligibilities)); - }); - } else { - errorAlert(context, "Update Failed", - "Something went wrong. Please try again.", () { - Navigator.of(context).pop(); - context.read().add(LoadEligibility( - eligibilities: state.eligibilities)); - }); - } - } - }, - builder: (context, state) { - return BlocBuilder( - builder: (context, state) { - if (state is EligibilityLoaded) { - eligibilities = state.eligibilities; - if (state.eligibilities.isNotEmpty) { - return ListView.builder( - padding: const EdgeInsets.symmetric( - vertical: 8, horizontal: 10), - itemCount: state.eligibilities.length, - itemBuilder: - (BuildContext context, int index) { - String title = state.eligibilities[index] - .eligibility!.title; - return Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Container( - width: screenWidth, - padding: const EdgeInsets.symmetric( - horizontal: 12, vertical: 8), - decoration: box1(), - child: Row( - children: [ - Expanded( - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment - .start, - children: [ - Text( - title, - style: Theme.of(context) - .textTheme - .titleMedium! - .copyWith( - fontWeight: - FontWeight - .w500), - ), - const Divider(), - const SizedBox( - height: 5, - ), - Text( - "$licenseNumber: ${state.eligibilities[index].licenseNumber == null ? 'N/A' : state.eligibilities[index].licenseNumber.toString()}", - style: - Theme.of(context) - .textTheme - .titleSmall), - const SizedBox( - height: 3, - ), - Text( - "Rating : ${state.eligibilities[index].rating ?? 'N/A'}.", - style: - Theme.of(context) - .textTheme - .titleSmall) - ]), - ), - AppPopupMenu( - offset: const Offset(-10, -10), - elevation: 3, - onSelected: (value) { - final progress = - ProgressHUD.of(context); - progress!.showWithText( - "Loading..."); - ////delete eligibilty-= = = = = = = = =>> - if (value == 2) { - confirmAlert(context, () { - BlocProvider.of< - ProfileBloc>( - context) - .add(DeleteEligibility( - eligibilities: - state - .eligibilities, - eligibilityId: state - .eligibilities[ - index] - .id!, - profileId: - profileId!, - token: token!)); - }, "Delete?", - "Confirm Delete?"); - } - if (value == 1) { - ////edit eligibilty-= = = = = = = = =>> - EligibityCert - eligibityCert = - state.eligibilities[ - index]; - bool overseas = eligibityCert - .examAddress! - .country! - .id - .toString() == - '175' - ? false - : true; - eligibityCert.overseas = - overseas; - - eligibityCert.overseas = - overseas; - - context.read().add( - ShowEditEligibilityForm( - eligibityCert: - eligibityCert)); - } - }, - menuItems: [ - popMenuItem( - text: "Edit", - value: 1, - icon: Icons.edit), - popMenuItem( - text: "Delete", - value: 2, - icon: Icons.delete), - popMenuItem( - text: "Attachment", - value: 3, - icon: FontAwesome.attach) - ], - icon: const Icon( - Icons.more_vert, - color: Colors.grey, - ), - tooltip: "Options", - ) - ], - ), - ), - const SizedBox( - height: 5, - ) - ], - ); - }); + return BlocBuilder( + builder: (context, state) { + if(state is ProfileLoaded){ + return ProgressHUD( + padding: const EdgeInsets.all(24), + indicatorWidget: const SpinKitFadingCircle( + color: Colors.white, + ), + backgroundColor: Colors.black87, + child: BlocConsumer( + listener: (context, state) { + if (state is EligibilityLoadingState) { + final progress = ProgressHUD.of(context); + progress!.showWithText("Loading"); + } + if (state is EligibilityLoaded || + state is AddEligibilityState || + state is EditEligibilityState || + state is DeletedState || + state is EligibilityAddedState || + state is EligibilityEditedState) { + final progress = ProgressHUD.of(context); + progress!.dismiss(); + } + //DELETED STATE + if (state is DeletedState) { + if (state.success) { + successAlert(context, "Deletion Successfull", + "Eligibility has been deleted successfully", + () { + Navigator.of(context).pop(); + context.read().add(LoadEligibility( + eligibilities: state.eligibilities)); + }); } else { - return const EmptyData( - message: - "You don't have any eligibilities added. Please click + to add"); + errorAlert(context, "Deletion Failed", + "Error deleting eligibility", () { + Navigator.of(context).pop(); + context.read().add(LoadEligibility( + eligibilities: state.eligibilities)); + }); } } - if (state is EditEligibilityState) { - return EditEligibilityScreen( - eligibityCert: state.eligibityCert); + //ADDED STATE + if (state is EligibilityAddedState) { + if (state.response['success']) { + successAlert(context, "Adding Successfull!", + state.response['message'], () { + Navigator.of(context).pop(); + context.read().add(LoadEligibility( + eligibilities: state.eligibilities)); + }); + } else { + errorAlert(context, "Adding Failed", + "Something went wrong. Please try again.", + () { + Navigator.of(context).pop(); + context.read().add(LoadEligibility( + eligibilities: state.eligibilities)); + }); + } } - if (state is AddEligibilityState) { - return const AddEligibilityScreen(); + //UPDATED STATE + if (state is EligibilityEditedState) { + if (state.response['success']) { + successAlert(context, "Update Successfull!", + state.response['message'], () { + Navigator.of(context).pop(); + context.read().add(LoadEligibility( + eligibilities: state.eligibilities)); + }); + } else { + errorAlert(context, "Update Failed", + "Something went wrong. Please try again.", + () { + Navigator.of(context).pop(); + context.read().add(LoadEligibility( + eligibilities: state.eligibilities)); + }); + } } - if (state is ProfileErrorState) { - return Center( - child: Text(state.mesage), - ); - } - return Container( - color: Colors.grey.shade200, + }, + builder: (context, state) { + return BlocBuilder( + builder: (context, state) { + if (state is EligibilityLoaded) { + + if (state.eligibilities.isNotEmpty) { + return ListView.builder( + padding: const EdgeInsets.symmetric( + vertical: 8, horizontal: 10), + itemCount: state.eligibilities.length, + itemBuilder: + (BuildContext context, int index) { + String title = state + .eligibilities[index] + .eligibility! + .title; + return Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Container( + width: screenWidth, + padding: + const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8), + decoration: box1(), + child: Row( + children: [ + Expanded( + child: Column( + mainAxisAlignment: + MainAxisAlignment + .start, + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + Text( + title, + style: Theme.of( + context) + .textTheme + .titleMedium! + .copyWith( + fontWeight: + FontWeight + .w500), + ), + const Divider(), + const SizedBox( + height: 5, + ), + Text( + "$licenseNumber: ${state.eligibilities[index].licenseNumber == null ? 'N/A' : state.eligibilities[index].licenseNumber.toString()}", + style: Theme.of( + context) + .textTheme + .titleSmall), + const SizedBox( + height: 3, + ), + Text( + "Rating : ${state.eligibilities[index].rating ?? 'N/A'}.", + style: Theme.of( + context) + .textTheme + .titleSmall) + ]), + ), + AppPopupMenu( + offset: + const Offset(-10, -10), + elevation: 3, + onSelected: (value) { + final progress = + ProgressHUD.of( + context); + progress!.showWithText( + "Loading..."); + ////delete eligibilty-= = = = = = = = =>> + if (value == 2) { + confirmAlert(context, + () { + BlocProvider.of< + EligibilityBloc>( + context) + .add(DeleteEligibility( + eligibilities: state + .eligibilities, + eligibilityId: state + .eligibilities[ + index] + .id!, + profileId: + profileId!, + token: + token!)); + }, "Delete?", + "Confirm Delete?"); + } + if (value == 1) { + ////edit eligibilty-= = = = = = = = =>> + EligibityCert + eligibityCert = + state.eligibilities[ + index]; + bool overseas = eligibityCert + .examAddress! + .country! + .id + .toString() == + '175' + ? false + : true; + eligibityCert.overseas = + overseas; + + eligibityCert.overseas = + overseas; + + context + .read() + .add(ShowEditEligibilityForm( + eligibityCert: + eligibityCert)); + } + }, + menuItems: [ + popMenuItem( + text: "Edit", + value: 1, + icon: Icons.edit), + popMenuItem( + text: "Delete", + value: 2, + icon: Icons.delete), + popMenuItem( + text: "Attachment", + value: 3, + icon: FontAwesome + .attach) + ], + icon: const Icon( + Icons.more_vert, + color: Colors.grey, + ), + tooltip: "Options", + ) + ], + ), + ), + const SizedBox( + height: 5, + ) + ], + ); + }); + } else { + return const EmptyData( + message: + "You don't have any eligibilities added. Please click + to add"); + } + } + if (state is EditEligibilityState) { + return EditEligibilityScreen( + eligibityCert: state.eligibityCert); + } + if (state is AddEligibilityState) { + return const AddEligibilityScreen(); + } + if (state is EligibilityErrorState) { + return Center( + child: Text(state.message), + ); + } + return Container( + color: Colors.grey.shade200, + ); + }, ); }, - ); - }, - ), + ), + ); + + } + return Container(); + } ); } return Container(); diff --git a/lib/screens/profile/components/other_information/non_academic_recognition_screen.dart b/lib/screens/profile/components/other_information/non_academic_recognition_screen.dart index 6aa6465..4af8aa7 100644 --- a/lib/screens/profile/components/other_information/non_academic_recognition_screen.dart +++ b/lib/screens/profile/components/other_information/non_academic_recognition_screen.dart @@ -1,6 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/src/widgets/framework.dart'; -import 'package:flutter/src/widgets/placeholder.dart'; import 'package:unit2/model/profile/other_information/non_acedimic_recognition.dart'; import 'package:unit2/theme-data.dart/box_shadow.dart'; import 'package:unit2/theme-data.dart/colors.dart'; diff --git a/lib/screens/profile/components/work_history_screen.dart b/lib/screens/profile/components/work_history_screen.dart index 71deb9f..74d9a0d 100644 --- a/lib/screens/profile/components/work_history_screen.dart +++ b/lib/screens/profile/components/work_history_screen.dart @@ -1,71 +1,167 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_progress_hud/flutter_progress_hud.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:intl/intl.dart'; +import 'package:unit2/bloc/profile/profile_bloc.dart'; +import 'package:unit2/bloc/user/user_bloc.dart'; +import 'package:unit2/bloc/workHistory/workHistory_bloc.dart'; import 'package:unit2/model/profile/work_history.dart'; import 'package:unit2/theme-data.dart/box_shadow.dart'; import 'package:unit2/theme-data.dart/colors.dart'; import 'package:unit2/utils/text_container.dart'; import 'package:unit2/widgets/Leadings/add_leading.dart'; import 'package:unit2/widgets/empty_data.dart'; +import 'package:unit2/widgets/error_state.dart'; import '../../../utils/global.dart'; class WorkHistoryScreen extends StatelessWidget { - final List workExperiences; - const WorkHistoryScreen({super.key, required this.workExperiences}); - - + const WorkHistoryScreen({super.key}); @override Widget build(BuildContext context) { - DateFormat dteFormat2 = DateFormat.yMMMMd('en_US'); + DateFormat dteFormat2 = DateFormat.yMMMMd('en_US'); return Scaffold( - appBar: AppBar( - title: const Text(workHistoryScreenTitle), - backgroundColor: primary, - centerTitle: true, - actions: [AddLeading(onPressed: (){})], - ), - body: workExperiences.isNotEmpty? ListView.builder( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 10), - itemCount: workExperiences.length, - itemBuilder: (BuildContext context, int index) { - String position = workExperiences[index].position!.title!; - String agency = workExperiences[index].agency!.name!; - String from = - dteFormat2.format(workExperiences[index].fromDate!); - String? to = workExperiences[index].toDate == null - ? present.toUpperCase() - : dteFormat2.format(workExperiences[index].toDate!); - return Column( - - children: [ - Container( - width: screenWidth, - decoration: box1(), - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), - child: Row(children: [ - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(position,style: Theme.of(context).textTheme.titleMedium!.copyWith(fontWeight: FontWeight.w600),), - const Divider(), - const SizedBox(height: 8,), - Text(agency,style: Theme.of(context).textTheme.titleSmall!.copyWith(fontWeight: FontWeight.w500),), - const SizedBox(height: 5,), - Text("$from to $to",style: Theme.of(context).textTheme.bodyMedium,), - ], - )), - IconButton(onPressed: () {}, icon: const Icon(Icons.more_vert,color: Colors.grey,)) - ]), - ), - const SizedBox( - height: 5, - ), - ], - ); - }):const EmptyData(message: "You don't have any Work History added. Please click + to add ."), - ); + appBar: AppBar( + title: const Text(workHistoryScreenTitle), + backgroundColor: primary, + centerTitle: true, + actions: [AddLeading(onPressed: () {})], + ), + body: + //UserBloc + ProgressHUD( + padding: const EdgeInsets.all(24), + backgroundColor: Colors.black87, + indicatorWidget: const SpinKitFadingCircle( + color: Colors.white, + ), + child: BlocBuilder( + builder: (context, state) { + if (state is UserLoggedIn) { + return BlocBuilder( + builder: (context, state) { + //ProfileBloc + if (state is ProfileLoaded) { + //WorkHistoryBloc + return BlocConsumer( + listener: (context, state) { + if (state is WorkHistoryLoadingState) { + final progress = ProgressHUD.of(context); + progress!.showWithText("Please wait..."); + } + if (state is WorkHistoryLoaded || state is WorkHistoryErrorState) { + final progress = ProgressHUD.of(context); + progress!.dismiss(); + } + }, + builder: (context, state) { + if (state is WorkHistoryLoaded) { + if (state.workExperiences.isNotEmpty) { + return ListView.builder( + padding: const EdgeInsets.symmetric( + vertical: 8, horizontal: 10), + itemCount: state.workExperiences.length, + itemBuilder: + (BuildContext context, int index) { + String position = state + .workExperiences[index] + .position! + .title!; + String agency = state + .workExperiences[index].agency!.name!; + String from = dteFormat2.format( + state.workExperiences[index].fromDate!); + String? to = + state.workExperiences[index].toDate == + null + ? present.toUpperCase() + : dteFormat2.format( + state.workExperiences[index].toDate!); + return Column( + children: [ + Container( + width: screenWidth, + decoration: box1(), + padding: const EdgeInsets.symmetric( + horizontal: 12, vertical: 8), + child: Row(children: [ + Expanded( + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + position, + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith( + fontWeight: + FontWeight.w600), + ), + const Divider(), + const SizedBox( + height: 8, + ), + Text( + agency, + style: Theme.of(context) + .textTheme + .titleSmall! + .copyWith( + fontWeight: + FontWeight.w500), + ), + const SizedBox( + height: 5, + ), + Text( + "$from $to ", + style: Theme.of(context) + .textTheme + .bodyMedium, + ), + ], + )), + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.more_vert, + color: Colors.grey, + )) + ]), + ), + const SizedBox( + height: 5, + ), + ], + ); + }); + } else { + return const EmptyData( + message: + "You don't have any work experience added. Please click + to add"); + } + } + if (state is WorkHistoryErrorState) { + return SomethingWentWrong( + message: state.message, onpressed: () {}); + } + return Container(); + }, + ); + } + return Container(); + }, + ); + } + return Container(); + }, + ), + )); } } diff --git a/lib/screens/profile/profile.dart b/lib/screens/profile/profile.dart index 2d305ed..91c203b 100644 --- a/lib/screens/profile/profile.dart +++ b/lib/screens/profile/profile.dart @@ -8,14 +8,15 @@ import 'package:fluttericon/elusive_icons.dart'; import 'package:fluttericon/entypo_icons.dart'; import 'package:fluttericon/font_awesome5_icons.dart'; import 'package:fluttericon/modern_pictograms_icons.dart'; +import 'package:unit2/bloc/eligibility/eligibility_bloc.dart'; import 'package:unit2/bloc/profile/profile_bloc.dart'; +import 'package:unit2/bloc/workHistory/workHistory_bloc.dart'; import 'package:unit2/model/login_data/employee_info/employee_info.dart'; import 'package:unit2/screens/profile/components/basic_information/address_screen.dart'; import 'package:unit2/screens/profile/components/basic_information/citizenship_screen.dart'; import 'package:unit2/screens/profile/components/basic_information/contact_information_screen.dart'; import 'package:unit2/screens/profile/components/basic_information/identification_information_screen.dart'; import 'package:unit2/screens/profile/components/basic_information/primary_information_screen.dart'; -import 'package:unit2/screens/profile/components/education_screen.dart'; import 'package:unit2/screens/profile/components/eligibility_screen.dart'; import 'package:unit2/screens/profile/components/family_background_screen.dart'; import 'package:unit2/screens/profile/components/learning_and_development_screen.dart'; @@ -148,12 +149,7 @@ class _ProfileInfoState extends State { icon: Elusive.group, title: "Family", onTap: () { - // Navigator.push(context, MaterialPageRoute( - // builder: (BuildContext context) { - // return FamilyBackgroundScreen( - // familyBackground: - // state.profileInformation.families); - // })); + }, ), const Divider(), @@ -177,10 +173,8 @@ class _ProfileInfoState extends State { onTap: () { Navigator.push(context, MaterialPageRoute( builder: (BuildContext context) { - return BlocProvider.value( - value: ProfileBloc() - ..add(GetEligibilities( - profileId: profileId!, token: token!)), + return BlocProvider( + create: (context) => EligibilityBloc()..add(GetEligibilities(profileId: profileId!, token: token!)), child: const EligibiltyScreen(), ); })); @@ -191,12 +185,14 @@ class _ProfileInfoState extends State { icon: FontAwesome5.shopping_bag, title: "Work History", onTap: () { - // Navigator.push(context, MaterialPageRoute( - // builder: (BuildContext context) { - // return WorkHistoryScreen( - // workExperiences: state - // .profileInformation.workExperiences); - // })); + Navigator.push(context, MaterialPageRoute( + builder: (BuildContext context) { + return BlocProvider( + create: (context) => WorkHistoryBloc()..add(GetWorkHistories(profileId: profileId!, token: token!)), + child: const WorkHistoryScreen(), + ); + })); + }, ), const Divider(), diff --git a/lib/sevices/profile/education_services.dart b/lib/sevices/profile/education_services.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/sevices/profile/eligibility_services.dart b/lib/sevices/profile/eligibility_services.dart index 1c3e183..adfdb8d 100644 --- a/lib/sevices/profile/eligibility_services.dart +++ b/lib/sevices/profile/eligibility_services.dart @@ -20,7 +20,7 @@ class EligibilityService { }; - // try{ + try{ http.Response response = await Request.instance.getRequest(path: path,headers: headers,param: {}); if(response.statusCode == 200){ Map data = jsonDecode(response.body); @@ -31,9 +31,9 @@ class EligibilityService { }); } } - // }catch(e){ - // throw e.toString(); - // } + }catch(e){ + throw e.toString(); + } return eligibilities; } diff --git a/lib/sevices/profile/work_history_services.dart b/lib/sevices/profile/work_history_services.dart new file mode 100644 index 0000000..b42de20 --- /dev/null +++ b/lib/sevices/profile/work_history_services.dart @@ -0,0 +1,39 @@ +import 'dart:convert'; + +import 'package:unit2/model/profile/work_history.dart'; + + +import 'package:http/http.dart' as http; +import 'package:unit2/utils/request.dart'; + +import '../../utils/urls.dart'; +class WorkHistoryService{ + static final WorkHistoryService _instance = WorkHistoryService(); + static WorkHistoryService get instance => _instance; + + Future > getWorkExperiences( int profileId, String token)async{ + List workExperiences = []; + String authToken = "Token $token"; + Map headers = { + 'Content-Type': 'application/json; charset=UTF-8', + 'Authorization': authToken + }; + String path= Url.instance.workHistories()+profileId.toString(); + // try{ + http.Response response =await Request.instance.getRequest(path: path, headers: headers, param: {}); + if(response.statusCode == 200){ + Map data = jsonDecode(response.body); + if(data['data'] != null){ + data['data'].forEach((var workHistory){ + workExperiences.add(WorkHistory.fromJson(workHistory)); + }); + } + + } + // }catch(e){ + // throw e.toString(); + // } + return workExperiences; + + } +} \ No newline at end of file diff --git a/lib/utils/app_router.dart b/lib/utils/app_router.dart index 16eea91..7e6d33c 100644 --- a/lib/utils/app_router.dart +++ b/lib/utils/app_router.dart @@ -34,12 +34,12 @@ class AppRouter { return const QRLogin(); }); case '/profile': + ProfileArguments arguments = routeSettings.arguments as ProfileArguments; + BlocProvider.of( + NavigationService.navigatorKey.currentContext!) + .add(LoadProfile(token:arguments.token ,userID:arguments.userID )); return MaterialPageRoute(builder: (_) { - ProfileArguments arguments = routeSettings.arguments as ProfileArguments; - return BlocProvider( - create: (context) => ProfileBloc()..add(LoadProfile(token: arguments.token,userID: arguments.userID)), - child: const ProfileInfo(), - ); + return const ProfileInfo(); }); default: return MaterialPageRoute(builder: (context) { diff --git a/lib/utils/urls.dart b/lib/utils/urls.dart index 6182792..f0d11fe 100644 --- a/lib/utils/urls.dart +++ b/lib/utils/urls.dart @@ -41,6 +41,10 @@ String deleteEligibility(){ String updateEligibility(){ return "/api/jobnet_app/profile/pds/eligibility/"; } +//// work history paths +String workHistories(){ + return "/api/jobnet_app/profile/pds/work/"; +} // location utils path String getCounties(){