diff --git a/.gitignore b/.gitignore index 0fa6b67..e84c8f4 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,4 @@ app.*.map.json /android/app/debug /android/app/profile /android/app/release +/pubspec.lock diff --git a/lib/config/provider_routes.dart b/lib/config/provider_routes.dart index aac9344..74a82e2 100644 --- a/lib/config/provider_routes.dart +++ b/lib/config/provider_routes.dart @@ -76,10 +76,7 @@ class ProviderAppRoutes { static final Map routes = { //Home page AppRoutes.dashboard: (context) => const DashboardPage(), - AppRoutes.adsDetailView: (context) => AdsDetailView(adDetails: ModalRoute.of(context)!.settings.arguments as AdDetailsModel), - AppRoutes.createAdView: (context) => const CreateAdView(), - //setting // defineLicense: (context) => DefineLicensePage(), dealershipSetting: (context) => DealershipPage(), // branchList: (context) => BranchListPage(), @@ -100,7 +97,6 @@ class ProviderAppRoutes { //Subscriptions mySubscriptionsPage: (context) => const MySubscriptionsPage(), subscriptionsPage: (context) => const SubscriptionsPage(), - AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(paymentType: ModalRoute.of(context)!.settings.arguments as PaymentTypes), //Services dealerUser: (context) => DealerUserPage(ModalRoute.of(context)!.settings.arguments as String), @@ -117,10 +113,5 @@ class ProviderAppRoutes { //Branch Duplication matchServices: (context) => MatchedServicesPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as MatchServicesArguments)), - - AppRoutes.chatView: (context) => ChatView(chatViewArguments: ModalRoute.of(context)!.settings.arguments as ChatViewArguments), - - //ADS: - AppRoutes.selectAdTypeView: (context) => SelectAdTypeView(isProvider: ModalRoute.of(context)!.settings.arguments as bool), }; } diff --git a/lib/view_models/dashboard_view_model.dart b/lib/view_models/dashboard_view_model.dart index c92df43..3da551d 100644 --- a/lib/view_models/dashboard_view_model.dart +++ b/lib/view_models/dashboard_view_model.dart @@ -10,11 +10,18 @@ import 'package:mc_common_app/main.dart'; import 'package:mc_common_app/models/user_models/image_response.dart'; import 'package:mc_common_app/repositories/user_repo.dart'; import 'package:mc_common_app/services/common_services.dart'; -import 'package:mc_common_app/services/firebase_service.dart'; +import 'package:mc_common_app/utils/enums.dart'; +import 'package:provider/provider.dart'; import 'package:mc_common_app/utils/location/Location.dart'; import 'package:mc_common_app/utils/shared_prefrence.dart'; import 'package:mc_common_app/utils/utils.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/base_view_model.dart'; +import 'package:mc_common_app/view_models/chat_view_model.dart'; +import 'package:mc_common_app/view_models/requests_view_model.dart'; +import 'package:mc_common_app/view_models/service_view_model.dart'; +import 'package:mc_common_app/view_models/subscriptions_view_model.dart'; class DashboardVM extends BaseVM { final CommonAppServices commonServices; @@ -27,7 +34,7 @@ class DashboardVM extends BaseVM { int selectedNavbarBarIndex = 2; void onNavbarTapped(int index) { - print(AppState().getDeviceToken); + logger.i(AppState().getDeviceToken); selectedNavbarBarIndex = index; notifyListeners(); } @@ -71,9 +78,53 @@ class DashboardVM extends BaseVM { notifyListeners(); } - updateIndex(int i) async { - print(AppState().getDeviceToken); - selectedNavbarBarIndex = i; - notifyListeners(); + Future onRefresh(BuildContext context) async { + final requestsVM = context.read(); + final chatVM = context.read(); + final appointmentVM = context.read(); + final serviceVM = context.read(); + final adVm = context.read(); + final subscriptionsVM = context.read(); + requestsVM.populateRequestsFilterList(); + appointmentVM.populateAppointmentsFilterList(); + await serviceVM.getBranchAndServices(); + await appointmentVM.getMyAppointmentsForProvider({"ServiceProviderID": injector.get().getUser.data?.userInfo?.providerId.toString() ?? "0"}); + adVm.populateAdsFilterList(); + await chatVM.buildHubConnection(context); + + await adVm.getMyAds(); + await adVm.getExploreAds(); + await adVm.getVehicleTypes(); + await adVm.getVehicleAdsDuration(); + await requestsVM.getRequests(appType: AppType.provider); + await subscriptionsVM.getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? ""); + await subscriptionsVM.getSubscriptionBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "", true); + + // if (adVm.myAds.isEmpty) { + // await adVm.getMyAds(); + // } + // + // if (adVm.exploreAds.isEmpty) { + // await adVm.getExploreAds(); + // } + // if (adVm.vehicleTypes.isEmpty) { + // await adVm.getVehicleTypes(); + // } + // + // if (adVm.vehicleAdsDurations.isEmpty) { + // await adVm.getVehicleAdsDuration(); + // } + // + // if (requestsVM.myRequests.isEmpty) { + // await requestsVM.getRequests(appType: AppType.provider); + // } + // + // if (subscriptionsVM.mySubscriptionsBySp.isEmpty) { + // await subscriptionsVM.getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? ""); + // } + // + // if (subscriptionsVM.tempSubscriptions.isEmpty) { + // await subscriptionsVM.getSubscriptionBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "", true); + // } } } diff --git a/lib/views/dashboard/dashboard_page.dart b/lib/views/dashboard/dashboard_page.dart index e34b2ba..a38785a 100644 --- a/lib/views/dashboard/dashboard_page.dart +++ b/lib/views/dashboard/dashboard_page.dart @@ -1,29 +1,13 @@ import 'dart:async'; - import 'package:car_provider_app/view_models/dashboard_view_model.dart'; -import 'package:mc_common_app/view_models/service_view_model.dart'; -import 'package:car_provider_app/views/dashboard/fragments/ads_fragment.dart'; -import 'package:car_provider_app/views/dashboard/fragments/my_requests_fragment.dart'; - import 'package:car_provider_app/views/settings/branch/branch_list_page.dart'; - 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/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/chat_view_model.dart'; -import 'package:mc_common_app/view_models/requests_view_model.dart'; -import 'package:mc_common_app/view_models/subscriptions_view_model.dart'; - import 'package:mc_common_app/widgets/common_widgets/bottom_nav_bar.dart'; import 'package:provider/provider.dart'; import 'fragments/branch_appointment_fragment.dart'; import 'fragments/home_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); @@ -40,103 +24,27 @@ class _DashboardPageState extends State { void initState() { super.initState(); dashboardVM = Provider.of(context, listen: false); - context.read().populateRequestsFilterList(); - context.read().populateAppointmentsFilterList(); - scheduleMicrotask(() => _onRefresh()); - } - - Future _onRefresh() async { - final requestsVM = context.read(); - final chatVM = context.read(); - await context.read().getBranchAndServices(); - AdVM adVm = Provider.of(context, listen: false); - SubscriptionsVM sVM = Provider.of(context, listen: false); - await context.read().getMyAppointmentsForProvider({"ServiceProviderID": injector.get().getUser.data?.userInfo?.providerId.toString() ?? "0"}); - adVm.populateAdsFilterList(); - await chatVM.buildHubConnection(context); - - if (adVm.myAds.isEmpty) { - await adVm.getMyAds(); - } - - if (adVm.exploreAds.isEmpty) { - await adVm.getExploreAds(); - } - if (adVm.vehicleTypes.isEmpty) { - await adVm.getVehicleTypes(); - } - - if (adVm.vehicleAdsDurations.isEmpty) { - await adVm.getVehicleAdsDuration(); - } - - if (requestsVM.myRequests.isEmpty) { - await requestsVM.getRequests(appType: AppType.provider); - } - - if (sVM.mySubscriptionsBySp.isEmpty) { - await sVM.getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? ""); - } - - if (sVM.tempSubscriptions.isEmpty) { - await sVM.getSubscriptionBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "", true); - } + scheduleMicrotask(() => dashboardVM.onRefresh(context)); } @override Widget build(BuildContext context) { List fragments = [ - BranchListPage( - onBackButtonTapped: () { - dashboardVM.updateIndex(2); - }, - onRefresh: () async { - context.read().getBranchAndServices(); - }, - ), - BranchAppointmentFragment( - onBackButtonTapped: () { - dashboardVM.updateIndex(2); - }, - onRefresh: () async { - context.read().getBranchAndServices(); - }, - ), - HomeFragment( - onTap: () { - navigateWithName(context, AppRoutes.settingOptionsLanguages); - }, - onRefresh: () async { - _onRefresh(); - }, - onNotificaitonClick: () { - _onRefresh(); - }, - ), - AdsFragment( - onBackButtonTapped: () { - dashboardVM.updateIndex(2); - }, - ), - MyRequestsFragment( - onBackButtonTapped: () { - dashboardVM.updateIndex(2); - }, - ), + const BranchListPage(), + const BranchAppointmentFragment(), + const HomeFragment(), + const AdsFragment(), + const MyRequestsFragment(), ]; return PopScope( canPop: false, child: Scaffold( key: _scaffoldKey, - // drawer: CustomDrawer(dashboardVM: dashboardVM), - // body: Consumer(builder: (context, model, _) { - // return fragments[dashboardVM.selectedNavbarBarIndex]; - // }), body: fragments[context.watch().selectedNavbarBarIndex], bottomNavigationBar: CustomBottomNavbar( - onSelected: (i) { - dashboardVM.updateIndex(i); + onSelected: (index) { + dashboardVM.onNavbarTapped(index); }, isProvider: true, selectedNavbarBarIndex: dashboardVM.selectedNavbarBarIndex, diff --git a/lib/views/dashboard/fragments/ads_fragment.dart b/lib/views/dashboard/fragments/ads_fragment.dart index 22699e7..4b75c40 100644 --- a/lib/views/dashboard/fragments/ads_fragment.dart +++ b/lib/views/dashboard/fragments/ads_fragment.dart @@ -1,135 +1,136 @@ -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/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 { - final bool isNeedAppBar; - final VoidCallback onBackButtonTapped; - - const AdsFragment({Key? key, this.isNeedAppBar = true, required this.onBackButtonTapped}) : 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( - appBar: !isNeedAppBar - ? null - : CustomAppBar( - title: LocaleKeys.ads.tr(), - onBackButtonTapped: onBackButtonTapped, - ), - 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: "Explore Ads", - txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, - onPressed: () { - print("ads: ${AppState().getUser.data!.accessToken}"); - adVM.updateIsExploreAds(true); - }, - ), - ), - 12.width, - Expanded( - child: ShowFillButton( - isFilled: !adVM.isExploreAdsTapped, - txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, - maxHeight: 55, - title: "My Ads", - 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), - ], - if (!adVM.isExploreAdsTapped) ...[ - 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: const 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 { +// const 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, +// 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.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: () 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: const Icon(Icons.add, color: MyColors.white), +// ), +// ); +// }, +// ); +// } +// } diff --git a/lib/views/dashboard/fragments/appoinment_fragment.dart b/lib/views/dashboard/fragments/appoinment_fragment.dart index 2838862..163326b 100644 --- a/lib/views/dashboard/fragments/appoinment_fragment.dart +++ b/lib/views/dashboard/fragments/appoinment_fragment.dart @@ -1,223 +1,222 @@ -import 'package:car_provider_app/config/provider_routes.dart'; -import 'package:car_provider_app/views/dashboard/widget/appointment_slider_widget.dart'; -import 'package:mc_common_app/classes/app_state.dart'; -import 'package:mc_common_app/config/dependency_injection.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/date_helper.dart'; -import 'package:mc_common_app/utils/navigator.dart'; -import 'package:mc_common_app/utils/utils.dart'; -import 'package:mc_common_app/view_models/appointments_view_model.dart'; -import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; -import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; -import 'package:flutter/material.dart'; -import 'package:mc_common_app/extensions/int_extensions.dart'; -import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; -import 'package:percent_indicator/percent_indicator.dart'; -import 'package:provider/provider.dart'; -import 'package:easy_localization/easy_localization.dart'; - - -class AppointmentFragment extends StatelessWidget { - String date = ""; - final VoidCallback onBackButtonTapped; - - AppointmentFragment({Key? key, required this.onBackButtonTapped}) : super(key: key); - - GlobalKey refreshIndicatorKey = GlobalKey(); - - Future _pullRefresh(BuildContext context) async { - await context.read().getMyAppointmentsForProvider({"ServiceProviderID": injector.get().getUser.data?.userInfo?.providerId.toString() ?? "0"}); - } - - @override - Widget build(BuildContext context) { - date = DateHelper.formatAsDayMonthYear(DateTime.now()); - return Scaffold( - appBar: CustomAppBar( - //profileImageUrl: MyAssets.carBanner, - title: LocaleKeys.appointments.tr(), - onBackButtonTapped: onBackButtonTapped, - actions: [ - IconButton( - onPressed: () {}, - icon: const Icon(Icons.search), - ), - 10.width, - ], - ), - body: SizedBox( - width: double.infinity, - height: double.infinity, - child: Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { - return RefreshIndicator( - onRefresh: () => _pullRefresh(context), - key: refreshIndicatorKey, - child: SingleChildScrollView( - physics: const AlwaysScrollableScrollPhysics(), - child: Column( - children: [ - progressWidget(context), - FiltersList( - filterList: appointmentsVM.appointmentsFilterOptions, - padding: const EdgeInsets.symmetric(horizontal: 18), - onFilterTapped: (index, selectedFilterId) { - appointmentsVM.applyFilterOnAppointmentsVM( - appointmentStatusEnum: selectedFilterId.toAppointmentStatusEnum(), - ); - }, - ), - ListView.separated( - itemBuilder: (context, index) { - return AppointmentSliderWidget( - appointmentListModel: appointmentsVM.myFilteredAppointments2[index], - isNeedTotalPayment: false, - onTap: () { - navigateWithName( - context, - ProviderAppRoutes.appointmentDetailList, - arguments: appointmentsVM.myFilteredAppointments2[index].customerAppointmentList, - ); - }, - ); - }, - separatorBuilder: (context, snapchat) { - return 21.height; - }, - itemCount: appointmentsVM.myFilteredAppointments2.length, - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - padding: const EdgeInsets.all(21), - ), - ], - ), - ), - ); - }), - ), - ); - } - - Widget progressWidget(BuildContext context) { - return Column( - children: [ - Row( - children: [ - Expanded( - child: "Slots Overview".toText( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - Row( - children: [ - date.toText( - fontWeight: FontWeight.bold, - ), - const Icon( - Icons.keyboard_arrow_down_outlined, - size: 16, - ), - ], - ) - .toContainer( - backgroundColor: MyColors.lightGreyEAColor, - borderRadius: 100, - padding: const EdgeInsets.symmetric( - horizontal: 12, - vertical: 6, - ), - ) - .onPress(() async { - date = await Utils.pickDateFromDatePicker( - context, - firstDate: null, - ); - context.read().notifyListeners(); - }), - ], - ), - 24.height, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Container( - width: 14, - height: 14, - color: MyColors.lightGreyEAColor, - ), - 4.width, - "Empty: ".toText( - fontSize: 8, - color: Colors.white, - ), - "8".toText( - fontSize: 9, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ], - ).toContainer( - backgroundColor: MyColors.darkIconColor, - ), - 8.height, - Row( - children: [ - Container( - width: 14, - height: 14, - color: MyColors.darkPrimaryColor, - ), - 4.width, - "Occupied: ".toText( - fontSize: 8, - color: Colors.white, - ), - "54".toText( - fontSize: 9, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ], - ).toContainer( - backgroundColor: MyColors.darkIconColor, - ), - ], - ), - CircularPercentIndicator( - radius: 60.0, - lineWidth: 12.0, - percent: 0.7, - circularStrokeCap: CircularStrokeCap.round, - center: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - "Total Slots".toText( - fontSize: 13, - fontWeight: FontWeight.bold, - ), - "24".toText( - fontSize: 24, - fontWeight: FontWeight.bold, - ), - ], - ), - backgroundColor: MyColors.lightGreyEAColor, - progressColor: MyColors.darkPrimaryColor, - ), - ], - ) - ], - ).toWhiteContainer( - width: double.infinity, - pading: const EdgeInsets.all(12), - margin: const EdgeInsets.all(21), - ); - } -} +// import 'package:car_provider_app/config/provider_routes.dart'; +// import 'package:car_provider_app/views/dashboard/widget/appointment_slider_widget.dart'; +// import 'package:mc_common_app/classes/app_state.dart'; +// import 'package:mc_common_app/config/dependency_injection.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/date_helper.dart'; +// import 'package:mc_common_app/utils/navigator.dart'; +// import 'package:mc_common_app/utils/utils.dart'; +// import 'package:mc_common_app/view_models/appointments_view_model.dart'; +// import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; +// import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; +// import 'package:flutter/material.dart'; +// import 'package:mc_common_app/extensions/int_extensions.dart'; +// import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; +// import 'package:percent_indicator/percent_indicator.dart'; +// import 'package:provider/provider.dart'; +// import 'package:easy_localization/easy_localization.dart'; +// +// class AppointmentFragment extends StatelessWidget { +// String date = ""; +// final VoidCallback onBackButtonTapped; +// +// AppointmentFragment({Key? key, required this.onBackButtonTapped}) : super(key: key); +// +// GlobalKey refreshIndicatorKey = GlobalKey(); +// +// Future _pullRefresh(BuildContext context) async { +// await context.read().getMyAppointmentsForProvider({"ServiceProviderID": injector.get().getUser.data?.userInfo?.providerId.toString() ?? "0"}); +// } +// +// @override +// Widget build(BuildContext context) { +// date = DateHelper.formatAsDayMonthYear(DateTime.now()); +// return Scaffold( +// appBar: CustomAppBar( +// //profileImageUrl: MyAssets.carBanner, +// title: LocaleKeys.appointments.tr(), +// onBackButtonTapped: onBackButtonTapped, +// actions: [ +// IconButton( +// onPressed: () {}, +// icon: const Icon(Icons.search), +// ), +// 10.width, +// ], +// ), +// body: SizedBox( +// width: double.infinity, +// height: double.infinity, +// child: Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { +// return RefreshIndicator( +// onRefresh: () => _pullRefresh(context), +// key: refreshIndicatorKey, +// child: SingleChildScrollView( +// physics: const AlwaysScrollableScrollPhysics(), +// child: Column( +// children: [ +// progressWidget(context), +// FiltersList( +// filterList: appointmentsVM.appointmentsFilterOptions, +// padding: const EdgeInsets.symmetric(horizontal: 18), +// onFilterTapped: (index, selectedFilterId) { +// appointmentsVM.applyFilterOnAppointmentsVM( +// appointmentStatusEnum: selectedFilterId.toAppointmentStatusEnum(), +// ); +// }, +// ), +// ListView.separated( +// itemBuilder: (context, index) { +// return AppointmentSliderWidget( +// appointmentListModel: appointmentsVM.myFilteredAppointments2[index], +// isNeedTotalPayment: false, +// onTap: () { +// navigateWithName( +// context, +// ProviderAppRoutes.appointmentDetailList, +// arguments: appointmentsVM.myFilteredAppointments2[index].customerAppointmentList, +// ); +// }, +// ); +// }, +// separatorBuilder: (context, snapchat) { +// return 21.height; +// }, +// itemCount: appointmentsVM.myFilteredAppointments2.length, +// physics: const NeverScrollableScrollPhysics(), +// shrinkWrap: true, +// padding: const EdgeInsets.all(21), +// ), +// ], +// ), +// ), +// ); +// }), +// ), +// ); +// } +// +// Widget progressWidget(BuildContext context) { +// return Column( +// children: [ +// Row( +// children: [ +// Expanded( +// child: "Slots Overview".toText( +// fontSize: 16, +// fontWeight: FontWeight.bold, +// ), +// ), +// Row( +// children: [ +// date.toText( +// fontWeight: FontWeight.bold, +// ), +// const Icon( +// Icons.keyboard_arrow_down_outlined, +// size: 16, +// ), +// ], +// ) +// .toContainer( +// backgroundColor: MyColors.lightGreyEAColor, +// borderRadius: 100, +// padding: const EdgeInsets.symmetric( +// horizontal: 12, +// vertical: 6, +// ), +// ) +// .onPress(() async { +// date = await Utils.pickDateFromDatePicker( +// context, +// firstDate: null, +// ); +// context.read().notifyListeners(); +// }), +// ], +// ), +// 24.height, +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Row( +// children: [ +// Container( +// width: 14, +// height: 14, +// color: MyColors.lightGreyEAColor, +// ), +// 4.width, +// "Empty: ".toText( +// fontSize: 8, +// color: Colors.white, +// ), +// "8".toText( +// fontSize: 9, +// fontWeight: FontWeight.bold, +// color: Colors.white, +// ), +// ], +// ).toContainer( +// backgroundColor: MyColors.darkIconColor, +// ), +// 8.height, +// Row( +// children: [ +// Container( +// width: 14, +// height: 14, +// color: MyColors.darkPrimaryColor, +// ), +// 4.width, +// "Occupied: ".toText( +// fontSize: 8, +// color: Colors.white, +// ), +// "54".toText( +// fontSize: 9, +// fontWeight: FontWeight.bold, +// color: Colors.white, +// ), +// ], +// ).toContainer( +// backgroundColor: MyColors.darkIconColor, +// ), +// ], +// ), +// CircularPercentIndicator( +// radius: 60.0, +// lineWidth: 12.0, +// percent: 0.7, +// circularStrokeCap: CircularStrokeCap.round, +// center: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// "Total Slots".toText( +// fontSize: 13, +// fontWeight: FontWeight.bold, +// ), +// "24".toText( +// fontSize: 24, +// fontWeight: FontWeight.bold, +// ), +// ], +// ), +// backgroundColor: MyColors.lightGreyEAColor, +// progressColor: MyColors.darkPrimaryColor, +// ), +// ], +// ) +// ], +// ).toWhiteContainer( +// width: double.infinity, +// pading: const EdgeInsets.all(12), +// margin: const EdgeInsets.all(21), +// ); +// } +// } diff --git a/lib/views/dashboard/fragments/branch_appointment_fragment.dart b/lib/views/dashboard/fragments/branch_appointment_fragment.dart index 33051b5..0b0b341 100644 --- a/lib/views/dashboard/fragments/branch_appointment_fragment.dart +++ b/lib/views/dashboard/fragments/branch_appointment_fragment.dart @@ -20,26 +20,17 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:easy_localization/easy_localization.dart'; class BranchAppointmentFragment extends StatelessWidget { - bool isNeedAppBar; - VoidCallback onBackButtonTapped; - RefreshCallback onRefresh; - - BranchAppointmentFragment({ + const BranchAppointmentFragment({ Key? key, - this.isNeedAppBar = true, - required this.onBackButtonTapped, - required this.onRefresh, }) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( - appBar: !isNeedAppBar - ? null - : CustomAppBar( - title: LocaleKeys.appointments.tr(), - onBackButtonTapped: onBackButtonTapped, - ), + appBar: CustomAppBar( + title: LocaleKeys.appointments.tr(), + isRemoveBackButton: true, + ), body: SizedBox( width: double.infinity, height: double.infinity, @@ -48,9 +39,7 @@ class BranchAppointmentFragment extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 21, right: 21, top: 21), child: RoleTypeTab( - context.watch().selectedBranchStatus == 3 - ? 0 - : context.watch().selectedBranchStatus, + context.watch().selectedBranchStatus == 3 ? 0 : context.watch().selectedBranchStatus, [ DropValue(3, "Active", ""), DropValue(1, "Requested", ""), @@ -62,19 +51,16 @@ class BranchAppointmentFragment extends StatelessWidget { ), Expanded( child: Consumer( - builder: (context, model, _) { - if (model.state == ViewState.busy) { + builder: (context, ServiceVM serviceVM, _) { + if (serviceVM.state == ViewState.busy) { return const Center(child: CircularProgressIndicator()); } else { List branches = []; - if (model.branches!.data != null) { - branches = model.branches!.data!.serviceProviderBranch! - .where((element) => - model.selectedBranchStatus == element.statusId) - .toList(); + if (serviceVM.branches!.data != null) { + branches = serviceVM.branches!.data!.serviceProviderBranch!.where((element) => serviceVM.selectedBranchStatus == element.statusId).toList(); } return RefreshIndicator( - onRefresh: onRefresh, + onRefresh: () async => serviceVM.getBranchAndServices(), child: branches.isEmpty ? Center(child: Text(LocaleKeys.noBranchFound.tr())) : ListView.separated( @@ -86,8 +72,7 @@ class BranchAppointmentFragment extends StatelessWidget { height: 50, decoration: const BoxDecoration( color: MyColors.darkPrimaryColor, - borderRadius: - BorderRadius.all(Radius.circular(8)), + borderRadius: BorderRadius.all(Radius.circular(8)), ), padding: const EdgeInsets.all(6), child: SvgPicture.asset( @@ -98,10 +83,8 @@ class BranchAppointmentFragment extends StatelessWidget { 12.width, Expanded( child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - mainAxisAlignment: - MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, children: [ Row( children: [ @@ -110,24 +93,12 @@ class BranchAppointmentFragment extends StatelessWidget { size: 12, color: MyColors.darkPrimaryColor, ), - Geolocator.distanceBetween( - AppState() - .currentLocation - .latitude, - AppState() - .currentLocation - .latitude, - double.parse(branches[index] - .latitude ?? - "0"), - double.parse(branches[index] - .longitude ?? - "0")) + Geolocator.distanceBetween(AppState().currentLocation.latitude, AppState().currentLocation.latitude, double.parse(branches[index].latitude ?? "0"), + double.parse(branches[index].longitude ?? "0")) .toStringAsFixed(2) .toText( fontSize: 12, - color: - MyColors.darkPrimaryColor, + color: MyColors.darkPrimaryColor, ) ], ), @@ -138,22 +109,16 @@ class BranchAppointmentFragment extends StatelessWidget { fontWeight: FontWeight.bold, ), ), - "Tap to view".toText( - fontSize: 10, - color: MyColors.grey70Color), + "Tap to view".toText(fontSize: 10, color: MyColors.grey70Color), ], ), ), 12.width, ], ).toContainer().onPress(() async { - branches[index].countryID = - model.branches!.data!.countryID; - branches[index].countryName = - model.branches!.data!.countryName; - navigateWithName( - context, ProviderAppRoutes.appointment, - arguments: branches[index]); + branches[index].countryID = serviceVM.branches!.data!.countryID; + branches[index].countryName = serviceVM.branches!.data!.countryName; + navigateWithName(context, ProviderAppRoutes.appointment, arguments: branches[index]); }); }, separatorBuilder: (context, index) { diff --git a/lib/views/dashboard/fragments/home_fragment.dart b/lib/views/dashboard/fragments/home_fragment.dart index ee13c53..db719f9 100644 --- a/lib/views/dashboard/fragments/home_fragment.dart +++ b/lib/views/dashboard/fragments/home_fragment.dart @@ -2,9 +2,7 @@ import 'package:car_provider_app/config/provider_routes.dart'; import 'package:car_provider_app/view_models/dashboard_view_model.dart'; import 'package:car_provider_app/views/dashboard/widget/my_service_provider.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.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/generated/locale_keys.g.dart'; import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart'; @@ -12,11 +10,8 @@ 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/service_view_model.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/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:badges/badges.dart' as b; @@ -24,13 +19,8 @@ import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; import 'package:easy_localization/easy_localization.dart'; -import '../widget/appointment_slider_widget.dart'; - class HomeFragment extends StatelessWidget { - VoidCallback onTap, onNotificaitonClick; - RefreshCallback onRefresh; - - HomeFragment({required this.onTap, required this.onRefresh, required this.onNotificaitonClick, Key? key}) : super(key: key); + const HomeFragment({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -38,10 +28,14 @@ class HomeFragment extends StatelessWidget { appBar: CustomAppBar( isDrawerEnabled: true, leadingWidth: 100, - onTap: onTap, + onTap: () { + navigateWithName(context, AppRoutes.settingOptionsLanguages); + }, actions: [ IconButton( - onPressed: onNotificaitonClick, + onPressed: () { + context.read().onRefresh(context); + }, icon: const b.Badge( badgeContent: Text( '3', @@ -64,7 +58,9 @@ class HomeFragment extends StatelessWidget { width: double.infinity, height: double.infinity, child: RefreshIndicator( - onRefresh: onRefresh, + onRefresh: () async { + await context.read().onRefresh(context); + }, child: ListView( children: [ 10.height, @@ -72,10 +68,10 @@ class HomeFragment extends StatelessWidget { title: LocaleKeys.upcoming_appointment.tr(), subTitle: LocaleKeys.view_all.tr(), onSubtitleTapped: () { - context.read().updateIndex(1); + context.read().onNavbarTapped(1); }).horPaddingMain(), // const AppointmentSliderWidget().horPaddingMain(), - CustomerAppointmentSliderWidget( + CommonAppointmentSliderWidget( onAppointmentClick: (AppointmentListModel value) { navigateWithName(context, ProviderAppRoutes.appointmentDetailList, arguments: value); }, @@ -85,7 +81,7 @@ class HomeFragment extends StatelessWidget { title: LocaleKeys.myBranches.tr(), subTitle: LocaleKeys.view_all.tr(), onSubtitleTapped: () { - context.read().updateIndex(0); + context.read().onNavbarTapped(0); }, ).horPaddingMain(), const ServiceProviderWidget().horPaddingMain(), diff --git a/lib/views/dashboard/fragments/my_requests_fragment.dart b/lib/views/dashboard/fragments/my_requests_fragment.dart index dd1eaed..a63b3ec 100644 --- a/lib/views/dashboard/fragments/my_requests_fragment.dart +++ b/lib/views/dashboard/fragments/my_requests_fragment.dart @@ -1,74 +1,68 @@ -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/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/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 { - final bool isNeedAppBar; - VoidCallback onBackButtonTapped; - - MyRequestsFragment({super.key, this.isNeedAppBar = true, required this.onBackButtonTapped}); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: !isNeedAppBar - ? null - : CustomAppBar( - title: LocaleKeys.myServiceBranches.tr(), - onBackButtonTapped: onBackButtonTapped, - ), - 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.provider), - 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.provider, requestIndex: index); - }, - separatorBuilder: (context, index) { - return 16.height; - }, - itemCount: requestsVM.myFilteredRequests.length, - padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8), - ), - )) - ], - ); - }), - ), - ); - } -} +// 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/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/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: 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.provider), +// 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.provider, requestIndex: index); +// }, +// separatorBuilder: (context, index) { +// return 16.height; +// }, +// itemCount: requestsVM.myFilteredRequests.length, +// padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8), +// ), +// )) +// ], +// ); +// }), +// ), +// ); +// } +// } diff --git a/lib/views/dashboard/widget/appointment_slider_widget.dart b/lib/views/dashboard/widget/appointment_slider_widget.dart index 71fb6fa..f3b2fcf 100644 --- a/lib/views/dashboard/widget/appointment_slider_widget.dart +++ b/lib/views/dashboard/widget/appointment_slider_widget.dart @@ -10,46 +10,38 @@ import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:flutter_svg/flutter_svg.dart'; class AppointmentSliderWidget extends StatelessWidget { - AppointmentListModel appointmentListModel; - bool isNeedTotalPayment; - bool isNeedToShowItems; - bool isNeedToShowToMoreText; - bool isSelectable; - bool isNeedToShowAppointmentStatus; - bool isNeedToShowMergeStatus; - Function()? onTap; + final AppointmentListModel appointmentListModel; + final bool isNeedTotalPayment; + final bool isNeedToShowItems; + final bool isNeedToShowToMoreText; + final bool isSelectable; + final bool isNeedToShowAppointmentStatus; + final bool isNeedToShowMergeStatus; + final Function()? onTap; - AppointmentSliderWidget( - {required this.appointmentListModel, - required this.onTap, - this.isNeedTotalPayment = false, - this.isNeedToShowItems = false, - this.isNeedToShowToMoreText = true, - this.isSelectable = false, - this.isNeedToShowAppointmentStatus = false, - this.isNeedToShowMergeStatus = false, - Key? key}) - : super(key: key); + const AppointmentSliderWidget({ + required this.appointmentListModel, + required this.onTap, + this.isNeedTotalPayment = false, + this.isNeedToShowItems = false, + this.isNeedToShowToMoreText = true, + this.isSelectable = false, + this.isNeedToShowAppointmentStatus = false, + this.isNeedToShowMergeStatus = false, + Key? key, + }) : super(key: key); - List buildServicesFromAppointment( - {required AppointmentListModel appointmentListModel}) { - if (appointmentListModel.appointmentServicesList == null || - appointmentListModel.appointmentServicesList!.isEmpty) { - return [SizedBox()]; + List buildServicesFromAppointment({required AppointmentListModel appointmentListModel}) { + if (appointmentListModel.appointmentServicesList == null || appointmentListModel.appointmentServicesList!.isEmpty) { + return [const SizedBox()]; } if (appointmentListModel.appointmentServicesList!.length == 1) { List itemsList = []; if (isNeedToShowItems) { itemsList = List.generate( - appointmentListModel - .appointmentServicesList?.first.serviceItems?.length ?? - 0, - (index) => (appointmentListModel.appointmentServicesList?.first - .serviceItems?[index].name ?? - "") - .toString() - .toText( + appointmentListModel.appointmentServicesList?.first.serviceItems?.length ?? 0, + (index) => (appointmentListModel.appointmentServicesList?.first.serviceItems?[index].name ?? "").toString().toText( color: MyColors.lightTextColor, isBold: true, ), @@ -61,8 +53,7 @@ class AppointmentSliderWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, children: [ showServices( - appointmentListModel - .appointmentServicesList![0].providerServiceDescription, + appointmentListModel.appointmentServicesList![0].providerServiceDescription, MyAssets.modificationsIcon, ), if (isNeedToShowItems) ...itemsList, @@ -72,41 +63,30 @@ class AppointmentSliderWidget extends StatelessWidget { } List servicesList = List.generate( - isNeedToShowToMoreText - ? 2 - : appointmentListModel.appointmentServicesList?.length ?? 0, + isNeedToShowToMoreText ? 2 : appointmentListModel.appointmentServicesList?.length ?? 0, (index) { List itemsList = []; if (isNeedToShowItems) { itemsList = List.generate( - appointmentListModel - .appointmentServicesList?[index].serviceItems?.length ?? - 0, - (mIndex) => - (" - ${appointmentListModel.appointmentServicesList?[index].serviceItems?[mIndex].name ?? ""}") - .toString() - .toText( - color: MyColors.lightTextColor, - isBold: true, - ), + appointmentListModel.appointmentServicesList?[index].serviceItems?.length ?? 0, + (mIndex) => (" - ${appointmentListModel.appointmentServicesList?[index].serviceItems?[mIndex].name ?? ""}").toString().toText( + color: MyColors.lightTextColor, + isBold: true, + ), ); } return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - showServices( - appointmentListModel - .appointmentServicesList![index].providerServiceDescription, - MyAssets.modificationsIcon), + showServices(appointmentListModel.appointmentServicesList![index].providerServiceDescription, MyAssets.modificationsIcon), if (isNeedToShowItems) ...itemsList, ], ).paddingOnly(bottom: 4); }, ); - if (isNeedToShowToMoreText && - appointmentListModel.appointmentServicesList!.length > 1) { + if (isNeedToShowToMoreText && appointmentListModel.appointmentServicesList!.length > 1) { servicesList.add( showServices( "+ ${appointmentListModel.appointmentServicesList!.length - 1} More", @@ -133,9 +113,7 @@ class AppointmentSliderWidget extends StatelessWidget { borderRadius: 24, marginAll: 4, paddingAll: 0, - backgroundColor: (appointmentListModel.isSelected ?? false) - ? MyColors.primaryColor - : MyColors.greyButtonColor, + backgroundColor: (appointmentListModel.isSelected ?? false) ? MyColors.primaryColor : MyColors.greyButtonColor, ), ).toContainer( borderRadius: 24, @@ -152,8 +130,7 @@ class AppointmentSliderWidget extends StatelessWidget { children: [ if (isNeedToShowMergeStatus) "Appointment Merged".toText(color: MyColors.white).toContainer( - padding: const EdgeInsets.symmetric( - horizontal: 6, vertical: 3), + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 3), borderRadius: 12, backgroundColor: MyColors.greenColor, ), @@ -171,17 +148,14 @@ class AppointmentSliderWidget extends StatelessWidget { color: MyColors.darkTextColor, isBold: true, ), - (appointmentListModel.customerName ?? "").toText( - color: MyColors.black, isBold: true, fontSize: 16), + (appointmentListModel.customerName ?? "").toText(color: MyColors.black, isBold: true, fontSize: 16), Row( children: [ "Phone:".toText( color: MyColors.lightTextColor, ), 2.width, - appointmentListModel.customerMobileNum - .toString() - .toText( + appointmentListModel.customerMobileNum.toString().toText( fontSize: 12, ), ], @@ -195,9 +169,7 @@ class AppointmentSliderWidget extends StatelessWidget { ), 2.width, Expanded( - child: - "${appointmentListModel.duration ?? ""} ${appointmentListModel.appointmentDate!.toFormattedDateWithoutTime()}" - .toText( + child: "${appointmentListModel.duration ?? ""} ${appointmentListModel.appointmentDate!.toFormattedDateWithoutTime()}".toText( fontSize: 12, ), ), @@ -209,9 +181,7 @@ class AppointmentSliderWidget extends StatelessWidget { color: MyColors.lightTextColor, ), 2.width, - appointmentListModel.appointmentType - .toString() - .toText( + appointmentListModel.appointmentType.toString().toText( fontSize: 12, ), ], @@ -220,8 +190,7 @@ class AppointmentSliderWidget extends StatelessWidget { ), ), if (!isNeedTotalPayment) - if (appointmentListModel.customerAppointmentList!.length > - 1) + if (appointmentListModel.customerAppointmentList!.length > 1) "${appointmentListModel.customerAppointmentList!.length - 1}+ Appointments" .toText( fontSize: 8, @@ -235,12 +204,8 @@ class AppointmentSliderWidget extends StatelessWidget { ), ), if (isNeedToShowAppointmentStatus) - (appointmentListModel.appointmentStatusEnum! - .getAppointmentNameFromEnum()) - .toText(color: MyColors.white) - .toContainer( - padding: const EdgeInsets.symmetric( - horizontal: 6, vertical: 3), + (appointmentListModel.appointmentStatusEnum!.getAppointmentNameFromEnum()).toText(color: MyColors.white).toContainer( + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 3), borderRadius: 12, backgroundColor: MyColors.primaryColor, ), @@ -253,8 +218,7 @@ class AppointmentSliderWidget extends StatelessWidget { Expanded( child: Column( children: [ - ...buildServicesFromAppointment( - appointmentListModel: appointmentListModel), + ...buildServicesFromAppointment(appointmentListModel: appointmentListModel), if (isNeedTotalPayment) Column( children: [ @@ -271,9 +235,7 @@ class AppointmentSliderWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.end, children: [ - appointmentListModel.totalAmount - .toString() - .toText(fontSize: 16, isBold: true), + appointmentListModel.totalAmount.toString().toText(fontSize: 16, isBold: true), 2.width, "SAR:".toText( color: MyColors.lightTextColor, @@ -295,9 +257,7 @@ class AppointmentSliderWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.end, children: [ - appointmentListModel.remainingAmount - .toString() - .toText(fontSize: 16, isBold: true), + appointmentListModel.remainingAmount.toString().toText(fontSize: 16, isBold: true), 2.width, "SAR:".toText( color: MyColors.lightTextColor, @@ -326,11 +286,11 @@ class AppointmentSliderWidget extends StatelessWidget { double calculateTotalPrice() { double totalServiceListPrice = 0; - appointmentListModel.appointmentServicesList!.forEach((servicesElement) { - servicesElement.serviceItems!.forEach((itemsElement) { + for (var servicesElement in appointmentListModel.appointmentServicesList!) { + for (var itemsElement in servicesElement.serviceItems!) { totalServiceListPrice += double.parse(itemsElement.price ?? "0"); - }); - }); + } + } return totalServiceListPrice; } diff --git a/lib/views/settings/branch/branch_list_page.dart b/lib/views/settings/branch/branch_list_page.dart index 345d95b..6766f0d 100644 --- a/lib/views/settings/branch/branch_list_page.dart +++ b/lib/views/settings/branch/branch_list_page.dart @@ -26,35 +26,14 @@ import 'package:mc_common_app/widgets/tab/role_type_tab.dart'; import 'package:provider/provider.dart'; class BranchListPage extends StatelessWidget { - bool isNeedAppBar; - VoidCallback onBackButtonTapped; - RefreshCallback onRefresh; - - BranchListPage( - {Key? key, - this.isNeedAppBar = true, - required this.onRefresh, - required this.onBackButtonTapped}) - : super(key: key); + const BranchListPage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( - appBar: !isNeedAppBar - ? null - : CustomAppBar( - title: LocaleKeys.myServiceBranches.tr(), - onBackButtonTapped: onBackButtonTapped, - ), - floatingActionButton: FloatingActionButton( - backgroundColor: MyColors.darkPrimaryColor, - child: const Icon( - Icons.add, - color: Colors.white, - ), - onPressed: () async { - await navigateWithName(context, ProviderAppRoutes.defineBranch); - }, + appBar: CustomAppBar( + title: LocaleKeys.myBranches.tr(), + isRemoveBackButton: true, ), body: SizedBox( width: double.infinity, @@ -64,9 +43,7 @@ class BranchListPage extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 21, right: 21, top: 21), child: RoleTypeTab( - context.watch().selectedBranchStatus == 3 - ? 0 - : context.watch().selectedBranchStatus, + context.watch().selectedBranchStatus == 3 ? 0 : context.watch().selectedBranchStatus, [ DropValue(3, "Active", ""), DropValue(1, "Requested", ""), @@ -84,13 +61,12 @@ class BranchListPage extends StatelessWidget { } else { List branches = []; if (model.branches!.data != null) { - branches = model.branches!.data!.serviceProviderBranch! - .where((element) => - model.selectedBranchStatus == element.statusId) - .toList(); + branches = model.branches!.data!.serviceProviderBranch!.where((element) => model.selectedBranchStatus == element.statusId).toList(); } return RefreshIndicator( - onRefresh: onRefresh, + onRefresh: () async { + await context.read().getBranchAndServices(); + }, child: branches.isEmpty ? Center(child: Text(LocaleKeys.no_branch.tr())) : ListView.separated( @@ -102,8 +78,7 @@ class BranchListPage extends StatelessWidget { height: 50, decoration: const BoxDecoration( color: MyColors.darkPrimaryColor, - borderRadius: - BorderRadius.all(Radius.circular(8)), + borderRadius: BorderRadius.all(Radius.circular(8)), ), padding: const EdgeInsets.all(6), child: SvgPicture.asset( @@ -114,10 +89,8 @@ class BranchListPage extends StatelessWidget { 12.width, Expanded( child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - mainAxisAlignment: - MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, children: [ Row( children: [ @@ -126,24 +99,12 @@ class BranchListPage extends StatelessWidget { size: 12, color: MyColors.darkPrimaryColor, ), - Geolocator.distanceBetween( - AppState() - .currentLocation - .latitude, - AppState() - .currentLocation - .latitude, - double.parse(branches[index] - .latitude ?? - "0"), - double.parse(branches[index] - .longitude ?? - "0")) + Geolocator.distanceBetween(AppState().currentLocation.latitude, AppState().currentLocation.latitude, double.parse(branches[index].latitude ?? "0"), + double.parse(branches[index].longitude ?? "0")) .toStringAsFixed(2) .toText( fontSize: 12, - color: - MyColors.darkPrimaryColor, + color: MyColors.darkPrimaryColor, ) ], ), @@ -154,9 +115,7 @@ class BranchListPage extends StatelessWidget { fontWeight: FontWeight.bold, ), ), - LocaleKeys.tapToEdit.tr().toText( - fontSize: 10, - color: MyColors.grey70Color), + LocaleKeys.tapToEdit.tr().toText(fontSize: 10, color: MyColors.grey70Color), ], ), ), @@ -164,20 +123,12 @@ class BranchListPage extends StatelessWidget { IconButton( onPressed: () async { Utils.showLoading(context); - MResponse res = await model.updateBranch( - branches[index].id ?? 0, - branches[index].branchName ?? "", - branches[index].branchDescription ?? - "", - branches[index].cityId.toString(), - branches[index].address ?? "", - branches[index].latitude.toString(), - branches[index].longitude.toString(), + MResponse res = await model.updateBranch(branches[index].id ?? 0, branches[index].branchName ?? "", branches[index].branchDescription ?? "", + branches[index].cityId.toString(), branches[index].address ?? "", branches[index].latitude.toString(), branches[index].longitude.toString(), isNeedToDelete: false); Utils.hideLoading(context); if (res.messageStatus == 1) { - Utils.showToast( - LocaleKeys.branch_deleted.tr()); + Utils.showToast(LocaleKeys.branch_deleted.tr()); model.setState(ViewState.idle); } else { Utils.showToast(res.message ?? ""); @@ -192,13 +143,9 @@ class BranchListPage extends StatelessWidget { ), ], ).toContainer().onPress(() async { - branches[index].countryID = - model.branches!.data!.countryID; - branches[index].countryName = - model.branches!.data!.countryName; - navigateWithName( - context, ProviderAppRoutes.branchDetail, - arguments: branches[index]); + branches[index].countryID = model.branches!.data!.countryID; + branches[index].countryName = model.branches!.data!.countryName; + navigateWithName(context, ProviderAppRoutes.branchDetail, arguments: branches[index]); }); }, separatorBuilder: (context, index) { @@ -215,6 +162,16 @@ class BranchListPage extends StatelessWidget { ], ), ), + floatingActionButton: FloatingActionButton( + backgroundColor: MyColors.darkPrimaryColor, + child: const Icon( + Icons.add, + color: Colors.white, + ), + onPressed: () { + navigateWithName(context, ProviderAppRoutes.defineBranch); + }, + ), ); } }