From 9c190bd7300ddb8c6c10b0dece45e2177e3664d4 Mon Sep 17 00:00:00 2001 From: "Mirza.Shafique@cloudsolutions.com.sa" <5093@Shf> Date: Sun, 7 Jan 2024 10:27:53 +0300 Subject: [PATCH] small changes based on the services --- lib/config/provider_routes.dart | 21 ++- lib/view_models/service_view_model.dart | 3 +- .../appoinments/update_appointment_page.dart | 16 +- lib/views/dashboard/dashboard_page.dart | 16 +- .../dashboard/fragments/ads_fragment.dart | 143 +++++++++--------- lib/views/location/map_selection_widget.dart | 16 +- lib/views/location/pick_location_page.dart | 25 ++- .../settings/branch/branch_detail_page.dart | 2 +- .../settings/branch/define_branch_page.dart | 55 +++++-- .../settings/schedule/add_schedules_page.dart | 40 +++-- .../schedule/schedules_list_page.dart | 96 +++++++++--- .../services/create_services_page3.dart | 65 +++++--- pubspec.lock | 32 ++++ 13 files changed, 374 insertions(+), 156 deletions(-) diff --git a/lib/config/provider_routes.dart b/lib/config/provider_routes.dart index 06384b0..be47b57 100644 --- a/lib/config/provider_routes.dart +++ b/lib/config/provider_routes.dart @@ -31,6 +31,7 @@ import 'package:mc_common_app/models/appointments_models/appointment_list_model. import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/views/advertisement/ads_detail_view.dart'; import 'package:mc_common_app/views/advertisement/create_ad_view.dart'; +import 'package:mc_common_app/views/advertisement/select_ad_type_view.dart'; import 'package:mc_common_app/views/chat/chat_view.dart'; import '../views/dashboard/dashboard_page.dart'; @@ -73,7 +74,9 @@ 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.adsDetailView: (context) => AdsDetailView( + adDetails: + ModalRoute.of(context)!.settings.arguments as AdDetailsModel), AppRoutes.createAdView: (context) => const CreateAdView(), //setting @@ -100,7 +103,8 @@ class ProviderAppRoutes { //Requests AppRoutes.requestsDetailPage: (context) => RequestDetailPage( - requestDetailPageArguments: ModalRoute.of(context)!.settings.arguments as RequestDetailPageArguments, + requestDetailPageArguments: ModalRoute.of(context)!.settings.arguments + as RequestDetailPageArguments, ), AppRoutes.sendOfferPage: (context) => const SendOfferPage(), @@ -130,10 +134,19 @@ class ProviderAppRoutes { addSchedule: (context) => AddSchedulesPage(), //Branch Duplication - matchServices: (context) => MatchedServicesPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as MatchServicesArguments)), + 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, + 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/service_view_model.dart b/lib/view_models/service_view_model.dart index d395326..e2063f6 100644 --- a/lib/view_models/service_view_model.dart +++ b/lib/view_models/service_view_model.dart @@ -382,9 +382,10 @@ class ServiceVM extends BaseVM { Future getAllCities( BranchDetailModel? branchData, String countryCode) async { setState(ViewState.busy); - citiesDropList.clear(); + citiesDropList=[]; cities = null; cityId = -1; + cityValue=null; cities = await commonRepo.getAllCites(countryId.toString()); cities!.data?.forEach((element) { if (branchData != null && branchData.id != null) { diff --git a/lib/views/appoinments/update_appointment_page.dart b/lib/views/appoinments/update_appointment_page.dart index 177d94e..20f3c1a 100644 --- a/lib/views/appoinments/update_appointment_page.dart +++ b/lib/views/appoinments/update_appointment_page.dart @@ -80,7 +80,7 @@ class UpdateAppointmentPage extends StatelessWidget { Column( children: [ showPayNowButton(context, appointmentsVM), - 21.height, + 12.height, showCancelButton(context, appointmentsVM), ], ).paddingAll(21), @@ -102,7 +102,7 @@ class UpdateAppointmentPage extends StatelessWidget { Column( children: [ showPayNowButton(context, appointmentsVM), - 21.height, + 12.height, showPayLaterButton(context, appointmentsVM), ], ).paddingAll(21), @@ -113,7 +113,9 @@ class UpdateAppointmentPage extends StatelessWidget { AppointmentStatusEnum.workStarted) && appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.payNow) - "Waiting for the payment from the customer".toText(), + "Waiting for the payment from the customer" + .toText() + .paddingAll(21), if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.arrived && @@ -134,7 +136,7 @@ class UpdateAppointmentPage extends StatelessWidget { Column( children: [ showPayLaterButton(context, appointmentsVM), - 21.height, + 12.height, showPayNowButton(context, appointmentsVM), ], ).paddingAll(21), @@ -154,7 +156,7 @@ class UpdateAppointmentPage extends StatelessWidget { AppointmentStatusEnum.workStarted && appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.payLater) - showPayNowButton(context, appointmentsVM), + showPayNowButton(context, appointmentsVM).paddingAll(21), if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.visitCompleted) @@ -234,6 +236,7 @@ class UpdateAppointmentPage extends StatelessWidget { "appointmentID": appointmentListModel.id.toString(), "appointmentServicePaymentStatusID": 2 }); + _updateAppointment(context, appointmentListModel.branchId ?? 0); Utils.hideLoading(context); }, ); @@ -249,6 +252,7 @@ class UpdateAppointmentPage extends StatelessWidget { "appointmentID": appointmentListModel.id.toString(), "appointmentStatusID": 3 }); + _updateAppointment(context, appointmentListModel.branchId ?? 0); Utils.hideLoading(context); }, ); @@ -265,6 +269,7 @@ class UpdateAppointmentPage extends StatelessWidget { "appointmentID": appointmentListModel.id.toString(), "appointmentServicePaymentStatusID": 4 }); + _updateAppointment(context, appointmentListModel.branchId ?? 0); Utils.hideLoading(context); }, ); @@ -281,6 +286,7 @@ class UpdateAppointmentPage extends StatelessWidget { "appointmentID": appointmentListModel.id.toString(), "appointmentStatusID": 8 }); + _updateAppointment(context, appointmentListModel.branchId ?? 0); Utils.hideLoading(context); }, ); diff --git a/lib/views/dashboard/dashboard_page.dart b/lib/views/dashboard/dashboard_page.dart index 1ca21f3..10f09b3 100644 --- a/lib/views/dashboard/dashboard_page.dart +++ b/lib/views/dashboard/dashboard_page.dart @@ -43,10 +43,8 @@ class _DashboardPageState extends State { void initState() { super.initState(); dashboardVM = Provider.of(context, listen: false); - scheduleMicrotask(() { - context.read().populateRequestsFilterList(); - _onRefresh(); - }); + context.read().populateRequestsFilterList(); + _onRefresh(); } Future _onRefresh() async { @@ -70,18 +68,26 @@ class _DashboardPageState extends State { "0" }); } + adVm.populateAdsFilterList(); 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); } - await chatVM.buildHubConnection(context); + // await chatVM.buildHubConnection(context); } diff --git a/lib/views/dashboard/fragments/ads_fragment.dart b/lib/views/dashboard/fragments/ads_fragment.dart index 86733f2..1b8b78b 100644 --- a/lib/views/dashboard/fragments/ads_fragment.dart +++ b/lib/views/dashboard/fragments/ads_fragment.dart @@ -1,19 +1,20 @@ import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/app_state.dart'; +import 'package:mc_common_app/config/dependencies.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/extensions/string_extensions.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/view_models/requests_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 { bool isNeedAppBar; @@ -27,15 +28,25 @@ class AdsFragment extends StatelessWidget { 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.myServiceBranches.tr(), - onBackButtonTapped: onBackButtonTapped, - ), + title: "Ads", + onBackButtonTapped: onBackButtonTapped, + ), body: Container( color: MyColors.backgroundColor, width: double.infinity, @@ -43,70 +54,65 @@ class AdsFragment extends StatelessWidget { 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 && adVM.exploreAds.isNotEmpty) ...[ - // 16.height, - // FiltersList(filterList: adVM.exploreAdsFilterOptions, onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(index: index), needLeftPadding: false) - // .paddingOnly(left: 21), - // ], - // if (!adVM.isExploreAdsTapped && adVM.myAds.isNotEmpty) ...[ - // 16.height, - // FiltersList( - // filterList: adVM.myAdsFilterOptions, - // onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(index: index, selectedFilterId: selectedFilterId), - // needLeftPadding: false) - // .paddingOnly(left: 21), - // ], - // ], - // ); - // }, - // ), + 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: adVM.isExploreAdsTapped && adVM.exploreAdsFilteredList.isNotEmpty - ? adVM.exploreAdsFilteredList - : !adVM.isExploreAdsTapped && adVM.myAdsFilteredList.isNotEmpty - ? adVM.myAdsFilteredList - : [], - ); + return BuildAdsList(isAdsFragment: true, shouldShowAdStatus: !adVM.isExploreAdsTapped, adsList: getAdsList(adVM)); }, ), ), @@ -115,14 +121,11 @@ class AdsFragment extends StatelessWidget { ), ), floatingActionButton: FloatingActionButton( - onPressed: () { - context.read().getVehicleTypes(); - context.read().populateRequestsFilterList(); - - navigateWithName(context, AppRoutes.createAdView); + onPressed: () async { + navigateWithName(context, AppRoutes.selectAdTypeView, arguments: injector.get().currentAppType == AppType.provider); }, backgroundColor: MyColors.darkPrimaryColor, - child: const Icon( + child: Icon( Icons.add, color: MyColors.white, ), diff --git a/lib/views/location/map_selection_widget.dart b/lib/views/location/map_selection_widget.dart index 61953d1..dc28656 100644 --- a/lib/views/location/map_selection_widget.dart +++ b/lib/views/location/map_selection_widget.dart @@ -12,13 +12,15 @@ class AppMap extends StatefulWidget { late AppMapState _state; final Function onMapCreated; - AppMap(this.initialCamera, {required this.onCameraMove, required this.onMapCreated}); + AppMap(this.initialCamera, + {required this.onCameraMove, required this.onMapCreated}); @override State createState() => _state = AppMapState(); moveTo({required CameraPosition cameraPostion}) { - _state.googleMapController.animateCamera(CameraUpdate.newCameraPosition(cameraPostion)); + _state.googleMapController + .animateCamera(CameraUpdate.newCameraPosition(cameraPostion)); } } @@ -35,6 +37,12 @@ class AppMapState extends State { @override void initState() {} + @override + void dispose() { + super.dispose(); + googleMapController.dispose(); + } + @override Widget build(BuildContext context) { if (isHuawei == null) return CircularProgressIndicator(); @@ -47,7 +55,9 @@ class AppMapState extends State { zoomControlsEnabled: true, myLocationButtonEnabled: true, myLocationEnabled: true, - initialCameraPosition: CameraPosition.fromMap(widget.initialCamera) ?? const CameraPosition(target: LatLng(-26.1711459, 27.9002758), zoom: 2.0), + initialCameraPosition: CameraPosition.fromMap(widget.initialCamera) ?? + const CameraPosition( + target: LatLng(-26.1711459, 27.9002758), zoom: 2.0), onCameraMove: widget.onCameraMove, onMapCreated: (GoogleMapController controller) { googleMapController = controller; diff --git a/lib/views/location/pick_location_page.dart b/lib/views/location/pick_location_page.dart index e7ef5aa..6c5900d 100644 --- a/lib/views/location/pick_location_page.dart +++ b/lib/views/location/pick_location_page.dart @@ -9,7 +9,7 @@ import 'package:car_provider_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/utils/navigator.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:geocoding/geocoding.dart'; import 'package:permission_handler/permission_handler.dart'; import 'map_selection_widget.dart'; @@ -54,6 +54,11 @@ class _PickLocationPageState extends State { super.initState(); } + @override + void dispose() { + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -117,10 +122,7 @@ class _PickLocationPageState extends State { Future _updatePosition(CameraPosition _position) async { latitude = _position.target.latitude; longitude = _position.target.longitude; - // List placemarks = await placemarkFromCoordinates(latitude, longitude); - // _counter.value = '${placemarks.first.street}, ${placemarks.first.subLocality}, ${placemarks.first.locality}, ${placemarks.first.postalCode}, ${placemarks.first.country}'; - print("Address121: " + _counter.value); - // _counter.value = (placemarks.first.name) ?? "" + " " + (placemarks.first.street ?? "") + " " + (placemarks.first.country ?? ""); + updateAddress(latitude, longitude); } void _getUserLocation() async { @@ -130,21 +132,32 @@ class _PickLocationPageState extends State { latitude = position.latitude; longitude = position.longitude; setMap(); + updateAddress(latitude, longitude); } else { requestPermissions().then( (value) async { if (value[Permission.location]!.isGranted) { - var position = await GeolocatorPlatform.instance.getCurrentPosition(); + var position = + await GeolocatorPlatform.instance.getCurrentPosition(); currentPostion = LatLng(position.latitude, position.longitude); latitude = position.latitude; longitude = position.longitude; setMap(); + updateAddress(latitude, longitude); } }, ); } } + updateAddress(double latitude, double longitude) async { + // List placemarks = + // await placemarkFromCoordinates(latitude, longitude); + // _counter.value = + // '${placemarks.first.street}, ${placemarks.first.subLocality}, ${placemarks.first.locality}, ${placemarks.first.postalCode}, ${placemarks.first.country}'; + // print("Address121: " + placemarks[0].toString()); + } + setMap() { setState(() { _kGooglePlex = CameraPosition( diff --git a/lib/views/settings/branch/branch_detail_page.dart b/lib/views/settings/branch/branch_detail_page.dart index 35e92c6..372d5c6 100644 --- a/lib/views/settings/branch/branch_detail_page.dart +++ b/lib/views/settings/branch/branch_detail_page.dart @@ -165,7 +165,7 @@ class BranchDetailPage extends StatelessWidget { ); }), categories.isEmpty - ? LocaleKeys.no_branch.tr().toText(fontSize: 12) + ? "No Service Added Yet".toText(fontSize: 12) : ListView.separated( itemBuilder: (context, pIndex) { return InkWell( diff --git a/lib/views/settings/branch/define_branch_page.dart b/lib/views/settings/branch/define_branch_page.dart index b3080cd..c92cd14 100644 --- a/lib/views/settings/branch/define_branch_page.dart +++ b/lib/views/settings/branch/define_branch_page.dart @@ -28,7 +28,8 @@ class DefineBranchPage extends StatelessWidget { @override Widget build(BuildContext context) { ServiceVM branchVM = context.read(); - branchVM.getAllCountriesList(branchData, EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA"); + branchVM.getAllCountriesList(branchData, + EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA"); return Scaffold( appBar: CustomAppBar( title: LocaleKeys.defineBranches.tr(), @@ -50,9 +51,16 @@ class DefineBranchPage extends StatelessWidget { model.country != null ? DropdownField( (DropValue value) { + model.countryValue = + DropValue(value.id, value.value, ""); model.countryCode = value.subValue; model.countryId = value.id; - model.getAllCities(branchData, EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA"); + model.getAllCities( + branchData, + EasyLocalization.of(context) + ?.currentLocale + ?.countryCode ?? + "SA"); }, list: model.countryDropList, dropdownValue: model.countryValue, @@ -66,7 +74,8 @@ class DefineBranchPage extends StatelessWidget { ? Text(LocaleKeys.no_city_available.tr()) : DropdownField( (DropValue value) { - // countryCode = value.subValue; + model.cityValue = DropValue( + value.id, value.value, ""); model.setOnlyState(ViewState.busy); model.cityId = value.id; model.setState(ViewState.idle); @@ -111,7 +120,9 @@ class DefineBranchPage extends StatelessWidget { navigateTo( context, PickLocationPage( - onPickAddress: (double latitude, double longitude, String address) { + onPickAddress: (double latitude, + double longitude, String address) { + print("tesssgngl "+address); model.latitude = latitude; model.longitude = longitude; model.address = address; @@ -125,12 +136,16 @@ class DefineBranchPage extends StatelessWidget { height: 45, decoration: BoxDecoration( color: Colors.transparent, - border: Border.all(color: MyColors.darkPrimaryColor, width: 2), - borderRadius: const BorderRadius.all(Radius.circular(8)), + border: Border.all( + color: MyColors.darkPrimaryColor, + width: 2), + borderRadius: const BorderRadius.all( + Radius.circular(8)), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ const Icon( Icons.place_outlined, @@ -163,14 +178,24 @@ class DefineBranchPage extends StatelessWidget { SizedBox( width: double.infinity, child: Padding( - padding: const EdgeInsets.only(left: 20, right: 20, bottom: 20), + padding: + const EdgeInsets.only(left: 20, right: 20, bottom: 20), child: ShowFillButton( - title: branchData != null ? (branchData!.id == null ? LocaleKeys.createBranch.tr() : LocaleKeys.updateBranch.tr()) : LocaleKeys.createBranch.tr(), + title: branchData != null + ? (branchData!.id == null + ? LocaleKeys.createBranch.tr() + : LocaleKeys.updateBranch.tr()) + : LocaleKeys.createBranch.tr(), onPressed: () async { if (branchData == null) { Utils.showLoading(context); - MResponse res = - await model.createBranch(model.branchName, model.branchDescription, model.cityId.toString(), model.address, model.latitude.toString(), model.longitude.toString()); + MResponse res = await model.createBranch( + model.branchName, + model.branchDescription, + model.cityId.toString(), + model.address, + model.latitude.toString(), + model.longitude.toString()); Utils.hideLoading(context); if (res.messageStatus == 1) { Utils.showToast(LocaleKeys.branch_created.tr()); @@ -182,7 +207,13 @@ class DefineBranchPage extends StatelessWidget { } else { Utils.showLoading(context); MResponse res = await model.updateBranch( - branchData!.id ?? 0, model.branchName, model.branchDescription, model.cityId.toString(), model.address, model.latitude.toString(), model.longitude.toString()); + branchData!.id ?? 0, + model.branchName, + model.branchDescription, + model.cityId.toString(), + model.address, + model.latitude.toString(), + model.longitude.toString()); Utils.hideLoading(context); if (res.messageStatus == 1) { Utils.showToast(LocaleKeys.branch_updated.tr()); diff --git a/lib/views/settings/schedule/add_schedules_page.dart b/lib/views/settings/schedule/add_schedules_page.dart index 63cee01..c8165b1 100644 --- a/lib/views/settings/schedule/add_schedules_page.dart +++ b/lib/views/settings/schedule/add_schedules_page.dart @@ -1,4 +1,3 @@ - import 'package:car_provider_app/view_models/schedule_view_model.dart'; import 'package:car_provider_app/views/settings/schedule/widgets/chips_picker_item.dart'; import 'package:car_provider_app/views/settings/schedule/widgets/select_days_sheet.dart'; @@ -10,6 +9,7 @@ import 'package:mc_common_app/models/appointments_models/schedule_model.dart'; import 'package:mc_common_app/models/general_models/m_response.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/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; @@ -19,15 +19,24 @@ import 'package:mc_common_app/widgets/bottom_sheet.dart'; class AddSchedulesPage extends StatelessWidget { late ScheduleVM mModel; - String name = "", startDate = "", endDate = "", startTime = "", endTime = "", slotsTime = "", appointmentPerSlot = "", servicesGroupID = ""; + String name = "", + startDate = "", + endDate = "", + startTime = "", + endTime = "", + slotsTime = "", + appointmentPerSlot = "", + servicesGroupID = ""; late ScheduleData scheduleData; AddSchedulesPage({Key? key}) : super(key: key); setEditData() { name = scheduleData.scheduleName ?? ""; - startDate = DateHelper.formatAsYearMonthDay(scheduleData.fromDate ?? DateTime.now()); - endDate = DateHelper.formatAsYearMonthDay(scheduleData.toDate ?? DateTime.now()); + startDate = DateHelper.formatAsYearMonthDay( + scheduleData.fromDate ?? DateTime.now()); + endDate = + DateHelper.formatAsYearMonthDay(scheduleData.toDate ?? DateTime.now()); startTime = scheduleData.startTime ?? ""; endTime = scheduleData.endTime ?? ""; slotsTime = scheduleData.slotDurationMinute.toString(); @@ -35,7 +44,9 @@ class AddSchedulesPage extends StatelessWidget { // mModel.selectedServicesItems.clear(); scheduleData.scheduleServices?.forEach((element) { - mModel.selectedServicesItems.add(PickerItem(id: element.providerServiceId ?? 0, title: element.providerServiceName ?? "")); + mModel.selectedServicesItems.add(PickerItem( + id: element.providerServiceId ?? 0, + title: element.serviceDescription ?? "")); }); mModel.selectedDaysItems.clear(); scheduleData.weeklyOffDays?.forEach((element) { @@ -134,7 +145,7 @@ class AddSchedulesPage extends StatelessWidget { ), 8.height, ChipsPickerItem( - hint: 'Days', + hint: 'Off Days', itemsList: [...model.selectedDaysItems], onClick: () { showMyBottomSheet( @@ -179,7 +190,12 @@ class AddSchedulesPage extends StatelessWidget { isNeedClickAll: true, onTap: () async { TimeOfDay _startTime = TimeOfDay.now(); - if (startTime.isNotEmpty) _startTime = TimeOfDay(hour: int.parse(startTime.split(":")[0]), minute: int.parse(startTime.split(":")[1])); + if (startTime.isNotEmpty) + _startTime = TimeOfDay( + hour: + int.parse(startTime.split(":")[0]), + minute: + int.parse(startTime.split(":")[1])); endTime = await Utils.pickTime( context, initialTime: _startTime, @@ -315,8 +331,11 @@ class AddSchedulesPage extends StatelessWidget { Utils.hideLoading(context); if (servicesResponse.messageStatus == 1) { Utils.showToast("Successfully schedule created"); + context.read().getSchedules(scheduleData.branchId ?? ""); + pop(context); } else { - Utils.showToast("Something went wrong while adding services in schedule"); + Utils.showToast( + "Something went wrong while adding services in schedule"); } } else { Utils.hideLoading(context); @@ -362,8 +381,11 @@ class AddSchedulesPage extends StatelessWidget { Utils.hideLoading(context); if (servicesResponse.messageStatus == 1) { Utils.showToast("Successfully schedule updated"); + context.read().getSchedules(scheduleData.branchId ?? ""); + pop(context); } else { - Utils.showToast("Something went wrong while adding services in schedule"); + Utils.showToast( + "Something went wrong while adding services in schedule"); } } else { Utils.hideLoading(context); diff --git a/lib/views/settings/schedule/schedules_list_page.dart b/lib/views/settings/schedule/schedules_list_page.dart index f4f0b5e..ab7449a 100644 --- a/lib/views/settings/schedule/schedules_list_page.dart +++ b/lib/views/settings/schedule/schedules_list_page.dart @@ -58,7 +58,10 @@ class _SchedulesListPageState extends State { Row( children: [ Expanded( - child: value.schedule!.data![index].scheduleName.toString().toText( + child: value.schedule!.data![index] + .scheduleName + .toString() + .toText( fontSize: 16, isBold: true, ), @@ -71,33 +74,81 @@ class _SchedulesListPageState extends State { height: 16, ), ).onPress(() { - value.schedule!.data![index].branchId = widget.branchId ?? ""; - navigateWithName(context, ProviderAppRoutes.addSchedule, arguments: value.schedule!.data![index]); + value.schedule!.data![index] + .branchId = widget.branchId ?? ""; + navigateWithName(context, + ProviderAppRoutes.addSchedule, + arguments: + value.schedule!.data![index]); }), ], - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, ), 12.height, - showItem("Start Date:", DateHelper.formatAsDayMonthYear(value.schedule!.data![index].fromDate)), - showItem("End Date:", DateHelper.formatAsDayMonthYear(value.schedule!.data![index].toDate)), - showItem("Off Days:", DateHelper.formatAsDayMonthYear(value.schedule!.data![index].fromDate)), - showItem("Shift Start Time:", value.schedule!.data![index].startTime ?? ""), - showItem("Shift End Time:", value.schedule!.data![index].startTime ?? ""), - showItem("Slots Time:", value.schedule!.data![index].slotDurationMinute.toString() + " Mins"), - showItem("Appointments Per Slot:", value.schedule!.data![index].perSlotAppointment.toString()), - showItem("Off Days", offDays(value.schedule!.data![index])), + showItem( + "Start Date:", + DateHelper.formatAsDayMonthYear(value + .schedule!.data![index].fromDate)), + showItem( + "End Date:", + DateHelper.formatAsDayMonthYear(value + .schedule!.data![index].toDate)), + showItem( + "Off Days:", + DateHelper.formatAsDayMonthYear(value + .schedule!.data![index].fromDate)), + showItem( + "Shift Start Time:", + value.schedule!.data![index] + .startTime ?? + ""), + showItem( + "Shift End Time:", + value.schedule!.data![index] + .startTime ?? + ""), + showItem( + "Slots Time:", + value.schedule!.data![index] + .slotDurationMinute + .toString() + + " Mins"), + showItem( + "Appointments Per Slot:", + value.schedule!.data![index] + .perSlotAppointment + .toString()), + showItem("Off Days", + offDays(value.schedule!.data![index])), 12.height, - "Services:".toText(fontSize: 12, isBold: true, color: MyColors.lightTextColor), + "Services:".toText( + fontSize: 12, + isBold: true, + color: MyColors.lightTextColor), Column( - children: value.schedule!.data![index].scheduleServices! - .map((element) => Container(child: element.providerServiceName.toString().toText(fontSize: 12, isBold: true))) + crossAxisAlignment: + CrossAxisAlignment.start, + children: value.schedule!.data![index] + .scheduleServices! + .map( + (element) => Container( + child: element.serviceDescription + .toString() + .toText( + fontSize: 12, + isBold: true, + ), + ), + ) .toList(), - crossAxisAlignment: CrossAxisAlignment.start, ) ], - ).toWhiteContainer(width: double.infinity, allPading: 12); + ).toWhiteContainer( + width: double.infinity, allPading: 12); }, - separatorBuilder: (BuildContext context, int index) { + separatorBuilder: + (BuildContext context, int index) { return 12.height; }, padding: const EdgeInsets.all(20), @@ -111,7 +162,8 @@ class _SchedulesListPageState extends State { maxWidth: double.infinity, margin: const EdgeInsets.all(20), onPressed: () { - navigateWithName(context, ProviderAppRoutes.addSchedule, arguments: ScheduleData(branchId: widget.branchId ?? "")); + navigateWithName(context, ProviderAppRoutes.addSchedule, + arguments: ScheduleData(branchId: widget.branchId ?? "")); }, ), ], @@ -123,7 +175,8 @@ class _SchedulesListPageState extends State { String offDays(ScheduleData scheduleData) { String offDays = ""; for (int i = 0; i < scheduleData.weeklyOffDays!.length; i++) { - offDays = offDays + initDaysList[scheduleData.weeklyOffDays![i].dayNumber! - 1].title; + offDays = offDays + + initDaysList[scheduleData.weeklyOffDays![i].dayNumber! - 1].title; if (i != scheduleData.weeklyOffDays!.length - 1) { offDays = offDays + " , "; } @@ -134,7 +187,8 @@ class _SchedulesListPageState extends State { Widget showItem(String title, String value) { return Row( children: [ - title.toText(fontSize: 12, isBold: true, color: MyColors.lightTextColor), + title.toText( + fontSize: 12, isBold: true, color: MyColors.lightTextColor), 4.width, value.toText(fontSize: 12, isBold: true), ], diff --git a/lib/views/settings/services/create_services_page3.dart b/lib/views/settings/services/create_services_page3.dart index c7554d6..a9d0ddc 100644 --- a/lib/views/settings/services/create_services_page3.dart +++ b/lib/views/settings/services/create_services_page3.dart @@ -1,4 +1,3 @@ - import 'package:car_provider_app/generated/locale_keys.g.dart'; import 'package:car_provider_app/view_models/service_view_model.dart'; import 'package:car_provider_app/views/settings/services/services_list_page.dart'; @@ -29,20 +28,26 @@ class CreateServicesPage3 extends StatelessWidget { String chargersPerKm = "0"; int? categoryId; int? serviceId = -1; + DropValue? category; + DropValue? service; @override Widget build(BuildContext context) { ServiceVM serviceVM = context.read(); if (branchModel!.categoryId == null) { - serviceVM.fetchBranchCategory(EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA"); + serviceVM.fetchBranchCategory( + EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA"); } else { - isAppointmentAvailable = branchModel?.serviceProviderService?.isAllowAppointment ?? false; + isAppointmentAvailable = + branchModel?.serviceProviderService?.isAllowAppointment ?? false; // isHomeAppointmentAvailable=branchModel.serviceProviderService. - serviceRage = branchModel?.serviceProviderService?.customerLocationRange ?? 0; + serviceRage = + branchModel?.serviceProviderService?.customerLocationRange ?? 0; if (serviceRage > 0) { isHomeAppointmentAvailable = true; } - chargersPerKm = branchModel?.serviceProviderService?.rangePricePerKm ?? "0"; + chargersPerKm = + branchModel?.serviceProviderService?.rangePricePerKm ?? "0"; serviceId = branchModel?.serviceProviderService?.serviceId ?? -1; } return Scaffold( @@ -67,7 +72,8 @@ class CreateServicesPage3 extends StatelessWidget { fontWeight: FontWeight.bold, ), ).toContainer( - padding: const EdgeInsets.only(left: 8, right: 8, bottom: 12, top: 12), + padding: const EdgeInsets.only( + left: 8, right: 8, bottom: 12, top: 12), backgroundColor: MyColors.textFieldColor, borderRadius: 0, width: double.infinity, @@ -81,34 +87,44 @@ class CreateServicesPage3 extends StatelessWidget { fontWeight: FontWeight.bold, ), ).toContainer( - padding: const EdgeInsets.only(left: 8, right: 8, bottom: 12, top: 12), + padding: const EdgeInsets.only( + left: 8, right: 8, bottom: 12, top: 12), backgroundColor: MyColors.textFieldColor, borderRadius: 0, width: double.infinity, ) - : (branchModel!.categoryId == null && model.categoryDropList.isNotEmpty) + : (branchModel!.categoryId == null && + model.categoryDropList.isNotEmpty) ? DropdownField( (DropValue value) async { categoryId = value.id; + category = value; + service = null; serviceId = -1; isAppointmentAvailable = false; isHomeAppointmentAvailable = false; - model.fetchServicesByCategoryId(value.id.toString()); + model.fetchServicesByCategoryId( + value.id.toString()); }, + dropdownValue: category, list: model.categoryDropList, - hint: LocaleKeys.selectServiceCategory.tr(), + hint: + LocaleKeys.selectServiceCategory.tr(), ) : const CircularProgressIndicator(), 12.height, branchModel!.serviceProviderService != null ? Text( - branchModel!.serviceProviderService!.serviceDescription ?? "N/A", + branchModel!.serviceProviderService! + .serviceDescription ?? + "N/A", style: const TextStyle( fontSize: 12, fontWeight: FontWeight.bold, ), ).toContainer( - padding: const EdgeInsets.only(left: 8, right: 8, bottom: 12, top: 12), + padding: const EdgeInsets.only( + left: 8, right: 8, bottom: 12, top: 12), backgroundColor: MyColors.textFieldColor, borderRadius: 0, width: double.infinity, @@ -117,10 +133,12 @@ class CreateServicesPage3 extends StatelessWidget { ? DropdownField( (DropValue value) { serviceId = value.id; + service = value; isAppointmentAvailable = false; isHomeAppointmentAvailable = false; model.setState(ViewState.idle); }, + dropdownValue: service, list: model.servicesDropList, hint: LocaleKeys.defineServices.tr(), ) @@ -135,7 +153,8 @@ class CreateServicesPage3 extends StatelessWidget { CheckBoxWithTitleDescription( isSelected: isAppointmentAvailable, title: 'Available for appointment', - description: 'This option will allow customer to book appointment for these services', + description: + 'This option will allow customer to book appointment for these services', onSelection: (bool v) { isAppointmentAvailable = v; model.setState(ViewState.idle); @@ -145,7 +164,8 @@ class CreateServicesPage3 extends StatelessWidget { CheckBoxWithTitleDescription( isSelected: isHomeAppointmentAvailable, title: 'Allow home services', - description: 'This option will allow customer to book appointment at their desired location', + description: + 'This option will allow customer to book appointment at their desired location', onSelection: (bool v) { isHomeAppointmentAvailable = v; model.setState(ViewState.idle); @@ -158,13 +178,18 @@ class CreateServicesPage3 extends StatelessWidget { TxtField( hint: "Home Services Range", keyboardType: TextInputType.number, - value: serviceRage == 0 ? null : serviceRage.toString(), + value: serviceRage == 0 + ? null + : serviceRage.toString(), postfixWidget: Row( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, children: [ - "KM".toText(color: MyColors.lightTextColor), + "KM".toText( + color: MyColors.lightTextColor), ], ), onChanged: (v) { @@ -179,7 +204,9 @@ class CreateServicesPage3 extends StatelessWidget { TxtField( hint: "Charges per Kilometer", keyboardType: TextInputType.number, - value: chargersPerKm == "0.0" ? null : chargersPerKm, + value: chargersPerKm == "0.0" + ? null + : chargersPerKm, onChanged: (v) { if (v.isNotEmpty) { chargersPerKm = v; diff --git a/pubspec.lock b/pubspec.lock index 48c1517..339d8be 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -269,6 +269,38 @@ packages: url: "https://pub.dev" source: hosted version: "8.2.2" + geocoding: + dependency: transitive + description: + name: geocoding + sha256: e1dc0ac56666d9ed1d5a9ae5543ce9eb5986db6209cc7600103487d09192059c + url: "https://pub.dev" + source: hosted + version: "2.1.1" + geocoding_android: + dependency: transitive + description: + name: geocoding_android + sha256: "609db1d71bc364dd9d0616f72a41c01e0c74f3a3807efb85e0d5a67e57baf50f" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + geocoding_ios: + dependency: transitive + description: + name: geocoding_ios + sha256: "8f79e380abb640ef4d88baee8bb65390058c802601158d0813dc990b36b189d2" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + geocoding_platform_interface: + dependency: transitive + description: + name: geocoding_platform_interface + sha256: "8848605d307d844d89937cdb4b8ad7dfa880552078f310fa24d8a460f6dddab4" + url: "https://pub.dev" + source: hosted + version: "2.0.1" geolocator: dependency: transitive description: