diff --git a/lib/bloc/education/education_bloc.dart b/lib/bloc/education/education_bloc.dart new file mode 100644 index 0000000..bb19420 --- /dev/null +++ b/lib/bloc/education/education_bloc.dart @@ -0,0 +1,25 @@ +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:unit2/model/profile/educational_background.dart'; +import 'package:unit2/sevices/profile/education_services.dart'; + +part 'education_event.dart'; +part 'education_state.dart'; + +class EducationBloc extends Bloc { + List educationalBackgrounds = []; + EducationBloc() : super(EducationInitial()) { + on((event, emit) async { + emit(EducationalBackgroundLoadingState()); + try { + List educations = await EducationService.instace + .getEducationalBackground(event.profileId, event.token); + educationalBackgrounds = educations; + emit(EducationalBackgroundLoadedState( + educationalBackground: educationalBackgrounds)); + } catch (e) { + emit(EducationalBackgroundErrorState(message: e.toString())); + } + }); + } +} diff --git a/lib/bloc/education/education_event.dart b/lib/bloc/education/education_event.dart new file mode 100644 index 0000000..cfe1db7 --- /dev/null +++ b/lib/bloc/education/education_event.dart @@ -0,0 +1,15 @@ +part of 'education_bloc.dart'; + +abstract class EducationEvent extends Equatable { + const EducationEvent(); + + @override + List get props => []; +} +class GetEducationalBackground extends EducationEvent{ + final int profileId; + final String token; + const GetEducationalBackground({required this.profileId, required this.token}); + @override + List get props => [profileId,token]; +} diff --git a/lib/bloc/education/education_state.dart b/lib/bloc/education/education_state.dart new file mode 100644 index 0000000..cc75963 --- /dev/null +++ b/lib/bloc/education/education_state.dart @@ -0,0 +1,29 @@ +part of 'education_bloc.dart'; + +abstract class EducationState extends Equatable { + const EducationState(); + + @override + List get props => []; +} + +class EducationInitial extends EducationState {} + + + +class EducationalBackgroundLoadedState extends EducationState{ + final List educationalBackground; + const EducationalBackgroundLoadedState({required this.educationalBackground}); + @override + List get props => [educationalBackground]; +} + +class EducationalBackgroundErrorState extends EducationState{ + final String message; + const EducationalBackgroundErrorState({required this.message}); + @override + List get props => [message]; +} +class EducationalBackgroundLoadingState extends EducationState{ + +} diff --git a/lib/screens/profile/components/education_screen.dart b/lib/screens/profile/components/education_screen.dart index 6602b57..67cd194 100644 --- a/lib/screens/profile/components/education_screen.dart +++ b/lib/screens/profile/components/education_screen.dart @@ -1,4 +1,10 @@ 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:unit2/bloc/education/education_bloc.dart'; +import 'package:unit2/bloc/profile/profile_bloc.dart'; +import 'package:unit2/bloc/user/user_bloc.dart'; import 'package:unit2/model/profile/educational_background.dart'; import 'package:unit2/theme-data.dart/box_shadow.dart'; @@ -6,122 +12,206 @@ 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'; class EducationScreen extends StatelessWidget { - final List educationBackgrounds; - const EducationScreen({super.key, required this.educationBackgrounds}); + + const EducationScreen({super.key}); @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text(educationScreenTitle), - centerTitle: true, - backgroundColor: primary, - actions: [AddLeading(onPressed: (){})], - ), - body: educationBackgrounds.isNotEmpty ? ListView.builder( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 10), - itemCount: educationBackgrounds.length, - itemBuilder: (BuildContext context, int index) { - String level = educationBackgrounds[index].education!.level!; - String periodFrom = educationBackgrounds[index].periodFrom!; - String periodTo = educationBackgrounds[index].periodTo!; - String? program = - educationBackgrounds[index].education!.course == null - ? null - : educationBackgrounds[index].education!.course! - .program!; - List? honors = - educationBackgrounds[index].honors!.toList(); - String school = - educationBackgrounds[index].education!.school!.name!; - return Column( - children: [ - Container( - decoration: box1(), - padding: - const EdgeInsets.symmetric(horizontal: 12, vertical: 8), - child: Row( - children: [ - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: Text( - level, - style: Theme.of(context) - .textTheme - .titleMedium! - .copyWith(fontWeight: FontWeight.w500), - )), - Text( - "$periodFrom - $periodTo", - style: - Theme.of(context).textTheme.bodyMedium, - ), - ], - ), - - const SizedBox(height: 5,), - Text( - school, - style: Theme.of(context).textTheme.titleSmall, - ), - Container( - padding: const EdgeInsets.only(top: 8), - child: honors.isNotEmpty - ? Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text("$honorsText : ",style: TextStyle(fontWeight: FontWeight.w600),), - Column( - children: - - honors - .map((Honor honor) => - Text(" - ${honor.name!}")) - .toList(), - ), - ], - ) - : const SizedBox()), - program == null - ? const SizedBox() - : Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, + appBar: AppBar( + title: const Text(educationScreenTitle), + centerTitle: true, + backgroundColor: primary, + actions: [AddLeading(onPressed: () {})], + ), + //userbloc + body: ProgressHUD( + padding: const EdgeInsets.all(24), + backgroundColor: Colors.black87, + indicatorWidget: const SpinKitFadingCircle( + color: Colors.white), + child: BlocBuilder( + builder: (context, state) { + if (state is UserLoggedIn) { + //profilebloc + return BlocBuilder( + builder: (context, state) { + if (state is ProfileLoaded) { + //education bloc + return BlocConsumer( + listener: (context, state) { + if (state is EducationalBackgroundLoadingState) { + final progress = ProgressHUD.of(context); + progress!.showWithText("Please wait..."); + } + if(state is EducationalBackgroundLoadedState || state is EducationalBackgroundErrorState){ + final progress = ProgressHUD.of(context); + progress!.dismiss(); + } + }, + builder: (context, state) { + if (state is EducationalBackgroundLoadedState) { + if (state.educationalBackground.isNotEmpty) { + return ListView.builder( + padding: const EdgeInsets.symmetric( + vertical: 8, horizontal: 10), + itemCount: state.educationalBackground.length, + itemBuilder: (BuildContext context, int index) { + String level = state + .educationalBackground[index] + .education! + .level!; + String periodFrom = state + .educationalBackground[index].periodFrom!; + String periodTo = state + .educationalBackground[index].periodTo!; + String? program = state + .educationalBackground[index] + .education! + .course == + null + ? null + : state.educationalBackground[index] + .education!.course!.program!; + List? honors = state + .educationalBackground[index].honors! + .toList(); + String school = state + .educationalBackground[index] + .education! + .school! + .name!; + return Column( children: [ + Container( + decoration: box1(), + padding: const EdgeInsets.symmetric( + horizontal: 12, vertical: 8), + child: Row( + children: [ + Expanded( + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + child: Text( + level, + style: Theme.of( + context) + .textTheme + .titleMedium! + .copyWith( + fontWeight: + FontWeight + .w500), + )), + Text( + "$periodFrom - ", + style: + Theme.of(context) + .textTheme + .bodyMedium, + ), + ], + ), + const SizedBox( + height: 5, + ), + Text( + school, + style: Theme.of(context) + .textTheme + .titleSmall, + ), + Container( + padding: + const EdgeInsets + .only(top: 8), + child: honors.isNotEmpty + ? Column( + mainAxisAlignment: + MainAxisAlignment + .start, + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + const Text( + " : ", + style: TextStyle( + fontWeight: + FontWeight.w600), + ), + Column( + children: honors + .map((Honor + honor) => + Text(" - ${honor.name!}")) + .toList(), + ), + ], + ) + : const SizedBox()), + program == null + ? const SizedBox() + : Column( + mainAxisAlignment: + MainAxisAlignment + .start, + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + const SizedBox( + height: 5, + ), + Text(program), + ], + ), + ]), + ), + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.more_vert, + color: Colors.grey, + )) + ], + ), + ), const SizedBox( height: 5, ), - Text(program), ], - ), - ]), - ), - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.more_vert, - color: Colors.grey, - )) - ], - ), - ), - const SizedBox( - height: 5, - ), - ], - ); - }):const EmptyData(message: "You don't have any Educational Background added. Please click + to add."), - ); + ); + }); + } else { + const EmptyData( + message: + "You don't have any Educational Background added. Please click + to add."); + } + }if(state is EducationalBackgroundErrorState){ + return SomethingWentWrong(message: state.message, onpressed: (){}); + } + 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 2d3a75d..7fc3356 100644 --- a/lib/screens/profile/components/eligibility_screen.dart +++ b/lib/screens/profile/components/eligibility_screen.dart @@ -75,7 +75,7 @@ class EligibiltyScreen extends StatelessWidget { listener: (context, state) { if (state is EligibilityLoadingState) { final progress = ProgressHUD.of(context); - progress!.showWithText("Loading"); + progress!.showWithText("Please wait..."); } if (state is EligibilityLoaded || state is AddEligibilityState || diff --git a/lib/screens/profile/profile.dart b/lib/screens/profile/profile.dart index 91c203b..e6ed37b 100644 --- a/lib/screens/profile/profile.dart +++ b/lib/screens/profile/profile.dart @@ -8,6 +8,7 @@ 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/education/education_bloc.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'; @@ -17,6 +18,7 @@ import 'package:unit2/screens/profile/components/basic_information/citizenship_s 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'; @@ -157,13 +159,13 @@ class _ProfileInfoState extends State { icon: FontAwesome5.graduation_cap, title: "Education", onTap: () { - // Navigator.push(context, MaterialPageRoute( - // builder: (BuildContext context) { - // return EducationScreen( - // educationBackgrounds: state - // .profileInformation - // .educationalBackgrounds); - // })); + Navigator.push(context, MaterialPageRoute( + builder: (BuildContext context) { + return BlocProvider( + create: (context) => EducationBloc()..add(GetEducationalBackground(profileId: profileId!, token: token!)), + child: const EducationScreen(), + ); + })); }, ), const Divider(), diff --git a/lib/sevices/profile/education_services.dart b/lib/sevices/profile/education_services.dart index e69de29..1d6d93e 100644 --- a/lib/sevices/profile/education_services.dart +++ b/lib/sevices/profile/education_services.dart @@ -0,0 +1,41 @@ +import 'dart:convert'; + +import 'package:unit2/model/profile/educational_background.dart'; +import 'package:unit2/utils/request.dart'; + +import '../../utils/urls.dart'; +import 'package:http/http.dart' as http; + +class EducationService { + static final EducationService _instance = EducationService(); + static EducationService get instace => _instance; + + Future> getEducationalBackground( + int profileId, String token) async { + List educationalBackgrounds = []; + String authToken = "Token $token"; + String path = "${Url.instance.getEducationalBackgrounds()}$profileId/"; + Map headers = { + 'Content-Type': 'application/json; charset=UTF-8', + 'Authorization': authToken + }; + try { + http.Response response = await Request.instance + .getRequest(path: path, param: {}, headers: headers); + if (response.statusCode == 200) { + Map data = jsonDecode(response.body); + if (data['data'] != null) { + data['data'].forEach((var education) { + EducationalBackground educationalBackground = + EducationalBackground.fromJson(education); + educationalBackgrounds.add(educationalBackground); + }); + } + } + } catch (e) { + throw e.toString(); + } + + return educationalBackgrounds; + } +} diff --git a/lib/sevices/profile/work_history_services.dart b/lib/sevices/profile/work_history_services.dart index b42de20..b62f526 100644 --- a/lib/sevices/profile/work_history_services.dart +++ b/lib/sevices/profile/work_history_services.dart @@ -18,7 +18,7 @@ class WorkHistoryService{ 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': authToken }; - String path= Url.instance.workHistories()+profileId.toString(); + String path= Url.instance.getWorkHistories()+profileId.toString(); // try{ http.Response response =await Request.instance.getRequest(path: path, headers: headers, param: {}); if(response.statusCode == 200){ diff --git a/lib/utils/urls.dart b/lib/utils/urls.dart index f0d11fe..b3506fb 100644 --- a/lib/utils/urls.dart +++ b/lib/utils/urls.dart @@ -42,10 +42,15 @@ String updateEligibility(){ return "/api/jobnet_app/profile/pds/eligibility/"; } //// work history paths -String workHistories(){ +String getWorkHistories(){ return "/api/jobnet_app/profile/pds/work/"; } +////educational background paths +String getEducationalBackgrounds(){ + return "/api/jobnet_app/profile/pds/education/"; +} + // location utils path String getCounties(){ return "/api/jobnet_app/countries/";