diff --git a/android/app/build.gradle b/android/app/build.gradle index 3a25cea..cdff380 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -57,6 +57,8 @@ android { signingConfig signingConfigs.debug } } + + ndkVersion "23.1.7779620" } flutter { diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4..1e1e2e1 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b7..ac2c489 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 09d4391..a5c1933 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d..6882943 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372e..a1371d9 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/assets/images/a_automated.png b/assets/images/a_automated.png new file mode 100644 index 0000000..c7b0164 Binary files /dev/null and b/assets/images/a_automated.png differ diff --git a/assets/images/android_cv.png b/assets/images/android_cv.png new file mode 100644 index 0000000..a40b714 Binary files /dev/null and b/assets/images/android_cv.png differ diff --git a/assets/images/apple_logo.png b/assets/images/apple_logo.png new file mode 100644 index 0000000..f644b18 Binary files /dev/null and b/assets/images/apple_logo.png differ diff --git a/assets/images/card1.png b/assets/images/card1.png new file mode 100644 index 0000000..15d5dc0 Binary files /dev/null and b/assets/images/card1.png differ diff --git a/assets/images/company.png b/assets/images/company.png new file mode 100644 index 0000000..c33c07a Binary files /dev/null and b/assets/images/company.png differ diff --git a/assets/images/company_background.png b/assets/images/company_background.png new file mode 100644 index 0000000..74b2910 Binary files /dev/null and b/assets/images/company_background.png differ diff --git a/assets/images/company_profile.png b/assets/images/company_profile.png new file mode 100644 index 0000000..f867428 Binary files /dev/null and b/assets/images/company_profile.png differ diff --git a/assets/images/create job winning.png b/assets/images/create job winning.png new file mode 100644 index 0000000..f71e072 Binary files /dev/null and b/assets/images/create job winning.png differ diff --git a/assets/images/create_your_cv.png b/assets/images/create_your_cv.png new file mode 100644 index 0000000..2da02de Binary files /dev/null and b/assets/images/create_your_cv.png differ diff --git a/assets/images/cvs1.png b/assets/images/cvs1.png new file mode 100644 index 0000000..a40b714 Binary files /dev/null and b/assets/images/cvs1.png differ diff --git a/assets/images/cvs2.png b/assets/images/cvs2.png new file mode 100644 index 0000000..21d5301 Binary files /dev/null and b/assets/images/cvs2.png differ diff --git a/assets/images/d_developer.png b/assets/images/d_developer.png new file mode 100644 index 0000000..9ca88c2 Binary files /dev/null and b/assets/images/d_developer.png differ diff --git a/assets/images/developer.jpg b/assets/images/developer.jpg new file mode 100644 index 0000000..6e5b6d6 Binary files /dev/null and b/assets/images/developer.jpg differ diff --git a/assets/images/edit_your_extend_cv.png b/assets/images/edit_your_extend_cv.png new file mode 100644 index 0000000..40f5a24 Binary files /dev/null and b/assets/images/edit_your_extend_cv.png differ diff --git a/assets/images/error_image (1).png b/assets/images/error_image (1).png new file mode 100644 index 0000000..de2f7fa Binary files /dev/null and b/assets/images/error_image (1).png differ diff --git a/assets/images/error_image.png b/assets/images/error_image.png new file mode 100644 index 0000000..27dbf14 Binary files /dev/null and b/assets/images/error_image.png differ diff --git a/assets/images/facebook_logo.png b/assets/images/facebook_logo.png new file mode 100644 index 0000000..ce99556 Binary files /dev/null and b/assets/images/facebook_logo.png differ diff --git a/assets/images/google_logo.png b/assets/images/google_logo.png new file mode 100644 index 0000000..9177464 Binary files /dev/null and b/assets/images/google_logo.png differ diff --git a/assets/images/grammar.png b/assets/images/grammar.png new file mode 100644 index 0000000..c76f684 Binary files /dev/null and b/assets/images/grammar.png differ diff --git a/assets/images/grammar_check.png b/assets/images/grammar_check.png new file mode 100644 index 0000000..a43f24f Binary files /dev/null and b/assets/images/grammar_check.png differ diff --git a/assets/images/graphic_design.png b/assets/images/graphic_design.png new file mode 100644 index 0000000..a0a6e75 Binary files /dev/null and b/assets/images/graphic_design.png differ diff --git a/assets/images/job_applicants.png b/assets/images/job_applicants.png new file mode 100644 index 0000000..7dfb74b Binary files /dev/null and b/assets/images/job_applicants.png differ diff --git a/assets/images/linkedIn_logo.png b/assets/images/linkedIn_logo.png new file mode 100644 index 0000000..b0677b9 Binary files /dev/null and b/assets/images/linkedIn_logo.png differ diff --git a/assets/images/medical_field.png b/assets/images/medical_field.png new file mode 100644 index 0000000..ceb74cd Binary files /dev/null and b/assets/images/medical_field.png differ diff --git a/assets/images/meeting.jpeg b/assets/images/meeting.jpeg new file mode 100644 index 0000000..04e2143 Binary files /dev/null and b/assets/images/meeting.jpeg differ diff --git a/assets/images/modern.png b/assets/images/modern.png new file mode 100644 index 0000000..d485fb6 Binary files /dev/null and b/assets/images/modern.png differ diff --git a/assets/images/my_cv1.png b/assets/images/my_cv1.png new file mode 100644 index 0000000..2de04cf Binary files /dev/null and b/assets/images/my_cv1.png differ diff --git a/assets/images/my_cv2.png b/assets/images/my_cv2.png new file mode 100644 index 0000000..63451c2 Binary files /dev/null and b/assets/images/my_cv2.png differ diff --git a/assets/images/person1.png b/assets/images/person1.png new file mode 100644 index 0000000..9964291 Binary files /dev/null and b/assets/images/person1.png differ diff --git a/assets/images/person2.png b/assets/images/person2.png new file mode 100644 index 0000000..338ad7b Binary files /dev/null and b/assets/images/person2.png differ diff --git a/assets/images/person3.png b/assets/images/person3.png new file mode 100644 index 0000000..03e3f91 Binary files /dev/null and b/assets/images/person3.png differ diff --git a/assets/images/person4.png b/assets/images/person4.png new file mode 100644 index 0000000..ca6e458 Binary files /dev/null and b/assets/images/person4.png differ diff --git a/assets/images/person5.png b/assets/images/person5.png new file mode 100644 index 0000000..ae28582 Binary files /dev/null and b/assets/images/person5.png differ diff --git a/assets/images/person6.png b/assets/images/person6.png new file mode 100644 index 0000000..9d60c5e Binary files /dev/null and b/assets/images/person6.png differ diff --git a/assets/images/person7.png b/assets/images/person7.png new file mode 100644 index 0000000..7986bff Binary files /dev/null and b/assets/images/person7.png differ diff --git a/assets/images/person8.png b/assets/images/person8.png new file mode 100644 index 0000000..a611e46 Binary files /dev/null and b/assets/images/person8.png differ diff --git a/assets/images/professional.png b/assets/images/professional.png new file mode 100644 index 0000000..e9af711 Binary files /dev/null and b/assets/images/professional.png differ diff --git a/assets/images/profile_photo.png b/assets/images/profile_photo.png new file mode 100644 index 0000000..11f540e Binary files /dev/null and b/assets/images/profile_photo.png differ diff --git a/assets/images/requirements.png b/assets/images/requirements.png new file mode 100644 index 0000000..c480b20 Binary files /dev/null and b/assets/images/requirements.png differ diff --git a/assets/images/search.png b/assets/images/search.png new file mode 100644 index 0000000..d792e95 Binary files /dev/null and b/assets/images/search.png differ diff --git a/assets/images/technical_or_general.png b/assets/images/technical_or_general.png new file mode 100644 index 0000000..a901a65 Binary files /dev/null and b/assets/images/technical_or_general.png differ diff --git a/assets/images/ui_ux_cv.png b/assets/images/ui_ux_cv.png new file mode 100644 index 0000000..21d5301 Binary files /dev/null and b/assets/images/ui_ux_cv.png differ diff --git a/assets/images/user_profile_image.jpeg b/assets/images/user_profile_image.jpeg new file mode 100644 index 0000000..cc91e8a Binary files /dev/null and b/assets/images/user_profile_image.jpeg differ diff --git a/lib/company/company_layout/company_layout.dart b/lib/company/company_layout/company_layout.dart new file mode 100644 index 0000000..b3ceb94 --- /dev/null +++ b/lib/company/company_layout/company_layout.dart @@ -0,0 +1,37 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class CompanyLayoutScreen extends StatelessWidget { + static const String id = 'WelcomeScreen'; + + const CompanyLayoutScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + var cubit = CVCubit.get(context); + return Scaffold( + backgroundColor: Colors.white, + body: cubit.screens[cubit.currentBottomIndex], + bottomNavigationBar: BottomNavigationBar( + unselectedItemColor: const Color(0xff828282), + selectedItemColor: kBasicColor, + currentIndex: cubit.currentBottomIndex, + onTap: (int value) { + cubit.changeBottomNavBarIndex(value); + }, + type: BottomNavigationBarType.fixed, + items: cubit.bottomItems, + ), + ); + }, + )); + } +} diff --git a/lib/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_home_screen_module/company_home_screen.dart b/lib/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_home_screen_module/company_home_screen.dart new file mode 100644 index 0000000..77aaadf --- /dev/null +++ b/lib/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_home_screen_module/company_home_screen.dart @@ -0,0 +1,159 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/company/company_layout/company_modules/company_performance_screen.dart'; +import 'package:cvito/company/company_layout/company_modules/company_software_company_module/company_software_company_screen.dart'; +import 'package:cvito/company/company_layout/custom_widgets/custom_card.dart'; +import 'package:cvito/company/company_layout/custom_widgets/default_form_field.dart'; +import 'package:cvito/company/company_layout/custom_widgets/line_chart_widget.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; + +class CompanyHomeScreen extends StatelessWidget { + const CompanyHomeScreen({Key? key}) : super(key: key); + static const String id = 'WelcomeScreen'; + + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + TextEditingController searchController = TextEditingController(); + return Scaffold( + backgroundColor: Colors.white, + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + InkWell( + child: const CircleAvatar( + backgroundColor: kBasicColor, + radius: 25, + backgroundImage: + AssetImage('assets/images/company.png' ), + ), + // assets/images/requirements.png + onTap: (){ + navigateTo(context: context, widget: SoftwareCompanyScreen()); + print('Company'); + }, + ), + SizedBox(width: MediaQuery.of(context).size.width / 20), + + ///========================================================== + ///search bar + Expanded( + child: defaultTextFormField( + controller: searchController, + type: TextInputType.text, + onChanged: () {}, + label: "Search", + prefix: Icons.search), + ), + ], + ), + // Spacer(), + + ///============================================================== + /// dashboard text + const Padding( + padding: EdgeInsets.only(top: 15.0), + child: Text( + 'Dashboard', + style: TextStyle( + letterSpacing: 1, + color: Color(0xff4F4F4F), + fontWeight: FontWeight.bold, + fontSize: 25), + ), + ), + + ///============================================================== + ///cards + Row( + children: [ + CustomCard(imageLink: 'assets/images/card1.png'), + SizedBox(width: MediaQuery.of(context).size.width / 20), + CustomCard(imageLink: 'assets/images/requirements.png') + ], + ), + + ///============================================================= + ///job description container + Padding( + padding: const EdgeInsets.symmetric(vertical: 10.0), + child: Container( + padding: const EdgeInsets.fromLTRB(15, 15, 15, 15), + width: SizeConfig.screenWidth, + child: Row(mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text( + 'Job Applicants', + style: TextStyle(color: kCustomBlack, fontWeight: FontWeight.w700, fontSize: 15.0), + ), + SizedBox(height:5.0 ,), + Text( + "See your job applicants here! \nApplicants CVs Matched With Your Job.", + style: TextStyle(color: kCustomBlack, fontWeight: FontWeight.w400, fontSize: 11.0), + ), + ], + ), + SizedBox(width: getProportionateScreenWidth(10),), + const Expanded(child: Image(image: AssetImage('assets/images/job_applicants.png',),)) + ], + ), + decoration: BoxDecoration( + color: Colors.grey.shade300, + borderRadius: BorderRadius.circular(5.0), + ), + ), + ), + + ///============================================================== + ///Row of ...Results, view details + Padding( + padding: const EdgeInsets.only(bottom: 30.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + const Text( + 'Rank', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: 20), + ), + const Spacer(), + TextButton( + onPressed: () { + navigateTo( + context: context, widget: CompanyPerformanceScreen()); + }, + child: const Icon(Icons.arrow_forward_ios_sharp)) + ], + ), + ), + + ///============================================================== + ///Rating Graph + Container( + color: Colors.transparent, + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height / 2.5, + child: LineChartWidget(), + ) + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_messages_screen_module/company_messages_screen.dart b/lib/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_messages_screen_module/company_messages_screen.dart new file mode 100644 index 0000000..ccaff28 --- /dev/null +++ b/lib/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_messages_screen_module/company_messages_screen.dart @@ -0,0 +1,150 @@ +import 'package:cvito/company/company_layout/company_modules/company_software_company_module/company_software_company_screen.dart'; +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/company/company_layout/custom_widgets/custom_list_tile_messages.dart'; +import 'package:cvito/company/company_layout/custom_widgets/custom_top_bar.dart'; +import 'package:cvito/company/company_layout/custom_widgets/default_form_field.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; + +class CompanyMessagesScreen extends StatelessWidget { + + TextEditingController messagesSearchController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + maintainBottomViewPadding: true, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///============================================================= + ///chats bar + CustomTopBar( + title: 'Chats', + function: (){ + navigateTo(context: context, widget: SoftwareCompanyScreen()); + }, + imageLink: 'assets/images/profile_photo.png', + color: kCustomBlack, + ), + + ///============================================================= + ///search bar + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, vertical: 16.0), + child: defaultTextFormField( + controller: messagesSearchController, + type: TextInputType.text, + onChanged: () {}, + label: 'Search', + prefix: Icons.search), + ), + + + ///============================================================= + ///list tiles for chats + BlocProvider( + create: (BuildContext context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit.get(context); + return ListView.separated( + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: 7, + itemBuilder: (context, index) { + return Slidable( + key: ValueKey(index), + child: CustomListTileMessages( + user: cubit.chatUsers[index], + imageLink: cubit.UserImageLinks[index], + chatTime: cubit.UserChatTimes[index], + ), + + /// start actions swap to right + startActionPane: ActionPane( + dismissible: DismissiblePane( + onDismissed: () { + cubit.deleteChatItem(context, index); + }, + ), + extentRatio: 0.5, + motion: const StretchMotion(), + children: [ + // A SlidableAction can have an icon and/or a label. + + ///================================================= + ///delete + SlidableAction( + onPressed: (BuildContext context) { + debugPrint('delete'); + }, + backgroundColor: const Color(0xFFFE4A49), + foregroundColor: Colors.white, + icon: Icons.delete, + label: 'Delete', + ), + + SlidableAction( + onPressed: (BuildContext context) { + ScaffoldMessenger.of(context) + .showSnackBar( + SnackBar( + content: Text( + 'the ${cubit.chatUsers[index]} chat is muted'), + duration: + const Duration(seconds: 1), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(10)))), + ); + debugPrint('mute'); + }, + backgroundColor: Colors.blue, + foregroundColor: Colors.white, + icon: Icons.volume_off, + label: 'Mute', + ), + ], + ), + ); + }, + separatorBuilder: (context, index) { + return const SizedBox(); + }); + }, + )), + ], + ), + ), + ), + + ///======================================================================= + ///edit button + floatingActionButton: SizedBox( + width: 50.0, + height: 50.0, + child: FloatingActionButton( + backgroundColor: kBasicColor, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)), + onPressed: () {}, + child: const Icon( + Icons.edit_outlined, + size: 25, + ), + ), + ), + ); + } +} diff --git a/lib/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_notifications_screen_module/company_notifications_screen.dart b/lib/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_notifications_screen_module/company_notifications_screen.dart new file mode 100644 index 0000000..00c758a --- /dev/null +++ b/lib/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_notifications_screen_module/company_notifications_screen.dart @@ -0,0 +1,107 @@ +import 'package:cvito/company/company_layout/custom_widgets/custom_top_bar.dart'; +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/company/company_layout/custom_widgets/custom_list_tile_notifications.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +/// padding = 15.0 +class CompanyNotificationsScreen extends StatelessWidget { + const CompanyNotificationsScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + child: Stack( + children: [ + Container( + color: kBasicColor, + width: double.infinity, + height: MediaQuery.of(context).size.height / 3, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///=========================================================== + /// notification section + CustomTopBar( + imageLink: 'assets/images/profile_photo.png', + title: 'Notifications', + color: Colors.white, + ), + const Padding( + padding: EdgeInsets.fromLTRB(16, 16, 16, 32), + child: Text( + 'Today', + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + fontWeight: FontWeight.w500), + ), + ), + + ///============================================================= + /// Today notifications + BlocProvider( + create: (BuildContext context)=> CVCubit(), + child: BlocConsumer( + listener: (context, state){}, + builder: (context, state){ + CVCubit cubit = CVCubit.get(context); + return ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + scrollDirection: Axis.vertical, + itemCount: 5, + itemBuilder: (context, index) { + return CustomListTileNotifications( + notificationTime: cubit.UserChatTimes[index], + notificationImages: cubit.notificationsImageLinks[index], + ); + }, + separatorBuilder: (context, index) { + return const SizedBox(); + }); + }, + ), + ), + + ///=========================================================== + ///Yesterday text + const Padding( + padding: EdgeInsets.all(16.0), + child: Text( + 'Yesterday', + style: TextStyle( + color: Colors.grey, + fontSize: 20.0, + fontWeight: FontWeight.w500), + ), + ), + + ///=========================================================== + /// Yesterday notifications + ListView.separated( + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: 1, + itemBuilder: (context, index) { + return CustomListTileNotifications(notificationTime: '7:52 AM',notificationImages: 'assets/images/person1.png',); + }, + separatorBuilder: (context, index) { + return const SizedBox(); + }), + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_related_jobs_screen_module/company_related_screen.dart b/lib/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_related_jobs_screen_module/company_related_screen.dart new file mode 100644 index 0000000..cff380a --- /dev/null +++ b/lib/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_related_jobs_screen_module/company_related_screen.dart @@ -0,0 +1,150 @@ +import 'dart:io'; + +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/company/company_layout/company_layout.dart'; +import 'package:cvito/company/company_layout/custom_widgets/company_card.dart'; +import 'package:cvito/company/company_layout/custom_widgets/default_form_field.dart'; +import 'package:cvito/company/company_layout/custom_widgets/suggested_people_list_tile.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class CompanyRelatedScreen extends StatelessWidget { + const CompanyRelatedScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + TextEditingController relatedSearchController = TextEditingController(); + return Scaffold( + backgroundColor: Colors.white, + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + IconButton( + color: kBasicColor, + onPressed: () { + navigateTo( + context: context, widget: const CompanyLayoutScreen()); + }, + icon: const Icon(Icons.arrow_back)), + SizedBox(width: MediaQuery.of(context).size.width / 20), + + ///========================================================== + ///search bar + Expanded( + child: defaultTextFormField( + controller: relatedSearchController, + type: TextInputType.text, + onChanged: () {}, + label: "Search", + prefix: Icons.search), + ), + ], + ), + SizedBox(height: MediaQuery.of(context).size.height / 25), + + ///========================================================= + ///see all + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: const[ + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Text( + 'Top Companies', + style: TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.bold, + fontSize: 20), + ), + ), + const Spacer(), + // TextButton(onPressed: () {}, child: const Text('see all')) + ], + ), + const SizedBox(height: 10.0), + + ///============================================================= + ///Companies list view + BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit(); + return SizedBox( + height: 100, + child: ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + scrollDirection: Axis.horizontal, + itemCount: cubit.companiesLogos.length, + itemBuilder: (context, index) => CompanyCard( + logoScale: index == 0 ? 1 : 2, + imageLink: cubit.companiesLogos[index], + ), + separatorBuilder: (BuildContext context, int index) { + return const SizedBox(width: 10.0); + }, + ), + ); + }, + ), + ), + + ///============================================================= + ///related people you might know + const SizedBox(height: 15.0), + const Padding( + padding: + EdgeInsets.symmetric(horizontal: 5.0, vertical: 10.0), + child: Text( + 'people related to you', + style: TextStyle( + color: Color(0xff828282), + fontWeight: FontWeight.w500, + fontSize: 20), + ), + ), + BlocProvider( + create: (BuildContext context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state){ + CVCubit cubit = CVCubit.get(context); + return ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + scrollDirection: Axis.vertical, + itemCount: 6, + itemBuilder: (context, index) { + return SuggestedPeopleListTile( + relatedPeopleImages: cubit.UserImageLinks[index] , + relatedPeopleName: cubit.companyRelatedPeopleNames[index], + relatedPeopleJobTitle: cubit.companyRelatedPeopleJobs[index], + ); + }, + separatorBuilder: (context, index) { + return const SizedBox(); + }); + }, + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/company/company_layout/company_modules/company_performance_screen.dart b/lib/company/company_layout/company_modules/company_performance_screen.dart new file mode 100644 index 0000000..bc6d050 --- /dev/null +++ b/lib/company/company_layout/company_modules/company_performance_screen.dart @@ -0,0 +1,207 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/company/company_layout/company_modules/sleek_slider.dart'; +import 'package:cvito/company/company_layout/custom_widgets/country_container_performance.dart'; +import 'package:flutter/material.dart'; + +class CompanyPerformanceScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + var width = MediaQuery.of(context).size.width; + var height = MediaQuery.of(context).size.width; + + return SafeArea( + child: Scaffold( + backgroundColor: kBasicColor, + body: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ///================================================================= + /// performance section + Padding( + padding: const EdgeInsets.only( + top: 20.0, + bottom: 40.0, + left: 15.0, + ), + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon( + Icons.arrow_back, + color: Colors.white, + )), + const Text( + 'Performance', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.w700, + fontSize: 20), + ), + ], + ), + ), + + ///================================================================= + /// second section white container + Expanded( + child: Container( + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20.0), + topRight: Radius.circular(20.0), + ), + ), + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Container( + width: width, + padding: const EdgeInsets.only(left: 35.0, right: 35.0), + child: Column( + children: [ + const Padding( + padding: EdgeInsets.symmetric(vertical: 25.0), + child: FittedBox( + child: MySlider(), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10.0), + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + decoration: BoxDecoration( + boxShadow: const [ + BoxShadow( + color: Colors.grey, + offset: Offset(0, 3), //(x,y) + blurRadius: 3, + ), + ], + color: Colors.white, + borderRadius: BorderRadius.circular(5.0), + border: + Border.all(color: Colors.grey.shade200), + ), + padding: + const EdgeInsets.symmetric(vertical: 3.0), + width: getProportionateScreenWidth(120), + height: 50, + child: Column( + children: [ + const Text( + 'this Month', + style: TextStyle(color: Colors.grey), + ), + const Spacer(), + RichText( + text: const TextSpan( + text: ' \$4.200 ', + style: TextStyle( + color: Color(0xffF2994A), + fontSize: 12, + ), + children: [ + TextSpan( + text: ' +8.2%', + style: TextStyle( + color: Color(0xff27AE60), + fontSize: 10, + ), + ), + ], + ), + ), + ], + ), + ), + SizedBox( + width: getProportionateScreenWidth(10)), + Container( + padding: + const EdgeInsets.symmetric(vertical: 3.0), + width: getProportionateScreenWidth(120), + height: 50, + color: Colors.white, + child: Column( + children: [ + const Text( + 'Last Month', + style: TextStyle(color: Colors.grey), + ), + const Spacer(), + RichText( + text: const TextSpan( + text: ' \$4.050 ', + style: TextStyle( + color: Color(0xffF2994A), + fontSize: 12, + ), + children: [ + TextSpan( + text: ' +6.4%', + style: TextStyle( + color: Color(0xff27AE60), + fontSize: 10, + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + ), + + ///===================================================== + /// country's container + const SizedBox(height: 20.0), + CountryContainer( + title: 'Impression', + height: height, + label1: 'Europe', + labelColor1: Colors.green, + label2: 'America', + labelColor2: Colors.orange, + label3: 'Asia', + labelColor3: Colors.red, + label4: 'Africa', + labelColor4: Colors.brown, + ), + const SizedBox(height: 20.0), + CountryContainer( + title: 'Product Quality', + height: height, + label1: 'UI/UX', + labelColor1: Colors.green, + label2: 'Agile', + labelColor2: Colors.orange, + label3: 'Development', + labelColor3: Colors.red, + label4: 'Privacy', + labelColor4: Colors.brown, + ), + ], + ), + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/company/company_layout/company_modules/company_software_company_module/company_software_company_screen.dart b/lib/company/company_layout/company_modules/company_software_company_module/company_software_company_screen.dart new file mode 100644 index 0000000..4147780 --- /dev/null +++ b/lib/company/company_layout/company_modules/company_software_company_module/company_software_company_screen.dart @@ -0,0 +1,257 @@ +import 'dart:io'; +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/company/company_layout/company_layout.dart'; +import 'package:cvito/company/company_layout/company_modules/company_software_company_module/company_tab_bar_company_screens_module/company_tab_about_company_screen.dart'; +import 'package:cvito/company/company_layout/company_modules/company_software_company_module/company_tab_bar_company_screens_module/company_tab_home_company_screen.dart'; +import 'package:cvito/company/company_layout/company_modules/company_software_company_module/company_tab_bar_company_screens_module/company_tab_jobs_company_screen.dart'; +import 'package:cvito/company/company_layout/custom_widgets/basic_custom_button.dart'; +import 'package:cvito/company/company_layout/custom_widgets/transparent_icon.dart'; +import 'package:cvito/utilities.dart'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:image_picker/image_picker.dart'; + +/// for multi provider TickerProviderStateMixin +/// for single provider SingleTickerProviderStateMixin + +class SoftwareCompanyScreen extends StatefulWidget { + @override + State createState() => _SoftwareCompanyScreenState(); +} + +class _SoftwareCompanyScreenState extends State + with TickerProviderStateMixin { + File? profileImage; + File? backgroundImage; + + Future pickImage() async { + try { + final image = await ImagePicker().pickImage(source: ImageSource.gallery); + if (image == null) return; + final imageTemporary = File(image.path); + return imageTemporary; + } on PlatformException catch (e) { + debugPrint('failed to pick image : $e'); + } + } + + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + TabController _tabController = TabController(length: 3, vsync: this); + + return Scaffold( + body: SingleChildScrollView( + child: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///=========================================================== + /// profile cover + SizedBox( + // color: Colors.black, + height: MediaQuery.of(context).size.height * 0.3, + child: Stack( + fit: StackFit.loose, + clipBehavior: Clip.none, + children: [ + Container( + width: SizeConfig.screenWidth, + height: getProportionateScreenHeight(150), + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + //todo backgroundImage UI + image: backgroundImage != null + ? Image.file( + backgroundImage!, + height: getProportionateScreenHeight(150), + fit: BoxFit.cover, + ).image + : const AssetImage( + 'assets/images/company_background.png'), + ), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TransparentIcon( + icon: Icons.arrow_back, + onPressed: () { + navigateTo( + context: context, + widget: const CompanyLayoutScreen()); + }, + ), + TransparentIcon( + icon: Icons.edit, + onPressed: () { + //todo calling backgroundImage + pickImage().then((value) { + if (value != null) debugPrint('finish'); + debugPrint(value.toString()); + setState(() { + backgroundImage = value; + }); + }); + }, + ), + ], + ), + ), + ), + + ///========================================================================================= + ///profile photo + + Positioned( + top: 60, + left: 15, + child: Stack( + clipBehavior: Clip.none, + children: [ + SizedBox( + width: getProportionateScreenWidth(160), + height: getProportionateScreenHeight(170), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(15.0), + //todo profileImage UI + child: profileImage != null + ? Image.file( + profileImage!, + width: 160, + height: + getProportionateScreenHeight(170), + fit: BoxFit.cover, + ) + : Image.asset('assets/images/company_profile.png', fit: BoxFit.contain), + ), + ], + ), + ), + Positioned( + right: -10, + bottom: 10, + // alignment: Alignment.bottomRight, + child: GestureDetector( + // behavior: HitTestBehavior.translucent, + onTap: () { + //todo calling profileImage + debugPrint('onClick'); + pickImage().then((value) { + if (value != null) debugPrint('finish'); + debugPrint(value.toString()); + setState(() { + profileImage = value; + }); + }); + }, + child: const CircleAvatar( + child: Icon( + Icons.add, + color: kBasicColor, + size: 15, + ), + radius: 15, + backgroundColor: Colors.white, + ), + ), + ), + ], + ), + ), + + ], + ), + ), + + ///=============================================================================================== + ///screen content + SizedBox(height: getProportionateScreenHeight(20.0)), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 15.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///========================================================= + ///company title and its description + const Text( + "Software Company", + style: TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w500, + fontSize: 25.0), + ), + const SizedBox(height: 10.0), + const Text( + "Egypt software company building mobile applications ", + style: TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w400, + fontSize: 15.0), + ), + const SizedBox(height: 10.0), + const Text( + "Staffing & Recruiting . Cairo,Egypt . 200,00 employees ", + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w300, + fontSize: 13.0), + ), + + ///========================================================= + ///edit profile + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 15.0), + child: Row( + children: [ + BasicCustomButton( + text: 'Edit Profile', + function: () { + debugPrint('edit profile'); + }), + const Spacer(), + ], + ), + ), + + TabBar( + controller: _tabController, + unselectedLabelColor: Colors.grey, + indicatorColor: kBasicColor, + labelColor: kBasicColor, + tabs: const [ + Tab(text: 'Home'), + Tab(text: 'About'), + Tab(text: 'Jobs'), + ]), + + SizedBox( + width: SizeConfig.screenWidth, + height: getProportionateScreenHeight(300), + child: TabBarView(controller: _tabController, children: [ + CompanyTabHomeCompanyScreen(), + const CompanyTabAboutCompanyScreen(), + const CompanyTabJobsCompanyScreen() + ]), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/company/company_layout/company_modules/company_software_company_module/company_tab_bar_company_screens_module/company_tab_about_company_screen.dart b/lib/company/company_layout/company_modules/company_software_company_module/company_tab_bar_company_screens_module/company_tab_about_company_screen.dart new file mode 100644 index 0000000..54018cb --- /dev/null +++ b/lib/company/company_layout/company_modules/company_software_company_module/company_tab_bar_company_screens_module/company_tab_about_company_screen.dart @@ -0,0 +1,179 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/company/company_layout/custom_widgets/edit_row.dart'; +import 'package:cvito/company/company_layout/custom_widgets/see_more_see_less.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + + +class CompanyTabAboutCompanyScreen extends StatelessWidget { + const CompanyTabAboutCompanyScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit.get(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + EditRow(icon: Icons.edit, label: 'About'), + buildText( + 'We constantly strive to develop our unique talent pool and wealth of skills. Our company is constantly on the lookout for talented individuals who can make a valuable contribution to the success of our products. This is the only way to attain excellence: combining talent with relentless commitment to innovation.'), + const SizedBox(height: 20.0), + + ///=========================================================== + ///to align text in the cells of the table to left don't wrap TableRow to Column + SizedBox( + width: SizeConfig.screenWidth, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Table( + textDirection: TextDirection.ltr, + defaultVerticalAlignment: + TableCellVerticalAlignment.bottom, + children: [ + TableRow(children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Website', + style: TextStyle(color: kCustomBlack), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: GestureDetector( + child: const Text( + 'Software123.com', + textAlign: TextAlign.left, + style: TextStyle( + color: kBasicColor, + ), + ), + onTap: () { + cubit.setLaunch(); + }, + ), + ), + ]), + const TableRow(children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Company Size', + style: TextStyle(color: kCustomBlack), + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '200,000 employees', + style: TextStyle(color: kCustomBlack), + ), + ), + ]), + const TableRow(children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Founded', + style: TextStyle(color: kCustomBlack), + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '2008', + style: TextStyle(color: kCustomBlack), + ), + ), + ]), + const TableRow(children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'type', + style: TextStyle(color: kCustomBlack), + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Privately Held', + style: TextStyle(color: kCustomBlack), + ), + ), + ]), + const TableRow(children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Specialistes', + style: TextStyle(color: kCustomBlack), + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Talent Management, Online Recruitment, Human Resource Management Systems (HRMS), Online Occupational Technical and Psychometric Assessments, and Software Development', + style: TextStyle(color: kCustomBlack), + ), + ), + ]), + TableRow(children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Location', + style: TextStyle(color: kCustomBlack), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Cairo, cairo, Zamalek', + style: TextStyle(color: kCustomBlack), + ), + const SizedBox(height: 5.0,), + Row( + children: const [ + Expanded( + child: Text( + 'GET DIRECTIONS', + style: TextStyle(color: kBasicColor, fontWeight: FontWeight.w500), + ), + ), Icon(Icons.login_outlined, color: kBasicColor,), + ], + ), + ], + ), + ), + ), + ]), + ], + ), + ), + ) + ], + ); + }, + ), + ), + ), + ); + } + +} diff --git a/lib/company/company_layout/company_modules/company_software_company_module/company_tab_bar_company_screens_module/company_tab_home_company_screen.dart b/lib/company/company_layout/company_modules/company_software_company_module/company_tab_bar_company_screens_module/company_tab_home_company_screen.dart new file mode 100644 index 0000000..68121f7 --- /dev/null +++ b/lib/company/company_layout/company_modules/company_software_company_module/company_tab_bar_company_screens_module/company_tab_home_company_screen.dart @@ -0,0 +1,217 @@ +import 'package:cvito/company/company_layout/company_modules/company_user_profile_module/company_user_profile_screen.dart'; +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/company/company_layout/custom_widgets/edit_row.dart'; +import 'package:cvito/company/company_layout/custom_widgets/see_more_see_less.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; + + +class CompanyTabHomeCompanyScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit.get(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + EditRow(icon: Icons.edit, label: 'About'), + buildText( + 'a technology firm specialized in developing innovative web-based online employment marketplaces and platforms.'), + const SizedBox(height: 10.0), + + ///================================================================================================ + ///website link contact + Container( + padding: const EdgeInsets.fromLTRB(20, 15, 0, 15), + height: 100, + width: SizeConfig.screenWidth, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7), + border: + Border.all(color: Colors.grey.shade400, width: 1)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + ' Website', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w400, + fontSize: 15.0), + ), + + // CVCubit cubit = CVCubit(); + Expanded( + child: TextButton( + child: const Text( + 'Software123.com', + style: TextStyle(color: kBasicColor), + ), + onPressed: () { + cubit.setLaunch(); + }, + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB(0, 15, 15, 15), + child: EditRow(label: 'Opening Jobs'), + ), + + ///============================================================================================== + /// jobs sections list view builder ....vertical + + ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + scrollDirection: Axis.vertical, + itemCount: cubit.jobsNames.length, + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + navigateTo(context: context, + widget: CompanyUserProfileScreen( + jobTitle: cubit.jobsNames[index], + jobLocation: cubit.jobLocations[index],)); + }, + child: ListTile( + // trailing: const Icon(Icons.edit), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(7), + side: const BorderSide( + width: 1, + color: Colors.grey, + ), + ), + contentPadding: const EdgeInsets.fromLTRB(16, 5, 16, + 5), + dense: true, + isThreeLine: true, + leading: CircleAvatar( + radius: 30, + child: Image.asset( + cubit.UserImageLinks[index]), + ), + tileColor: Colors.transparent, + title: Row( + children: [ + Text( + cubit.jobsNames[index], + style: const TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w700, + fontSize: 16.0), + ), + ], + ), + subtitle: Text( + cubit.jobLocations[index], + style: const TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w500, + fontSize: 14.0), + ), + ), + ); + }, + separatorBuilder: (context, index) { + return const SizedBox(height: 10.0); + }), + const SizedBox(height: 10.0), + const Text('Your Employees', + style: TextStyle(fontSize: 20.0)), + const SizedBox(height: 15.0), + SizedBox( + height: getProportionateScreenHeight(90), + + ///========================================================================================================== + /// Your Employees list view builder ....horizontal + child: ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + scrollDirection: Axis.horizontal, + itemCount: 8, + itemBuilder: (context, index) { + return Column( + children: [ + CircleAvatar( + child: Image( + image: AssetImage( + cubit.notificationsImageLinks[index])), + ), + const SizedBox( + height: 5, + ), + Text( + cubit.UserChatUsers[index], + ), + ], + ); + }, + separatorBuilder: (context, index) { + return const SizedBox( + width: 20.0, + ); + }), + ), + const SizedBox(height: 15.0), + const Center( + child: Text( + 'Your Rating From Applicants Or Others', + style: TextStyle( + color: kCustomBlack, + fontSize: 16.0, + fontWeight: FontWeight.w500), + )), + const SizedBox(height: 10.0), + + Center( + child: Text( + 'Your review : ${cubit.rating}', + style: const TextStyle(fontSize: 15.0), + )), + + const SizedBox(height: 15.0), + + Center( + child: RatingBar.builder( + itemPadding: + const EdgeInsets.symmetric(horizontal: 7.0), + itemSize: 30, + updateOnDrag: true, + glowColor: Colors.white60, + unratedColor: const Color(0xffE0E0E0), + minRating: 1, + itemBuilder: (context, _) => + const Icon( + Icons.star, + color: Colors.amber, + ), + onRatingUpdate: (rating) { + cubit.ratingUpdate(rating); + }), + ), + ], + ); + }, + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/company/company_layout/company_modules/company_software_company_module/company_tab_bar_company_screens_module/company_tab_jobs_company_screen.dart b/lib/company/company_layout/company_modules/company_software_company_module/company_tab_bar_company_screens_module/company_tab_jobs_company_screen.dart new file mode 100644 index 0000000..27257e3 --- /dev/null +++ b/lib/company/company_layout/company_modules/company_software_company_module/company_tab_bar_company_screens_module/company_tab_jobs_company_screen.dart @@ -0,0 +1,86 @@ +import 'package:cvito/company/company_layout/company_modules/user_job_details_screen.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../../custom_widgets/edit_row.dart'; + +class CompanyTabJobsCompanyScreen extends StatelessWidget { + const CompanyTabJobsCompanyScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Column( + children: [ + + EditRow(label: 'Opening Jobs', icon: Icons.edit, ), + const SizedBox(height: 10,), + BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state){ + CVCubit cubit = CVCubit.get(context); + return ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + scrollDirection: Axis.vertical, + itemCount:5, + itemBuilder: (context, index) { + return ListTile( + trailing: IconButton(icon: const Icon(Icons.more_vert), onPressed: (){ + navigateTo(context: context, widget: UserJobDetailsScreen()); + },), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(7), + side: const BorderSide( + width: 1, + color: Colors.grey, + ), + ), + contentPadding: const EdgeInsets.fromLTRB(16, 5, 16, 5), + dense: true, + isThreeLine: true, + leading: CircleAvatar( + radius: 30, + child: Image.asset(cubit.notificationsImageLinks[index]), + ), + tileColor: Colors.transparent, + title: Row( + children: [ + Text( + cubit.companyRelatedPeopleJobs[index], + style:const TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w700, + fontSize: 16.0), + ), + ], + ), + subtitle: Text( + cubit.jobLocations[index], + style:const TextStyle( + color: Colors.grey, fontWeight: FontWeight.w500, fontSize: 14.0), + ), + ); + }, + separatorBuilder: (context, index) { + return const SizedBox(height: 10.0); + }); + }, + ), + ), + + + ], + ), + ), + ); + } +} diff --git a/lib/company/company_layout/company_modules/company_user_profile_module/company_tab_bar_user_profile_screens_modules/company_tab_about_user_screen.dart b/lib/company/company_layout/company_modules/company_user_profile_module/company_tab_bar_user_profile_screens_modules/company_tab_about_user_screen.dart new file mode 100644 index 0000000..8ecb098 --- /dev/null +++ b/lib/company/company_layout/company_modules/company_user_profile_module/company_tab_bar_user_profile_screens_modules/company_tab_about_user_screen.dart @@ -0,0 +1,132 @@ + +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/company/company_layout/custom_widgets/edit_row.dart'; +import 'package:cvito/company/company_layout/custom_widgets/see_more_see_less.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class CompanyTabAboutUserScreen extends StatefulWidget { + @override + State createState() => _CompanyTabAboutUserScreenState(); +} + +class _CompanyTabAboutUserScreenState extends State { + + @override + Widget build(BuildContext context) { + + SizeConfig().init(context); + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit.get(context); + return Padding( + padding: const EdgeInsets.only(right:10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + EditRow( label: 'About'), + buildText( + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quam suspendisse aliquet platea ut ornare porttitor. Adipiscing tellus volutpat laoreet erat consectetur cum suscipit ac. Tellus nibh semper ornare suspendisse lectus arcu elit, pellentesque. Fusce ipsum sem ut tortor.'), + const SizedBox(height: 10.0), + + ///=========================================================== + ///Email link contact + Container( + padding: const EdgeInsets.fromLTRB(20, 15, 0, 15), + height: 100, + width: SizeConfig.screenWidth, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7), + border: Border.all( + color: Colors.grey.shade400, width: 1)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + ' Email', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w400, + fontSize: 15.0), + ), + + // CVCubit cubit = CVCubit(); + Expanded( + child: TextButton( + child: const Text( + 'miraezz14@gmail.com', + style: TextStyle(color: kBasicColor), + ), + onPressed: () { + cubit.setLaunch(); + }, + ), + ), + + ], + ), + ), + + ///================================================================= + /// jobs sections + SizedBox(height: getProportionateScreenHeight(30.0)), + const Text('CVs', style: TextStyle(color: kCustomBlack, fontSize: 20.0, fontWeight: FontWeight.w500),), + const SizedBox(height: 15.0,), + Padding( + padding: const EdgeInsets.only(left: 10.0, bottom: 20.0), + child: Row( + children: [ + InkWell( + onTap: () async{ + + + }, + child: Expanded( + child: SizedBox( + width: MediaQuery.of(context).size.width / 2.5, + child: Image.asset('assets/images/android_cv.png', + fit: BoxFit.cover), + ), + ), + ), + SizedBox(width: getProportionateScreenWidth(20.0)), + InkWell( + onTap: () async{ + + + }, + child: Expanded( + child: SizedBox( + width: MediaQuery.of(context).size.width / 2.5, + child: Image.asset( + 'assets/images/ui_ux_cv.png', + fit: BoxFit.cover, + ), + ), + ), + ), + ], + ), + ), + + + ], + ), + ); + }, + ), + ), + ), + ); + } +} + diff --git a/lib/company/company_layout/company_modules/company_user_profile_module/company_tab_bar_user_profile_screens_modules/company_tab_education_user_screen.dart b/lib/company/company_layout/company_modules/company_user_profile_module/company_tab_bar_user_profile_screens_modules/company_tab_education_user_screen.dart new file mode 100644 index 0000000..1a7d4cf --- /dev/null +++ b/lib/company/company_layout/company_modules/company_user_profile_module/company_tab_bar_user_profile_screens_modules/company_tab_education_user_screen.dart @@ -0,0 +1,84 @@ +import 'package:cvito/some_helpers/constants/time_line_class.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +class CompanyTabEducationUserScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (BuildContext context, state) {}, + builder: (BuildContext context, state) { + var cubit = CVCubit(); + return Scaffold( + body: TimelineComponent( + timelineList: cubit.userEducationList, + backgroundColor: Colors.white, + // headingColor: Colors.green, + )); + }, + ), + ); + } +} + +class TimelineComponent extends StatefulWidget { + final List timelineList; + + final Color backgroundColor; + + // final Color headingColor; + + TimelineComponent({ + required this.timelineList, + required this.backgroundColor, + // required this.headingColor, + }); + + @override + TimelineComponentState createState() { + return TimelineComponentState(); + } +} + +class TimelineComponentState extends State + with SingleTickerProviderStateMixin { + Animation? animation; + AnimationController? controller; + double fraction = 0.0; + + @override + void initState() { + super.initState(); + controller = AnimationController( + duration: const Duration(milliseconds: 1000), vsync: this); + controller?.forward(); + } + + @override + Widget build(BuildContext context) { + return ListView.builder( + itemCount: widget.timelineList.length, + itemBuilder: (_, index) { + return TimelineElement( + lineColor: widget.timelineList[index].lineColor, + backgroundColor: widget.backgroundColor , + model: widget.timelineList[index], + firstElement: index == 0, + lastElement: widget.timelineList.length == index + 1, + controller: controller!, + // headingColor: widget.timelineList[index].titleColor, + // descriptionColor: widget.timelineList[index].descriptionColor + + ); + }); + } + + @override + void dispose() { + controller?.dispose(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/company/company_layout/company_modules/company_user_profile_module/company_tab_bar_user_profile_screens_modules/company_tab_experience_user_screen.dart b/lib/company/company_layout/company_modules/company_user_profile_module/company_tab_bar_user_profile_screens_modules/company_tab_experience_user_screen.dart new file mode 100644 index 0000000..6ea5d70 --- /dev/null +++ b/lib/company/company_layout/company_modules/company_user_profile_module/company_tab_bar_user_profile_screens_modules/company_tab_experience_user_screen.dart @@ -0,0 +1,85 @@ +import 'package:cvito/some_helpers/constants/time_line_class.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class CompanyTabExperienceUserScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (BuildContext context, state) {}, + builder: (BuildContext context, state) { + var cubit = CVCubit(); + return Scaffold( + body: TimelineComponent( + timelineList: cubit.userExperienceList, + backgroundColor: Colors.white, + // headingColor: Colors.green, + )); + }, + ), + ); + } +} + +class TimelineComponent extends StatefulWidget { + final List timelineList; + + final Color backgroundColor; + + // final Color headingColor; + + TimelineComponent({ + required this.timelineList, + required this.backgroundColor, + // required this.headingColor, + }); + + @override + TimelineComponentState createState() { + return TimelineComponentState(); + } +} + +class TimelineComponentState extends State + with SingleTickerProviderStateMixin { + Animation? animation; + AnimationController? controller; + double fraction = 0.0; + + @override + void initState() { + super.initState(); + controller = AnimationController( + duration: const Duration(milliseconds: 1000), vsync: this); + controller?.forward(); + } + + @override + Widget build(BuildContext context) { + return ListView.builder( + itemCount: widget.timelineList.length, + itemBuilder: (_, index) { + return TimelineElement( + lineColor: widget.timelineList[index].lineColor , + backgroundColor: widget.backgroundColor, + model: widget.timelineList[index], + firstElement: index == 0, + lastElement: widget.timelineList.length == index + 1, + controller: controller!, + // headingColor: widget.timelineList[index].titleColor, + // descriptionColor: widget.timelineList[index].descriptionColor + + ); + }); + } + + @override + void dispose() { + controller?.dispose(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/company/company_layout/company_modules/company_user_profile_module/company_user_profile_screen.dart b/lib/company/company_layout/company_modules/company_user_profile_module/company_user_profile_screen.dart new file mode 100644 index 0000000..116400b --- /dev/null +++ b/lib/company/company_layout/company_modules/company_user_profile_module/company_user_profile_screen.dart @@ -0,0 +1,211 @@ +import 'dart:io'; +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/company/company_layout/company_modules/company_user_profile_module/company_tab_bar_user_profile_screens_modules/company_tab_about_user_screen.dart'; +import 'package:cvito/company/company_layout/company_modules/company_user_profile_module/company_tab_bar_user_profile_screens_modules/company_tab_experience_user_screen.dart'; +import 'package:cvito/company/company_layout/custom_widgets/transparent_icon.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:image_picker/image_picker.dart'; + +import 'company_tab_bar_user_profile_screens_modules/company_tab_education_user_screen.dart'; + +/// for multi provider TickerProviderStateMixin +/// for single provider SingleTickerProviderStateMixin + +class CompanyUserProfileScreen extends StatefulWidget { + @override + State createState() => _CompanyUserProfileScreenState(); + String jobTitle; + String jobLocation; + + CompanyUserProfileScreen({required this.jobTitle, required this.jobLocation}); +} + +class _CompanyUserProfileScreenState extends State + with TickerProviderStateMixin { + File? profileImage; + File? backgroundImage; + + Future pickImage() async { + try { + final image = await ImagePicker().pickImage(source: ImageSource.gallery); + if (image == null) return; + final imageTemporary = File(image.path); + return imageTemporary; + } on PlatformException catch (e) { + debugPrint('failed to pick image : $e'); + } + } + + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + TabController _tabController = TabController(length: 3, vsync: this); + + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///=========================================================== + /// profile cover + SizedBox( + height: MediaQuery.of(context).size.height * 0.3, + child: Stack( + fit: StackFit.loose, + clipBehavior: Clip.none, + children: [ + Container( + width: SizeConfig.screenWidth, + height: getProportionateScreenHeight(150), + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + //todo imageBackground UI + image: backgroundImage != null + ? Image.file( + backgroundImage!, + height: getProportionateScreenHeight(150), + fit: BoxFit.cover, + ).image + : const AssetImage( + 'assets/images/company_background.png'), + ), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TransparentIcon( + icon: Icons.arrow_back, + onPressed: () { + // navigateTo(context: context, widget: const LayoutScreen()); + Navigator.pop(context); + }, + ), + ], + ), + ), + ), + + ///========================================================================================= + ///profile photo + + Positioned( + top: 60, + left: 15, + child: Stack( + clipBehavior: Clip.none, + children: [ + SizedBox( + width: getProportionateScreenWidth(160), + height: getProportionateScreenHeight(170), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ClipOval( + // borderRadius: BorderRadius.circular(15.0), + //todo profileImage UI + child: profileImage != null + ? Image.file( + profileImage!, + width: 160, + height: + getProportionateScreenHeight(170), + fit: BoxFit.cover, + ) + : Image.asset( + 'assets/images/developer.jpg', + ), + ), + ], + ), + ), + ], + ), + ), + // ), + // ), + ], + ), + ), + SizedBox(height: getProportionateScreenHeight(20.0)), + + ///=============================================================================================== + ///screen content + Padding( + padding: const EdgeInsets.symmetric(horizontal: 15.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///========================================================= + ///company title and its description + const Text( + 'Eyad Najy ', + style: TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w500, + fontSize: 25.0), + ), + const SizedBox(height: 10.0), + Text( + widget.jobTitle, + style: const TextStyle( + letterSpacing: 1, + color: kCustomBlack, + fontWeight: FontWeight.w400, + fontSize: 15.0), + ), + const SizedBox(height: 10.0), + Row( + children: [ + const Icon( + Icons.location_on, + color: Colors.grey, + ), + Text( + widget.jobLocation, + style: const TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w300, + fontSize: 15.0), + ), + ], + ), + TabBar( + controller: _tabController, + unselectedLabelColor: Colors.grey, + indicatorColor: kBasicColor, + labelColor: kBasicColor, + tabs: const [ + Tab(text: 'About'), + Tab(text: 'Experience'), + Tab(text: 'Education'), + ]), + + SizedBox( + width: SizeConfig.screenWidth, + height: getProportionateScreenHeight(300), + child: TabBarView(controller: _tabController, children: [ + CompanyTabAboutUserScreen(), + CompanyTabExperienceUserScreen(), + CompanyTabEducationUserScreen(), + // TabEducationUserScreen() + ]), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/company/company_layout/company_modules/sleek_slider.dart b/lib/company/company_layout/company_modules/sleek_slider.dart new file mode 100644 index 0000000..734f22c --- /dev/null +++ b/lib/company/company_layout/company_modules/sleek_slider.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:percent_indicator/circular_percent_indicator.dart'; + + +//TODO : change percentage +class MySlider extends StatelessWidget { + const MySlider({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return CircularPercentIndicator( + animateFromLastPercent: true, + animation: true, + animationDuration:700, + radius: 100.0, + lineWidth: 13.0, + backgroundWidth: -1.0, + percent: 0.80, + center: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '80%', + style: TextStyle( + letterSpacing: 1, + fontSize: 45.0, + color: Colors.black, + fontWeight: FontWeight.w700, + shadows: [ + Shadow( + blurRadius: 10.0, + color: Colors.grey.shade300, + offset: const Offset(0.0, 0.5), + ), + ], + ), + ), + Text( + '\$15,000 / week', + style: TextStyle( + fontSize: 15.0, fontWeight: FontWeight.bold, + + shadows: [ + Shadow( + blurRadius: 10.0, + color: Colors.grey.shade300, + offset: const Offset(0.0, 0.5), + ), + ], ), + ) + ], + ), + // + progressColor: const Color(0xff0077b5), + backgroundColor: Colors.grey.shade300, + circularStrokeCap: CircularStrokeCap.round, + ); + } +} diff --git a/lib/company/company_layout/company_modules/tesssst.dart b/lib/company/company_layout/company_modules/tesssst.dart new file mode 100644 index 0000000..f383926 --- /dev/null +++ b/lib/company/company_layout/company_modules/tesssst.dart @@ -0,0 +1,647 @@ +import 'package:flutter/material.dart'; + +//////لو في أي كود محتاجين نشيله على جمب علشان نتيست كود تاني ممكن نحطه هنا مؤقتًاimport 'dart:io'; +/* +import 'package:cvito/company_layout/custom_widgets/default_form_field.dart'; +import 'package:flutter/material.dart'; + +class UserJobsScreen extends StatelessWidget { + TextEditingController relatedSearchController = TextEditingController(); + TextEditingController searchController = TextEditingController(); + final GlobalKey _scaffoldKey = GlobalKey(); + + List userJobRecommendationList = [ + "Web Designer", + "Flutter Developer", + "Backend Developer ", + // "Android Developer", + // "FullStack Developer", + ]; + @override + Widget build(BuildContext context) { + return Scaffold( + drawer: const Drawer(), + body: SingleChildScrollView( + child: SafeArea( + // maintainBottomViewPadding: true, + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Builder(builder: (context) { + return InkWell( + child: CircleAvatar( + radius: 25, + child: Image.asset('assets/images/profile_photo.png'), + ), + onTap: () { + print( + '===================================================='); + //TODO IMPLEMENT THE FUNCTION HERE + _scaffoldKey.currentState?.openDrawer(); + }, + ); + }), + SizedBox(width: MediaQuery.of(context).size.width / 20), + + ///================================================================================================= + ///search bar + Expanded( + child: defaultTextFormField( + controller: searchController, + type: TextInputType.text, + onChanged: () {}, + label: "Search", + prefix: Icons.search), + ), + ], + ), + const SizedBox(height: 30.0), + + ///================================================================================================ + /// Recommended For You + const Text( + 'Recommended For You', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: 18.0), + ), + const SizedBox(height: 30.0), + ListView.separated( + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return ListTile( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), + side: + const BorderSide(color: Colors.black45, width: 1), + ), + contentPadding: const EdgeInsets.symmetric(vertical: 15.0, horizontal: 5.0), + + leading: const CircleAvatar( + radius: 30, + backgroundImage: + AssetImage('assets/images/profile_photo.png'), + ), + // horizontalTitleGap: 5.0, + title: Padding( + padding: const EdgeInsets.only(bottom: 5.0), + child: Text(userJobRecommendationList[index]), + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text('Software Company'), + Text('Cairo , Egypt(Remote)'), + ], + ), + trailing: const Icon(Icons.bookmark_border_outlined), + + ); + }, + separatorBuilder: (BuildContext context, int index) { + return const SizedBox(height: 10.0); + }, + itemCount: 3), + + ///================================================================================================ + /// Matched with your profile + const SizedBox(height: 30.0), + const Text( + 'Matched with your profile', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: 18.0), + ), + ], + ), + ), + ), + ), + ); + } +} + + + +*/ + +//user home screen +/* + +onTap: () { +print( +'===================================================='); +//TODO IMPLEMENT THE FUNCTION HERE +_scaffoldKey.currentState?.openDrawer(); +},*/ + + +// الكود الاصلي +/* + +//user user profile screen + +import 'dart:io'; +import 'package:cvito/constants/constants.dart'; +import 'package:cvito/constants/sized_config.dart'; +import 'package:cvito/company_layout/custom_widgets/basic_custom_button.dart'; +import 'package:cvito/company_layout/custom_widgets/transparent_icon.dart'; +import 'package:cvito/user/user_layout/user_layout.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'user_tab_bar_user_profile_screen/user_tab_about_user_screen.dart'; +import 'user_tab_bar_user_profile_screen/user_tab_education_user_screen.dart'; +import 'user_tab_bar_user_profile_screen/user_tab_experience_user_screen.dart'; + +/// for multi provider TickerProviderStateMixin +/// for single provider SingleTickerProviderStateMixin + +class UserUserProfileScreen extends StatefulWidget { + @override + State createState() => _UserUserProfileScreenState(); + String jobTitle; + String jobLocation; + + UserUserProfileScreen({required this.jobTitle, required this.jobLocation}); +} + +class _UserUserProfileScreenState extends State + with TickerProviderStateMixin { + File? profileImage; + File? backgroundImage; + String? imagePath; + + @override + void initState() { + // TODO: implement initState + super.initState(); + loadImage(); + } + + + + Future pickImage() async { + try { + final image = await ImagePicker().pickImage(source: ImageSource.gallery); + if (image == null) return; + final imageTemporary = File(image.path); + return imageTemporary; + } on PlatformException catch (e) { + debugPrint('failed to pick image : $e'); + } + } + + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + TabController _tabController = TabController(length: 3, vsync: this); + + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///=========================================================== + /// profile cover + SizedBox( + height: MediaQuery.of(context).size.height * 0.3, + child: Stack( + fit: StackFit.loose, + clipBehavior: Clip.none, + children: [ + Container( + width: SizeConfig.screenWidth, + height: getProportionateScreenHeight(150), + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + //todo imageBackground UI + image: backgroundImage != null + ? Image.file( + backgroundImage!, + height: getProportionateScreenHeight(150), + fit: BoxFit.cover, + ).image + : const AssetImage( + 'assets/images/company_background.png'), + ), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TransparentIcon( + icon: Icons.arrow_back, + onPressed: () { + navigateTo(context: context, widget: const UserLayoutScreen()); + }, + ), + TransparentIcon( + icon: Icons.edit, + onPressed: () { + //todo calling backgroundImage + pickImage().then((value) { + if(value != null) debugPrint('finish'); + debugPrint(value.toString()); + setState(() { + backgroundImage = value; + }); + }); + }, + ), + ], + ), + ), + ), + + ///========================================================================================= + ///profile photo + + Positioned( + top: 60, + left: 15, + child: Stack( + clipBehavior: Clip.none, + children: [ + SizedBox( + width: getProportionateScreenWidth(160), + height: getProportionateScreenHeight(170), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ClipOval( + // borderRadius: BorderRadius.circular(15.0), + //todo profileImage UI + child: profileImage != null + ? Image.file( + profileImage!, + width: 160, + height: + getProportionateScreenHeight(170), + fit: BoxFit.cover, + ) + : const FlutterLogo(size: 100), + ), + ], + ), + ), + Positioned( + right: -5, + bottom: 15, + child: GestureDetector( + onTap: () { + //todo calling profileImage + debugPrint('onClick'); + pickImage().then((value) { + if(value != null) debugPrint('finish'); + debugPrint(value.toString()); + setState(() { + profileImage = value; + }); + } ); + }, + child: const CircleAvatar( + child: Icon( + Icons.add, + color: kBasicColor, + size: 15, + ), + radius: 15, + backgroundColor: Colors.white, + ), + ), + ), + ], + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.only(left: 60.0), + child: ElevatedButton( + onPressed: (){ + saveImage(path: profileImage!.path); + + + + + + }, + child: const Text('save'), + style: ElevatedButton.styleFrom( + onPrimary: Colors.white, + primary: kBasicColor, + onSurface: Colors.grey, + side: const BorderSide(color: kBasicColor, width: 1), + + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30)), + ), + ), + ), + SizedBox(height: getProportionateScreenHeight(20.0)), + + ///=============================================================================================== + ///screen content + Padding( + padding: const EdgeInsets.symmetric(horizontal: 15.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///========================================================= + ///company title and its description + const Text('Eyad Najy ', + style: TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w500, + fontSize: 25.0), + ), + const SizedBox(height: 10.0), + Text( + widget.jobTitle, + style: const TextStyle( + letterSpacing: 1, + color: kCustomBlack, + fontWeight: FontWeight.w400, + fontSize: 15.0), + ), + const SizedBox(height: 10.0), + Row( + children: [ + const Icon( + Icons.location_on, + color: Colors.grey, + ), + Text( + widget.jobLocation, + style: const TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w300, + fontSize: 15.0), + ), + ], + ), + + ///========================================================= + ///edit profile + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 15.0), + child: Row( + children: [ + BasicCustomButton( + text: 'Edit Profile', + function: () { + debugPrint('edit profile'); + }), + const Spacer(), + const CircleAvatar( + radius: 17, + backgroundColor: Colors.grey, + child: CircleAvatar( + radius: 15, + child: Icon( + Icons.more_horiz_outlined, + color: Colors.grey, + ), + backgroundColor: Colors.white, + ), + ), + ], + ), + ), + + TabBar( + controller: _tabController, + unselectedLabelColor: Colors.grey, + indicatorColor: kBasicColor, + labelColor: kBasicColor, + tabs: const [ + Tab(text: 'About'), + Tab(text: 'Experience'), + Tab(text: 'Education'), + ]), + + SizedBox( + width: SizeConfig.screenWidth, + height: getProportionateScreenHeight(300), + child: TabBarView(controller: _tabController, children: [ + UserTabAboutUserScreen(), + UserTabExperienceUserScreen(), + UserTabEducationUserScreen(), + // TabEducationUserScreen() + ]), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } + + void saveImage({required path}) async{ + SharedPreferences saveImage = await SharedPreferences.getInstance(); + saveImage.setString('imagePath', path); + } + + void loadImage() async{ + SharedPreferences saveImage = await SharedPreferences.getInstance(); + setState(() { + imagePath = saveImage.getString('imagePath'); + }); + } +} + +*/ + + +//كود مع السيركل افاتار بس عندي 3 شروط فيهم +/* + +child: Column( +mainAxisAlignment: MainAxisAlignment.center, +crossAxisAlignment: CrossAxisAlignment.center, +children: [ +imagePath != null +? CircleAvatar( +backgroundImage: +FileImage(File(imagePath!)),radius: 80.0, +) +: ClipOval( +child: profileImage != null +? Image.file( +profileImage!, +width: 160, +height: +getProportionateScreenHeight( +170), +fit: BoxFit.cover, +) +: const FlutterLogo(size: 100), +), +], +), +*/ + +//كود مش بيحفظ الصورة +/* + +Column( +mainAxisAlignment: MainAxisAlignment.center, +crossAxisAlignment: CrossAxisAlignment.center, +children: [ +imagePath != null ? ClipOval( +child: profileImage != null +? Image.file( +profileImage!, +width: 160, +height: +getProportionateScreenHeight( +170), +fit: BoxFit.cover, +) +: const FlutterLogo(size: 100), +) : CircleAvatar( +backgroundImage: +FileImage(File(imagePath!)),radius: 80.0, +), +], +), +*/ + + +/* + +child: Column( +mainAxisAlignment: MainAxisAlignment.center, +crossAxisAlignment: CrossAxisAlignment.center, +children: [ +imagePath != null +? CircleAvatar( +backgroundImage: +FileImage(File(imagePath!)),radius: 80.0, +) +: ClipOval( +child: profileImage != null +? Image.file( +profileImage!, +width: 160, +height: +getProportionateScreenHeight( +170), +fit: BoxFit.cover, +) +: Image.asset('assets/images/user_profile_image.jpeg'), +), +], +), +*/ + + + +class SearchTest extends StatefulWidget { + + + @override + State createState() => _SearchTestState(); +} + +class _SearchTestState extends State { + + ///empty String list + var items = []; + TextEditingController editingController = TextEditingController(); + // final duplicateItems = List.generate(10000, (i) => "Item $i"); + List duplicateItems =['a', 'aa', 'aaa', 'aaaa', 'aaaaa']; + + @override + void initState() { + items.addAll(duplicateItems); + super.initState(); + } + + void filterSearchResults(String query) { + List dummySearchList = []; + dummySearchList.addAll(duplicateItems); + if(query.isNotEmpty) { + List dummyListData = []; + for (var item in dummySearchList) { + if(item.contains(query)) { + dummyListData.add(item); + } + } + setState(() { + items.clear(); + items.addAll(dummyListData); + }); + return; + } else { + setState(() { + items.clear(); + items.addAll(duplicateItems); + }); + } + } + + @override + Widget build(BuildContext context){ + return Scaffold( + appBar: AppBar( + title: Text('Demo'), + ), + body: Container( + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + onChanged: (value) { + filterSearchResults(value); + }, + controller: editingController, + decoration: InputDecoration( + labelText: "Search", + hintText: "Search", + prefixIcon: Icon(Icons.search), + border: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(25.0)))), + ), + ), + Expanded( + child: ListView.builder( + shrinkWrap: true, + itemCount: items.length, + itemBuilder: (context, index) { + return ListTile( + title: Text('${items[index]}'), + ); + }, + ), + ), + ], + ), + ), + ); + } +} + diff --git a/lib/company/company_layout/company_modules/user_job_details_screen.dart b/lib/company/company_layout/company_modules/user_job_details_screen.dart new file mode 100644 index 0000000..1f2a574 --- /dev/null +++ b/lib/company/company_layout/company_modules/user_job_details_screen.dart @@ -0,0 +1,167 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/company/company_layout/custom_widgets/basic_custom_button.dart'; +import 'package:cvito/company/company_layout/custom_widgets/secondary_custom_button.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; + +import 'company_software_company_module/company_software_company_screen.dart'; + +class UserJobDetailsScreen extends StatelessWidget { + List levels = [ + 'Full-time . Entry-level', + 'part-time . inter-level', + 'Full-time . Advanced-level', + ]; + + List icons = [ + Icons.shopping_bag, + Icons.calendar_today_rounded, + Icons.check_circle + ]; + + List colors = [ + Colors.grey, + Colors.grey, + Colors.green + ]; + + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + // getProportionateScreenHeight + // getProportionateScreenWidth + + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + IconButton( + icon: const Icon(Icons.arrow_back), + color: kCustomBlack, + onPressed: () { + navigateTo(context: context, widget: SoftwareCompanyScreen()); + //TODO implement function + }), + SizedBox(width: getProportionateScreenWidth(20.0)), + const Text('Job Details', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.w600, + color: kCustomBlack)), + const SizedBox(height: 80.0), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text('UI/UX Product designer', + style: TextStyle( + fontSize: 20.0, + color: kCustomBlack, + fontWeight: FontWeight.w500)), + SizedBox(width: getProportionateScreenWidth(20.0)), + const Icon(Icons.more_vert) + ], + ), + SizedBox(height: getProportionateScreenHeight(30.0)), + Row( + children: [ + const CircleAvatar( + backgroundColor: kBasicColor, + radius: 25, + backgroundImage: + AssetImage('assets/images/meeting.jpeg')), + SizedBox(width: getProportionateScreenWidth(15.0)), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text('Software Company'), + Text('Staffing & Recruiting . Cairo,Egypt'), + ], + ), + ], + ), + SizedBox(height: getProportionateScreenHeight(30.0)), + Padding( + padding: const EdgeInsets.only(left: 40.0), + child: SizedBox( + height: 150, + child: ListView.separated( + physics: const BouncingScrollPhysics(), + itemBuilder: (context, index) { + return Row( + children: [ + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Icon( + icons[index], + color: colors[index], + ), + ), + Text(levels[index]), + ], + ); + }, + separatorBuilder: (context, index) { + return SizedBox( + height: getProportionateScreenHeight(30.0), + ); + }, + itemCount: 3), + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20.0, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + BasicCustomButton(text: 'Delete', function: () {}), + SecondaryCustomButton(text: 'Save', function: () {}) + ], + ), + ), + const SizedBox(height: 35.0), + const Text( + 'Job Description', + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 20.0, + color: kCustomBlack), + ), + const SizedBox(height: 15.0), + const Text( + ''' +Envision Employment Solutions is currently on the look for a UI/UX Product Designer for one of our clients, a multinational e-commerce company. ''', + style: TextStyle(color: kCustomBlack), + ), + const SizedBox(height: 20.0), + const Text( + 'Job Summary', + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 20.0, + color: kCustomBlack), + ), + const SizedBox(height: 15.0), + const Text( + '''Our partner is looking for an experienced and creative UI/UX Designer to join their team! The UI/UX designer. ''', + style: TextStyle(color: kCustomBlack), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/company/company_layout/custom_widgets/basic_custom_button.dart b/lib/company/company_layout/custom_widgets/basic_custom_button.dart new file mode 100644 index 0000000..5f3c7b2 --- /dev/null +++ b/lib/company/company_layout/custom_widgets/basic_custom_button.dart @@ -0,0 +1,27 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:flutter/material.dart'; + +class BasicCustomButton extends StatelessWidget { + const BasicCustomButton({@required this.text, @required this.function}); + + final String? text; + final VoidCallback? function; + + @override + Widget build(BuildContext context) { + return ElevatedButton( + child: Text(text!), + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 40), + onPrimary: Colors.white, + primary: kBasicColor, + onSurface: Colors.grey, + side: const BorderSide(color: kBasicColor, width: 1), + + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30)), + ), + onPressed: function, + ); + } +} diff --git a/lib/company/company_layout/custom_widgets/clip_path.dart b/lib/company/company_layout/custom_widgets/clip_path.dart new file mode 100644 index 0000000..b40a693 --- /dev/null +++ b/lib/company/company_layout/custom_widgets/clip_path.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; + +class DrawHalfCircle extends StatelessWidget { + const DrawHalfCircle({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + ///white60 + backgroundColor: Colors.white, + body: Column( + children: [ + ClipPath( + clipper: MyCliper(), + child: Container( + height: 200, + decoration: BoxDecoration( + color: Colors.grey.withOpacity(.25), + ), + child: const Center(), + ), + ) + ], + ), + ); + } +} + +class MyCliper extends CustomClipper { + @override + Path getClip(Size size) { + double width = size.width; + double height = size.height; + double offset = 100.0; + var path = Path(); + path.lineTo(0, height - offset); + path.quadraticBezierTo(width / 2, height, width, height - offset); + path.lineTo(size.width, 0); + path.close(); + return path; + } + + @override + bool shouldReclip(covariant CustomClipper oldClipper) { + return true; + } +} diff --git a/lib/company/company_layout/custom_widgets/company_card.dart b/lib/company/company_layout/custom_widgets/company_card.dart new file mode 100644 index 0000000..97328b2 --- /dev/null +++ b/lib/company/company_layout/custom_widgets/company_card.dart @@ -0,0 +1,30 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:flutter/material.dart'; + + +///used in Related Screen +class CompanyCard extends StatelessWidget { + String imageLink; + double? logoScale; + + CompanyCard({required this.imageLink, required this.logoScale}); + + @override + Widget build(BuildContext context) { + return Container( + width: 100, + height: 100, + decoration: BoxDecoration( + color: kBasicColor, + borderRadius: BorderRadius.circular(10.0), + border: Border.all(color: Colors.grey.shade200), + //linkedin = 1 + //facebook = 2 + image: DecorationImage(scale: logoScale!, + fit: BoxFit.scaleDown, + image: AssetImage(imageLink), + ), + ), + ); + } +} diff --git a/lib/company/company_layout/custom_widgets/country_container_performance.dart b/lib/company/company_layout/custom_widgets/country_container_performance.dart new file mode 100644 index 0000000..4cb7f38 --- /dev/null +++ b/lib/company/company_layout/custom_widgets/country_container_performance.dart @@ -0,0 +1,81 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/company/company_layout/custom_widgets/country_label_performance.dart'; +import 'package:flutter/material.dart'; + +class CountryContainer extends StatelessWidget { + const CountryContainer({ + required this.height, + required this.title, + required this.label1, + required this.label2, + required this.label3, + required this.label4, + required this.labelColor1, + required this.labelColor2, + required this.labelColor3, + required this.labelColor4, + }); + + final double height; + final String label1, label2, label3, label4, title; + + final Color labelColor1, labelColor2, labelColor3, labelColor4; + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: Colors.grey.shade100, + borderRadius: BorderRadius.circular(10.0), + ), + padding: const EdgeInsets.symmetric(horizontal: 10.0), + height: getProportionateScreenHeight(300), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 8.0, + bottom: 10.0, + ), + child: Text( + title, + style: const TextStyle( + color: kCustomBlack, + fontSize: 15.0, + fontWeight: FontWeight.bold), + ), + ), + const SizedBox(height: 5.0), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10.0), + child: Row( + children: [ + CountryLabelPerformance( + countryLabel: label1, iconColor: labelColor1), + const Spacer(), + CountryLabelPerformance( + countryLabel: label2, iconColor: labelColor2), + ], + ), + ), + const SizedBox(height: 20.0), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10.0), + child: Row( + children: [ + CountryLabelPerformance( + countryLabel: label3, iconColor: labelColor3), + const Spacer(), + CountryLabelPerformance( + countryLabel: label4, iconColor: labelColor4), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/company/company_layout/custom_widgets/country_label_performance.dart b/lib/company/company_layout/custom_widgets/country_label_performance.dart new file mode 100644 index 0000000..125a0e5 --- /dev/null +++ b/lib/company/company_layout/custom_widgets/country_label_performance.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:cvito/some_helpers/constants/constants.dart'; + +class CountryLabelPerformance extends StatelessWidget { + String? countryLabel; + Color? iconColor; + + CountryLabelPerformance( + {required this.countryLabel, required this.iconColor}); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + children: [ + Icon( + Icons.bar_chart, + color: iconColor, + ), + FittedBox( + child: Text( + countryLabel!, + style: const TextStyle(color: kCustomBlack), + ), + ), + ]), + const Text( + '16%', + style: TextStyle(color: Colors.grey), + ) + ], + ); + } +} diff --git a/lib/company/company_layout/custom_widgets/custom_card.dart b/lib/company/company_layout/custom_widgets/custom_card.dart new file mode 100644 index 0000000..813317d --- /dev/null +++ b/lib/company/company_layout/custom_widgets/custom_card.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +class CustomCard extends StatelessWidget { + final String? imageLink; + VoidCallback? function; + CustomCard({required this.imageLink, this.function}); + + @override + Widget build(BuildContext context) { + return Expanded( + child: InkWell( + onTap: function, + child: Container( + width: MediaQuery.of(context).size.width / 2, + height: MediaQuery.of(context).size.height / 3.5, + decoration: BoxDecoration( + // color: kBasicColor, + borderRadius: BorderRadius.circular(25.0), + // color: Colors.red, + image: DecorationImage( + // fit: BoxFit.fill, + image: AssetImage( + imageLink!, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/company/company_layout/custom_widgets/custom_list_tile_messages.dart b/lib/company/company_layout/custom_widgets/custom_list_tile_messages.dart new file mode 100644 index 0000000..6e2516f --- /dev/null +++ b/lib/company/company_layout/custom_widgets/custom_list_tile_messages.dart @@ -0,0 +1,80 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:flutter/material.dart'; + + +///used in messages screen and notifications screen +class CustomListTileMessages extends StatelessWidget { + + String? user; + String? imageLink; + String? chatTime; + + CustomListTileMessages({required this.user, required this.imageLink, required this.chatTime}); + + + @override + Widget build(BuildContext context) { + return + Container( + margin: const EdgeInsets.fromLTRB(16, 5, 16, 5), + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.grey.shade400, + offset: const Offset(0, 5), //(x,y) + blurRadius: 5, + ), + ], + color: Colors.white, + borderRadius: BorderRadius.circular(5.0), + border: Border.all(color: Colors.grey.shade200), + + ), + child: ListTile( + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(5), + // side: BorderSide( + // color: Colors.grey.shade200, + // ), + // ), + // tileColor: Colors.grey.shade200, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 5.0), + dense: true, + isThreeLine: true, + leading: CircleAvatar( + radius: 30, + + // child: Image.asset('assets/images/profile_photo.png'), + child: Image.asset(imageLink!), + ), + title: Row( + children: [ + Text( + user!, + style: const TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w700, + fontSize: 16.0), + ), + const Spacer(), + Text( + // '7:36 AM', + chatTime!, + style: const TextStyle( + color: Color(0xff4F4F4F), + fontWeight: FontWeight.w700, + fontSize: 16.0), + ), + ], + ), + subtitle: const Text( + "Hello, thanks for dicovering my CV i pleased to join your ....", + style: TextStyle( + color: Colors.grey, fontWeight: FontWeight.w500, fontSize: 14.0), + ), + ), + ); + } + +} \ No newline at end of file diff --git a/lib/company/company_layout/custom_widgets/custom_list_tile_notifications.dart b/lib/company/company_layout/custom_widgets/custom_list_tile_notifications.dart new file mode 100644 index 0000000..5937a98 --- /dev/null +++ b/lib/company/company_layout/custom_widgets/custom_list_tile_notifications.dart @@ -0,0 +1,68 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:flutter/material.dart'; + +///used in notifications screen +class CustomListTileNotifications extends StatelessWidget { + String? notificationTime; + String? notificationImages; + CustomListTileNotifications({required this.notificationTime, required this.notificationImages}); + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.fromLTRB(16, 5, 16, 5), + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.grey.shade400, + offset: const Offset(0, 5), //(x,y) + blurRadius: 5, + ), + ], + color: Colors.white, + borderRadius: BorderRadius.circular(5.0), + border: Border.all(color: Colors.grey.shade200)), + child: ListTile( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(25), + side: const BorderSide( + color: Colors.black, + ), + ), + contentPadding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 5.0), + dense: true, + isThreeLine: true, + leading: CircleAvatar( + radius: 30, + child: Image.asset(notificationImages!), + ), + tileColor: Colors.grey, + title: Row( + children: [ + const Text( + 'Discover', + style: TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w700, + fontSize: 16.0), + ), + Spacer(), + Text( + notificationTime!, + style:const TextStyle( + color: Color(0xff4F4F4F), + fontWeight: FontWeight.w700, + fontSize: 16.0), + ), + ], + ), + subtitle: const Text( + 'You can discover other companies \njobs..', + style: TextStyle( + color: Colors.grey, fontWeight: FontWeight.w500, fontSize: 14.0), + ), + ), + ); + } +} diff --git a/lib/company/company_layout/custom_widgets/custom_top_bar.dart b/lib/company/company_layout/custom_widgets/custom_top_bar.dart new file mode 100644 index 0000000..05892ef --- /dev/null +++ b/lib/company/company_layout/custom_widgets/custom_top_bar.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; + +class CustomTopBar extends StatelessWidget { + String title, imageLink; + VoidCallback? function; + Color color; + + CustomTopBar( + {Key? key, + required this.title, + required this.imageLink, + this.function, + required this.color}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 10.0), + child: Row( + children: [ + GestureDetector( + onTap: function, + child: CircleAvatar( + radius: 20, + child: Image.asset(imageLink), + ), + ), + const SizedBox(width: 20.0), + SizedBox(width: MediaQuery.of(context).size.width / 20), + Text( + title, + style: TextStyle( + color: color, fontWeight: FontWeight.bold, fontSize: 25), + ), + const Spacer(), + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.settings, + color: Colors.transparent, + )) + ], + ), + ); + } +} diff --git a/lib/company/company_layout/custom_widgets/default_form_field.dart b/lib/company/company_layout/custom_widgets/default_form_field.dart new file mode 100644 index 0000000..526328a --- /dev/null +++ b/lib/company/company_layout/custom_widgets/default_form_field.dart @@ -0,0 +1,48 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:flutter/material.dart'; + +Widget defaultTextFormField({ + required TextEditingController controller, + required TextInputType type, + required Function onChanged, + final validate, + required String label, + required IconData prefix, + IconData? suffix, + Function? suffixPressed, + bool isClickable = true, +}) => + SizedBox( + height: 45.0, + child: TextFormField( + onChanged: (value) { + onChanged(value); + }, + controller: controller, + keyboardType: type, + enabled: isClickable, + validator: validate, + decoration: InputDecoration( + isDense: false, + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(width: 1, color: Colors.grey.shade200), + borderRadius: BorderRadius.circular(10)), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide(width: 1, color: kBasicColor), + borderRadius: BorderRadius.circular(10)), + labelText: label, + filled: true, + fillColor: Colors.grey.shade100, + prefixIcon: Icon(prefix), + suffixIcon: suffix != null + ? IconButton( + onPressed: () { + suffixPressed!(); + }, + icon: Icon(suffix), + ) + : null, + border: const OutlineInputBorder(), + ), + ), + ); diff --git a/lib/company/company_layout/custom_widgets/edit_row.dart b/lib/company/company_layout/custom_widgets/edit_row.dart new file mode 100644 index 0000000..197ac0f --- /dev/null +++ b/lib/company/company_layout/custom_widgets/edit_row.dart @@ -0,0 +1,33 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:flutter/material.dart'; + +class EditRow extends StatelessWidget { + IconData? icon; + String label; + + EditRow({ this.icon, required this.label}); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Text( + label, + style: const TextStyle( + color: kCustomBlack, + fontSize: 18.0, + decorationColor: kCustomBlack, + fontWeight: FontWeight.w500), + ), + const Spacer(), + IconButton( + onPressed: () {}, + icon: Icon( + icon, + color: kCustomBlack, + ), + ) + ], + ); + } +} \ No newline at end of file diff --git a/lib/company/company_layout/custom_widgets/intro_slider.dart b/lib/company/company_layout/custom_widgets/intro_slider.dart new file mode 100644 index 0000000..fd1bc3d --- /dev/null +++ b/lib/company/company_layout/custom_widgets/intro_slider.dart @@ -0,0 +1,60 @@ +import 'package:cvito/company/company_layout/custom_widgets/clip_path.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:flutter/material.dart'; + +class IntroSliderContent extends StatelessWidget { + const IntroSliderContent({ + Key? key, + required this.description, + required this.imageLink, + required this.title, + }) : super(key: key); + final String? title, description, imageLink; + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + const DrawHalfCircle(), + Container( + child: Column( + children: [ + const Spacer(flex: 5), + + const Spacer(flex: 3,), + Image.asset( + imageLink!, + height: getProportionateScreenHeight(300), + width: getProportionateScreenHeight(300), + ), + const Spacer( + flex: 4, + ), + + ///=============================================== + /// title + Text( + title!, + textAlign: TextAlign.center, + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 20.0), + ), + const Spacer( + flex: 2, + ), + + ///=================================================== + /// description + Center(child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 5.0), + child: Text(description!, textAlign: TextAlign.center), + )), + const Spacer( + flex: 1, + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/company/company_layout/custom_widgets/line_chart_widget.dart b/lib/company/company_layout/custom_widgets/line_chart_widget.dart new file mode 100644 index 0000000..036c0e4 --- /dev/null +++ b/lib/company/company_layout/custom_widgets/line_chart_widget.dart @@ -0,0 +1,150 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; + +class LineChartWidget extends StatelessWidget { + final List gradientColors = [ + // Color(0xff8C1D18), + Colors.red, + Colors.red.shade400, + ]; + + LineChartWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return LineChart( + LineChartData( + minX: 0, + maxX: 3, + minY: 0, + maxY: 5, + titlesData: LineTitles.getTitleData(), + gridData: FlGridData( + show: true, + + ///draw horizontal lines in graph + getDrawingHorizontalLine: (value) { + return FlLine( + color: Colors.grey.shade400, + strokeWidth: 1, + ); + }, + + ///draw vertical lines in graph + drawVerticalLine: true, + getDrawingVerticalLine: (value) { + return FlLine( + color: Colors.grey.shade400, + strokeWidth: 1, + ); + }, + ), + lineBarsData: [ + LineChartBarData( + spots: [ + const FlSpot(0, 0), + const FlSpot(1, 1), + const FlSpot(1.5, 1.5), + const FlSpot(2, 2.5), + const FlSpot(2.5, 3.4), + const FlSpot(3, 4.5), + ], + isCurved: false, + colors: gradientColors, + + ///stroke of the curve + barWidth: 1.5, + belowBarData: BarAreaData( + show: true, + colors: gradientColors + .map((color) => color.withOpacity(0.3)) + .toList())) + ], + borderData: FlBorderData( + show: true, + border: Border.all(color: Colors.grey.shade400, width: 1), + ), + ), + ); + } +} + +class LineTitles { + static getTitleData() => FlTitlesData( + show: true, + + ///bottom titles + bottomTitles: SideTitles( + showTitles: true, + reservedSize: 22, + + ///text style for bottom titles + getTextStyles: (BuildContext context, double value) { + return const TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w400, + fontSize: 12.0); + }, + + /// define the bottom titles + getTitles: (value) { + switch (value.toInt()) { + case 0: + return 'JAN'; + case 1: + return 'MAR'; + case 2: + return 'MAY'; + case 3: + return 'AUG'; + } + return ''; + }, + margin: 10.0, + ), + + ///left titles + leftTitles: SideTitles( + showTitles: true, + margin: 22, + reservedSize: 30, + + ///text style for left titles + getTextStyles: (BuildContext context, double value) { + return const TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w400, + fontSize: 12.0); + }, + + /// define the left titles + getTitles: (value) { + switch (value.toInt()) { + case 1: + return '1000'; + case 2: + return '2000'; + case 3: + return '3000'; + case 4: + return '4000'; + case 5: + return '5000'; + } + return ''; + }, + ), + + /// top titles + topTitles: SideTitles( + showTitles: false, + ), + + ///right titles + rightTitles: SideTitles( + showTitles: false, + margin: 22, + ), + ); +} diff --git a/lib/company/company_layout/custom_widgets/secondary_custom_button.dart b/lib/company/company_layout/custom_widgets/secondary_custom_button.dart new file mode 100644 index 0000000..fd357c4 --- /dev/null +++ b/lib/company/company_layout/custom_widgets/secondary_custom_button.dart @@ -0,0 +1,53 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:flutter/material.dart'; + +/// for company button +class SecondaryCustomButton extends StatelessWidget { + const SecondaryCustomButton({ + @required this.text, + @required this.function, + }); + + final String? text; + final VoidCallback? function; + + @override + Widget build(BuildContext context) { + return ElevatedButton( + child: Text(text!), + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 40), + onPrimary: kBasicColor, + primary: Colors.white, + onSurface: Colors.grey, + side: const BorderSide(color: kBasicColor, width: 1), + + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30)), + ), + onPressed: function, + ); + } +} +// } +// FittedBox( +// child: Container( +// alignment: Alignment.center, +// decoration: BoxDecoration( +// border: Border.all(color: kBasicColor), +// color: Colors.white, +// borderRadius: BorderRadius.circular(50.0), +// ), +// child: Padding( +// padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 40), +// child: Text( +// text!, +// style: const TextStyle( +// color: kBasicColor, +// fontWeight: FontWeight.w600, +// fontSize: 15, +// ), +// ), +// ), +// ), +// ), \ No newline at end of file diff --git a/lib/company/company_layout/custom_widgets/see_more_see_less.dart b/lib/company/company_layout/custom_widgets/see_more_see_less.dart new file mode 100644 index 0000000..b542613 --- /dev/null +++ b/lib/company/company_layout/custom_widgets/see_more_see_less.dart @@ -0,0 +1,19 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:flutter/material.dart'; +import 'package:readmore/readmore.dart'; + +Widget buildText(String text) { + return ReadMoreText( + text, + trimCollapsedText: 'see more', + trimExpandedText: 'see less', + trimLength: 100, + trimMode: TrimMode.Length, + delimiterStyle: const TextStyle(color: kBasicColor), + moreStyle: + const TextStyle(color: kBasicColor, fontWeight: FontWeight.w500), + lessStyle: + const TextStyle(color: kBasicColor, fontWeight: FontWeight.w500), + style: const TextStyle(fontSize: 15), + ); +} \ No newline at end of file diff --git a/lib/company/company_layout/custom_widgets/suggested_people_list_tile.dart b/lib/company/company_layout/custom_widgets/suggested_people_list_tile.dart new file mode 100644 index 0000000..17c3693 --- /dev/null +++ b/lib/company/company_layout/custom_widgets/suggested_people_list_tile.dart @@ -0,0 +1,51 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:flutter/material.dart'; + +class SuggestedPeopleListTile extends StatelessWidget { + + String? relatedPeopleName; + String? relatedPeopleJobTitle; + String? relatedPeopleImages; + + SuggestedPeopleListTile({required this.relatedPeopleImages, required this.relatedPeopleName, required this.relatedPeopleJobTitle}); + + @override + Widget build(BuildContext context) { + return ListTile( + minVerticalPadding: 15.0, + horizontalTitleGap: 2.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + // trailing: const Icon(Icons.more_vert), + contentPadding: const EdgeInsets.symmetric(horizontal: 5.0), + isThreeLine: true, + leading: Padding( + padding: const EdgeInsets.only(right: 10.0), + child: CircleAvatar( + backgroundImage: AssetImage(relatedPeopleImages!), + radius: 35, + ), + ), + tileColor: Colors.white, + title: Row( + children: [ + Padding( + padding:const EdgeInsets.only(bottom: 5.0), + child: Text( + relatedPeopleName!, + style:const TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w700, + fontSize: 16.0), + ), + ), + ], + ), + subtitle: Text( relatedPeopleJobTitle!, + style:const TextStyle( + color: Colors.grey, fontWeight: FontWeight.w500, fontSize: 14.0), + ), + ); + } +} diff --git a/lib/company/company_layout/custom_widgets/transparent_icon.dart b/lib/company/company_layout/custom_widgets/transparent_icon.dart new file mode 100644 index 0000000..b25d85d --- /dev/null +++ b/lib/company/company_layout/custom_widgets/transparent_icon.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +class TransparentIcon extends StatelessWidget { + TransparentIcon({required this.icon, this.onPressed}); + + IconData icon; + Function()? onPressed; + + @override + Widget build(BuildContext context) { + return CircleAvatar( + backgroundColor: Colors.white.withOpacity(.10), + child: IconButton( + onPressed: onPressed, + icon: Icon( + icon, + color: Colors.white, + size: 20.0, + )), + ); + } +} diff --git a/lib/layout/screens/home_screen.dart b/lib/layout/screens/home_screen.dart deleted file mode 100644 index b973607..0000000 --- a/lib/layout/screens/home_screen.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:flutter/material.dart'; - -class HomeScreen extends StatelessWidget { - const HomeScreen({Key? key}) : super(key: key); - static const String id = 'WelcomeScreen'; - - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: const Scaffold() - ); - } -} diff --git a/lib/layout/screens/signin_screen.dart b/lib/layout/screens/signin_screen.dart deleted file mode 100644 index df16275..0000000 --- a/lib/layout/screens/signin_screen.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:flutter/material.dart'; - -class SignInScreen extends StatelessWidget { - const SignInScreen({Key? key}) : super(key: key); - static const String id = 'WelcomeScreen'; - - @override - Widget build(BuildContext context) { - return const Scaffold(); - } -} diff --git a/lib/layout/screens/signup_screen.dart b/lib/layout/screens/signup_screen.dart deleted file mode 100644 index dd15f3a..0000000 --- a/lib/layout/screens/signup_screen.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:flutter/material.dart'; - -class SignUpScreen extends StatelessWidget { - const SignUpScreen({Key? key}) : super(key: key); - static const String id = 'WelcomeScreen'; - - @override - Widget build(BuildContext context) { - return const Scaffold(); - } -} diff --git a/lib/layout/screens/tesssst.dart b/lib/layout/screens/tesssst.dart deleted file mode 100644 index a650d1a..0000000 --- a/lib/layout/screens/tesssst.dart +++ /dev/null @@ -1,45 +0,0 @@ -///لو في أي كود محتاجين نشيله على جمب علشان نتيست كود تاني ممكن نحطه هنا مؤقتًا - -/* -import 'package:flutter/material.dart'; - -class IntroSlider extends StatelessWidget { - - String? imageLink; - String? title; - String? description; - - IntroSlider({Key? key, - this.imageLink, - this.title, - this.description, - - }) : super(key: key); - @override - Widget build(BuildContext context) { - return Column( - children: [ - Container( - height:200, - width: 200, - - child:Image.asset(imageLink!), - ), - const SizedBox( - height: 15.0, - ), - Expanded( - child: Text(title!, - style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 20.0), - ), - ), - const SizedBox( - height: 10.0, - ), - Expanded(child: Text(description!, - textAlign: TextAlign.center),) - ], - ); - } -} -*/ diff --git a/lib/layout/screens/welcome_screen.dart b/lib/layout/screens/welcome_screen.dart deleted file mode 100644 index ce8dc96..0000000 --- a/lib/layout/screens/welcome_screen.dart +++ /dev/null @@ -1,87 +0,0 @@ -import 'package:cvito/layout/screens/get_started_screen.dart'; -import 'package:cvito/utilities.dart'; -import 'package:flutter/material.dart'; -import 'package:carousel_slider/carousel_slider.dart'; -import '../widgets/basic_custom_button.dart'; -import '../widgets/intro_slider.dart'; - -class WelcomeScreen extends StatelessWidget { - static const String id = 'WelcomeScreen'; - - const WelcomeScreen({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - elevation: 0.0, - backgroundColor: Colors.white, - title: const Padding( - padding: EdgeInsets.only(top: 30.0), - child: Text( - 'Welcome!', - style: TextStyle( - color: Colors.black, fontWeight: FontWeight.bold, fontSize: 30), - ), - ), - ), - backgroundColor: Colors.white, - body: SingleChildScrollView( - physics: const BouncingScrollPhysics(), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - SizedBox( - height: 500, - child: CarouselSlider( - items: [ - ///====================================================================================== - /// Create An Automated CV ... rafiki image - IntroSlider( - imageLink: 'assets/images/rafiki.png', - title: 'Create An Automated CV', - description: - 'Our app helps you build an automated CV differently!', - ), - - ///===================================================================================== - /// find your job ....bro image - IntroSlider( - imageLink: 'assets/images/bro.png', - title: 'Find Your Job', - description: - 'It will also help you find a job remotely without recruiters.', - ), - - ///====================================================================================== - ///find Employess ....business image - IntroSlider( - imageLink: 'assets/images/business.png', - title: 'Find Employees', - description: 'A Company Can Also Find Its Employees!', - ), - - ///============================================================================================ - ///Create a manual CV ....rafikti image - IntroSlider( - imageLink: 'assets/images/rafikti.png', - title: 'Create A Manual CV', - description: - 'Create your CV with yourself and customize it with any template that attracts you.', - ), - ], - options: CarouselOptions( - enlargeCenterPage: true, - height: MediaQuery.of(context).size.height * 40 / 100), - ), - ), - BasicCustomButton(text: 'Next', function: (){ - navigateTo(context: context, widget: const GetStartedScreen()); - }) - ], - ), - ), - ); - } -} - diff --git a/lib/layout/widgets/basic_custom_button.dart b/lib/layout/widgets/basic_custom_button.dart deleted file mode 100644 index fd03cdf..0000000 --- a/lib/layout/widgets/basic_custom_button.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:cvito/constants.dart'; -import 'package:flutter/material.dart'; - -class BasicCustomButton extends StatelessWidget { - BasicCustomButton({@required this.text, @required this.function}); - - final String? text; - final VoidCallback? function; - - @override - Widget build(BuildContext context) { - return GestureDetector( - - onTap: function, - child: FittedBox( - child: Container( - alignment: Alignment.center, - decoration: BoxDecoration( - border: Border.all(color: kBasicColor), - color: kBasicColor, - // boxShadow: const [ - // BoxShadow( - // color: Colors.grey, - // offset: Offset(0, 3), //(x,y) - // blurRadius: 5, - // ), - // ], - borderRadius: BorderRadius.circular(50.0),), - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 40), - child: Text( - text!, - style: const TextStyle( - color: Color(0xffffffff), - fontSize: 15, - ), - ), - ), - ), - ), - ); - } -} diff --git a/lib/layout/widgets/intro_slider.dart b/lib/layout/widgets/intro_slider.dart deleted file mode 100644 index 0fa495c..0000000 --- a/lib/layout/widgets/intro_slider.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; - -class IntroSlider extends StatelessWidget { - - String? imageLink; - String? title; - String? description; - - IntroSlider({ - this.imageLink, - this.title, - this.description, - - }); - - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Expanded( - child: Container( - width: MediaQuery - .of(context) - .size - .width, - height: MediaQuery - .of(context) - .size - .height / 2.5, - decoration: BoxDecoration( - image: DecorationImage( - fit: BoxFit.fitHeight, - image: AssetImage(imageLink!), - )), - ), - ), - const SizedBox( - height: 15.0, - ), - Text(title!, - style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 20.0), - ), - const SizedBox( - height: 10.0, - ), - Text(description!, - textAlign: TextAlign.center), - ], - ); - } -} - diff --git a/lib/layout/widgets/secondary_custom_button.dart b/lib/layout/widgets/secondary_custom_button.dart deleted file mode 100644 index 9df6c3d..0000000 --- a/lib/layout/widgets/secondary_custom_button.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:cvito/constants.dart'; -import 'package:flutter/material.dart'; - - -/// for company button -class SecondaryCustomButton extends StatelessWidget { - const SecondaryCustomButton({@required this.text, @required this.function,}); - - final String? text; - final VoidCallback? function; - - - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: function, - child: FittedBox( - child: Container( - alignment: Alignment.center, - decoration: BoxDecoration( - border: Border.all(color: kBasicColor), - color: Colors.white, - borderRadius: BorderRadius.circular(50.0),), - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 40), - child: Text( - text!, - style: const TextStyle( - color: kBasicColor, - fontSize: 15, - ), - ), - ), - ), - ), - ); - } -} diff --git a/lib/main.dart b/lib/main.dart index 4e71e00..65ad82c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,31 +1,44 @@ -import 'package:cvito/layout/screens/splash_screen.dart'; +import 'package:cvito/some_helpers/helpers/custom_error_screen.dart'; +import 'package:cvito/some_helpers/start_modules/splash_screen_module/splash_screen.dart'; import 'package:flutter/material.dart'; -import 'package:animated_splash_screen/animated_splash_screen.dart'; -import 'layout/screens/home_screen.dart'; -import 'layout/screens/welcome_screen.dart'; +import 'package:flutter/services.dart'; -void main() { + +void main() async{ + // await Firebase.initializeApp(); + customErrorScreen(); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); + + + ///update term2 @override Widget build(BuildContext context) { + SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + ]); + + debugInvertOversizedImages = true; return MaterialApp( debugShowCheckedModeBanner: false, title: 'Flutter Demo', theme: ThemeData( - primarySwatch: Colors.blue, - backgroundColor: Colors.blue, - ), - routes: { - WelcomeScreen.id: (context) => WelcomeScreen(), - // HomeScreen.id: (context) => HomeScreen(), - }, - initialRoute: SplashScreen.id, - home: SplashScreen(), + //primarySwatch: Colors.blue, + // backgroundColor: kBackgroundColor, + ), + // routes: { + // WelcomeScreen.id: (context) => WelcomeScreen(), + // // HomeScreen.id: (context) => HomeScreen(), + // }, + // initialRoute: SplashScreen.id, + home: const SplashScreen(), + + + // home: DrawHalfCircle(), ); } } diff --git a/lib/constants.dart b/lib/some_helpers/constants/constants.dart similarity index 78% rename from lib/constants.dart rename to lib/some_helpers/constants/constants.dart index 8fd5c43..80edc45 100644 --- a/lib/constants.dart +++ b/lib/some_helpers/constants/constants.dart @@ -8,3 +8,7 @@ const Color kBasicColor = Color(0xff0077B5); /// TextStyle kTextTitleDecoration1 = TextStyle(fontSize: 40.0); TextStyle kWelcomText = const TextStyle( color: Color(0xff040404), fontSize: 50, fontWeight: FontWeight.w700); + +const kAnimationDuration = Duration(milliseconds: 400); + +const Color kCustomBlack = Color(0xff4F4F4F); diff --git a/lib/some_helpers/constants/sized_config.dart b/lib/some_helpers/constants/sized_config.dart new file mode 100644 index 0000000..d652eb0 --- /dev/null +++ b/lib/some_helpers/constants/sized_config.dart @@ -0,0 +1,31 @@ + +import 'package:flutter/material.dart'; + +class SizeConfig { + static late MediaQueryData _mediaQueryData; + static late double screenWidth; + static late double screenHeight; + static double? defaultSize; + static Orientation? orientation; + + void init(BuildContext context) { + _mediaQueryData = MediaQuery.of(context); + screenWidth = _mediaQueryData.size.width; + screenHeight = _mediaQueryData.size.height; + orientation = _mediaQueryData.orientation; + } +} + +// Get the proportionate height as per screen size +double getProportionateScreenHeight(double inputHeight) { + double screenHeight = SizeConfig.screenHeight; + // 812 is the company_layout height that designer use + return (inputHeight / 812.0) * screenHeight; +} + +// Get the proportionate height as per screen size +double getProportionateScreenWidth(double inputWidth) { + double screenWidth = SizeConfig.screenWidth; + // 375 is the company_layout width that designer use + return (inputWidth / 375.0) * screenWidth; +} \ No newline at end of file diff --git a/lib/some_helpers/constants/time_line_class.dart b/lib/some_helpers/constants/time_line_class.dart new file mode 100644 index 0000000..d936940 --- /dev/null +++ b/lib/some_helpers/constants/time_line_class.dart @@ -0,0 +1,213 @@ + +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:flutter/material.dart'; + +///====================================================================================== +/// TimelineModel +class TimelineModel { + final String id; + final String title; + final String hh; + final String description; + final String location; + final Color lineColor; + // final Color descriptionColor; + final Color titleColor; + + const TimelineModel( + {required this.id, + required this.description, + required this.location, + required this.title, + required this.hh, + required this.lineColor, + // required this.descriptionColor, + required this.titleColor + + }); +} + +///===================================================================================== +///TimelineElement class +class TimelineElement extends StatelessWidget { + final Color lineColor; + final Color backgroundColor; + final TimelineModel model; + final bool firstElement; + final bool lastElement; + final Animation controller; + // final Color headingColor; + // final Color descriptionColor; + + TimelineElement( + {required this.lineColor, + required this.backgroundColor, + required this.model, + this.firstElement = false, + this.lastElement = false, + required this.controller, + // required this.headingColor, + // required this.descriptionColor + }); + + Widget _buildLine() { + return SizedBox( + width: 40.0, + child: CustomPaint( + painter: TimelinePainter( + lineColor: lineColor, + backgroundColor: backgroundColor, + firstElement: firstElement, + lastElement: lastElement, + controller: controller))); + } + + Widget _buildContentColumn(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: const EdgeInsets.only(bottom: 8.0, top: 8.0), + child: Text( + model.title.length > 47 + ? model.title.substring(0, 47) + "..." + : model.title, + style: const TextStyle( + fontWeight: FontWeight.bold, + // color: headingColor ?? Colors.black + + ))), + Expanded( + child: Text( + model.description != null + ? (model.description.length > 50 + ? model.description.substring(0, 50) + "..." + : model.description) + : "", + // To prevent overflowing of text to the next element, the text is truncated if greater than 75 characters + style: const TextStyle( + // color: descriptionColor?? Colors.grey + ))), + + Expanded( + child: Text( + model.hh != null + ? (model.hh.length > 50 + ? model.hh.substring(0, 50) + "..." + : model.hh) + : "", + // To prevent overflowing of text to the next element, the text is truncated if greater than 75 characters + style: const TextStyle( color: Colors.grey + // color: descriptionColor?? Colors.grey + ))), + + Expanded( + child: Text( + model.location != null + ? (model.location.length > 50 + ? model.location.substring(0, 50) + "..." + : model.location) + : "", + // To prevent overflowing of text to the next element, the text is truncated if greater than 75 characters + style: const TextStyle( color: Colors.grey + // color: descriptionColor?? Colors.grey + ))), + + + + ]); + } + + Widget _buildRow(BuildContext context) { + return Container( + height: getProportionateScreenHeight(130), + color: Colors.white, + padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 0.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + AnimatedBuilder( + builder: (BuildContext context, widget) => _buildLine(), + animation: controller), + Expanded(child: _buildContentColumn(context)) + ])); + } + + @override + Widget build(BuildContext context) { + return _buildRow(context); + } +} + +///==================================================================================== +///TimelinePainter class +class TimelinePainter extends CustomPainter { + final Color lineColor; + final Color backgroundColor; + final bool firstElement; + final bool lastElement; + final Animation controller; + final Animation height; + + TimelinePainter( + { + required this.lineColor, + required this.backgroundColor, + this.firstElement = false, + this.lastElement = false, + required this.controller}) + : height = Tween(begin: 0.0, end: 1.0).animate( + CurvedAnimation( + parent: controller, + curve: const Interval(0.45, 1.0, curve: Curves.ease), + ), + ), + super(repaint: controller); + + @override + void paint(Canvas canvas, Size size) { + _centerElementPaint(canvas, size); + } + + void _centerElementPaint(Canvas canvas, Size size) { + Paint lineStroke = Paint() + ..color = lineColor + ..strokeCap = StrokeCap.round + ..strokeWidth = 2.0 + ..style = PaintingStyle.stroke; + if (firstElement && lastElement) { + // Do nothing + } else if (firstElement) { + Offset offsetCenter = size.center(const Offset(0.0, -4.0)); + Offset offsetBottom = size.bottomCenter(const Offset(0.0, 0.0)); + Offset renderOffset = Offset( + offsetBottom.dx, offsetBottom.dy * (0.5 + (controller.value / 2))); + canvas.drawLine(offsetCenter, renderOffset, lineStroke); + } else if (lastElement) { + Offset offsetTopCenter = size.topCenter(const Offset(0.0, 0.0)); + Offset offsetCenter = size.center(const Offset(0.0, -4.0)); + Offset renderOffset = + Offset(offsetCenter.dx, offsetCenter.dy * controller.value); + canvas.drawLine(offsetTopCenter, renderOffset, lineStroke); + } else { + Offset offsetTopCenter = size.topCenter(const Offset(0.0, 0.0)); + Offset offsetBottom = size.bottomCenter(const Offset(0.0, 0.0)); + Offset renderOffset = + Offset(offsetBottom.dx, offsetBottom.dy * controller.value); + canvas.drawLine(offsetTopCenter, renderOffset, lineStroke); + } + + Paint circleFill = Paint() + ..color = lineColor + ..style = PaintingStyle.fill; + + canvas.drawCircle(size.center(const Offset(0.0, -8.0)), 6.0, circleFill); + } + + @override + bool shouldRepaint(TimelinePainter oldDelegate) { + return oldDelegate.lineColor != lineColor || + oldDelegate.backgroundColor != backgroundColor; + } +} diff --git a/lib/some_helpers/cubit/cubit.dart b/lib/some_helpers/cubit/cubit.dart new file mode 100644 index 0000000..13365f3 --- /dev/null +++ b/lib/some_helpers/cubit/cubit.dart @@ -0,0 +1,434 @@ +import 'package:cvito/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_home_screen_module/company_home_screen.dart'; +import 'package:cvito/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_messages_screen_module/company_messages_screen.dart'; +import 'package:cvito/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_notifications_screen_module/company_notifications_screen.dart'; +import 'package:cvito/company/company_layout/company_modules/company_bottom_navigation_bar_module/company_related_jobs_screen_module/company_related_screen.dart'; +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_home_screen_module/user_home_screen.dart'; +import 'package:cvito/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_jobs_screen_module/user_jobs_screen.dart'; +import 'package:cvito/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_messages_screen_module/user_messages_screen.dart'; +import 'package:cvito/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_notification_screen_module/user_notification_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../constants/time_line_class.dart'; + +class CVCubit extends Cubit { + CVCubit() : super(InitialState()); + + int currentPage = 0; + + static CVCubit get(context) => BlocProvider.of(context); + + void changeCurrentPage(int value) { + currentPage = value; + emit(CurrentPageInWelcomeScreenState()); + } + + AnimatedContainer buildDot({int? index}) { + return AnimatedContainer( + margin: const EdgeInsets.only(right: 5), + height: 6, + width: currentPage == index ? 20 : 6, + decoration: BoxDecoration( + color: currentPage == index ? kBasicColor : Colors.grey, + borderRadius: BorderRadius.circular(3)), + duration: kAnimationDuration, + ); + } + + List welcomeImages = [ + ///========================================================================= + /// Create An Automated CV ... rafiki image + { + "title": "Create An Automated CV", + "description": "Our app helps you to build an automated CV differently!", + "image": "assets/images/rafiki.png" + }, + + ///========================================================================= + /// find your job ....bro image + + { + "title": 'Find Your Job', + "description": + "It will also help you to find a job remotely without recruiters.", + "image": "assets/images/bro.png" + }, + + ///========================================================================= + ///find Employess ....business image + + { + "title": "Find Employees", + "description": "A company can also find its employees!", + "image": "assets/images/business.png" + }, + + ///========================================================================= + ///Create a manual CV ....rafikti image + + { + "title": "Create A Manual CV", + "description": + "Create your CV with yourself and customize it with any template that attracts you.", + "image": "assets/images/rafikti.png" + }, + + ///========================================================================= + ///Create a manual CV ....rafikti image + + { + "title": "Rephrase Awesome CV", + "description": + "Correct the grammar of your CV and rephrase it technically.", + "image": "assets/images/grammar.png" + }, + ]; + + ///====================================================================================================================== + ///bottom navigation bar items + + int currentBottomIndex = 0; + + List screens = [ + const CompanyHomeScreen(), + const CompanyNotificationsScreen(), + CompanyMessagesScreen(), + const CompanyRelatedScreen(), + ]; + + void changeBottomNavBarIndex(int index) { + currentBottomIndex = index; + emit(CVBottomNavState()); + } + + List bottomItems = const [ + BottomNavigationBarItem( + icon: Icon(Icons.home), + label: 'Home', + ), + BottomNavigationBarItem( + icon: Icon(Icons.notifications_active_sharp), + label: 'Notifications', + ), + BottomNavigationBarItem( + icon: Icon(Icons.message), + label: 'Messages', + ), + BottomNavigationBarItem( + icon: Icon(Icons.group), + label: 'Related', + ), + ]; + + ///================================================================================ + ///companies names list + List companiesLogos = [ + "assets/images/linkedIn_logo.png", + "assets/images/google_logo.png", + "assets/images/facebook_logo.png", + "assets/images/apple_logo.png", + ]; + + ///======================================================================== + ///MessagesScreen + ///==================================== + ///companies names list + List chatUsers = [ + "Amit", + "Brem", + "Amer ", + "Akshat", + "Brain", + "John", + "Danish", + "Sam", + ]; + + ///====================================== + ///delete chat item + void deleteChatItem(BuildContext context, int index) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("${chatUsers[index]} chat is deleted"), + ], + ), + duration: const Duration(seconds: 1), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10))), + // behavior: SnackBarBehavior.floating, + ), + ); + } + + ///=========================================================================== + /// TabHomeScreen + _launchEmail() async { + launch("mailto:miraezz14@gmail.com"); + } + + setLaunch() { + _launchEmail(); + emit(CVEmailLaunch()); + } + + double rating = 0; + + void ratingUpdate(double rating) { + this.rating = rating; + emit(CVRatingUpdate()); + } + + ///============================================================================= + /// job applicant names + List jobsNames = [ + "Web Designer", + "Flutter Developer", + "Backend Developer ", + "Android Developer", + "FullStack ", + ]; + + List jobLocations = [ + "Cairo-Cairo-Egypt", + "Giza Cairo-Egypt", + "Nasr City Cairo-Egypt", + "Maady Cairo-Egypt", + "Mansoura Cairo-Egypt", + ]; + + ///================================================================================= + /// user screen (experience section) + List userExperienceList = const [ + TimelineModel( + id: "1", + title: "2020-2022", + description: "software development company", + location: 'giza - egypt', + hh: 'android developer ', + lineColor: Colors.black, + // descriptionColor: Colors.green, + titleColor: Colors.green, + ), + TimelineModel( + id: "2", + title: "2018-2020", + description: "eltawfeq company", + location: 'giza - egypt', + hh: 'android developer ', + lineColor: Colors.black, + // descriptionColor: Colors.red, + titleColor: Colors.indigo, + ), + TimelineModel( + id: "3", + title: "2015-2018", + description: "software development company", + location: 'giza - egypt', + hh: 'android developer ', + lineColor: Colors.black, + // descriptionColor: Colors.green, + titleColor: Colors.green, + ) + ]; + + + List userEducationList = const [ + TimelineModel( + id: "3", + title: "2020-2022f", + description: "software development companyf", + location: 'giza - egyptf', + hh: 'android developerf ', + lineColor: Colors.black, + // descriptionColor: Colors.green, + titleColor: Colors.green, + ), + TimelineModel( + id: "4", + title: "2018-2020f", + description: "eltawfeq companyf", + location: 'giza - egyptf', + hh: 'android developerf ', + lineColor: Colors.black, + // descriptionColor: Colors.red, + titleColor: Colors.indigo, + ), + + ]; + + ///=================================================================================================================== + ///=================================================================================================================== + ///=================================================================================================================== +/// User Layout + + List userscreens = [ + const UserHomeScreen(), + const UserNotificationsScreen(), + UserMessagesScreen(), + UserJobsScreen(), + ]; + + List UserChatUsers = [ + "Amit", + "Brem", + "Amer ", + "Akshat", + "Brain", + "John", + "Danish", + "Sam", + ]; + + + List UserImageLinks = [ + "assets/images/person1.png", + "assets/images/person2.png", + "assets/images/person3.png", + "assets/images/person4.png", + "assets/images/person5.png", + "assets/images/person6.png", + "assets/images/person7.png", + "assets/images/person8.png", + ]; + + +List UserChatTimes = [ + "12:00 PM", + "11:45 PM", + "10:00 PM", + "9:30 PM", + "9:00 PM", + "8:30 PM", + "8:15 PM", + "7:00 PM", + + ]; + +///============================================================================================ +///==================================== notification screen ========================================= +///============================================================================================ + + + List notificationsImageLinks = [ + "assets/images/person8.png", + "assets/images/person3.png", + "assets/images/person4.png", + "assets/images/person1.png", + "assets/images/person2.png", + "assets/images/person6.png", + "assets/images/person7.png", + "assets/images/person5.png", + ]; + + + + + ///============================================================================================ + ///==================================== company related screen ========================================= + ///============================================================================================ + + List companyRelatedPeopleNames = [ + "Asma Abram", + "Koshi Komar", + "Amer Khan", + "Akshat Sodi", + "Brain", + "John Micheal", + "Ahmed Ali ", + "Karan Danish", + ]; + + + List companyRelatedPeopleJobs = [ + "Web Designer", + "Flutter Developer", + "FullStack ", + "Front End", + "Game Developer", + "UI/UX Designer", + ]; + + + + ///empty String list + // var items = []; + // TextEditingController editingController = TextEditingController(); + // // final duplicateItems = List.generate(10000, (i) => "Item $i"); + // // List duplicateItems =['a', 'aa', 'aaa', 'aaaa', 'aaaaa']; + // //duplicateItems = UserChatUsers + // + // @override + // void initState() { + // items.addAll(UserChatUsers); + // } + // + // void filterSearchResults(String query) { + // List dummySearchList = []; + // dummySearchList.addAll(UserChatUsers); + // if(query.isNotEmpty) { + // List dummyListData = []; + // for (var item in dummySearchList) { + // if(item.contains(query)) { + // dummyListData.add(item); + // } + // } + // items.clear(); + // items.addAll(dummyListData); + // return; + // } else { + // items.clear(); + // items.addAll(UserChatUsers); + // + // } + // emit(CVUserUpdateChatState()); + // } + + int userCurrentBottomIndex = 0; + + void userChangeBottomNavBarIndex(int index) { + userCurrentBottomIndex = index; + emit(CVBottomNavState()); + } + + List UserBottomItems = const [ + BottomNavigationBarItem( + icon: Icon(Icons.home), + label: 'Home', + ), + BottomNavigationBarItem( + icon: Icon(Icons.notifications_active_sharp), + label: 'Notifications', + ), + BottomNavigationBarItem( + icon: Icon(Icons.message), + label: 'Messages', + ), + BottomNavigationBarItem( + icon: Icon(Icons.work_outlined), + label: 'Jobs', + ), + ]; + + ///========================================================================== +/// userJobsScreen + List userJobRecommendationList = [ + "Web Designer", + "Flutter Developer", + "FullStack Developer", + ]; + + + List userJobsLocationList = [ + "Cairo - Egypt", + "Jeddah - Saudi Arabia", + "Berlin - German", + ]; + + + +} diff --git a/lib/some_helpers/cubit/states.dart b/lib/some_helpers/cubit/states.dart new file mode 100644 index 0000000..1f29330 --- /dev/null +++ b/lib/some_helpers/cubit/states.dart @@ -0,0 +1,10 @@ +abstract class CVStates{} +class InitialState extends CVStates{} +class CurrentPageInWelcomeScreenState extends CVStates{} +class CVBottomNavState extends CVStates{} +class CVHomeState extends CVStates{} +class CVNotificationsState extends CVStates{} +class CVMessagesState extends CVStates{} +class CVEmailLaunch extends CVStates{} +class CVRatingUpdate extends CVStates{} +class CVUserBottomNavState extends CVStates{} diff --git a/lib/some_helpers/helpers/custom_error_screen.dart b/lib/some_helpers/helpers/custom_error_screen.dart new file mode 100644 index 0000000..0b2b1ed --- /dev/null +++ b/lib/some_helpers/helpers/custom_error_screen.dart @@ -0,0 +1,27 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:flutter/material.dart'; + +customErrorScreen() { + return ErrorWidget.builder = ((details) { + return Material( + child: Expanded( + child: Container( + color: Colors.white, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset('assets/images/error_image.png', fit: BoxFit.fitWidth), + const SizedBox(height: 20.0), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text(details.exception.toString(), + style: const TextStyle(color: kBasicColor,), textAlign: TextAlign.center, + ), + ) + ], + ), + ), + ), + ); + }); +} diff --git a/lib/some_helpers/helpers/pdf_api.dart b/lib/some_helpers/helpers/pdf_api.dart new file mode 100644 index 0000000..b02fe61 --- /dev/null +++ b/lib/some_helpers/helpers/pdf_api.dart @@ -0,0 +1,22 @@ +// import 'dart:io'; +// +// import 'package:firebase_storage/firebase_storage.dart'; +// +// class PDFApi{ +// static Future loadFirebase(String url) async{ +// final refPdf = FirebaseStorage.instance.ref().child(url); +// final bytes = await refPdf.getData(); +// return _storeFile(url, bytes!); +// } +// +// +// +// static Future _storeFile(String url, List bytes) async { +// String filename = basename(url); +// final dir = await getApplicationDocumentsDirectory(); +// +// final file = File('${dir.path}/$filename'); +// await file.writeAsBytes(bytes, flush: true); +// return file; +// } +// } \ No newline at end of file diff --git a/lib/layout/screens/get_started_screen.dart b/lib/some_helpers/start_modules/get_started_module/get_started_screen.dart similarity index 55% rename from lib/layout/screens/get_started_screen.dart rename to lib/some_helpers/start_modules/get_started_module/get_started_screen.dart index e03ec89..7648bd1 100644 --- a/lib/layout/screens/get_started_screen.dart +++ b/lib/some_helpers/start_modules/get_started_module/get_started_screen.dart @@ -1,6 +1,9 @@ - -import 'package:cvito/layout/widgets/basic_custom_button.dart'; -import 'package:cvito/layout/widgets/secondary_custom_button.dart'; +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/company/company_layout/company_layout.dart'; +import 'package:cvito/company/company_layout/custom_widgets/basic_custom_button.dart'; +import 'package:cvito/company/company_layout/custom_widgets/secondary_custom_button.dart'; +import 'package:cvito/user/user_layout/user_layout.dart'; +import 'package:cvito/utilities.dart'; import 'package:flutter/material.dart'; class GetStartedScreen extends StatelessWidget { @@ -9,6 +12,17 @@ class GetStartedScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + elevation: 0.0, + backgroundColor: Colors.white, + leading: IconButton( + color: kBasicColor, + onPressed: () { + Navigator.of(context).pop(); + }, + icon: const Icon(Icons.arrow_back)), + ), body: Center( child: SingleChildScrollView( physics: const BouncingScrollPhysics(), @@ -26,11 +40,17 @@ class GetStartedScreen extends StatelessWidget { const SizedBox(height: 30.0), Padding( padding: const EdgeInsets.all(20.0), - child: BasicCustomButton(text: 'Personal', function: () {}), + child: BasicCustomButton(text: 'Personal', function: () { + + navigateTo(context: context, widget: const UserLayoutScreen()); + }), ), Padding( padding: const EdgeInsets.only(bottom: 20.0), - child: SecondaryCustomButton(text: 'Company', function: () {}), + child: SecondaryCustomButton(text: 'Company', function: () { + navigateTo(context: context, widget: const CompanyLayoutScreen()); + + }), ) ], ), @@ -39,4 +59,4 @@ class GetStartedScreen extends StatelessWidget { ); } } -// buttonBorderAndTextColor: kBasicColor,buttonColor: Colors.white, + diff --git a/lib/layout/screens/splash_screen.dart b/lib/some_helpers/start_modules/splash_screen_module/splash_screen.dart similarity index 80% rename from lib/layout/screens/splash_screen.dart rename to lib/some_helpers/start_modules/splash_screen_module/splash_screen.dart index 0acd0d2..fd103ac 100644 --- a/lib/layout/screens/splash_screen.dart +++ b/lib/some_helpers/start_modules/splash_screen_module/splash_screen.dart @@ -1,6 +1,6 @@ import 'package:animated_splash_screen/animated_splash_screen.dart'; -import 'package:cvito/layout/screens/welcome_screen.dart'; import 'package:flutter/material.dart'; +import '../welcome_module/welcome_screen.dart'; class SplashScreen extends StatelessWidget { const SplashScreen({Key? key}) : super(key: key); @@ -10,9 +10,9 @@ class SplashScreen extends StatelessWidget { Widget build(BuildContext context) { return AnimatedSplashScreen( backgroundColor: Colors.white, - splashIconSize:180.0, + splashIconSize: 180.0, splash: Image.asset('assets/images/app_logo.png', fit: BoxFit.cover), - nextScreen: const WelcomeScreen(), + nextScreen: WelcomeScreen(), splashTransition: SplashTransition.scaleTransition, ); } diff --git a/lib/some_helpers/start_modules/welcome_module/welcome_screen.dart b/lib/some_helpers/start_modules/welcome_module/welcome_screen.dart new file mode 100644 index 0000000..5c3259d --- /dev/null +++ b/lib/some_helpers/start_modules/welcome_module/welcome_screen.dart @@ -0,0 +1,98 @@ +import 'package:cvito/company/company_layout/custom_widgets/basic_custom_button.dart'; +import 'package:cvito/company/company_layout/custom_widgets/intro_slider.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/some_helpers/start_modules/get_started_module/get_started_screen.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class WelcomeScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + return BlocProvider(create: (BuildContext context)=>CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + + ///cubit instance in builder of BlocProvider + CVCubit cubit = CVCubit.get(context); + return Scaffold( + ///white60 + backgroundColor: Colors.white, + body: SafeArea( + child: SizedBox( + width: double.infinity, + child: Column( + children: [ + Expanded( + flex: 3, + child: PageView.builder( + physics: const BouncingScrollPhysics(), + onPageChanged: (value) { + cubit.changeCurrentPage(value); + }, + itemCount: cubit.welcomeImages.length, + itemBuilder: (context, index) => IntroSliderContent( + title: cubit.welcomeImages[index]['title'], + description: cubit.welcomeImages[index]['description'], + imageLink: cubit.welcomeImages[index]['image'], + ), + ), + ), + Expanded( + flex: 2, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: getProportionateScreenWidth(20)), + child: Column( + children: [ + const Spacer(), + + ///=============================================== + ///swapping between images + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: List.generate( + cubit.welcomeImages.length, + + ///============================================ + ///slider + (index) => cubit.buildDot( + index: index, + ), + ), + ), + const Spacer( + flex: 2, + ), + + ///================================================= + /// start button + SizedBox( + child: BasicCustomButton( + text: 'Start', + function: () { + navigateTo( + context: context, widget: const GetStartedScreen()); + }), + ), + const Spacer() + ], + ), + ), + ) + ], + ), + ), + ), + ); + }, + ), + ); + } + + +} diff --git a/lib/user/user_layout/user_layout.dart b/lib/user/user_layout/user_layout.dart new file mode 100644 index 0000000..20450d8 --- /dev/null +++ b/lib/user/user_layout/user_layout.dart @@ -0,0 +1,37 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class UserLayoutScreen extends StatelessWidget { + static const String id = 'WelcomeScreen'; + + const UserLayoutScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + var cubit = CVCubit.get(context); + return Scaffold( + backgroundColor: Colors.white, + body: cubit.userscreens[cubit.userCurrentBottomIndex], + bottomNavigationBar: BottomNavigationBar( + unselectedItemColor: const Color(0xff828282), + selectedItemColor: kBasicColor, + currentIndex: cubit.userCurrentBottomIndex, + onTap: (int value) { + cubit.userChangeBottomNavBarIndex(value); + }, + type: BottomNavigationBarType.fixed, + items: cubit.UserBottomItems, + ), + ); + }, + )); + } +} diff --git a/lib/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_home_screen_module/user_home_screen.dart b/lib/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_home_screen_module/user_home_screen.dart new file mode 100644 index 0000000..ff33378 --- /dev/null +++ b/lib/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_home_screen_module/user_home_screen.dart @@ -0,0 +1,439 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/company/company_layout/custom_widgets/custom_card.dart'; +import 'package:cvito/company/company_layout/custom_widgets/default_form_field.dart'; +import 'package:cvito/some_helpers/start_modules/get_started_module/get_started_screen.dart'; +import 'package:cvito/user/user_layout/user_modules/user_create_cv_module/user_create_cv_screen.dart'; +import 'package:cvito/user/user_layout/user_modules/user_user_profile_screen/user_user_profile_screen.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; + +class UserHomeScreen extends StatelessWidget { + const UserHomeScreen({Key? key}) : super(key: key); + static const String id = 'WelcomeScreen'; + + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + TextEditingController searchController = TextEditingController(); + GlobalKey _scaffoldKey = GlobalKey(); + return Scaffold( + drawer: Drawer( + child: ListView( + children: [ + Container( + padding: const EdgeInsets.all(10.0), + color: kBasicColor, + width: MediaQuery.of(context).size.width, + height: 150, + child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + InkWell( + onTap: (){ + navigateTo(context: context, widget: UserUserProfileScreen(jobTitle: 'Web', jobLocation: 'Cairo',)); + }, + child:const CircleAvatar( + backgroundImage: + AssetImage('assets/images/profile_photo.png'), + backgroundColor: Colors.white, + radius: 30, + ), + ), + const SizedBox(width: 15.0,), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: const[ + Text( + 'user name', + style: TextStyle(fontSize: 18.0, color: Colors.white), + ), + Text( + 'username@gmail.com', + style: TextStyle(fontSize: 15.0, color: Colors.white70 + ), + ), + ], + ), + ], + ), + ), + Align( + alignment: Alignment.center, + child: ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 15.0), + title: InkWell( + onTap: (){ + navigateTo(context: context, widget: UserUserProfileScreen(jobTitle: 'Web Development', jobLocation: 'Cairo - Egypt',)); + }, + child: const Text( + 'View Profile', + style: TextStyle(color: kBasicColor), + ), + ), + ), + ), + const Divider( + thickness: 1.0, + color: Colors.grey, + endIndent: 10.0, + indent: 10.0, + ), + Container( + padding: const EdgeInsets.symmetric( + vertical: 20.0, horizontal: 15.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomDrawerRow( + labelText: 'My CVs', + labelIcon: Icons.file_copy, + function: () {}, + ), + const SizedBox(height: 25.0), + CustomDrawerRow( + labelText: 'Certificates', + labelIcon: Icons.check_box_sharp, + function: () {}, + ), + const SizedBox(height: 25.0), + CustomDrawerRow( + labelText: 'Saved', + labelIcon: Icons.bookmark, + function: () {}, + ), + ], + ), + ), + const Divider( + thickness: 1.0, + color: Colors.grey, + endIndent: 10.0, + indent: 10.0, + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 20.0, horizontal: 15.0), + child: CustomDrawerRow( + labelText: 'Help Centre', + labelIcon: Icons.help_outlined, + function: () {}, + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 15.0), + child: CustomDrawerRow( + function: () { + navigateTo(context: context, widget: GetStartedScreen()); + }, + labelIcon: Icons.logout, + labelText: 'Logout'), + ), + ], + ), + ), + key: _scaffoldKey, + floatingActionButton: FloatingActionButton( + backgroundColor: kBasicColor, + onPressed: () { + navigateTo(context: context, widget: const UserCreateCVScreen()); + }, + child: const Icon( + Icons.add, + color: Colors.white, + ), + ), + backgroundColor: Colors.white, + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Builder(builder: (context) { + return InkWell( + child: CircleAvatar( + radius: 25, + child: Image.asset('assets/images/profile_photo.png'), + ), + onTap: () { + print( + '===================================================='); + //TODO IMPLEMENT THE FUNCTION HERE + _scaffoldKey.currentState?.openDrawer(); + }, + ); + }), + SizedBox(width: MediaQuery.of(context).size.width / 20), + + ///================================================================================================= + ///search bar + Expanded( + child: defaultTextFormField( + controller: searchController, + type: TextInputType.text, + onChanged: () {}, + label: "Search", + prefix: Icons.search), + ), + ], + ), + // Spacer(), + + ///================================================================================================= + /// Create a job-Winning text + Container( + padding: const EdgeInsets.fromLTRB(15, 15, 0, 0), + width: SizeConfig.screenWidth, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text( + "Create a job-Winning \nResume in minutes!.", + style: TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w500), + ), + ], + ), + const Spacer(), + const Expanded( + child: Image( + image: AssetImage( + 'assets/images/create job winning.png', + ), + height: 70, + )) + ], + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5.0), + ), + ), + + ///================================================================================================= + ///cards + Row( + children: [ + CustomCard( + imageLink: 'assets/images/create_your_cv.png', + function: () { + navigateTo( + context: context, + widget: const UserCreateCVScreen()); + }, + ), + const SizedBox(width: 10), + CustomCard( + imageLink: 'assets/images/edit_your_extend_cv.png') + ], + ), + + ///================================================================================================= + ///Row of ...Recent, arrow + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + const Text( + 'Recent', + style: TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.bold, + fontSize: 20), + ), + const Spacer(), + TextButton( + onPressed: () { + //TODO IMPLEMENT THE FUNCTION HERE + }, + child: const Icon( + Icons.arrow_forward_ios_sharp, + color: kBasicColor, + )) + ], + ), + ), + + ///================================================================================================= + ///Recent + Row( + children: [ + Expanded( + child: GestureDetector( + onTap: () { + showModalBottomSheet( + enableDrag: false, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(25), + ), + ), + context: context, + builder: (context) => buildSheet(context)); + }, + child: Container( + alignment: Alignment.topCenter, + width: MediaQuery.of(context).size.width / 2, + height: MediaQuery.of(context).size.height / 2, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20.0)), + child: Image.asset( + 'assets/images/my_cv1.png', + fit: BoxFit.contain, + ), + ), + ), + ), + const SizedBox(width: 20.0), + Expanded( + child: GestureDetector( + onTap: () { + showModalBottomSheet( + enableDrag: false, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(25), + ), + ), + context: context, + builder: (context) => buildSheet(context)); + }, + child: Container( + alignment: Alignment.topCenter, + width: MediaQuery.of(context).size.width / 2, + height: MediaQuery.of(context).size.height / 2, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20.0)), + child: Image.asset( + 'assets/images/my_cv1.png', + fit: BoxFit.contain, + ), + ), + ), + ), + ], + ), + ], + ), + ), + ), + ), + ); + } + + Widget buildSheet(BuildContext context) => Container( + padding: const EdgeInsets.only(left: 40.0), + height: MediaQuery.of(context).size.height / 3, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + const Spacer(), + BottomSheetRow( + icon: Icons.download, + iconLabel: 'Download', + function: () { + debugPrint('download'); + }, + ), + const Spacer(), + BottomSheetRow( + icon: Icons.share_outlined, + iconLabel: 'Share', + function: () { + debugPrint('share'); + }, + ), + const Spacer(), + BottomSheetRow( + icon: Icons.delete, + iconLabel: 'Delete', + function: () { + debugPrint('delete'); + }, + ), + const Spacer(), + ], + ), + ); +} + +class CustomDrawerRow extends StatelessWidget { + VoidCallback? function; + String? labelText; + IconData? labelIcon; + + CustomDrawerRow( + {required this.function, + required this.labelIcon, + required this.labelText}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: function, + child: Row( + children: [ + Icon( + labelIcon, + color: Colors.grey, + size: 28.0, + ), + const SizedBox( + width: 10.0, + ), + Text( + labelText!, + style: const TextStyle(fontSize: 15.0), + ), + ], + ), + ); + } +} + +class BottomSheetRow extends StatelessWidget { + IconData? icon; + String? iconLabel; + VoidCallback? function; + + BottomSheetRow( + {required this.icon, required this.iconLabel, required this.function}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + //TODO IMPLEMENT THIS FUNCTION HERE + onTap: function, + + child: Row( + children: [ + Icon( + icon, + size: 20.0, + ), + const SizedBox( + width: 30.0, + ), + Text( + iconLabel!, + style: const TextStyle(fontSize: 20.0), + ), + ], + ), + ); + } +} diff --git a/lib/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_jobs_screen_module/user_jobs_screen.dart b/lib/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_jobs_screen_module/user_jobs_screen.dart new file mode 100644 index 0000000..1a2b43c --- /dev/null +++ b/lib/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_jobs_screen_module/user_jobs_screen.dart @@ -0,0 +1,229 @@ +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/company/company_layout/custom_widgets/default_form_field.dart'; +import 'package:cvito/user/user_layout/user_modules/user_job_details_screen.dart'; +import 'package:cvito/user/user_layout/user_modules/user_software_company_module/user_software_company_screen.dart'; +import 'package:cvito/user/user_layout/user_modules/user_user_profile_screen/user_user_profile_screen.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class UserJobsScreen extends StatelessWidget { + TextEditingController relatedSearchController = TextEditingController(); + TextEditingController searchController = TextEditingController(); + final GlobalKey _scaffoldKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + return Scaffold( + drawer: const Drawer(), + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + // maintainBottomViewPadding: true, + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Builder(builder: (context) { + return InkWell( + child: CircleAvatar( + radius: 25, + child: Image.asset('assets/images/profile_photo.png'), + ), + onTap: () { + navigateTo(context: context, widget: UserUserProfileScreen(jobTitle: 'Web Development', jobLocation: 'Cairo - Egypt')); + print( + '===================================================='); + //TODO IMPLEMENT THE FUNCTION HERE + _scaffoldKey.currentState?.openDrawer(); + }, + ); + }), + SizedBox(width: MediaQuery.of(context).size.width / 20), + + ///================================================================================================= + ///search bar + Expanded( + child: defaultTextFormField( + controller: searchController, + type: TextInputType.text, + onChanged: () {}, + label: "Search", + prefix: Icons.search), + ), + ], + ), + const SizedBox(height: 35.0), + + ///===================================================================================================== + /// Recommended For You + const Text( + 'Recommended For You', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: 18.0), + ), + const SizedBox(height: 15.0), + BlocProvider( + create: (BuildContext context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit.get(context); + return ListView.separated( + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return ListTile( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), + side: const BorderSide( + color: Colors.black45, width: 1), + ), + contentPadding: const EdgeInsets.symmetric( + vertical: 15.0, horizontal: 5.0), + + leading: CircleAvatar( + radius: 30, + backgroundImage: AssetImage( + cubit.notificationsImageLinks[index]), + ), + // horizontalTitleGap: 5.0, + title: Padding( + padding: const EdgeInsets.only(bottom: 5.0), + child: InkWell( + onTap: (){ + navigateTo(context: context, widget: UserJobDetailsScreen(jobTitle: cubit.userJobRecommendationList[index],)); + }, + child: Text( + cubit.userJobRecommendationList[index]), + ), + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + InkWell( onTap: (){ + navigateTo(context: context, widget: UserSoftwareCompanyScreen()); + }, + child: const Text('Software Company')), + Text( + cubit.userJobsLocationList[index]), + ], + ), + // trailing: + // const Icon(Icons.bookmark_border_outlined), + ); + }, + separatorBuilder: + (BuildContext context, int index) { + return const SizedBox(height: 10.0); + }, + itemCount: 3); + }, + )), + + ///================================================================================================ + /// Matched with your profile + const SizedBox(height: 35.0), + const Text( + 'Matched with your profile', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: 18.0), + ), + const SizedBox(height: 15.0), + BlocProvider( + create: (BuildContext context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit.get(context); + return ListView.separated( + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return ListTile( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), + side: const BorderSide( + color: Colors.black45, width: 1), + ), + contentPadding: const EdgeInsets.symmetric( + vertical: 15.0, horizontal: 5.0), + leading: CircleAvatar( + radius: 30, + backgroundImage: AssetImage( + cubit.UserImageLinks[index]), + ), + title: Padding( + padding: const EdgeInsets.only(bottom: 5.0), + child: Text( + cubit.userJobRecommendationList[index]), + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text('Software Company'), + Text( + cubit.userJobsLocationList[index]), + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Row( + children: [ + Container( + // color: Colors.amber, + padding: const EdgeInsets.all(5.0), + child: Stack( + children: const[ + CircleAvatar( + radius: 15, + backgroundImage: AssetImage( + 'assets/images/profile_photo.png'), + ), + Positioned( + bottom: -1.0, + right: -1.0, + child: Icon(Icons.check_circle, size: 9.0, color: Colors.green, )) + ], + ), + ), + const SizedBox(width: 5.0,), + const Expanded( + child: Text( + 'Your profile matches this job', + style: TextStyle( + fontSize: 12.0, ), + maxLines: 2, + )), + ], + ), + ), + ], + ), + // trailing: + // const Icon(Icons.bookmark_border_outlined), + ); + }, + separatorBuilder: + (BuildContext context, int index) { + return const SizedBox(height: 10.0); + }, + itemCount: 3); + }, + )), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_messages_screen_module/user_messages_screen.dart b/lib/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_messages_screen_module/user_messages_screen.dart new file mode 100644 index 0000000..3492b61 --- /dev/null +++ b/lib/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_messages_screen_module/user_messages_screen.dart @@ -0,0 +1,171 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/company/company_layout/custom_widgets/custom_list_tile_messages.dart'; +import 'package:cvito/company/company_layout/custom_widgets/custom_top_bar.dart'; +import 'package:cvito/company/company_layout/custom_widgets/default_form_field.dart'; +import 'package:cvito/user/user_layout/user_modules/user_user_profile_screen/user_user_profile_screen.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; + +class UserMessagesScreen extends StatelessWidget { + + TextEditingController messagesSearchController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + maintainBottomViewPadding: true, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///============================================================= + ///chats bar + CustomTopBar( + title: 'Chats', + imageLink: 'assets/images/profile_photo.png', + color: kCustomBlack, + function: () { + navigateTo(context: context, widget: UserUserProfileScreen(jobTitle: 'Web Development', jobLocation: 'Cairo - Egypt',)); + } , + ), + + ///============================================================= + ///search bar + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, vertical: 16.0), + child: defaultTextFormField( + controller: messagesSearchController, + type: TextInputType.text, + onChanged: () {}, + label: 'Search', + prefix: Icons.search), + ), + + ///============================================================= + ///unread messages number + + /* const Padding( + padding: + EdgeInsets.symmetric(horizontal: 20.0, vertical: 15.0), + child: Text.rich( + TextSpan( + text: 'Unread ', + style: TextStyle( + fontSize: 16, + color: Colors.blue, + fontWeight: FontWeight.bold), + children: [ + TextSpan( + text: '(2)', + style: TextStyle( + fontWeight: FontWeight.w600, color: Colors.red), + ), + ])), + ),*/ + + ///============================================================= + ///list tiles for chats + BlocProvider( + create: (BuildContext context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit.get(context); + return ListView.separated( + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: 7, + itemBuilder: (context, index) { + return Slidable( + key: ValueKey(index), + child: CustomListTileMessages( + user: cubit.UserChatUsers[index], + imageLink: cubit.UserImageLinks[index], + chatTime: cubit.UserChatTimes[index], + ), + + /// start actions swap to right + startActionPane: ActionPane( + dismissible: DismissiblePane( + onDismissed: () { + cubit.deleteChatItem(context, index); + }, + ), + extentRatio: 0.5, + motion: const StretchMotion(), + children: [ + // A SlidableAction can have an icon and/or a label. + + ///================================================= + ///delete + SlidableAction( + onPressed: (BuildContext context) { + debugPrint('delete'); + }, + backgroundColor: const Color(0xFFFE4A49), + foregroundColor: Colors.white, + icon: Icons.delete, + label: 'Delete', + ), + + SlidableAction( + onPressed: (BuildContext context) { + ScaffoldMessenger.of(context) + .showSnackBar( + SnackBar( + content: Text( + 'the ${cubit.UserChatUsers[index]} chat is muted'), + duration: + const Duration(seconds: 1), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(10)))), + ); + debugPrint('mute'); + }, + backgroundColor: Colors.blue, + foregroundColor: Colors.white, + icon: Icons.volume_off, + label: 'Mute', + ), + ], + ), + ); + }, + separatorBuilder: (context, index) { + return const SizedBox(); + }); + }, + )), + ], + ), + ), + ), + + ///======================================================================= + ///edit button + floatingActionButton: SizedBox( + width: 50.0, + height: 50.0, + child: FloatingActionButton( + backgroundColor: kBasicColor, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)), + onPressed: () {}, + child: const Icon( + Icons.edit_outlined, + size: 25, + ), + ), + ), + ); + } +} diff --git a/lib/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_notification_screen_module/user_notification_screen.dart b/lib/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_notification_screen_module/user_notification_screen.dart new file mode 100644 index 0000000..cd20fe7 --- /dev/null +++ b/lib/user/user_layout/user_modules/user_bottom_navigation_bar_module/user_notification_screen_module/user_notification_screen.dart @@ -0,0 +1,116 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/company/company_layout/custom_widgets/custom_list_tile_notifications.dart'; +import 'package:cvito/company/company_layout/custom_widgets/custom_top_bar.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/user/user_layout/user_modules/user_user_profile_screen/user_user_profile_screen.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class UserNotificationsScreen extends StatelessWidget { + const UserNotificationsScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + child: Stack( + children: [ + Container( + color: kBasicColor, + width: double.infinity, + height: MediaQuery.of(context).size.height / 3, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///=========================================================== + /// notification section + CustomTopBar( + imageLink: 'assets/images/profile_photo.png', + title: 'Notifications', + color: Colors.white, + function: () { + navigateTo( + context: context, + widget: UserUserProfileScreen( + jobTitle: 'Web Development', + jobLocation: 'Cairo - Egypt', + + )); + }, + ), + const Padding( + padding: EdgeInsets.fromLTRB(16, 16, 16, 32), + child: Text( + 'Today', + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + fontWeight: FontWeight.w500), + ), + ), + + ///============================================================= + /// Today notifications + BlocProvider( + create: (BuildContext context)=>CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit.get(context); + return ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + scrollDirection: Axis.vertical, + itemCount: 6, + itemBuilder: (context, index) { + return CustomListTileNotifications(notificationTime: cubit.UserChatTimes[index],notificationImages: cubit.notificationsImageLinks[index] ,); + }, + separatorBuilder: (context, index) { + return const SizedBox(); + }); + }, + ), + ), + + + + ///=========================================================== + ///Yesterday text + const Padding( + padding: EdgeInsets.all(16.0), + child: Text( + 'Yesterday', + style: TextStyle( + color: Colors.grey, + fontSize: 20.0, + fontWeight: FontWeight.w500), + ), + ), + + ///=========================================================== + /// Yesterday notifications + ListView.separated( + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: 1, + itemBuilder: (context, index) { + return CustomListTileNotifications(notificationTime: '7:00 AM', notificationImages: 'assets/images/person1.png',); + }, + separatorBuilder: (context, index) { + return const SizedBox(); + }), + ], + ), + ], + ), + ), + ) + ); + } +} diff --git a/lib/user/user_layout/user_modules/user_create_cv_module/building_manual_cv/create_template.dart b/lib/user/user_layout/user_modules/user_create_cv_module/building_manual_cv/create_template.dart new file mode 100644 index 0000000..3f09389 --- /dev/null +++ b/lib/user/user_layout/user_modules/user_create_cv_module/building_manual_cv/create_template.dart @@ -0,0 +1,194 @@ +import 'package:cvito/user/user_layout/user_layout.dart'; +import 'package:cvito/user/user_layout/user_modules/user_create_cv_module/building_manual_cv/my_text_field.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; +import 'template_model.dart'; + +class CreateTemplate extends StatefulWidget { + @override + State createState() => _CreateTemplateState(); +} + +class Content { + bool cipher = false; + var iconColor = Colors.green; + + var str = ""; + var nav = GlobalKey(); + + void show(String str) { + var context = nav.currentState!.overlay!.context; + var dialog = AlertDialog( + content: Text(str), + ); // AlertDialog + showDialog(context: context, builder: (x) => dialog); + } +} + +TextEditingController txtControllerName = TextEditingController(); +TextEditingController txtControllerTelephoneNumber = TextEditingController(); +TextEditingController txtControllerEmail = TextEditingController(); + +TextEditingController txtControllerExperience = TextEditingController(); +TextEditingController txtControllerSkills = TextEditingController(); +TextEditingController txtControllerEducation = TextEditingController(); +var list2 = []; + +getList() { + var list = [ + Container( + margin: const EdgeInsets.all(10.0), + child: Column( + children: [ + const Center( + child: Text( + 'Resume Info', + style: TextStyle( + fontSize: 25.0, + color: Colors.blue, + fontWeight: FontWeight.bold), + )), + MyTextField( + controller: txtControllerName, + labelName: 'Name', + hint: 'Enter Your Name', + textType: TextInputType.text, + icon: Icons.person, + iconColor: Colors.blue, + ), + MyTextField( + controller: txtControllerTelephoneNumber, + labelName: 'Telephone Number', + hint: 'Enter Your Telephone Number', + textType: TextInputType.text, + icon: Icons.opacity, + iconColor: Colors.blue, + ), + MyTextField( + controller: txtControllerEmail, + labelName: 'Email', + hint: 'Enter Your Education Email', + textType: TextInputType.text, + icon: Icons.email_outlined, + iconColor: Colors.blue, + ), + MyTextField( + controller: txtControllerExperience, + labelName: 'Experience', + hint: 'Enter Your Experience', + textType: TextInputType.text, + icon: Icons.info_outline, + iconColor: Colors.blue, + ), + MyTextField( + controller: txtControllerSkills, + labelName: 'Skills', + hint: 'Enter Your Skills', + textType: TextInputType.text, + icon: Icons.sports_hockey, + iconColor: Colors.blue, + ), + MyTextField( + controller: txtControllerEducation, + labelName: 'Education', + hint: 'Enter Your Education', + textType: TextInputType.text, + icon: Icons.school_outlined, + iconColor: Colors.blue, + ), + ], + ), + ), + Column( + children: list2, + ), + ]; + return list; +} + +class _CreateTemplateState extends State { + var c; + + CreateTemplate(content) { + c = content; + c.getList(); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + debugShowCheckedModeBanner: false, + home: Scaffold( + body: SafeArea( + child: Padding( + padding: const EdgeInsets.all(10.0), + child: SingleChildScrollView( + child: Column(children: getList()), + ), + ), + ), + // floatingActionButton: + // Row(mainAxisAlignment: MainAxisAlignment.end, children: [ + // FloatingActionButton( + // onPressed: () => {}, + // child: Icon(Icons.navigate_before_rounded), + // heroTag: "fab1", + // ), + // FloatingActionButton( + // onPressed: () => {}, + // child: Icon(Icons.navigate_next_rounded), + // heroTag: "fab2", + // ), + // ]) + + floatingActionButton: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + FloatingActionButton( + child: Icon(Icons.done_outline_rounded), + onPressed: () { + setState(() { + list2.add(People( + name: txtControllerName.text, + telephoneNumber: txtControllerTelephoneNumber.text, + email: txtControllerEmail.text, + experience: txtControllerExperience.text, + skills: txtControllerSkills.text, + education: txtControllerEducation.text, + ).getTemplate()); + }); + }, + ), + const SizedBox(width: 10.0), + FloatingActionButton( + child: const Icon(Icons.arrow_forward_ios_sharp), + onPressed: () { + navigateTo(context: context, widget: const UserLayoutScreen()); + }, + + + + ), + ], + )), + ); + } +} +// +// floatingActionButton: FloatingActionButton.extended( +// label: const Text('Submit'), +// onPressed: () { +// setState(() { +// list2.add(People( +// name: txtControllerName.text, +// telephoneNumber: txtControllerTelephoneNumber.text, +// email: txtControllerEmail.text, +// experience: txtControllerExperience.text, +// skills: txtControllerSkills.text, +// education: txtControllerEducation.text, +// ) +// .getTemplate()); +// }); +// }, +// ), diff --git a/lib/user/user_layout/user_modules/user_create_cv_module/building_manual_cv/my_text_field.dart b/lib/user/user_layout/user_modules/user_create_cv_module/building_manual_cv/my_text_field.dart new file mode 100644 index 0000000..f0e857b --- /dev/null +++ b/lib/user/user_layout/user_modules/user_create_cv_module/building_manual_cv/my_text_field.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +class MyTextField extends StatelessWidget { + var controller = TextEditingController(); + String labelName; + String hint; + IconData icon; + Color iconColor; + TextInputType textType; + + MyTextField( + {required this.controller, + required this.labelName, + required this.hint, + required this.icon, + required this.iconColor, + required this.textType, + }); + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + child: TextField( + controller: controller, + decoration: InputDecoration( + labelText: labelName, + hintText: hint, + hintStyle: const TextStyle(fontSize: 20), + labelStyle: const TextStyle(fontSize: 25), + icon: Icon( + icon, + color: iconColor, + ) + + ), + keyboardType: textType, + ) // Input Decoration,TextField + ); // Container + } +} diff --git a/lib/user/user_layout/user_modules/user_create_cv_module/building_manual_cv/template_model.dart b/lib/user/user_layout/user_modules/user_create_cv_module/building_manual_cv/template_model.dart new file mode 100644 index 0000000..811bb5c --- /dev/null +++ b/lib/user/user_layout/user_modules/user_create_cv_module/building_manual_cv/template_model.dart @@ -0,0 +1,177 @@ +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; + +class People { + String? name; + String? telephoneNumber; + String? email; + String? experience; + String? skills; + String? education; + + People( + {required this.name, + required this.telephoneNumber, + required this.email, + required this.experience, + required this.skills, + this.education}); + + Widget myText(var text) { + return Expanded( + child: Text( + text, + style: const TextStyle(fontSize: 20.0), + maxLines: 2, + overflow: TextOverflow.clip, + softWrap: true, + ), + ); + } + + getTemplate() { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(3.0), + border: Border.all(width: 2.0, color: Colors.blue)), + + + child: SizedBox( + width: 500, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Table( + textDirection: TextDirection.ltr, + defaultVerticalAlignment: TableCellVerticalAlignment.bottom, + children: [ + TableRow(children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Name :', + style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: GestureDetector( + child: Text( + name!, + textAlign: TextAlign.left, + style: const TextStyle( + color: Colors.black87, + ), + ), + ), + ), + ]), + TableRow(children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Telephone Number:', + style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + telephoneNumber!, + style: const TextStyle(color: Colors.black), + ), + ), + ]), + TableRow(children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Email :', + style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + email!, + style: const TextStyle(color: Colors.black), + ), + ), + ]), + TableRow(children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Experience :', + style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + experience!, + style: const TextStyle(color: Colors.black), + ), + ), + ]), + TableRow(children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'skills :', + style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + skills!, + style: const TextStyle(color: Colors.black), + ), + ), + ]), + TableRow(children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Education :', + style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + education!, + style: const TextStyle(color: Colors.black), + ), + const SizedBox( + height: 5.0, + ), + ], + ), + ), + ]), + ], + ), + ), + )); + } + + Widget templateRow({required String label, required String labelValue}) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 10.0), + child: Row( + children: [ + Text('$label : ', + style: + const TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold)), + myText( + labelValue, + ), + ], + ), + ); + } +} diff --git a/lib/user/user_layout/user_modules/user_create_cv_module/user_create_cv_screen.dart b/lib/user/user_layout/user_modules/user_create_cv_module/user_create_cv_screen.dart new file mode 100644 index 0000000..05cfbb2 --- /dev/null +++ b/lib/user/user_layout/user_modules/user_create_cv_module/user_create_cv_screen.dart @@ -0,0 +1,203 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/user/user_layout/user_layout.dart'; +import 'package:cvito/user/user_layout/user_modules/user_create_cv_module/building_manual_cv/create_template.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; + +class UserCreateCVScreen extends StatelessWidget { + const UserCreateCVScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + return Scaffold( + body: SingleChildScrollView( + child: SafeArea( + child: Padding( + padding: const EdgeInsets.only(left: 20.0, top: 15.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + IconButton( + onPressed: () { + navigateTo( + context: context, widget: const UserLayoutScreen()); + }, + icon: const Icon(Icons.arrow_back), + ), + const Text( + 'Create A CV ', + style: TextStyle( + fontSize: 23.0, + fontWeight: FontWeight.bold, + color: kCustomBlack), + ), + ], + ), + SizedBox(height: getProportionateScreenHeight(25.0)), + const Text('Select your Field!', + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 20.0, + color: kCustomBlack)), + SizedBox(height: getProportionateScreenHeight(20.0)), + + ///========================================================================================== + /// select your field + SizedBox( + height: getProportionateScreenHeight(220), + width: MediaQuery.of(context).size.width, + child: ListView( + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.horizontal, + children: [ + CustomCardField( + imageLink: + 'assets/images/technical_or_general.png'), + CustomCardField( + imageLink: 'assets/images/medical_field.png'), + CustomCardField( + imageLink: 'assets/images/graphic_design.png'), + ], + )), + const SizedBox( + height: 20.0, + ), + const Text('CVs', + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 20.0, + color: kCustomBlack)), + const SizedBox(height: 10), + + ///====================================================================================== + ///CVs + Padding( + //todo create your cv important to fix + padding: const EdgeInsets.only(right: 20.0), + child: Container( + height: getProportionateScreenHeight(290), + padding: const EdgeInsets.only(right: 20.0), + child: Row( + children: [ + Expanded( + child: SizedBox( + width: MediaQuery.of(context).size.width / 2, + child: Image.asset('assets/images/a_automated.png', + fit: BoxFit.cover), + ), + ), + SizedBox(width: getProportionateScreenWidth(15.0)), + Expanded( + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => CreateTemplate()), + ); + }, + child: SizedBox( + width: MediaQuery.of(context).size.width / 2, + child: Image.asset( + 'assets/images/m_manual.png', + fit: BoxFit.cover, + ), + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +class BuildSheet extends StatelessWidget { + const BuildSheet({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), + height: MediaQuery.of(context).size.height / 2, + child: SingleChildScrollView( + child: Column( + // mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Center( + child: Container( + width: 100.0, + height: 7.0, + decoration: BoxDecoration( + color: kCustomBlack, + borderRadius: BorderRadius.circular(10.0)), + )), + const SizedBox(height: 20.0), + const Text('Opened Categories', + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 18.0, + color: kCustomBlack)), + const SizedBox(height: 20.0), + Row( + children: [ + Expanded( + child: SizedBox( + width: MediaQuery.of(context).size.width / 2, + child: Image.asset( + 'assets/images/professional.png', + fit: BoxFit.cover, + ), + ), + ), + const SizedBox(width: 20.0), + Expanded( + child: SizedBox( + width: MediaQuery.of(context).size.width / 2, + child: Image.asset( + 'assets/images/modern.png', + fit: BoxFit.cover, + ), + ), + ), + ], + ), + ], + ), + ), + ); + } +} + +class CustomCardField extends StatelessWidget { + String? imageLink; + + CustomCardField({required this.imageLink}); + + @override + Widget build(BuildContext context) { + return InkWell( + child: Image.asset(imageLink!), + onTap: () { + showModalBottomSheet( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(25), + ), + ), + context: context, + builder: (context) => const BuildSheet()); + }, + ); + } +} diff --git a/lib/user/user_layout/user_modules/user_job_details_screen.dart b/lib/user/user_layout/user_modules/user_job_details_screen.dart new file mode 100644 index 0000000..faff379 --- /dev/null +++ b/lib/user/user_layout/user_modules/user_job_details_screen.dart @@ -0,0 +1,184 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/company/company_layout/custom_widgets/basic_custom_button.dart'; +import 'package:flutter/material.dart'; + +class UserJobDetailsScreen extends StatelessWidget { + String? jobTitle; + + UserJobDetailsScreen({required this.jobTitle}); + + List levels = [ + 'Full-time . Entry-level', + 'part-time . inter-level', + 'Full-time . Advanced-level', + ]; + + List icons = [ + Icons.shopping_bag, + Icons.calendar_today_rounded, + Icons.check_circle + ]; + + List colors = [Colors.grey, Colors.grey, Colors.green]; + + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + // getProportionateScreenHeight + // getProportionateScreenWidth + + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + IconButton( + icon: const Icon(Icons.arrow_back), + color: kCustomBlack, + onPressed: () { + Navigator.pop(context); + //TODO implement function + }), + SizedBox(width: getProportionateScreenWidth(20.0)), + const Text('Job Details', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.w600, + color: kCustomBlack)), + const SizedBox(height: 80.0), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(jobTitle!, + style: const TextStyle( + fontSize: 20.0, + color: kCustomBlack, + fontWeight: FontWeight.w500)), + SizedBox(width: getProportionateScreenWidth(20.0)), + // const Icon(Icons.more_vert) + ], + ), + SizedBox(height: getProportionateScreenHeight(30.0)), + Row( + children: [ + const CircleAvatar( + backgroundColor: kBasicColor, + radius: 25, + backgroundImage: + AssetImage('assets/images/company.png')), + SizedBox(width: getProportionateScreenWidth(15.0)), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text('Software Company'), + Text('Staffing & Recruiting.Cairo'), + ], + ), + ], + ), + SizedBox(height: getProportionateScreenHeight(30.0)), + Padding( + padding: const EdgeInsets.only(left: 40.0), + child: SizedBox( + height: 150, + child: ListView.separated( + physics: const BouncingScrollPhysics(), + itemBuilder: (context, index) { + return Row( + children: [ + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Icon( + icons[index], + color: colors[index], + ), + ), + Text(levels[index]), + ], + ); + }, + separatorBuilder: (context, index) { + return SizedBox( + height: getProportionateScreenHeight(30.0), + ); + }, + itemCount: 3), + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20.0, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: BasicCustomButton( + text: 'Apply', + function: () { + showDialog( + context: context, + builder: (context) => const AlertDialog( + contentPadding: EdgeInsets.symmetric( + horizontal: 30.0, vertical: 45.0), + title: Icon( + Icons.check_circle, + color: Colors.green, + size: 40, + ), + content: Text( + 'Your application was sent successfully!', + style: TextStyle(fontSize: 16.0), + textAlign: TextAlign.center, + ), + )); + }, + ), + ), + // SecondaryCustomButton(text: 'Save', function: () {}) + ], + ), + ), + const SizedBox(height: 35.0), + const Text( + 'Job Description', + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 20.0, + color: kCustomBlack), + ), + const SizedBox(height: 10.0), + const Text( + '''Envision Employment Solutions is currently on the look for a UI/UX Product Designer for one of our clients, a multinational e-commerce company. ''', + style: TextStyle(color: kCustomBlack), + ), + const SizedBox(height: 25.0), + const Text( + 'Job Summary', + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 20.0, + color: kCustomBlack), + ), + const SizedBox(height: 10.0), + const Text( + '''Our partner is looking for an experienced and creative UI/UX Designer to join their team! The UI/UX designer. ''', + style: TextStyle(color: kCustomBlack), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/user/user_layout/user_modules/user_software_company_module/user_software_company_screen.dart b/lib/user/user_layout/user_modules/user_software_company_module/user_software_company_screen.dart new file mode 100644 index 0000000..4c42871 --- /dev/null +++ b/lib/user/user_layout/user_modules/user_software_company_module/user_software_company_screen.dart @@ -0,0 +1,193 @@ +import 'dart:io'; +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/company/company_layout/custom_widgets/transparent_icon.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:image_picker/image_picker.dart'; +import 'user_tab_bar_company_screen/user_tab_about_company_screen.dart'; +import 'user_tab_bar_company_screen/user_tab_home_company_screen.dart'; +import 'user_tab_bar_company_screen/user_tab_jobs_company_screen.dart'; + +/// for multi provider TickerProviderStateMixin +/// for single provider SingleTickerProviderStateMixin + +class UserSoftwareCompanyScreen extends StatefulWidget { + @override + State createState() => + _UserSoftwareCompanyScreenState(); +} + +class _UserSoftwareCompanyScreenState extends State + with TickerProviderStateMixin { + File? profileImage; + File? backgroundImage; + + Future pickImage() async { + try { + final image = await ImagePicker().pickImage(source: ImageSource.gallery); + if (image == null) return; + final imageTemporary = File(image.path); + return imageTemporary; + } on PlatformException catch (e) { + debugPrint('failed to pick image : $e'); + } + } + + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + TabController _tabController = TabController(length: 3, vsync: this); + + return Scaffold( + body: SingleChildScrollView( + child: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///=========================================================== + /// profile cover + SizedBox( + height: MediaQuery.of(context).size.height * 0.3, + child: Stack( + fit: StackFit.loose, + clipBehavior: Clip.none, + children: [ + Container( + width: SizeConfig.screenWidth, + height: getProportionateScreenHeight(150), + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + //todo backgroundImage UI + image: backgroundImage != null + ? Image.file( + backgroundImage!, + height: getProportionateScreenHeight(150), + fit: BoxFit.cover, + ).image + : const AssetImage( + 'assets/images/company_background.png'), + ), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TransparentIcon( + icon: Icons.arrow_back, + onPressed: () { + Navigator.pop(context); + }, + ), + ], + ), + ), + ), + + ///========================================================================================= + ///profile photo + + Positioned( + top: 60, + left: 15, + child: Stack( + clipBehavior: Clip.none, + children: [ + SizedBox( + width: getProportionateScreenWidth(160), + height: getProportionateScreenHeight(170), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(15.0), + //todo profileImage UI + child: profileImage != null + ? Image.file( + profileImage!, + width: 160, + height: + getProportionateScreenHeight(220), + fit: BoxFit.cover, + ) + : Image.asset( + 'assets/images/company_profile.png'), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + + ///=============================================================================================== + ///screen content + // SizedBox(height: getProportionateScreenHeight(10.0)), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 15.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///========================================================= + ///company title and its description + const Text( + "Software Company", + style: TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w500, + fontSize: 25.0), + ), + const SizedBox(height: 10.0), + const Text( + "Egypt software company building mobile applications ", + style: TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w400, + fontSize: 15.0), + ), + const SizedBox(height: 10.0), + const Text( + "Staffing & Recruiting . Cairo,Egypt . 200,00 employees ", + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w300, + fontSize: 13.0), + ), + + TabBar( + controller: _tabController, + unselectedLabelColor: Colors.grey, + indicatorColor: kBasicColor, + labelColor: kBasicColor, + tabs: const [ + Tab(text: 'Home'), + Tab(text: 'About'), + Tab(text: 'Jobs'), + ]), + + SizedBox( + width: SizeConfig.screenWidth, + height: getProportionateScreenHeight(300), + child: TabBarView(controller: _tabController, children: [ + UserTabHomeCompanyScreen(), + const UserTabAboutCompanyScreen(), + const UserTabJobsCompanyScreen() + ]), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/user/user_layout/user_modules/user_software_company_module/user_tab_bar_company_screen/user_tab_about_company_screen.dart b/lib/user/user_layout/user_modules/user_software_company_module/user_tab_bar_company_screen/user_tab_about_company_screen.dart new file mode 100644 index 0000000..3938a84 --- /dev/null +++ b/lib/user/user_layout/user_modules/user_software_company_module/user_tab_bar_company_screen/user_tab_about_company_screen.dart @@ -0,0 +1,177 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/company/company_layout/custom_widgets/edit_row.dart'; +import 'package:cvito/company/company_layout/custom_widgets/see_more_see_less.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + + +class UserTabAboutCompanyScreen extends StatelessWidget { + const UserTabAboutCompanyScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit.get(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + EditRow(label: 'About'), + buildText( + 'We constantly strive to develop our unique talent pool and wealth of skills. Our company is constantly on the lookout for talented individuals who can make a valuable contribution to the success of our products. This is the only way to attain excellence: combining talent with relentless commitment to innovation.'), + const SizedBox(height: 20.0), + + ///=========================================================== + ///to align text in the cells of the table to left don't wrap TableRow to Column + SizedBox( + width: SizeConfig.screenWidth, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Table( + textDirection: TextDirection.ltr, + defaultVerticalAlignment: + TableCellVerticalAlignment.bottom, + children: [ + TableRow(children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Website', + style: TextStyle(color: kCustomBlack), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: GestureDetector( + child: const Text( + 'Software123.com', + textAlign: TextAlign.left, + style: TextStyle( + color: kBasicColor, + ), + ), + onTap: () { + cubit.setLaunch(); + }, + ), + ), + ]), + const TableRow(children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Company Size', + style: TextStyle(color: kCustomBlack), + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '200,000 employees', + style: TextStyle(color: kCustomBlack), + ), + ), + ]), + const TableRow(children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Founded', + style: TextStyle(color: kCustomBlack), + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '2008', + style: TextStyle(color: kCustomBlack), + ), + ), + ]), + const TableRow(children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'type', + style: TextStyle(color: kCustomBlack), + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Privately Held', + style: TextStyle(color: kCustomBlack), + ), + ), + ]), + const TableRow(children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Specialistes', + style: TextStyle(color: kCustomBlack), + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Talent Management, Online Recruitment, Human Resource Management Systems (HRMS), Online Occupational Technical and Psychometric Assessments, and Software Development', + style: TextStyle(color: kCustomBlack), + ), + ), + ]), + TableRow(children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Location', + style: TextStyle(color: kCustomBlack), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Cairo, cairo, Zamalek', + style: TextStyle(color: kCustomBlack), + ), + const SizedBox(height: 5.0,), + Row( + children: const[ + Expanded( + child: Text( + 'GET DIRECTIONS', + style: TextStyle(color: kBasicColor, fontWeight: FontWeight.w500), + ), + ), Icon(Icons.login_outlined, color: kBasicColor,), + ], + ), + ], + ), + ), + ]), + ], + ), + ), + ) + ], + ); + }, + ), + ), + ), + ); + } + +} diff --git a/lib/user/user_layout/user_modules/user_software_company_module/user_tab_bar_company_screen/user_tab_home_company_screen.dart b/lib/user/user_layout/user_modules/user_software_company_module/user_tab_bar_company_screen/user_tab_home_company_screen.dart new file mode 100644 index 0000000..59c7f13 --- /dev/null +++ b/lib/user/user_layout/user_modules/user_software_company_module/user_tab_bar_company_screen/user_tab_home_company_screen.dart @@ -0,0 +1,212 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/company/company_layout/custom_widgets/edit_row.dart'; +import 'package:cvito/company/company_layout/custom_widgets/see_more_see_less.dart'; +import 'package:cvito/user/user_layout/user_modules/user_user_profile_screen/user_user_profile_screen.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; + +class UserTabHomeCompanyScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit.get(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + EditRow( label: 'Home'), + buildText( + 'a technology firm specialized in developing innovative web-based online employment marketplaces and platforms.'), + const SizedBox(height: 10.0), + + ///================================================================================================ + ///website link contact + Container( + padding: const EdgeInsets.fromLTRB(20, 15, 0, 15), + height: 100, + width: SizeConfig.screenWidth, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7), + border: + Border.all(color: Colors.grey.shade400, width: 1)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + ' Website', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w400, + fontSize: 15.0), + ), + + // CVCubit cubit = CVCubit(); + Expanded( + child: TextButton( + child: const Text( + 'Software123.com', + style: TextStyle(color: kBasicColor), + ), + onPressed: () { + cubit.setLaunch(); + }, + ), + ), + ], + ), + ), + EditRow(label: 'Opening Jobs'), + + ///============================================================================================== + /// jobs sections list view builder ....vertical + + ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + scrollDirection: Axis.vertical, + itemCount: cubit.jobsNames.length, + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + navigateTo( + context: context, + widget: UserUserProfileScreen( + jobTitle: cubit.jobsNames[index], + jobLocation: cubit.jobLocations[index], + )); + }, + child: ListTile( + // trailing: const Icon(Icons.edit), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(7), + side: const BorderSide( + width: 1, + color: Colors.grey, + ), + ), + contentPadding: + const EdgeInsets.fromLTRB(16, 5, 16, 5), + dense: true, + isThreeLine: true, + leading: CircleAvatar( + radius: 30, + child: Image.asset( + cubit.UserImageLinks[index]), + ), + tileColor: Colors.transparent, + title: Row( + children: [ + Text( + cubit.jobsNames[index], + style: const TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w700, + fontSize: 16.0), + ), + ], + ), + subtitle: Text( + cubit.jobLocations[index], + style: const TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w500, + fontSize: 14.0), + ), + ), + ); + }, + separatorBuilder: (context, index) { + return const SizedBox(height: 10.0); + }), + const SizedBox(height: 10.0), + const Text('Your Employees', + style: TextStyle(fontSize: 20.0)), + const SizedBox(height: 15.0), + SizedBox( + height: getProportionateScreenHeight(90), + + ///========================================================================================================== + /// Your Employees list view builder ....horizontal + child: Center( + child: ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + scrollDirection: Axis.horizontal, + itemCount: 8, + itemBuilder: (context, index) { + return Column( + children: [ + CircleAvatar( + child: Image( + image: AssetImage( + cubit.notificationsImageLinks[index])), + ), + const SizedBox(height: 5), + Text( + cubit.UserChatUsers[index] + ), + ], + ); + }, + separatorBuilder: (context, index) { + return const SizedBox(width: 20.0); + }), + ), + ), + const SizedBox(height: 15.0), + const Center( + child: Text( + 'Your Rating From Applicants Or Others', + style: TextStyle( + color: kCustomBlack, + fontSize: 16.0, + fontWeight: FontWeight.w500), + )), + const SizedBox(height: 10.0), + + Center( + child: Text( + 'Your review : ${cubit.rating}', + style: const TextStyle(fontSize: 15.0), + )), + + const SizedBox(height: 15.0), + + Center( + child: RatingBar.builder( + itemPadding: + const EdgeInsets.symmetric(horizontal: 7.0), + itemSize: 30, + updateOnDrag: true, + glowColor: Colors.white60, + unratedColor: const Color(0xffE0E0E0), + minRating: 1, + itemBuilder: (context, _) => const Icon( + Icons.star, + color: Colors.amber, + ), + onRatingUpdate: (rating) { + cubit.ratingUpdate(rating); + }), + ), + ], + ); + }, + ), + ), + ), + ); + } +} diff --git a/lib/user/user_layout/user_modules/user_software_company_module/user_tab_bar_company_screen/user_tab_jobs_company_screen.dart b/lib/user/user_layout/user_modules/user_software_company_module/user_tab_bar_company_screen/user_tab_jobs_company_screen.dart new file mode 100644 index 0000000..9cf583f --- /dev/null +++ b/lib/user/user_layout/user_modules/user_software_company_module/user_tab_bar_company_screen/user_tab_jobs_company_screen.dart @@ -0,0 +1,83 @@ +import 'package:cvito/company/company_layout/custom_widgets/edit_row.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:flutter/material.dart'; +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class UserTabJobsCompanyScreen extends StatelessWidget { + const UserTabJobsCompanyScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Column( + children: [ + EditRow(label: 'Opening Jobs'), + const SizedBox( + height: 10, + ), + BlocProvider( + create: (BuildContext context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit.get(context); + return ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + scrollDirection: Axis.vertical, + itemCount: 3, + itemBuilder: (context, index) { + return ListTile( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(7), + side: const BorderSide( + width: 1, + color: Colors.grey, + ), + ), + contentPadding: + const EdgeInsets.fromLTRB(16, 5, 16, 5), + dense: true, + isThreeLine: true, + leading: CircleAvatar( + radius: 30, + child: + Image.asset(cubit.notificationsImageLinks[index]), + ), + tileColor: Colors.transparent, + title: Row( + children: [ + Text( + cubit.jobsNames[index], + style:const TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w700, + fontSize: 16.0), + ), + ], + ), + subtitle: Text( + cubit.userJobsLocationList[index], + style:const TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w500, + fontSize: 14.0), + ), + ); + }, + separatorBuilder: (context, index) { + return const SizedBox(height: 10.0); + }); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/user/user_layout/user_modules/user_user_profile_screen/user_tab_bar_user_profile_screen/user_tab_about_user_screen.dart b/lib/user/user_layout/user_modules/user_user_profile_screen/user_tab_bar_user_profile_screen/user_tab_about_user_screen.dart new file mode 100644 index 0000000..c0d4b42 --- /dev/null +++ b/lib/user/user_layout/user_modules/user_user_profile_screen/user_tab_bar_user_profile_screen/user_tab_about_user_screen.dart @@ -0,0 +1,133 @@ +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:cvito/company/company_layout/custom_widgets/edit_row.dart'; +import 'package:cvito/company/company_layout/custom_widgets/see_more_see_less.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class UserTabAboutUserScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + CVCubit cubit = CVCubit.get(context); + return Padding( + padding: const EdgeInsets.only(right: 15.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + EditRow( label: 'About'), + buildText( + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quam suspendisse aliquet platea ut ornare porttitor. Adipiscing tellus volutpat laoreet erat consectetur cum suscipit ac. Tellus nibh semper ornare suspendisse lectus arcu elit, pellentesque. Fusce ipsum sem ut tortor.'), + const SizedBox(height: 10.0), + + ///=========================================================== + ///Email link contact + Container( + padding: const EdgeInsets.fromLTRB(20, 15, 0, 15), + height: 100, + width: SizeConfig.screenWidth, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7), + border: Border.all( + color: Colors.grey.shade400, width: 1)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + ' Email', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w400, + fontSize: 15.0), + ), + + // CVCubit cubit = CVCubit(); + Expanded( + child: TextButton( + child: const Text( + 'miraezz14@gmail.com', + style: TextStyle(color: kBasicColor), + ), + onPressed: () { + cubit.setLaunch(); + }, + ), + ), + ], + ), + ), + + ///================================================================= + /// jobs sections + SizedBox(height: getProportionateScreenHeight(30.0)), + const Text( + 'CVs', + style: TextStyle( + color: kCustomBlack, + fontSize: 20.0, + fontWeight: FontWeight.w500), + ), + + const SizedBox(height: 15.0,), + + + + + Row( + children: [ + Expanded( + child: GestureDetector( + onTap: () {}, + child: Container( + alignment: Alignment.topCenter, + width: MediaQuery.of(context).size.width / 2.5, + decoration: BoxDecoration(color: kBasicColor.withOpacity(.5), + ), + child: Image.asset('assets/images/cvs1.png', fit: BoxFit.cover,) + ), + ), + ), + + const SizedBox(width: 10.0), + + + Expanded( + child: GestureDetector( + onTap: () {}, + child: Container( + alignment: Alignment.topCenter, + width: MediaQuery.of(context).size.width / 2.5, + decoration: BoxDecoration(color: kBasicColor.withOpacity(.5), + ), + child: Image.asset( + 'assets/images/cvs2.png', + fit: BoxFit.fill, + ), + ), + ), + ), + ], + ), + + const SizedBox(height: 20.0,), + + ], + ), + ); + }, + ), + ), + ), + ); + } +} diff --git a/lib/user/user_layout/user_modules/user_user_profile_screen/user_tab_bar_user_profile_screen/user_tab_education_user_screen.dart b/lib/user/user_layout/user_modules/user_user_profile_screen/user_tab_bar_user_profile_screen/user_tab_education_user_screen.dart new file mode 100644 index 0000000..36bb05e --- /dev/null +++ b/lib/user/user_layout/user_modules/user_user_profile_screen/user_tab_bar_user_profile_screen/user_tab_education_user_screen.dart @@ -0,0 +1,82 @@ +import 'package:cvito/some_helpers/constants/time_line_class.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class UserTabEducationUserScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (BuildContext context, state) {}, + builder: (BuildContext context, state) { + var cubit = CVCubit(); + return Scaffold( + body: TimelineComponent( + timelineList: cubit.userEducationList, + backgroundColor: Colors.white, + // headingColor: Colors.green, + )); + }, + ), + ); + } +} + +class TimelineComponent extends StatefulWidget { + final List timelineList; + + final Color backgroundColor; + + // final Color headingColor; + + TimelineComponent({ + required this.timelineList, + required this.backgroundColor, + // required this.headingColor, + }); + + @override + TimelineComponentState createState() { + return TimelineComponentState(); + } +} + +class TimelineComponentState extends State + with SingleTickerProviderStateMixin { + Animation? animation; + AnimationController? controller; + double fraction = 0.0; + + @override + void initState() { + super.initState(); + controller = AnimationController( + duration: const Duration(milliseconds: 1000), vsync: this); + controller?.forward(); + } + + @override + Widget build(BuildContext context) { + return ListView.builder( + itemCount: widget.timelineList.length, + itemBuilder: (_, index) { + return TimelineElement( + lineColor: widget.timelineList[index].lineColor, + backgroundColor: widget.backgroundColor, + model: widget.timelineList[index], + firstElement: index == 0, + lastElement: widget.timelineList.length == index + 1, + controller: controller!, + ); + }); + } + + @override + void dispose() { + controller?.dispose(); + super.dispose(); + } +} diff --git a/lib/user/user_layout/user_modules/user_user_profile_screen/user_tab_bar_user_profile_screen/user_tab_experience_user_screen.dart b/lib/user/user_layout/user_modules/user_user_profile_screen/user_tab_bar_user_profile_screen/user_tab_experience_user_screen.dart new file mode 100644 index 0000000..1cccbed --- /dev/null +++ b/lib/user/user_layout/user_modules/user_user_profile_screen/user_tab_bar_user_profile_screen/user_tab_experience_user_screen.dart @@ -0,0 +1,79 @@ +import 'package:cvito/some_helpers/constants/time_line_class.dart'; +import 'package:cvito/some_helpers/cubit/cubit.dart'; +import 'package:cvito/some_helpers/cubit/states.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class UserTabExperienceUserScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => CVCubit(), + child: BlocConsumer( + listener: (BuildContext context, state) {}, + builder: (BuildContext context, state) { + var cubit = CVCubit(); + return Scaffold( + body: TimelineComponent( + timelineList: cubit.userExperienceList, + backgroundColor: Colors.white, + // headingColor: Colors.green, + )); + }, + ), + ); + } +} + +class TimelineComponent extends StatefulWidget { + final List timelineList; + + final Color backgroundColor; + + TimelineComponent({ + required this.timelineList, + required this.backgroundColor, + }); + + @override + TimelineComponentState createState() { + return TimelineComponentState(); + } +} + +class TimelineComponentState extends State + with SingleTickerProviderStateMixin { + Animation? animation; + AnimationController? controller; + double fraction = 0.0; + + @override + void initState() { + super.initState(); + controller = AnimationController( + duration: const Duration(milliseconds: 1000), vsync: this); + controller?.forward(); + } + + @override + Widget build(BuildContext context) { + return ListView.builder( + itemCount: widget.timelineList.length, + itemBuilder: (_, index) { + return TimelineElement( + lineColor: widget.timelineList[index].lineColor , + backgroundColor: widget.backgroundColor , + model: widget.timelineList[index], + firstElement: index == 0, + lastElement: widget.timelineList.length == index + 1, + controller: controller!, + ); + }); + } + + @override + void dispose() { + controller?.dispose(); + super.dispose(); + } +} diff --git a/lib/user/user_layout/user_modules/user_user_profile_screen/user_user_profile_screen.dart b/lib/user/user_layout/user_modules/user_user_profile_screen/user_user_profile_screen.dart new file mode 100644 index 0000000..92b8fee --- /dev/null +++ b/lib/user/user_layout/user_modules/user_user_profile_screen/user_user_profile_screen.dart @@ -0,0 +1,294 @@ +import 'dart:io'; +import 'package:cvito/some_helpers/constants/constants.dart'; +import 'package:cvito/some_helpers/constants/sized_config.dart'; +import 'package:cvito/company/company_layout/custom_widgets/basic_custom_button.dart'; +import 'package:cvito/company/company_layout/custom_widgets/transparent_icon.dart'; +import 'package:cvito/user/user_layout/user_layout.dart'; +import 'package:cvito/utilities.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'user_tab_bar_user_profile_screen/user_tab_about_user_screen.dart'; +import 'user_tab_bar_user_profile_screen/user_tab_education_user_screen.dart'; +import 'user_tab_bar_user_profile_screen/user_tab_experience_user_screen.dart'; + +/// for multi provider TickerProviderStateMixin +/// for single provider SingleTickerProviderStateMixin + +class UserUserProfileScreen extends StatefulWidget { + @override + State createState() => _UserUserProfileScreenState(); + String jobTitle; + String jobLocation; + + UserUserProfileScreen({ + required this.jobTitle, + required this.jobLocation, + }); +} + +class _UserUserProfileScreenState extends State + with TickerProviderStateMixin { + File? profileImage; + File? backgroundImage; + String? imagePath; + + @override + void initState() { + // TODO: implement initState + super.initState(); + loadImage(); + } + + Future pickImage() async { + try { + final image = await ImagePicker().pickImage(source: ImageSource.gallery); + if (image == null) return; + final imageTemporary = File(image.path); + return imageTemporary; + } on PlatformException catch (e) { + debugPrint('failed to pick image : $e'); + } + } + + @override + Widget build(BuildContext context) { + SizeConfig().init(context); + TabController _tabController = TabController(length: 3, vsync: this); + + return Scaffold( + body: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///=========================================================== + /// profile cover + SizedBox( + height: MediaQuery.of(context).size.height * 0.3, + child: Stack( + fit: StackFit.loose, + clipBehavior: Clip.none, + children: [ + Container( + width: SizeConfig.screenWidth, + height: getProportionateScreenHeight(150), + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + //todo imageBackground UI + image: backgroundImage != null + ? Image.file( + backgroundImage!, + height: getProportionateScreenHeight(150), + fit: BoxFit.cover, + ).image + : const AssetImage( + 'assets/images/company_background.png'), + ), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TransparentIcon( + icon: Icons.arrow_back, + onPressed: () { + navigateTo( + context: context, + widget: const UserLayoutScreen()); + }, + ), + TransparentIcon( + icon: Icons.edit, + onPressed: () { + //todo calling backgroundImage + pickImage().then((value) { + if (value != null) debugPrint('finish'); + debugPrint(value.toString()); + setState(() { + backgroundImage = value; + }); + }); + }, + ), + ], + ), + ), + ), + + ///========================================================================================= + ///profile photo + + Positioned( + top: 60, + left: 15, + child: Stack( + clipBehavior: Clip.none, + children: [ + SizedBox( + width: getProportionateScreenWidth(160), + height: getProportionateScreenHeight(200), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ClipOval( + // borderRadius: BorderRadius.circular(15.0), + //todo profileImage UI + child: profileImage != null + ? Image.file( + profileImage!, + width: 160, + height: + getProportionateScreenHeight(170), + fit: BoxFit.cover, + ) + : Image.asset( + 'assets/images/d_developer.png'), + ), + ], + ), + ), + Positioned( + right: -5, + bottom: 15, + child: GestureDetector( + onTap: () { + //todo calling profileImage + debugPrint('onClick'); + pickImage().then((value) { + if (value != null) debugPrint('finish'); + debugPrint(value.toString()); + setState(() { + profileImage = value; + }); + }); + saveImage(path: profileImage!.path); + }, + child: const CircleAvatar( + child: Icon( + Icons.add, + color: kBasicColor, + size: 15, + ), + radius: 15, + backgroundColor: Colors.white, + ), + ), + ), + ], + ), + ), + ], + ), + ), + SizedBox(height: getProportionateScreenHeight(20.0)), + + ///=============================================================================================== + ///screen content + Padding( + padding: const EdgeInsets.symmetric(horizontal: 15.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///========================================================= + ///company title and its description + const Text( + 'Eyad Najy ', + style: TextStyle( + color: kCustomBlack, + fontWeight: FontWeight.w500, + fontSize: 25.0), + ), + const SizedBox(height: 10.0), + Text( + widget.jobTitle, + style: const TextStyle( + letterSpacing: 1, + color: kCustomBlack, + fontWeight: FontWeight.w400, + fontSize: 15.0), + ), + const SizedBox(height: 10.0), + Row( + children: [ + const Icon( + Icons.location_on, + color: Colors.grey, + ), + Text( + widget.jobLocation, + style: const TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w300, + fontSize: 15.0), + ), + ], + ), + + ///========================================================= + ///edit profile + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 15.0), + child: Row( + children: [ + BasicCustomButton( + text: 'Edit Profile', + function: () { + debugPrint('edit profile'); + }), + const Spacer(), + + ], + ), + ), + + TabBar( + controller: _tabController, + unselectedLabelColor: Colors.grey, + indicatorColor: kBasicColor, + labelColor: kBasicColor, + tabs: const [ + Tab(text: 'About'), + Tab(text: 'Experience'), + Tab(text: 'Education'), + ]), + + SizedBox( + width: SizeConfig.screenWidth, + height: getProportionateScreenHeight(300), + child: TabBarView(controller: _tabController, children: [ + UserTabAboutUserScreen(), + UserTabExperienceUserScreen(), + UserTabEducationUserScreen(), + // TabEducationUserScreen() + ]), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } + + void saveImage({required path}) async { + SharedPreferences saveImage = await SharedPreferences.getInstance(); + saveImage.setString('imagePath', path); + } + + void loadImage() async { + SharedPreferences saveImage = await SharedPreferences.getInstance(); + setState(() { + imagePath = saveImage.getString('imagePath'); + }); + } +} diff --git a/lib/utilities.dart b/lib/utilities.dart index 85b4de0..140630d 100644 --- a/lib/utilities.dart +++ b/lib/utilities.dart @@ -1,9 +1,29 @@ import 'package:flutter/material.dart'; - - ///here is the most methods we will use many times ///navigator method void navigateTo({required context, required widget}) => Navigator.push(context, MaterialPageRoute(builder: (context) => widget)); +// Future openLink({ +// required String url, +// }) => +// _launcher(url); +// +// Future _launcher(String url) async { +// if (await canLaunch(url)) { +// await launch(url); +// } +// } + +///===================================================================== +///===================================================================== +// Future openEmail({ +// required String toEmail, +// required String subject, +// required String body, +// }) async { +// final url = 'mailto:$toEmail'; +// +// await _launcher(url); +// } diff --git a/pubspec.lock b/pubspec.lock index 4c601c1..c4ca394 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -15,6 +15,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.8.2" + bloc: + dependency: "direct main" + description: + name: bloc + url: "https://pub.dartlang.org" + source: hosted + version: "8.0.2" boolean_selector: dependency: transitive description: @@ -57,6 +64,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.15.0" + cross_file: + dependency: transitive + description: + name: cross_file + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.2" cupertino_icons: dependency: "direct main" description: @@ -71,6 +85,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + equatable: + dependency: transitive + description: + name: equatable + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" fake_async: dependency: transitive description: @@ -78,11 +99,39 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.2" + fl_chart: + dependency: "direct main" + description: + name: fl_chart + url: "https://pub.dartlang.org" + source: hosted + version: "0.45.0" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_bloc: + dependency: "direct main" + description: + name: flutter_bloc + url: "https://pub.dartlang.org" + source: hosted + version: "8.0.1" flutter_carousel_slider: dependency: "direct main" description: @@ -97,11 +146,37 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.4" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + flutter_rating_bar: + dependency: "direct main" + description: + name: flutter_rating_bar + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + flutter_slidable: + dependency: "direct main" + description: + name: flutter_slidable + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" form_field_validator: dependency: "direct main" description: @@ -109,6 +184,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.0" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.4" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.4+10" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.6" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.4" intl: dependency: transitive description: @@ -116,6 +226,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.17.0" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.4" lints: dependency: transitive description: @@ -136,7 +253,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -144,6 +261,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.7.0" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" page_transition: dependency: transitive description: @@ -157,7 +281,126 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.5" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + percent_indicator: + dependency: "direct main" + description: + name: percent_indicator + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.4" + provider: + dependency: transitive + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.2" + readmore: + dependency: "direct main" + description: + name: readmore + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.13" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + shared_preferences_ios: + dependency: transitive + description: + name: shared_preferences_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + shared_preferences_macos: + dependency: transitive + description: + name: shared_preferences_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" sky_engine: dependency: transitive description: flutter @@ -169,7 +412,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -204,7 +447,14 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" + timeline_tile: + dependency: "direct main" + description: + name: timeline_tile + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" typed_data: dependency: transitive description: @@ -212,12 +462,83 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.20" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.15" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.15" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "2.5.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0+1" sdks: dart: ">=2.16.1 <3.0.0" + flutter: ">=2.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index b9673cf..3db99a8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -39,6 +39,21 @@ dependencies: carousel_slider: ^4.0.0 delayed_display: ^2.0.0 flutter_carousel_slider: ^1.0.8 + bloc: ^8.0.1 + flutter_bloc: ^8.0.1 + fl_chart: ^0.45.0 + flutter_slidable: ^1.2.0 + + percent_indicator: ^4.0.0 + image_picker: ^0.8.4+8 + readmore: ^2.1.0 + url_launcher: ^6.0.20 + flutter_rating_bar: ^4.0.0 + timeline_tile: ^2.0.0 + shared_preferences: ^2.0.13 + + + dev_dependencies: flutter_test: @@ -74,6 +89,24 @@ flutter: - assets/images/business.png - assets/images/rafikti.png - assets/images/get_started.png + - assets/images/card1.png + - assets/images/profile_photo.png + - assets/images/linkedIn_logo.png + - assets/images/grammar_check.png + - assets/images/company_background.png + - assets/images/company.png + - assets/images/meeting.jpeg + - assets/images/create job winning.png + - assets/images/create_your_cv.png + - assets/images/edit_your_extend_cv.png + - assets/images/requirements.png + - assets/images/job_applicants.png + - assets/images/search.png + - assets/images/technical_or_general.png + - assets/images/person1.png + - assets/images/developer.jpg + + # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. diff --git a/test/widget_test.dart b/test/widget_test.dart index 28e233d..6395f65 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -2,7 +2,7 @@ // // To perform an interaction with a widget in your test, use the WidgetTester // utility that Flutter provides. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget +// gestures. You can also use WidgetTester to find child custom_widgets in the widget // tree, read text, and verify that the values of widget properties are correct. import 'package:flutter/material.dart';