From f9584c14ccb7bdd5bc978d98bd1e361c4b8b4f2d Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Thu, 5 Dec 2024 01:58:30 +0300 Subject: [PATCH] Added Services Widget on HomeScreen --- lib/views/dashboard/dashboard_view.dart | 2 +- .../fragments/branches_fragment.dart | 4 +- .../dashboard/fragments/home_fragment.dart | 41 +++++++++++-- .../my_services_categories_widget.dart | 58 +++++++++++++++++++ pubspec.yaml | 6 +- 5 files changed, 101 insertions(+), 10 deletions(-) create mode 100644 lib/views/dashboard/widgets/my_services_categories_widget.dart diff --git a/lib/views/dashboard/dashboard_view.dart b/lib/views/dashboard/dashboard_view.dart index 8592e8c..7c339a0 100644 --- a/lib/views/dashboard/dashboard_view.dart +++ b/lib/views/dashboard/dashboard_view.dart @@ -28,7 +28,7 @@ class _DashboardViewState extends State { @override void initState() { super.initState(); - dashboardVM = Provider.of(context, listen: false); + dashboardVM = context.read(); scheduleMicrotask(() => dashboardVM.onRefresh(context, dashboardRouteEnum: widget.dashboardRouteEnum)); } diff --git a/lib/views/dashboard/fragments/branches_fragment.dart b/lib/views/dashboard/fragments/branches_fragment.dart index eb01a1a..2265acc 100644 --- a/lib/views/dashboard/fragments/branches_fragment.dart +++ b/lib/views/dashboard/fragments/branches_fragment.dart @@ -48,10 +48,10 @@ class BranchesFragment extends StatelessWidget { height: double.infinity, child: Column( children: [ - if (appointmentsVM.branchesFilterOptions.isNotEmpty) ...[ + if (appointmentsVM.branchesCategoriesFilterOptions.isNotEmpty) ...[ 16.height, FiltersList( - filterList: appointmentsVM.branchesFilterOptions, + filterList: appointmentsVM.branchesCategoriesFilterOptions, onFilterTapped: (index, selectedFilterId) => appointmentsVM.applyFilterOnBranches(index: index), ), ], diff --git a/lib/views/dashboard/fragments/home_fragment.dart b/lib/views/dashboard/fragments/home_fragment.dart index 7fd8a1d..97b33e2 100644 --- a/lib/views/dashboard/fragments/home_fragment.dart +++ b/lib/views/dashboard/fragments/home_fragment.dart @@ -1,5 +1,7 @@ import 'package:car_customer_app/views/dashboard/widgets/drawer_widget.dart'; import 'package:car_customer_app/views/dashboard/widgets/my_recent_branches_widget.dart'; +import 'package:car_customer_app/views/dashboard/widgets/my_services_categories_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; @@ -15,7 +17,6 @@ import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/view_all_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; -import 'package:easy_localization/easy_localization.dart'; class HomeFragment extends StatelessWidget { const HomeFragment({Key? key}) : super(key: key); @@ -67,10 +68,38 @@ class HomeFragment extends StatelessWidget { context.read().applyFilterOnAppointmentsVM(appointmentStatusEnum: AppointmentStatusEnum.allAppointments); }, ).horPaddingMain(), - CommonAppointmentSliderWidget().toWhiteContainer(width: double.infinity, backgroundColor: Colors.transparent).margin( - left: 21, - right: 21, - ), + CommonAppointmentSliderWidget() + .toWhiteContainer( + width: double.infinity, + backgroundColor: Colors.transparent, + ) + .margin(left: 21, right: 21), + + // SERVICES SECTION + 14.height, + Consumer( + builder: (BuildContext context, AppointmentsVM appointmentVM, Widget? child) { + if (appointmentVM.state == ViewState.busy) { + return Center(child: CircularProgressIndicator()); + } + if (appointmentVM.branchesCategoriesFilterOptions.isNotEmpty) { + return Column( + children: [ + ViewAllWidget( + title: LocaleKeys.services.tr().toUpperCase(), + subTitle: '', + onSubtitleTapped: () {}, + ).horPaddingMain(), + MyServicesCategoriesWidget(homeCategories: appointmentVM.branchesCategoriesFilterOptions).horPaddingMain() + ], + ); + } + + return SizedBox(); + }, + ), + + // NEARBY BRANCHES SECTION 7.height, Consumer( builder: (BuildContext context, AppointmentsVM appointmentVM, Widget? child) { @@ -112,6 +141,8 @@ class HomeFragment extends StatelessWidget { return SizedBox(); }, ), + + // ADS SECTION Consumer( builder: (BuildContext context, AdVM adVM, Widget? child) { if (adVM.state == ViewState.busy) { diff --git a/lib/views/dashboard/widgets/my_services_categories_widget.dart b/lib/views/dashboard/widgets/my_services_categories_widget.dart new file mode 100644 index 0000000..4963163 --- /dev/null +++ b/lib/views/dashboard/widgets/my_services_categories_widget.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:mc_common_app/extensions/int_extensions.dart'; +import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/models/general_models/widgets_models.dart'; +import 'package:mc_common_app/view_models/appointments_view_model.dart'; +import 'package:mc_common_app/view_models/dashboard_view_model_customer.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; +import 'package:provider/provider.dart'; + +class MyServicesCategoriesWidget extends StatelessWidget { + final List homeCategories; + + const MyServicesCategoriesWidget({Key? key, required this.homeCategories}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: double.infinity, + height: 140, + child: ListView.builder( + itemCount: homeCategories.length, + scrollDirection: Axis.horizontal, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + FilterListModel category = homeCategories[index]; + if (category.id == 0) { + return SizedBox(); + } + return SizedBox( + width: 90, + child: Column( + children: [ + category.iconUrl.buildNetworkImage(height: 73, width: 73, fit: BoxFit.cover).toCircle(borderRadius: 100), + 9.height, + Flexible( + child: category.title.toText( + fontSize: 14, + textAlign: TextAlign.center, + maxLines: 2, + overflow: TextOverflow.ellipsis, + letterSpacing: -0.84, + height: 18 / 14, + ), + ), + ], + ), + ).onPress(() { + final appointmentVM = context.read(); + final dashboardCustomerVM = context.read(); + context.read().onNavbarTapped(0); + dashboardCustomerVM.onNavbarTapped(0); + appointmentVM.applyFilterOnBranches(index: index); + }); + }, + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 133cf23..88e27c9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,8 +36,9 @@ dependencies: cupertino_icons: ^1.0.2 mc_common_app: -# path: D:\Development\car_common_app - path: /Volumes/Data/Projects/Flutter/car_common_app + # path: D:\Development\car_common_app + # path: /Volumes/Data/Projects/Flutter/car_common_app + path: /Users/faizhashmi/Development/Projects/MyProjects/CloudSolutions/car_common_app dev_dependencies: flutter_test: @@ -84,3 +85,4 @@ flutter: # - asset: assets/fonts/Poppins-Medium.ttf # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages +