From 91ea03c83461b0689eefa832a41ad8e9dbd5dfe3 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Thu, 15 Aug 2024 16:06:27 +0300 Subject: [PATCH] Updated both apps' structure --- lib/config/customer_routes.dart | 16 +- lib/views/dashboard/dashboard_page.dart | 162 +--------- .../dashboard/fragments/ads_fragment.dart | 283 ++++++++++-------- .../fragments/appointments_fragment.dart | 69 +++-- .../fragments/branches_fragment.dart | 144 +++++---- .../dashboard/fragments/home_fragment.dart | 218 ++++++++------ .../fragments/my_requests_fragment.dart | 156 +++++----- ...et.dart => my_recent_branches_widget.dart} | 24 +- 8 files changed, 519 insertions(+), 553 deletions(-) rename lib/views/dashboard/widgets/{my_branches_widget.dart => my_recent_branches_widget.dart} (50%) diff --git a/lib/config/customer_routes.dart b/lib/config/customer_routes.dart index 52cdf0d..fb73da9 100644 --- a/lib/config/customer_routes.dart +++ b/lib/config/customer_routes.dart @@ -32,25 +32,15 @@ class CustomerAppRoutes { AppRoutes.dashboard: (context) => DashboardPage(), AppRoutes.bookProviderAppView: (context) => BookProviderAppView(), AppRoutes.appointmentDetailView: (context) => AppointmentDetailView(appointmentListModel: ModalRoute.of(context)!.settings.arguments as AppointmentListModel), - AppRoutes.adsDetailView: (context) => AdsDetailView(adDetails: ModalRoute.of(context)!.settings.arguments as AdDetailsModel), - AppRoutes.createAdView: (context) => CreateAdView(), - AppRoutes.adsFilterView: (context) => AdsFilterView(), - AppRoutes.selectAdTypeView: (context) => SelectAdTypeView(isProvider: ModalRoute.of(context)!.settings.arguments as bool), AppRoutes.bookAppointmenServicesView: (context) => BookAppointmentServicesView(), - AppRoutes.bookAppointmenSchedulesView: (context) => - BookAppointmentSchedulesView(screenArgumentsForAppointmentDetailPage: ModalRoute.of(context)!.settings.arguments as ScreenArgumentsForAppointmentDetailPage), + AppRoutes.bookAppointmenSchedulesView: (context) => BookAppointmentSchedulesView( + screenArgumentsForAppointmentDetailPage: ModalRoute.of(context)!.settings.arguments as ScreenArgumentsForAppointmentDetailPage, + ), AppRoutes.bookAppointmentsItemView: (context) => BookAppointmentsItemView(), AppRoutes.reviewAppointmentView: (context) => ReviewAppointment(), - AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(paymentType: ModalRoute.of(context)!.settings.arguments as PaymentTypes), AppRoutes.branchDetailPage: (context) => BranchDetailPage(branchDetailModel: ModalRoute.of(context)!.settings.arguments as BranchDetailModel), AppRoutes.branchSearchFilterPage: (context) => BranchesFilterView(), AppRoutes.appoinmentSearchFilterPage: (context) => AppointmentsFilterView(), AppRoutes.providerProfilePage: (context) => ProviderProfilePage(providerId: ModalRoute.of(context)!.settings.arguments as int), - AppRoutes.offersListPage: (context) => OfferListPage(offerListPageArguments: ModalRoute.of(context)!.settings.arguments as OfferListPageArguments), - AppRoutes.createRequestPage: (context) => CreateRequestPage(), - AppRoutes.chatView: (context) => ChatView(chatViewArguments: ModalRoute.of(context)!.settings.arguments as ChatViewArguments), - AppRoutes.settingOptionsFaqs: (context) => SettingOptionsFAQs(), - AppRoutes.settingOptionsLanguages: (context) => SettingOptionsLanguage(), - AppRoutes.settingOptionsInviteFriends: (context) => SettingOptionsInviteFriends(), }; } diff --git a/lib/views/dashboard/dashboard_page.dart b/lib/views/dashboard/dashboard_page.dart index 9f790c2..0b17b54 100644 --- a/lib/views/dashboard/dashboard_page.dart +++ b/lib/views/dashboard/dashboard_page.dart @@ -1,29 +1,15 @@ import 'dart:async'; -import 'dart:developer'; - -import 'package:car_customer_app/views/dashboard/fragments/ads_fragment.dart'; import 'package:car_customer_app/views/dashboard/fragments/appointments_fragment.dart'; import 'package:car_customer_app/views/dashboard/fragments/home_fragment.dart'; -import 'package:car_customer_app/views/dashboard/fragments/my_requests_fragment.dart'; import 'package:car_customer_app/views/dashboard/widgets/bottom_nav_bar.dart'; import 'package:flutter/material.dart'; -import 'package:mc_common_app/classes/app_state.dart'; -import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/routes.dart'; -import 'package:mc_common_app/extensions/int_extensions.dart'; -import 'package:mc_common_app/extensions/string_extensions.dart'; -import 'package:mc_common_app/generated/locale_keys.g.dart'; -import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/navigator.dart'; -import 'package:mc_common_app/view_models/ad_view_model.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/view_models/requests_view_model.dart'; -import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; -import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; -import 'package:easy_localization/easy_localization.dart'; import 'fragments/branches_fragment.dart'; +import 'package:mc_common_app/views/common_fragments/ads_fragment.dart'; +import 'package:mc_common_app/views/common_fragments/my_requests_fragment.dart'; class DashboardPage extends StatefulWidget { const DashboardPage({Key? key}) : super(key: key); @@ -34,152 +20,28 @@ class DashboardPage extends StatefulWidget { class _DashboardPageState extends State { late DashboardVmCustomer dashboardVM; + final GlobalKey _scaffoldKey = GlobalKey(); @override void initState() { super.initState(); dashboardVM = Provider.of(context, listen: false); - scheduleMicrotask(() { - dashboardVM.onInitState(context); - dashboardVM.onRefresh(context); - }); - } - - List fragments = [ - const BranchesFragment(), - const AppointmentsFragment(), - const HomeFragment(), - AdsFragment(), - MyRequestsFragment(), - ]; - - String getPageTitle(int index) { - if (index == 0) { - return LocaleKeys.branches.tr(); - } - if (index == 1) { - return LocaleKeys.appointments.tr(); - } - if (index == 2) { - return ""; - } - if (index == 3) { - return LocaleKeys.ads.tr(); - } - if (index == 4) { - return LocaleKeys.myRequests.tr(); - } - return ""; + scheduleMicrotask(() => dashboardVM.onRefresh(context)); } @override Widget build(BuildContext context) { - DashboardVmCustomer dashboardVM = context.read(); - bool isHomePage = dashboardVM.selectedNavbarBarIndex == 2; + List fragments = [ + const BranchesFragment(), + const AppointmentsFragment(), + const HomeFragment(), + const AdsFragment(), + const MyRequestsFragment(), + ]; return PopScope( canPop: false, child: Scaffold( - appBar: CustomAppBar( - backgroundColor: null, - leadingWidth: 100, - title: getPageTitle(dashboardVM.selectedNavbarBarIndex), - isRemoveBackButton: true, - isDrawerEnabled: isHomePage ? true : false, - onTap: () { - if (isHomePage) { - navigateWithName(context, AppRoutes.settingOptionsLanguages); - } - }, - actions: [ - (isHomePage - ? Row( - children: [ - "${AppState().currentAppType}".toText(color: MyColors.darkTextColor).onPress( - () { - print("userId: ${AppState().getUser.data!.userInfo!.userId}"); - print("customerId: ${AppState().getUser.data!.userInfo!.customerId}"); - // context.read().buildHubConnection(); - }, - ), - 10.width, - MyAssets.notificationsBellIcon.buildSvg().onPress(() {}), - 15.width, - Icon(Icons.message, color: MyColors.darkTextColor) - ], - ) - : InkWell( - onTap: () async { - if (dashboardVM.selectedNavbarBarIndex == 0) { - navigateWithName(context, AppRoutes.branchSearchFilterPage); - } - if (dashboardVM.selectedNavbarBarIndex == 1) { - navigateWithName(context, AppRoutes.appoinmentSearchFilterPage); - } - if (dashboardVM.selectedNavbarBarIndex == 3) { - await context.read().populateDataForAdFilter(); - navigateWithName(context, AppRoutes.adsFilterView); - } - }, - child: Consumer2( - builder: (BuildContext context, AppointmentsVM appointmentsVM, AdVM adVM, Widget? child) { - if (dashboardVM.selectedNavbarBarIndex == 0) { - if (appointmentsVM.branchFiltersCounter > 0) { - return Padding( - padding: const EdgeInsets.only(top: 20), - child: Badge( - largeSize: 15, - smallSize: 20, - backgroundColor: MyColors.darkPrimaryColor, - label: Text('${appointmentsVM.branchFiltersCounter}'), - child: MyAssets.searchIcon.buildSvg(), - ), - ); - } else { - return MyAssets.searchIcon.buildSvg(); - } - } - - if (dashboardVM.selectedNavbarBarIndex == 1) { - if (appointmentsVM.appointmentFiltersCounter > 0) { - return Padding( - padding: const EdgeInsets.only(top: 20), - child: Badge( - largeSize: 15, - smallSize: 20, - backgroundColor: MyColors.darkPrimaryColor, - label: Text('${appointmentsVM.appointmentFiltersCounter}'), - child: MyAssets.searchIcon.buildSvg(), - ), - ); - } else { - return MyAssets.searchIcon.buildSvg(); - } - } - - if (dashboardVM.selectedNavbarBarIndex == 3) { - if (adVM.adsFiltersCounter > 0) { - return Padding( - padding: const EdgeInsets.only(top: 20), - child: Badge( - largeSize: 15, - smallSize: 20, - backgroundColor: MyColors.darkPrimaryColor, - label: Text('${adVM.adsFiltersCounter}'), - child: MyAssets.searchIcon.buildSvg(), - ), - ); - } else { - return MyAssets.searchIcon.buildSvg(); - } - } - - return MyAssets.searchIcon.buildSvg(); - }, - ), - )) - .paddingOnly(right: 21) - ], - ), + key: _scaffoldKey, bottomNavigationBar: CustomBottomNavbar(), body: fragments[context.watch().selectedNavbarBarIndex], ), diff --git a/lib/views/dashboard/fragments/ads_fragment.dart b/lib/views/dashboard/fragments/ads_fragment.dart index 5b9fa44..da2fc9d 100644 --- a/lib/views/dashboard/fragments/ads_fragment.dart +++ b/lib/views/dashboard/fragments/ads_fragment.dart @@ -1,130 +1,153 @@ -import 'package:flutter/material.dart'; -import 'package:mc_common_app/classes/app_state.dart'; -import 'package:mc_common_app/config/dependency_injection.dart'; -import 'package:mc_common_app/config/routes.dart'; -import 'package:mc_common_app/extensions/int_extensions.dart'; -import 'package:mc_common_app/extensions/string_extensions.dart'; -import 'package:mc_common_app/generated/locale_keys.g.dart'; -import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; -import 'package:mc_common_app/theme/colors.dart'; -import 'package:mc_common_app/utils/enums.dart'; -import 'package:mc_common_app/utils/navigator.dart'; -import 'package:mc_common_app/view_models/ad_view_model.dart'; -import 'package:mc_common_app/views/advertisement/ads_list.dart'; -import 'package:mc_common_app/widgets/button/show_fill_button.dart'; -import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; -import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; -import 'package:provider/provider.dart'; -import 'package:easy_localization/easy_localization.dart'; - -class AdsFragment extends StatelessWidget { - AdsFragment({Key? key}) : super(key: key); - - Future _onRefreshAds(BuildContext context) async { - AdVM adVM = context.read(); - await adVM.getExploreAds(); - await adVM.getMyAds(); - } - - List getAdsList(AdVM adVM) { - if (adVM.isExploreAdsTapped) { - return adVM.exploreAdsFilteredList; - } - if (adVM.myAdsFilteredList.isNotEmpty) { - return adVM.myAdsFilteredList; - } - return []; - } - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Container( - color: MyColors.backgroundColor, - width: double.infinity, - height: double.infinity, - child: Column( - children: [ - 16.height, - Consumer( - builder: (BuildContext context, AdVM adVM, Widget? child) { - return Column( - children: [ - Row( - children: [ - Expanded( - child: ShowFillButton( - isFilled: adVM.isExploreAdsTapped, - maxHeight: 55, - title: LocaleKeys.exploreAds.tr(), - txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, - onPressed: () { - print("ads: ${AppState().getUser.data!.accessToken}"); - adVM.populateAdsFilterList(); - if (adVM.myAds.isEmpty) { - adVM.getMyAds(); - } - adVM.updateIsExploreAds(true); - }, - ), - ), - 12.width, - Expanded( - child: ShowFillButton( - isFilled: !adVM.isExploreAdsTapped, - txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, - maxHeight: 55, - title: LocaleKeys.myAds.tr(), - onPressed: () { - adVM.updateIsExploreAds(false); - }, - ), - ), - ], - ).horPaddingMain(), - if (adVM.isExploreAdsTapped) ...[ - 16.height, - FiltersList( - filterList: adVM.exploreAdsFilterOptions, - onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(createdByRoleFilter: selectedFilterId.toCreatedByRoleEnum()), - needLeftPadding: false) - .paddingOnly(left: 21), - ] else ...[ - 16.height, - FiltersList( - filterList: adVM.myAdsFilterOptions, - onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(adPostStatusEnum: selectedFilterId.toAdPostEnum()), - needLeftPadding: false, - ).paddingOnly(left: 21), - ], - ], - ); - }, - ), - 16.height, - Expanded( - child: RefreshIndicator( - onRefresh: () => _onRefreshAds(context), - child: Consumer( - builder: (BuildContext context, AdVM adVM, Widget? child) { - return BuildAdsList(isAdsFragment: true, shouldShowAdStatus: !adVM.isExploreAdsTapped, adsList: getAdsList(adVM)); - }, - ), - ), - ) - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: () async { - navigateWithName(context, AppRoutes.selectAdTypeView, arguments: injector.get().currentAppType == AppType.provider); - }, - backgroundColor: MyColors.darkPrimaryColor, - child: Icon( - Icons.add, - color: MyColors.white, - ), - ), - ); - } -} +// import 'package:flutter/material.dart'; +// import 'package:mc_common_app/classes/app_state.dart'; +// import 'package:mc_common_app/classes/consts.dart'; +// import 'package:mc_common_app/config/dependency_injection.dart'; +// import 'package:mc_common_app/config/routes.dart'; +// import 'package:mc_common_app/extensions/int_extensions.dart'; +// import 'package:mc_common_app/extensions/string_extensions.dart'; +// import 'package:mc_common_app/generated/locale_keys.g.dart'; +// import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; +// import 'package:mc_common_app/theme/colors.dart'; +// import 'package:mc_common_app/utils/enums.dart'; +// import 'package:mc_common_app/utils/navigator.dart'; +// import 'package:mc_common_app/view_models/ad_view_model.dart'; +// import 'package:mc_common_app/views/advertisement/ads_list.dart'; +// import 'package:mc_common_app/widgets/button/show_fill_button.dart'; +// import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; +// import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; +// import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; +// import 'package:provider/provider.dart'; +// import 'package:easy_localization/easy_localization.dart'; +// +// class AdsFragment extends StatelessWidget { +// AdsFragment({Key? key}) : super(key: key); +// +// List getAdsList(AdVM adVM) { +// if (adVM.isExploreAdsTapped) { +// return adVM.exploreAdsFilteredList; +// } +// if (adVM.myAdsFilteredList.isNotEmpty) { +// return adVM.myAdsFilteredList; +// } +// return []; +// } +// +// @override +// Widget build(BuildContext context) { +// return Consumer( +// builder: (BuildContext context, AdVM adVM, Widget? child) { +// return Scaffold( +// appBar: CustomAppBar( +// title: LocaleKeys.ads.tr(), +// isRemoveBackButton: true, +// actions: [ +// Padding( +// padding: EdgeInsets.only(top: adVM.adsFiltersCounter > 0 ? 20 : 0, right: 21), +// child: Badge( +// isLabelVisible: adVM.adsFiltersCounter > 0, +// largeSize: 15, +// smallSize: 20, +// backgroundColor: MyColors.darkPrimaryColor, +// label: Text('${adVM.adsFiltersCounter}'), +// child: MyAssets.searchIcon.buildSvg(), +// ), +// ).onPress(() { +// navigateWithName(context, AppRoutes.adsFilterView); +// }) +// ], +// ), +// body: SizedBox( +// width: double.infinity, +// height: double.infinity, +// child: Column( +// children: [ +// 16.height, +// Consumer( +// builder: (BuildContext context, AdVM adVM, Widget? child) { +// return Column( +// children: [ +// Row( +// children: [ +// Expanded( +// child: ShowFillButton( +// isFilled: adVM.isExploreAdsTapped, +// maxHeight: 55, +// title: LocaleKeys.exploreAds.tr(), +// txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, +// onPressed: () { +// print("accessToken: ${AppState().getUser.data!.accessToken}"); +// adVM.populateAdsFilterList(); +// if (adVM.myAds.isEmpty) { +// adVM.getMyAds(); +// } +// adVM.updateIsExploreAds(true); +// }, +// ), +// ), +// 12.width, +// Expanded( +// child: ShowFillButton( +// isFilled: !adVM.isExploreAdsTapped, +// txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, +// maxHeight: 55, +// title: LocaleKeys.myAds.tr(), +// onPressed: () { +// adVM.updateIsExploreAds(false); +// }, +// ), +// ), +// ], +// ).horPaddingMain(), +// if (adVM.isExploreAdsTapped) ...[ +// if (adVM.adsFiltersCounter == 0) ...[ +// 16.height, +// FiltersList( +// filterList: adVM.exploreAdsFilterOptions, +// onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(createdByRoleFilter: selectedFilterId.toCreatedByRoleEnum()), +// needLeftPadding: false) +// .paddingOnly(left: 21), +// ] +// ] else ...[ +// 16.height, +// FiltersList( +// filterList: adVM.myAdsFilterOptions, +// onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(adPostStatusEnum: selectedFilterId.toAdPostEnum()), +// needLeftPadding: false, +// ).paddingOnly(left: 21), +// ], +// ], +// ); +// }, +// ), +// 16.height, +// Expanded( +// child: RefreshIndicator( +// onRefresh: () async { +// await adVM.getExploreAds(); +// await adVM.getMyAds(); +// }, +// child: BuildAdsList( +// isAdsFragment: true, +// shouldShowAdStatus: !adVM.isExploreAdsTapped, +// adsList: getAdsList(adVM), +// ), +// ), +// ) +// ], +// ), +// ), +// floatingActionButton: FloatingActionButton( +// onPressed: () async { +// navigateWithName(context, AppRoutes.selectAdTypeView, arguments: injector.get().currentAppType == AppType.provider); +// }, +// backgroundColor: MyColors.darkPrimaryColor, +// child: Icon( +// Icons.add, +// color: MyColors.white, +// ), +// ), +// ); +// }, +// ); +// } +// } diff --git a/lib/views/dashboard/fragments/appointments_fragment.dart b/lib/views/dashboard/fragments/appointments_fragment.dart index 7f9d903..7f8b20c 100644 --- a/lib/views/dashboard/fragments/appointments_fragment.dart +++ b/lib/views/dashboard/fragments/appointments_fragment.dart @@ -1,8 +1,8 @@ - +import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/generated/locale_keys.g.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/views/appointments/widgets/customer_appointment_slider_widget.dart'; +import 'package:mc_common_app/views/appointments/widgets/common_appointment_slider_widget.dart'; import 'package:flutter/material.dart'; import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; @@ -11,24 +11,43 @@ import 'package:mc_common_app/models/appointments_models/appointment_list_model. import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/navigator.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; import 'package:easy_localization/easy_localization.dart'; - class AppointmentsFragment extends StatelessWidget { const AppointmentsFragment({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - return Scaffold( - body: Container( - color: MyColors.backgroundColor, - width: double.infinity, - height: double.infinity, - child: Consumer( - builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { - return Column( + return Consumer( + builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { + return Scaffold( + appBar: CustomAppBar( + title: LocaleKeys.appointments.tr(), + isRemoveBackButton: true, + actions: [ + Padding( + padding: EdgeInsets.only(top: appointmentsVM.appointmentFiltersCounter > 0 ? 20 : 0, right: 21), + child: Badge( + isLabelVisible: appointmentsVM.appointmentFiltersCounter > 0, + largeSize: 15, + smallSize: 20, + backgroundColor: MyColors.darkPrimaryColor, + label: Text('${appointmentsVM.appointmentFiltersCounter}'), + child: MyAssets.searchIcon.buildSvg(), + ), + ).onPress(() { + navigateWithName(context, AppRoutes.appoinmentSearchFilterPage); + }) + ], + ), + body: SizedBox( + width: double.infinity, + height: double.infinity, + child: Column( children: [ 16.height, FiltersList( @@ -74,20 +93,20 @@ class AppointmentsFragment extends StatelessWidget { ), ), ], - ); - }, - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: () async { - context.read().onNavbarTapped(0); - }, - backgroundColor: MyColors.darkPrimaryColor, - child: Icon( - Icons.add, - color: MyColors.white, - ), - ), + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: () async { + context.read().onNavbarTapped(0); + }, + backgroundColor: MyColors.darkPrimaryColor, + child: Icon( + Icons.add, + color: MyColors.white, + ), + ), + ); + }, ); } } diff --git a/lib/views/dashboard/fragments/branches_fragment.dart b/lib/views/dashboard/fragments/branches_fragment.dart index e7dd7a5..639c94b 100644 --- a/lib/views/dashboard/fragments/branches_fragment.dart +++ b/lib/views/dashboard/fragments/branches_fragment.dart @@ -10,8 +10,10 @@ import 'package:mc_common_app/models/provider_branches_models/branch_detail_mode import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/navigator.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; import 'package:mc_common_app/widgets/common_widgets/provider_details_card.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; class BranchesFragment extends StatelessWidget { @@ -19,72 +21,92 @@ class BranchesFragment extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - color: MyColors.backgroundColor, - width: double.infinity, - height: double.infinity, - child: Consumer( - builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { - return Column( - children: [ - if (appointmentsVM.branchesFilterOptions.isNotEmpty) ...[ - 16.height, - FiltersList( - filterList: appointmentsVM.branchesFilterOptions, - onFilterTapped: (index, selectedFilterId) => appointmentsVM.applyFilterOnBranches(index: index), + return Consumer( + builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { + return Scaffold( + appBar: CustomAppBar( + title: LocaleKeys.branches.tr(), + isRemoveBackButton: true, + actions: [ + Padding( + padding: EdgeInsets.only(top: appointmentsVM.branchFiltersCounter > 0 ? 20 : 0, right: 21), + child: Badge( + largeSize: 15, + smallSize: 20, + isLabelVisible: appointmentsVM.branchFiltersCounter > 0, + backgroundColor: MyColors.darkPrimaryColor, + label: Text('${appointmentsVM.branchFiltersCounter}'), + child: MyAssets.searchIcon.buildSvg(), ), - ], - 16.height, - Expanded( - child: RefreshIndicator( - onRefresh: () async { - context.read().getAllNearBranches(isNeedToRebuild: true, isFromRefresh: true); - }, - child: Container( - width: double.infinity, - height: MediaQuery.of(context).size.height / 1.37, - child: appointmentsVM.state == ViewState.busy - ? const Center( - child: CircularProgressIndicator(), - ) - : appointmentsVM.nearbyBranches.isEmpty - ? Center( - child: LocaleKeys.no_branch.tr().toText( - fontSize: 16, - color: MyColors.lightTextColor, - ), - ) - : ListView.separated( - itemCount: appointmentsVM.nearbyBranches.length, - itemBuilder: (context, index) { - BranchDetailModel branchDetailModel = appointmentsVM.nearbyBranches[index]; + ).onPress(() { + navigateWithName(context, AppRoutes.branchSearchFilterPage); + }), + ], + ), + body: SizedBox( + width: double.infinity, + height: double.infinity, + child: Column( + children: [ + if (appointmentsVM.branchesFilterOptions.isNotEmpty) ...[ + 16.height, + FiltersList( + filterList: appointmentsVM.branchesFilterOptions, + onFilterTapped: (index, selectedFilterId) => appointmentsVM.applyFilterOnBranches(index: index), + ), + ], + 16.height, + Expanded( + child: RefreshIndicator( + onRefresh: () async { + context.read().getAllNearBranches(isNeedToRebuild: true, isFromRefresh: true); + }, + child: Container( + width: double.infinity, + height: MediaQuery.of(context).size.height / 1.37, + child: appointmentsVM.state == ViewState.busy + ? const Center( + child: CircularProgressIndicator(), + ) + : appointmentsVM.nearbyBranches.isEmpty + ? Center( + child: LocaleKeys.no_branch.tr().toText( + fontSize: 16, + color: MyColors.lightTextColor, + ), + ) + : ListView.separated( + itemCount: appointmentsVM.nearbyBranches.length, + itemBuilder: (context, index) { + BranchDetailModel branchDetailModel = appointmentsVM.nearbyBranches[index]; - return ProviderDetailsCard( - onCardTapped: () { - navigateWithName(context, AppRoutes.branchDetailPage, arguments: branchDetailModel); - }, - providerImageUrl: MyAssets.bnCar, - title: branchDetailModel.branchName ?? "", - providerLocation: branchDetailModel.distanceKm.toString() + " KM", - providerName: branchDetailModel.serviceProviderName ?? "", - providerRatings: "4.9", - services: branchDetailModel.branchServices, - ); - }, - separatorBuilder: (context, index) { - return 12.height; - }, - padding: const EdgeInsets.all( - 12, + return ProviderDetailsCard( + onCardTapped: () { + navigateWithName(context, AppRoutes.branchDetailPage, arguments: branchDetailModel); + }, + providerImageUrl: MyAssets.bnCar, + title: branchDetailModel.branchName ?? "", + providerLocation: branchDetailModel.distanceKm.toString() + " KM", + providerName: branchDetailModel.serviceProviderName ?? "", + providerRatings: "4.9", + services: branchDetailModel.branchServices, + ); + }, + separatorBuilder: (context, index) { + return 12.height; + }, + padding: const EdgeInsets.all( + 12, + ), ), - ), + ), ), ), - ), - ], - ); - }, - ), + ], + ), + ), + ); + }, ); } } diff --git a/lib/views/dashboard/fragments/home_fragment.dart b/lib/views/dashboard/fragments/home_fragment.dart index e892e7a..f458210 100644 --- a/lib/views/dashboard/fragments/home_fragment.dart +++ b/lib/views/dashboard/fragments/home_fragment.dart @@ -1,17 +1,23 @@ 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:flutter/material.dart'; +import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart'; +import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/enums.dart'; +import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/view_models/ad_view_model.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/views/advertisement/ads_list.dart'; -import 'package:mc_common_app/views/appointments/widgets/customer_appointment_slider_widget.dart'; -import 'package:mc_common_app/widgets/common_widgets/my_service_provider.dart'; +import 'package:mc_common_app/views/appointments/widgets/common_appointment_slider_widget.dart'; +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:badges/badges.dart' as b; + import 'package:easy_localization/easy_localization.dart'; class HomeFragment extends StatelessWidget { @@ -21,97 +27,129 @@ class HomeFragment extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( drawer: CustomDrawer(dashboardVM: context.watch()), - body: RefreshIndicator( - onRefresh: () async { - context.read().onInitState(context); - context.read().onRefresh(context); - return; - }, - child: SizedBox( - width: double.infinity, - height: double.infinity, - child: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.only(top: 8), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - 16.height, - ViewAllWidget( - title: LocaleKeys.upcoming_appointment.tr().toUpperCase(), - subTitle: LocaleKeys.view_all.tr(), - onSubtitleTapped: () { - context.read().onNavbarTapped(1); - context.read().applyFilterOnAppointmentsVM(appointmentStatusEnum: AppointmentStatusEnum.allAppointments); - }, - ).horPaddingMain(), - CustomerAppointmentSliderWidget(), - 7.height, - ViewAllWidget( - title: LocaleKeys.my_recent_providers.tr().toUpperCase(), - subTitle: LocaleKeys.view_all.tr(), - onSubtitleTapped: () { - context.read().onNavbarTapped(0); - context.read().applyFilterOnBranches(index: 0); - }).horPaddingMain(), - Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { - return ServiceProviderWidget(nearbyBranches: context.read().nearbyBranches).horPaddingMain(); - }), - Consumer( - builder: (BuildContext context, AdVM adVM, Widget? child) { - return Column( - children: [ - if (adVM.myActiveAdsForHome.isNotEmpty) ...[ - Column( - children: [ - 15.height, - ViewAllWidget( - title: LocaleKeys.my_active_Ads.tr().toUpperCase(), - subTitle: LocaleKeys.view_all.tr(), - onSubtitleTapped: () { - context.read().onNavbarTapped(3); - context.read().updateIsExploreAds(false); - }).horPaddingMain(), - BuildAdsList( - shouldShowAdStatus: true, - isAdsFragment: false, - adsList: adVM.myActiveAdsForHome, - scrollPhysics: NeverScrollableScrollPhysics(), - ), - ], - ) - ], - if (adVM.exploreAds.isNotEmpty) ...[ - Column( - children: [ - 15.height, - ViewAllWidget( - title: LocaleKeys.myRecommendedAds.tr().toUpperCase(), - subTitle: LocaleKeys.view_all.tr(), - onSubtitleTapped: () { - context.read().onNavbarTapped(3); - context.read().updateIsExploreAds(true); - context.read().applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds); - }, - ).horPaddingMain(), - BuildAdsList( - shouldShowAdStatus: false, - adsList: adVM.exploreAds.length >= 3 ? adVM.exploreAds.take(3).toList() : adVM.exploreAds, - isAdsFragment: false, - scrollPhysics: NeverScrollableScrollPhysics(), - ), - ], - ) - ] - ], - ); - }, - ), - 20.height, - ], + appBar: CustomAppBar( + isDrawerEnabled: true, + leadingWidth: 100, + onTap: () => navigateWithName(context, AppRoutes.settingOptionsLanguages), + actions: [ + IconButton( + onPressed: () { + context.read().onRefresh(context); + }, + icon: const b.Badge( + badgeContent: Text( + '3', + style: TextStyle( + fontSize: 10, + color: Colors.white, + ), + ), + badgeStyle: b.BadgeStyle( + badgeColor: MyColors.primaryColor, + padding: EdgeInsets.all(5), ), + child: Icon(Icons.notifications_active), ), ), + 10.width, + ], + ), + body: SizedBox( + width: double.infinity, + height: double.infinity, + child: RefreshIndicator( + onRefresh: () async { + await context.read().onRefresh(context); + }, + child: ListView( + children: [ + 16.height, + ViewAllWidget( + title: LocaleKeys.upcoming_appointment.tr().toUpperCase(), + subTitle: LocaleKeys.view_all.tr(), + onSubtitleTapped: () { + context.read().onNavbarTapped(1); + context.read().applyFilterOnAppointmentsVM(appointmentStatusEnum: AppointmentStatusEnum.allAppointments); + }, + ).horPaddingMain(), + CommonAppointmentSliderWidget(), + 7.height, + Consumer( + builder: (BuildContext context, AppointmentsVM appointmentVM, Widget? child) { + if (appointmentVM.state == ViewState.busy) { + return Center(child: CircularProgressIndicator()); + } + return Column( + children: [ + ViewAllWidget( + title: LocaleKeys.my_recent_providers.tr().toUpperCase(), + subTitle: '', + onSubtitleTapped: () { + // context.read().onNavbarTapped(0); + // context.read().applyFilterOnBranches(index: 0); + }) + .horPaddingMain(), + MyRecentBranchesWidget(nearbyBranches: appointmentVM.myRecentBranches).horPaddingMain(), + ], + ); + }, + ), + Consumer( + builder: (BuildContext context, AdVM adVM, Widget? child) { + if (adVM.state == ViewState.busy) { + return Center(child: CircularProgressIndicator()); + } + return Column( + children: [ + if (adVM.myActiveAdsForHome.isNotEmpty) ...[ + Column( + children: [ + 15.height, + ViewAllWidget( + title: LocaleKeys.my_active_Ads.tr().toUpperCase(), + subTitle: LocaleKeys.view_all.tr(), + onSubtitleTapped: () { + context.read().onNavbarTapped(3); + context.read().updateIsExploreAds(false); + }).horPaddingMain(), + BuildAdsList( + shouldShowAdStatus: true, + isAdsFragment: false, + adsList: adVM.myActiveAdsForHome, + scrollPhysics: NeverScrollableScrollPhysics(), + ), + ], + ) + ], + if (adVM.exploreAds.isNotEmpty) ...[ + Column( + children: [ + 15.height, + ViewAllWidget( + title: LocaleKeys.myRecommendedAds.tr().toUpperCase(), + subTitle: LocaleKeys.view_all.tr(), + onSubtitleTapped: () { + context.read().onNavbarTapped(3); + context.read().updateIsExploreAds(true); + context.read().applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds); + }, + ).horPaddingMain(), + BuildAdsList( + shouldShowAdStatus: false, + adsList: adVM.exploreAds.length >= 3 ? adVM.exploreAds.take(3).toList() : adVM.exploreAds, + isAdsFragment: false, + scrollPhysics: NeverScrollableScrollPhysics(), + ), + ], + ) + ] + ], + ); + }, + ), + 20.height, + ], + ), ), ), ); diff --git a/lib/views/dashboard/fragments/my_requests_fragment.dart b/lib/views/dashboard/fragments/my_requests_fragment.dart index b0ebe78..b237d1d 100644 --- a/lib/views/dashboard/fragments/my_requests_fragment.dart +++ b/lib/views/dashboard/fragments/my_requests_fragment.dart @@ -1,76 +1,80 @@ -import 'package:mc_common_app/generated/locale_keys.g.dart'; -import 'package:mc_common_app/view_models/requests_view_model.dart'; -import 'package:flutter/material.dart'; -import 'package:mc_common_app/config/routes.dart'; -import 'package:mc_common_app/extensions/int_extensions.dart'; -import 'package:mc_common_app/extensions/string_extensions.dart'; -import 'package:mc_common_app/theme/colors.dart'; -import 'package:mc_common_app/utils/enums.dart'; -import 'package:mc_common_app/utils/navigator.dart'; -import 'package:mc_common_app/views/requests/widget/request_item.dart'; -import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; -import 'package:provider/provider.dart'; -import 'package:easy_localization/easy_localization.dart'; - -class MyRequestsFragment extends StatelessWidget { - const MyRequestsFragment({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Container( - color: MyColors.backgroundColor, - width: double.infinity, - height: double.infinity, - child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) { - return Column( - children: [ - 16.height, - FiltersList( - filterList: requestsVM.requestsTypeFilterOptions, - onFilterTapped: (index, selectedFilterId) { - requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeStatusEnum()); - }, - ), - 8.height, - Expanded( - child: RefreshIndicator( - onRefresh: () async => await requestsVM.getRequests(isNeedToRebuild: true, appType: AppType.customer), - child: requestsVM.state == ViewState.busy - ? const Center(child: CircularProgressIndicator()) - : requestsVM.myFilteredRequests.isEmpty - ? Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor), - ], - ) - : ListView.separated( - itemBuilder: (context, index) { - return RequestItem( - request: requestsVM.myFilteredRequests[index], - appType: AppType.customer, - requestIndex: index, - ); - }, - separatorBuilder: (context, index) => 16.height, - itemCount: requestsVM.myFilteredRequests.length, - padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8), - ), - ), - ) - ], - ); - }), - ), - floatingActionButton: FloatingActionButton( - onPressed: () => navigateWithName(context, AppRoutes.createRequestPage), - backgroundColor: MyColors.darkPrimaryColor, - child: const Icon( - Icons.add, - color: MyColors.white, - ), - ), - ); - } -} +// import 'package:mc_common_app/generated/locale_keys.g.dart'; +// import 'package:mc_common_app/view_models/requests_view_model.dart'; +// import 'package:flutter/material.dart'; +// import 'package:mc_common_app/config/routes.dart'; +// import 'package:mc_common_app/extensions/int_extensions.dart'; +// import 'package:mc_common_app/extensions/string_extensions.dart'; +// import 'package:mc_common_app/theme/colors.dart'; +// import 'package:mc_common_app/utils/enums.dart'; +// import 'package:mc_common_app/utils/navigator.dart'; +// import 'package:mc_common_app/views/requests/widget/request_item.dart'; +// import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; +// import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; +// import 'package:provider/provider.dart'; +// import 'package:easy_localization/easy_localization.dart'; +// +// class MyRequestsFragment extends StatelessWidget { +// const MyRequestsFragment({super.key}); +// +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// appBar: CustomAppBar( +// title: LocaleKeys.myRequests.tr(), +// isRemoveBackButton: true, +// ), +// body: SizedBox( +// width: double.infinity, +// height: double.infinity, +// child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) { +// return Column( +// children: [ +// 16.height, +// FiltersList( +// filterList: requestsVM.requestsTypeFilterOptions, +// onFilterTapped: (index, selectedFilterId) { +// requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeStatusEnum()); +// }, +// ), +// 8.height, +// Expanded( +// child: RefreshIndicator( +// onRefresh: () async => await requestsVM.getRequests(isNeedToRebuild: true, appType: AppType.customer), +// child: requestsVM.state == ViewState.busy +// ? const Center(child: CircularProgressIndicator()) +// : requestsVM.myFilteredRequests.isEmpty +// ? Column( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor), +// ], +// ) +// : ListView.separated( +// itemBuilder: (context, index) { +// return RequestItem( +// request: requestsVM.myFilteredRequests[index], +// appType: AppType.customer, +// requestIndex: index, +// ); +// }, +// separatorBuilder: (context, index) => 16.height, +// itemCount: requestsVM.myFilteredRequests.length, +// padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8), +// ), +// ), +// ) +// ], +// ); +// }), +// ), +// floatingActionButton: FloatingActionButton( +// onPressed: () => navigateWithName(context, AppRoutes.createRequestPage), +// backgroundColor: MyColors.darkPrimaryColor, +// child: const Icon( +// Icons.add, +// color: MyColors.white, +// ), +// ), +// ); +// } +// } diff --git a/lib/views/dashboard/widgets/my_branches_widget.dart b/lib/views/dashboard/widgets/my_recent_branches_widget.dart similarity index 50% rename from lib/views/dashboard/widgets/my_branches_widget.dart rename to lib/views/dashboard/widgets/my_recent_branches_widget.dart index bb291b2..7b2687b 100644 --- a/lib/views/dashboard/widgets/my_branches_widget.dart +++ b/lib/views/dashboard/widgets/my_recent_branches_widget.dart @@ -1,37 +1,45 @@ - import 'package:flutter/material.dart'; +import 'package:mc_common_app/classes/consts.dart'; +import 'package:mc_common_app/config/routes.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/provider_branches_models/branch_detail_model.dart'; +import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; -class ServiceProviderWidget extends StatelessWidget { - const ServiceProviderWidget({Key? key}) : super(key: key); +class MyRecentBranchesWidget extends StatelessWidget { + final List nearbyBranches; + + const MyRecentBranchesWidget({Key? key, required this.nearbyBranches}) : super(key: key); @override Widget build(BuildContext context) { return SizedBox( width: double.infinity, - height: 150, + height: 140, child: ListView.builder( - itemCount: 9, + itemCount: nearbyBranches.length, scrollDirection: Axis.horizontal, shrinkWrap: true, itemBuilder: (BuildContext context, int index) { + BranchDetailModel branchDetailModel = nearbyBranches[index]; return SizedBox( width: 90, child: Column( children: [ Image.asset( - "assets/images/bn_car.jpeg", + MyAssets.bnCar, width: 80, height: 80, fit: BoxFit.cover, ).toCircle(borderRadius: 100), 8.height, - "Olaya Branch".toText(fontSize: 14, isBold: true, textAlign: TextAlign.center), + "${branchDetailModel.branchName}".toText(fontSize: 14, isBold: true, textAlign: TextAlign.center), ], ), - ); + ).onPress(() { + navigateWithName(context, AppRoutes.branchDetailPage, arguments: branchDetailModel); + }); }, ), );