From 7f4cf06626886ddb7ee2010a16105ef59337d9f6 Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Tue, 21 Mar 2023 17:52:05 +0300 Subject: [PATCH] Architecture Integration and UI --- android/app/build.gradle | 2 +- assets/icons/anouncement_icon.svg | 6 + assets/icons/appointments_icon.svg | 5 + assets/icons/close_icon.svg | 3 + assets/icons/drawer_icon.svg | 6 + assets/icons/home_icon.svg | 3 + assets/icons/mini_clock.svg | 3 + assets/icons/next_icon.svg | 3 + assets/icons/notification_bell.svg | 6 + assets/icons/providers_icon.svg | 7 + assets/icons/settings_icon.svg | 3 + ...encies.dart => customer_dependencies.dart} | 4 +- lib/config/customer_routes.dart | 9 + lib/main.dart | 22 +- lib/views/dashboard/dashboard_page.dart | 1 + .../dashboard/fragments/home_fragment.dart | 21 +- .../widgets/appointment_slider_widget.dart | 198 +++++++++++++----- .../dashboard/widgets/my_branches_widget.dart | 2 +- .../dashboard/widgets/view_all_widget.dart | 2 +- pubspec.yaml | 2 + 20 files changed, 229 insertions(+), 79 deletions(-) create mode 100644 assets/icons/anouncement_icon.svg create mode 100644 assets/icons/appointments_icon.svg create mode 100644 assets/icons/close_icon.svg create mode 100644 assets/icons/drawer_icon.svg create mode 100644 assets/icons/home_icon.svg create mode 100644 assets/icons/mini_clock.svg create mode 100644 assets/icons/next_icon.svg create mode 100644 assets/icons/notification_bell.svg create mode 100644 assets/icons/providers_icon.svg create mode 100644 assets/icons/settings_icon.svg rename lib/config/{dependencies.dart => customer_dependencies.dart} (81%) create mode 100644 lib/config/customer_routes.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 09fd0fb..6ac2704 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -44,7 +44,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.car_customer_app" - minSdkVersion 16 + minSdkVersion 20 targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/assets/icons/anouncement_icon.svg b/assets/icons/anouncement_icon.svg new file mode 100644 index 0000000..dad55fd --- /dev/null +++ b/assets/icons/anouncement_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/icons/appointments_icon.svg b/assets/icons/appointments_icon.svg new file mode 100644 index 0000000..ebf91e9 --- /dev/null +++ b/assets/icons/appointments_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/close_icon.svg b/assets/icons/close_icon.svg new file mode 100644 index 0000000..0230942 --- /dev/null +++ b/assets/icons/close_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/drawer_icon.svg b/assets/icons/drawer_icon.svg new file mode 100644 index 0000000..363d413 --- /dev/null +++ b/assets/icons/drawer_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/icons/home_icon.svg b/assets/icons/home_icon.svg new file mode 100644 index 0000000..758dd1b --- /dev/null +++ b/assets/icons/home_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/mini_clock.svg b/assets/icons/mini_clock.svg new file mode 100644 index 0000000..d59971c --- /dev/null +++ b/assets/icons/mini_clock.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/next_icon.svg b/assets/icons/next_icon.svg new file mode 100644 index 0000000..0a3dc04 --- /dev/null +++ b/assets/icons/next_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/notification_bell.svg b/assets/icons/notification_bell.svg new file mode 100644 index 0000000..dd32254 --- /dev/null +++ b/assets/icons/notification_bell.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/icons/providers_icon.svg b/assets/icons/providers_icon.svg new file mode 100644 index 0000000..f4cc334 --- /dev/null +++ b/assets/icons/providers_icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/settings_icon.svg b/assets/icons/settings_icon.svg new file mode 100644 index 0000000..6fe8da9 --- /dev/null +++ b/assets/icons/settings_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/config/dependencies.dart b/lib/config/customer_dependencies.dart similarity index 81% rename from lib/config/dependencies.dart rename to lib/config/customer_dependencies.dart index 7fa12dd..d74aa71 100644 --- a/lib/config/dependencies.dart +++ b/lib/config/customer_dependencies.dart @@ -1,7 +1,9 @@ import 'package:mc_common_app/config/dependencies.dart'; -class LocalDependencies { +class CustomerDependencies { static void addDependencies() { AppDependencies.addDependencies(); + + } } diff --git a/lib/config/customer_routes.dart b/lib/config/customer_routes.dart new file mode 100644 index 0000000..d6763e9 --- /dev/null +++ b/lib/config/customer_routes.dart @@ -0,0 +1,9 @@ +import 'package:car_customer_app/views/dashboard/dashboard_page.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:mc_common_app/config/routes.dart'; + +class CustomerAppRoutes { + static final Map routes = { + AppRoutes.dashboard: (context) => DashboardPage(), + }; +} diff --git a/lib/main.dart b/lib/main.dart index f97caa2..d1cbb8b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,10 @@ -import 'package:car_customer_app/config/dependencies.dart'; +import 'package:car_customer_app/config/customer_dependencies.dart'; +import 'package:car_customer_app/config/customer_routes.dart'; +import 'package:car_customer_app/view_models/dashboard_view_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/app_state_cm.dart'; +import 'package:mc_common_app/services/services.dart'; import 'package:mc_common_app/theme/app_theme.dart'; import 'package:mc_common_app/config/dependencies.dart'; import 'package:mc_common_app/config/routes.dart'; @@ -17,8 +20,9 @@ import 'generated/codegen_loader.g.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); - LocalDependencies.addDependencies(); + CustomerDependencies.addDependencies(); await EasyLocalization.ensureInitialized(); + CustomerAppRoutes.routes.addAll(AppRoutes.routes); runApp( EasyLocalization( supportedLocales: const [Locale('ar', 'SA'), Locale('en', 'US')], @@ -31,12 +35,12 @@ Future main() async { ChangeNotifierProvider( create: (_) => BaseVM(), ), - // ChangeNotifierProvider( - // create: (_) => DashboardVM( - // userRepo: injector.get(), - // commonServices: injector.get(), - // ), - // ), + ChangeNotifierProvider( + create: (_) => DashboardVM( + userRepo: injector.get(), + commonServices: injector.get(), + ), + ), ChangeNotifierProvider( create: (_) => UserVM(userRepo: injector.get()), ), @@ -72,7 +76,7 @@ class MyApp extends StatelessWidget { supportedLocales: context.supportedLocales, locale: context.locale, initialRoute: AppRoutes.initialRoute, - routes: AppRoutes.routes, + routes: CustomerAppRoutes.routes, ); }, ); diff --git a/lib/views/dashboard/dashboard_page.dart b/lib/views/dashboard/dashboard_page.dart index a1eb041..9e54184 100644 --- a/lib/views/dashboard/dashboard_page.dart +++ b/lib/views/dashboard/dashboard_page.dart @@ -3,6 +3,7 @@ import 'package:car_customer_app/views/dashboard/fragments/home_fragment.dart'; import 'package:car_customer_app/views/dashboard/widgets/bottom_nav_bar.dart'; import 'package:car_customer_app/views/dashboard/widgets/drawer_widget.dart'; import 'package:flutter/material.dart'; +import 'package:mc_common_app/widgets/app_bar.dart'; import 'package:provider/provider.dart'; class DashboardPage extends StatefulWidget { diff --git a/lib/views/dashboard/fragments/home_fragment.dart b/lib/views/dashboard/fragments/home_fragment.dart index 78ece26..4415b19 100644 --- a/lib/views/dashboard/fragments/home_fragment.dart +++ b/lib/views/dashboard/fragments/home_fragment.dart @@ -4,6 +4,7 @@ import 'package:car_customer_app/views/dashboard/widgets/my_branches_widget.dart import 'package:car_customer_app/views/dashboard/widgets/view_all_widget.dart'; import 'package:flutter/material.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; class HomeFragment extends StatelessWidget { const HomeFragment({Key? key}) : super(key: key); @@ -15,22 +16,22 @@ class HomeFragment extends StatelessWidget { height: double.infinity, child: SingleChildScrollView( child: Padding( - padding: const EdgeInsets.only(top: 8, left: 21, right: 21, bottom: 21), + padding: const EdgeInsets.only(top: 8), child: Column( mainAxisSize: MainAxisSize.max, children: [ - ViewAllWidget(title: "Upcoming Appointment".toUpperCase(), subTitle: "View All"), + ViewAllWidget(title: "Upcoming Appointment".toUpperCase(), subTitle: "View All").horPaddingMain(), const AppointmentSliderWidget(), - 20.height, - ViewAllWidget(title: "My Recent Service Providers".toUpperCase(), subTitle: "View All"), - const ServiceProviderWidget(), - 20.height, - ViewAllWidget(title: "My Active Ads".toUpperCase(), subTitle: "View All"), + 7.height, + ViewAllWidget(title: "My Recent Service Providers".toUpperCase(), subTitle: "View All").horPaddingMain(), + const ServiceProviderWidget().horPaddingMain(), + 15.height, + ViewAllWidget(title: "My Active Ads".toUpperCase(), subTitle: "View All").horPaddingMain(), // todo: we will replace this count with the sublist of ads - const AdWidget(count: 1), + const AdWidget(count: 1).horPaddingMain(), 20.height, - ViewAllWidget(title: "My Recommended Ads".toUpperCase(), subTitle: "View All"), - const AdWidget(count: 2), + ViewAllWidget(title: "My Recommended Ads".toUpperCase(), subTitle: "View All").horPaddingMain(), + const AdWidget(count: 2).horPaddingMain(), ], ), ), diff --git a/lib/views/dashboard/widgets/appointment_slider_widget.dart b/lib/views/dashboard/widgets/appointment_slider_widget.dart index 3e3b3ec..0af7bed 100644 --- a/lib/views/dashboard/widgets/appointment_slider_widget.dart +++ b/lib/views/dashboard/widgets/appointment_slider_widget.dart @@ -1,4 +1,4 @@ - +import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; @@ -8,67 +8,153 @@ import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; class AppointmentSliderWidget extends StatelessWidget { const AppointmentSliderWidget({Key? key}) : super(key: key); - @override - Widget build(BuildContext context) { - return Column( - children: [ - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - "Olaya Brach".toText( - color: MyColors.lightTextColor, - isBold: true, - ), - "Abdullah Alhbas".toText( - isBold: true, - fontSize: 14, - ), - Row( - children: [ - "Appt. On:".toText( - color: MyColors.lightTextColor, - ), - 2.width, - "19-Mar-2023 11:48 AM".toText(), - ], + Widget buildAppointmentContainerForProvider() { + return Container( + margin: EdgeInsets.only(bottom: 21, left: 21, right: 21, top: 7), + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Olaya Brach".toText( + color: MyColors.lightTextColor, + isBold: true, + ), + "Abdullah Alhbas".toText( + isBold: true, + fontSize: 14, + ), + Row( + children: [ + "Appt. On:".toText( + color: MyColors.lightTextColor, + ), + 2.width, + "19-Mar-2023 11:48 AM".toText(), + ], + ), + ], + ), + ), + "1+ Requests".toText(fontSize: 10).toContainer( + borderRadius: 15, + backgroundColor: MyColors.lightGreyEAColor, + padding: const EdgeInsets.symmetric( + vertical: 6, + horizontal: 12, + ), ), - ], + ], + ), + 8.height, + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded( + child: Column( + children: [ + showServices("Maintenance"), + 2.height, + showServices("Accessories and Modification"), + ], + ), + ), + const Icon( + Icons.arrow_forward, + ), + ], + ), + ], + ).toWhiteContainer(width: double.infinity, allPading: 12), + ); + } + + Widget buildAppointmentSliderForConsumer() { + return Container( + margin: EdgeInsets.only(bottom: 21, left: 21, right: 21, top: 7), + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Olaya Brach".toText( + color: MyColors.lightTextColor, + isBold: true, + ), + "Abdullah Alhbas".toText( + isBold: true, + fontSize: 14, + ), + Row( + children: [ + "Appt. On:".toText( + color: MyColors.lightTextColor, + ), + 2.width, + "19-Mar-2023 11:48 AM".toText(), + ], + ), + ], + ), ), - ), - "1+ Requests".toText(fontSize: 10).toContainer( - borderRadius: 15, - backgroundColor: MyColors.lightGreyEAColor, - padding: const EdgeInsets.symmetric( - vertical: 6, - horizontal: 12, + "1+ Requests".toText(fontSize: 10).toContainer( + borderRadius: 15, + backgroundColor: MyColors.lightGreyEAColor, + padding: const EdgeInsets.symmetric( + vertical: 6, + horizontal: 12, + ), ), + ], + ), + 8.height, + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded( + child: Column( + children: [ + showServices("Maintenance"), + 2.height, + showServices("Accessories and Modification"), + ], ), - ], - ), - 8.height, - Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Expanded( - child: Column( - children: [ - showServices("Maintenance"), - 2.height, - showServices("Accessories and Modification"), - ], ), - ), - const Icon( - Icons.arrow_forward, - ), - ], + const Icon( + Icons.arrow_forward, + ), + ], + ), + ], + ).toWhiteContainer(width: double.infinity, allPading: 12), + ); + } + + @override + Widget build(BuildContext context) { + return CarouselSlider.builder( + options: CarouselOptions( + height: 160, + viewportFraction: 1.0, + enlargeCenterPage: true, + enableInfiniteScroll: false, + + // onPageChanged: (index) { + // setState(() { + // _current = index; + // }); + // }, ), - ], - ).toWhiteContainer(width: double.infinity, allPading: 0); + itemCount: 10, + itemBuilder: (BuildContext context, int itemIndex, int pageViewIndex) => buildAppointmentSliderForConsumer()); } Widget showServices(String title) { diff --git a/lib/views/dashboard/widgets/my_branches_widget.dart b/lib/views/dashboard/widgets/my_branches_widget.dart index bb291b2..0f250fe 100644 --- a/lib/views/dashboard/widgets/my_branches_widget.dart +++ b/lib/views/dashboard/widgets/my_branches_widget.dart @@ -11,7 +11,7 @@ class ServiceProviderWidget extends StatelessWidget { Widget build(BuildContext context) { return SizedBox( width: double.infinity, - height: 150, + height: 140, child: ListView.builder( itemCount: 9, scrollDirection: Axis.horizontal, diff --git a/lib/views/dashboard/widgets/view_all_widget.dart b/lib/views/dashboard/widgets/view_all_widget.dart index 5724eb8..b46d67c 100644 --- a/lib/views/dashboard/widgets/view_all_widget.dart +++ b/lib/views/dashboard/widgets/view_all_widget.dart @@ -13,7 +13,7 @@ class ViewAllWidget extends StatelessWidget { Widget build(BuildContext context) { return Container( width: double.infinity, - padding: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only(bottom: 7), child: Row( children: [ Expanded(child: title.toText(isBold: true, fontSize: 18)), diff --git a/pubspec.yaml b/pubspec.yaml index 340fa59..50481cb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,6 +36,8 @@ dependencies: cupertino_icons: ^1.0.2 flutter_password_strength: ^0.1.6 + carousel_slider: ^4.2.1 + mc_common_app: path: D:/Development/car_common_app