diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 08f3a9d..4ec8a32 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -5,6 +5,13 @@ + + + + + + 1000) { + if (sizeInBytes > 1000000) { Utils.showToast(LocaleKeys.fileLarger.tr()); return; } else { diff --git a/lib/view_models/schedule_view_model.dart b/lib/view_models/schedule_view_model.dart index 456b927..4b8bd4e 100644 --- a/lib/view_models/schedule_view_model.dart +++ b/lib/view_models/schedule_view_model.dart @@ -1,3 +1,4 @@ +import 'package:mc_common_app/main.dart'; 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/models/provider_branches_models/profile/services.dart'; @@ -5,6 +6,7 @@ import 'package:mc_common_app/repositories/schedule_repo.dart'; import 'package:car_provider_app/views/settings/schedule/widgets/chips_picker_item.dart'; import 'package:mc_common_app/utils/enums.dart'; +import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/view_models/base_view_model.dart'; List initDaysList = [ @@ -31,6 +33,19 @@ class ScheduleVM extends BaseVM { setState(ViewState.idle); } + setScheduleInactive(int scheduleId, int branchId) async { + setState(ViewState.busy); + MResponse val = await scheduleRepo.setScheduleInActive(scheduleId, branchId); + if (val.messageStatus == 1) { + if (schedule!.data != null) { + schedule!.data!.removeWhere((element) => element.serviceProviderBranchId == branchId && element.id == scheduleId); + } else { + Utils.showToast(val.message ?? ""); + } + } + setState(ViewState.idle); + } + getAllServices(String branchId, ScheduleData selectedSchedule) async { // if (servicesList == null) { servicesList = null; diff --git a/lib/view_models/service_view_model.dart b/lib/view_models/service_view_model.dart index afb58aa..1ea6eb6 100644 --- a/lib/view_models/service_view_model.dart +++ b/lib/view_models/service_view_model.dart @@ -320,7 +320,7 @@ class ServiceVM extends BaseVM { if (file != null) { int sizeInBytes = file.lengthSync(); // double sizeInMb = sizeInBytes / (1024 * 1024); - if (sizeInBytes > 1000) { + if (sizeInBytes > 1000000) { Utils.showToast("File is larger then 1KB"); } else { document!.data![index].document = Utils.convertFileToBase64(file); @@ -486,7 +486,6 @@ class ServiceVM extends BaseVM { servicesDropList = []; setState(ViewState.busy); services = await branchRepo.fetchServicesByCategoryId(serviceCategoryId: categoryId); // to get all the services - for (var element in services!.data!) { servicesDropList.add( DropValue( diff --git a/lib/views/appoinments/add_new_service_appointment_page.dart b/lib/views/appoinments/add_new_service_appointment_page.dart index ae2f72e..e8ea043 100644 --- a/lib/views/appoinments/add_new_service_appointment_page.dart +++ b/lib/views/appoinments/add_new_service_appointment_page.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:car_provider_app/view_models/service_view_model.dart'; import 'package:car_provider_app/views/appoinments/widget/select_items_sheet.dart'; import 'package:flutter/material.dart'; @@ -25,22 +27,37 @@ import '../../generated/locale_keys.g.dart'; import '../dashboard/widget/appointment_slider_widget.dart'; import '../settings/schedule/widgets/chips_picker_item.dart'; -class AddNewServiceAppointmentPage extends StatelessWidget { +class AddNewServiceAppointmentPage extends StatefulWidget { AppointmentListModel appointmentListModel; - AddNewServiceAppointmentPage(this.appointmentListModel, {Key? key}) - : super(key: key); + AddNewServiceAppointmentPage(this.appointmentListModel, {Key? key}) : super(key: key); + @override + State createState() => _AddNewServiceAppointmentPageState(); +} + +class _AddNewServiceAppointmentPageState extends State { DropValue? category; + DropValue? service; + List selectedList = []; + List? pickedItems; + ServiceVM? serviceVM; + + @override + void initState() { + // TODO: implement initState + super.initState(); + scheduleMicrotask(() { + serviceVM = context.read(); + serviceVM!.fetchBranchCategory(EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA"); + }); + } @override Widget build(BuildContext context) { - ServiceVM serviceVM = context.read(); - serviceVM.fetchBranchCategory( - EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA"); return Scaffold( appBar: const CustomAppBar( title: "Add Service", @@ -50,7 +67,7 @@ class AddNewServiceAppointmentPage extends StatelessWidget { child: Column( children: [ AppointmentSliderWidget( - appointmentListModel: appointmentListModel, + appointmentListModel: widget.appointmentListModel, isNeedTotalPayment: true, isNeedToShowItems: true, isNeedToShowToMoreText: false, @@ -79,15 +96,11 @@ class AddNewServiceAppointmentPage extends StatelessWidget { (DropValue value) async { category = value; service = null; - model.fetchProviderServices( - appointmentListModel.branchId - .toString(), - value.id.toString()); + model.fetchProviderServices(widget.appointmentListModel.branchId.toString(), value.id.toString()); }, dropdownValue: category, list: model.categoryDropList, - hint: - LocaleKeys.selectServiceCategory.tr(), + hint: LocaleKeys.selectServiceCategory.tr(), ) : const Center( child: CircularProgressIndicator(), @@ -103,18 +116,13 @@ class AddNewServiceAppointmentPage extends StatelessWidget { context, child: SelectItemsSheet( serviceId: service?.id ?? 0, - onSelectItems: - (List selectedList) { + onSelectItems: (List selectedList) { this.selectedList.clear(); this.selectedList = selectedList; pickedItems = []; - for (var element - in selectedList) { + for (var element in selectedList) { pickedItems!.add( - PickerItem( - id: element.id ?? 0, - title: - element.name ?? ""), + PickerItem(id: element.id ?? 0, title: element.name ?? ""), ); } model.notifyListeners(); @@ -128,14 +136,11 @@ class AddNewServiceAppointmentPage extends StatelessWidget { ) : category == null ? Container() - : model.services != null && - model.servicesDropList.isEmpty + : model.services != null && model.servicesDropList.isEmpty ? const Text("No Service Found") : const CircularProgressIndicator(), 12.height, - (service != null && - pickedItems != null && - pickedItems!.length > 0) + (service != null && pickedItems != null && pickedItems!.length > 0) ? ChipsPickerItem( hint: 'Select Items', itemsList: [...pickedItems ?? []], @@ -145,16 +150,11 @@ class AddNewServiceAppointmentPage extends StatelessWidget { child: SelectItemsSheet( serviceId: service?.id ?? 0, list: pickedItems, - onSelectItems: - (List selectedList) { + onSelectItems: (List selectedList) { pickedItems = []; - for (var element - in selectedList) { + for (var element in selectedList) { pickedItems!.add( - PickerItem( - id: element.id ?? 0, - title: - element.name ?? ""), + PickerItem(id: element.id ?? 0, title: element.name ?? ""), ); } model.notifyListeners(); @@ -166,9 +166,7 @@ class AddNewServiceAppointmentPage extends StatelessWidget { : service != null ? const Text("No Item Selected Yet") : const SizedBox(), - if ((service != null && - pickedItems != null && - pickedItems!.length > 0)) + if ((service != null && pickedItems != null && pickedItems!.length > 0)) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -179,8 +177,7 @@ class AddNewServiceAppointmentPage extends StatelessWidget { color: MyColors.lightTextColor, ), Row( - crossAxisAlignment: - CrossAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.end, children: [ calculatePrice().toString().toText( fontSize: 29, @@ -218,27 +215,18 @@ class AddNewServiceAppointmentPage extends StatelessWidget { title: "Add", maxWidth: double.infinity, onPressed: () async { - if (pickedItems != null && - pickedItems!.length > 0) { + if (pickedItems != null && pickedItems!.length > 0) { List items = []; pickedItems?.forEach((element) { items.add(element.id); }); Utils.showLoading(context); - var postParams = { - "providerBranchID": - appointmentListModel.branchId, - "appointmentID": appointmentListModel.id, - "serviceItemID": items - }; - MResponse res = await serviceVM - .addNewServiceInAppointment(postParams); - _updateAppointment(context, - appointmentListModel.branchId ?? 0); + var postParams = {"providerBranchID": widget.appointmentListModel.branchId, "appointmentID": widget.appointmentListModel.id, "serviceItemID": items}; + MResponse res = await serviceVM!.addNewServiceInAppointment(postParams); + _updateAppointment(context, widget.appointmentListModel.branchId ?? 0); Utils.hideLoading(context); if (res.messageStatus == 1) { - Utils.showToast( - "Items are added Successfully"); + Utils.showToast("Items are added Successfully"); pop(context); } else { Utils.showToast(res.message.toString()); @@ -264,14 +252,7 @@ class AddNewServiceAppointmentPage extends StatelessWidget { Future _updateAppointment(BuildContext context, int branchId) async { await context.read().getMyAppointmentsForProvider({ - "ServiceProviderID": injector - .get() - .getUser - .data - ?.userInfo - ?.providerId - .toString() ?? - "0", + "ServiceProviderID": injector.get().getUser.data?.userInfo?.providerId.toString() ?? "0", "ProviderBranchID": branchId.toString(), }, isNeedToRebuild: true); } diff --git a/lib/views/appoinments/appoinment_detail_list_page.dart b/lib/views/appoinments/appoinment_detail_list_page.dart index 86dfa5a..f6419c4 100644 --- a/lib/views/appoinments/appoinment_detail_list_page.dart +++ b/lib/views/appoinments/appoinment_detail_list_page.dart @@ -34,7 +34,7 @@ class AppointmentDetailListPage extends StatelessWidget { appointmentListModel: appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![index], isNeedTotalPayment: true, isNeedToShowAppointmentStatus: true, - isNeedToShowMergeStatus: true, + isNeedToShowMergeStatus: appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![index].isMerged ?? false, onTap: () { appointmentsVM.selectedAppointmentId = appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![index].id ?? 0; appointmentsVM.selectedAppointmentSubIndex = index; diff --git a/lib/views/appoinments/appointment_page.dart b/lib/views/appoinments/appointment_page.dart index 4de335d..1c58ade 100644 --- a/lib/views/appoinments/appointment_page.dart +++ b/lib/views/appoinments/appointment_page.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + 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'; @@ -19,42 +21,55 @@ import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:percent_indicator/percent_indicator.dart'; import 'package:provider/provider.dart'; -class AppointmentPage extends StatelessWidget { +class AppointmentPage extends StatefulWidget { BranchDetailModel branch; - String date = ""; AppointmentPage({ required this.branch, Key? key, }) : super(key: key); + @override + State createState() => _AppointmentPageState(); +} + +class _AppointmentPageState extends State { + String date = ""; + GlobalKey refreshIndicatorKey = GlobalKey(); Future _pullRefresh(BuildContext context) async { await context.read().getAppointmentSlotsInfo( context: context, - map: {"ProviderBranchID": branch.id.toString(), "FromDate": date, "ToDate": date}, + map: {"ProviderBranchID": widget.branch.id.toString(), "FromDate": date, "ToDate": date}, isNeedToRebuild: true, ); await context.read().getMyAppointmentsForProvider({ "ServiceProviderID": injector.get().getUser.data?.userInfo?.providerId.toString() ?? "0", - "ProviderBranchID": branch.id.toString(), + "ProviderBranchID": widget.branch.id.toString(), "FromDate": date, "DateTo": date, }); } @override - Widget build(BuildContext context) { - date = DateHelper.formatAsYearMonthDay(DateTime.now()); - context.read().populateAppointmentsFilterList(); - _pullRefresh(context); - context.read().selectedBranch = branch.id ?? 0; + void initState() { + // TODO: implement initState + super.initState(); + scheduleMicrotask(() { + date = DateHelper.formatAsYearMonthDay(DateTime.now()); + context.read().populateAppointmentsFilterList(); + _pullRefresh(context); + context.read().selectedBranch = widget.branch.id ?? 0; + }); + } + @override + Widget build(BuildContext context) { return Scaffold( appBar: CustomAppBar( profileImageUrl: MyAssets.carBanner, - title: branch.branchName, + title: widget.branch.branchName, ), body: SizedBox( width: double.infinity, @@ -122,7 +137,7 @@ class AppointmentPage extends StatelessWidget { } Widget progressWidget(BuildContext context, AppointmentsVM appointmentsVM) { - double percent = (appointmentsVM.appointmentSlots?.occupiedSlots ?? 0.0 / (appointmentsVM.appointmentSlots?.totalSlots ?? 0.0)).toDouble() * 100; + double percent = appointmentsVM.appointmentSlots!.occupiedSlots / appointmentsVM.appointmentSlots!.totalSlots; return Column( children: [ Row( diff --git a/lib/views/dashboard/dashboard_page.dart b/lib/views/dashboard/dashboard_page.dart index 228ad3b..c642880 100644 --- a/lib/views/dashboard/dashboard_page.dart +++ b/lib/views/dashboard/dashboard_page.dart @@ -16,6 +16,7 @@ import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/dependencies.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; +import 'package:mc_common_app/main.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart'; @@ -54,6 +55,7 @@ class _DashboardPageState extends State { // context.read().populateAdsFilterList(); context.read().getBranchAndServices(); AdVM adVm = Provider.of(context, listen: false); + // context.read().myUpComingAppointments, AppointmentsVM appointmentsVM = Provider.of(context, listen: false); if (appointmentsVM.myAppointments.isEmpty) { await appointmentsVM.getMyAppointmentsForProvider({"ServiceProviderID": injector.get().getUser.data?.userInfo?.providerId.toString() ?? "0"}); diff --git a/lib/views/dashboard/widget/drawer_widget.dart b/lib/views/dashboard/widget/drawer_widget.dart index e366ac4..90f6b08 100644 --- a/lib/views/dashboard/widget/drawer_widget.dart +++ b/lib/views/dashboard/widget/drawer_widget.dart @@ -14,6 +14,7 @@ import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/user_models/image_response.dart'; import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/utils/app_permission_handler.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'; @@ -35,14 +36,8 @@ class _CustomDrawerState extends State { builder: (context) => AlertDialog( content: const Text("Choose image source"), actions: [ - TextButton( - child: const Text("Camera"), - onPressed: () => - widget.dashboardVM.pickImageFromPhone(context, 0)), - TextButton( - child: const Text("Gallery"), - onPressed: () => - widget.dashboardVM.pickImageFromPhone(context, 1)), + TextButton(child: const Text("Camera"), onPressed: () => widget.dashboardVM.pickImageFromPhone(context, 0)), + TextButton(child: const Text("Gallery"), onPressed: () => widget.dashboardVM.pickImageFromPhone(context, 1)), ], ), ); @@ -60,13 +55,8 @@ class _CustomDrawerState extends State { height: 200, color: MyColors.darkPrimaryColor.withOpacity(0.01), child: Image.network( - ApiConsts.baseUrlServices + - AppState() - .getUser - .data! - .userInfo! - .userImageUrl - .toString(), + // ApiConsts.baseUrlServices + + AppState().getUser.data!.userInfo!.userImageUrl.toString(), ), ), Positioned( @@ -106,16 +96,11 @@ class _CustomDrawerState extends State { color: Colors.red, ).onPress(() async { Utils.showLoading(context); - ImageResponse response = - await widget.dashboardVM.updateUserImage(""); + ImageResponse response = await widget.dashboardVM.updateUserImage(""); if (response.messageStatus == 1) { Utils.showToast("Image is Deleted"); setState(() { - AppState() - .getUser - .data! - .userInfo! - .userImageUrl = response.data; + AppState().getUser.data!.userInfo!.userImageUrl = response.data; }); } Utils.hideLoading(context); @@ -139,17 +124,14 @@ class _CustomDrawerState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - "userName".toText( - isBold: true, - fontSize: 20, - letterSpacing: -1.44, - ), - AppState() - .getUser - .data! - .userInfo! - .roleName! - .toText(fontSize: 10), + AppState().getUser.data!.userInfo!.firstName!.toText( + isBold: true, + fontSize: 20, + letterSpacing: -1.44, + ), + AppState().getUser.data!.userInfo!.roleName! == "ServiceProvider_Dealership" || AppState().getUser.data!.userInfo!.roleName! == "ServiceProvider_Individual" + ? (AppState().getUser.data!.userInfo!.roleName!.split("_").first.toString() + " " + AppState().getUser.data!.userInfo!.roleName!.split("_").last.toString()).toText() + : AppState().getUser.data!.userInfo!.roleName!.toText(fontSize: 10), ], ), ), @@ -166,16 +148,15 @@ class _CustomDrawerState extends State { ), ), ListTile( - leading: SvgPicture.asset(MyAssets.nextIcon, - color: MyColors.darkPrimaryColor), + leading: SvgPicture.asset(MyAssets.nextIcon, color: MyColors.darkPrimaryColor), title: LocaleKeys.defineLicences.tr().toText(fontSize: 12), onTap: () { + // AppPermissions.checkStoragePermissions(context); navigateWithName(context, ProviderAppRoutes.defineLicense); }, ), ListTile( - leading: SvgPicture.asset(MyAssets.nextIcon, - color: MyColors.darkPrimaryColor), + leading: SvgPicture.asset(MyAssets.nextIcon, color: MyColors.darkPrimaryColor), title: "Subscriptions".toText(fontSize: 12), onTap: () { navigateWithName(context, ProviderAppRoutes.mySubscriptionsPage); @@ -190,8 +171,7 @@ class _CustomDrawerState extends State { ), title: LocaleKeys.english.tr().toText(fontSize: 12), onTap: () { - if (EasyLocalization.of(context)?.currentLocale?.countryCode == - "SA") { + if (EasyLocalization.of(context)?.currentLocale?.countryCode == "SA") { context.setLocale(const Locale("en", "US")); } else { context.setLocale(const Locale('ar', 'SA')); diff --git a/lib/views/dashboard/widget/my_service_provider.dart b/lib/views/dashboard/widget/my_service_provider.dart index e66240b..0d74cff 100644 --- a/lib/views/dashboard/widget/my_service_provider.dart +++ b/lib/views/dashboard/widget/my_service_provider.dart @@ -24,9 +24,9 @@ class ServiceProviderWidget extends StatelessWidget { if (model.state == ViewState.busy) { return const Center(child: CircularProgressIndicator()); } else { - return model.branches!.data! == null + return model.branches!.data == null ? const Center(child: Text("No Branch Found")) - : model.branches!.data!.serviceProviderBranch!.isEmpty + : model.branches!.data!.serviceProviderBranch != null && model.branches!.data!.serviceProviderBranch!.isEmpty ? Center(child: Text(LocaleKeys.no_branch.tr())) : ListView.builder( itemCount: model.branches!.data!.serviceProviderBranch!.length, diff --git a/lib/views/settings/define_license_page.dart b/lib/views/settings/define_license_page.dart index 84b7650..7beb79e 100644 --- a/lib/views/settings/define_license_page.dart +++ b/lib/views/settings/define_license_page.dart @@ -1,4 +1,3 @@ - import 'package:car_provider_app/view_models/service_view_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -144,9 +143,10 @@ class _DefineLicensePageState extends State { 8.height, InkWell( onTap: () async { - bool isPermissionsAvailable = await requestPermissionGranted(context, Permission.storage); + int sdkInt = await AppPermissions().getAndroidDeviceInfo(); + bool isPermissionsAvailable = await requestPermissionGranted(context, sdkInt > 32 ? Permission.photos : Permission.storage); if (isPermissionsAvailable) { - model.selectFile(context,index); + model.selectFile(context, index); } }, child: Container( diff --git a/lib/views/settings/schedule/add_schedules_page.dart b/lib/views/settings/schedule/add_schedules_page.dart index 645efa1..bdb8030 100644 --- a/lib/views/settings/schedule/add_schedules_page.dart +++ b/lib/views/settings/schedule/add_schedules_page.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + 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'; @@ -5,6 +7,7 @@ import 'package:car_provider_app/views/settings/schedule/widgets/select_services 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/main.dart'; 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'; @@ -17,26 +20,24 @@ import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:provider/provider.dart'; import 'package:mc_common_app/widgets/bottom_sheet.dart'; -class AddSchedulesPage extends StatelessWidget { +class AddSchedulesPage extends StatefulWidget { + AddSchedulesPage({Key? key}) : super(key: key); + + @override + State createState() => _AddSchedulesPageState(); +} + +class _AddSchedulesPageState extends State { late ScheduleVM mModel; - String name = "", - startDate = "", - endDate = "", - startTime = "", - endTime = "", - slotsTime = "", - appointmentPerSlot = "", - servicesGroupID = ""; - late ScheduleData scheduleData; - AddSchedulesPage({Key? key}) : super(key: key); + String name = "", startDate = "", endDate = "", startTime = "", endTime = "", slotsTime = "", appointmentPerSlot = "", servicesGroupID = ""; + + late ScheduleData scheduleData; 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(); @@ -44,9 +45,7 @@ class AddSchedulesPage extends StatelessWidget { // mModel.selectedServicesItems.clear(); scheduleData.scheduleServices?.forEach((element) { - mModel.selectedServicesItems.add(PickerItem( - id: element.providerServiceId ?? 0, - title: element.serviceDescription ?? "")); + mModel.selectedServicesItems.add(PickerItem(id: element.providerServiceId ?? 0, title: element.serviceDescription ?? "")); }); mModel.selectedDaysItems.clear(); scheduleData.weeklyOffDays?.forEach((element) { @@ -59,16 +58,23 @@ class AddSchedulesPage extends StatelessWidget { }); } + @override + void initState() { + super.initState(); + scheduleMicrotask(() { + mModel = context.read(); + scheduleData = ModalRoute.of(context)!.settings.arguments as ScheduleData; + mModel.getAllServices(scheduleData.branchId, scheduleData); + mModel.selectedServicesItems = []; + mModel.selectedDaysItems = []; + if (scheduleData.id != null) { + setEditData(); + } + }); + } + @override Widget build(BuildContext context) { - mModel = context.read(); - scheduleData = ModalRoute.of(context)!.settings.arguments as ScheduleData; - mModel.getAllServices(scheduleData.branchId, scheduleData); - mModel.selectedServicesItems = []; - mModel.selectedDaysItems = []; - if (scheduleData.id != null) { - setEditData(); - } return Scaffold( appBar: const CustomAppBar( title: "Create Schedules", @@ -190,12 +196,7 @@ 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, @@ -340,11 +341,13 @@ class AddSchedulesPage extends StatelessWidget { } } else { Utils.hideLoading(context); - Utils.showToast(scheduleResponse.message??""); + Utils.showToast(scheduleResponse.message ?? ""); } } updateSchedule(BuildContext context, ScheduleVM model) async { + logger.d(scheduleData); + print("-----------"); List days = []; for (var element in model.selectedDaysItems) { days.add(element.id); @@ -361,7 +364,8 @@ class AddSchedulesPage extends StatelessWidget { "slotDurationMinute": slotsTime, "perSlotAppointment": appointmentPerSlot, "deliveryServiceType": 1, - "weeklyOffDays": days + "weeklyOffDays": days, + "appointmentType": scheduleData.appointmentType }; Utils.showLoading(context); @@ -385,8 +389,7 @@ class AddSchedulesPage extends StatelessWidget { 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 ab7449a..5f86fc8 100644 --- a/lib/views/settings/schedule/schedules_list_page.dart +++ b/lib/views/settings/schedule/schedules_list_page.dart @@ -4,10 +4,12 @@ import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/main.dart'; import 'package:mc_common_app/models/appointments_models/schedule_model.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'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; @@ -26,7 +28,6 @@ class SchedulesListPage extends StatefulWidget { class _SchedulesListPageState extends State { @override void initState() { - // TODO: implement initState super.initState(); context.read().getSchedules(widget.branchId ?? ""); } @@ -56,16 +57,30 @@ class _SchedulesListPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( + crossAxisAlignment: CrossAxisAlignment.center, children: [ Expanded( - child: value.schedule!.data![index] - .scheduleName - .toString() - .toText( + child: value.schedule!.data![index].scheduleName.toString().toText( fontSize: 16, isBold: true, ), ), + IconButton( + onPressed: () async { + Utils.showLoading(context); + value.setScheduleInactive(value.schedule!.data![index].id!, value.schedule!.data![index].serviceProviderBranchId!); + Utils.hideLoading(context); + // if (res.messageStatus == 1) { + // Utils.showToast( + // LocaleKeys.branch_deleted.tr()); + // model.setState(ViewState.idle); + // } else { + // Utils.showToast(res.message ?? ""); + // } + }, + icon: const Icon(Icons.delete), + color: Colors.red, + ), Padding( padding: const EdgeInsets.all(4.0), child: SvgPicture.asset( @@ -74,68 +89,28 @@ 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, ), 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( - crossAxisAlignment: - CrossAxisAlignment.start, - children: value.schedule!.data![index] - .scheduleServices! + crossAxisAlignment: CrossAxisAlignment.start, + children: value.schedule!.data![index].scheduleServices! .map( (element) => Container( - child: element.serviceDescription - .toString() - .toText( + child: element.serviceDescription.toString().toText( fontSize: 12, isBold: true, ), @@ -144,11 +119,9 @@ class _SchedulesListPageState extends State { .toList(), ) ], - ).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), @@ -162,8 +135,7 @@ 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 ?? "")); }, ), ], @@ -175,8 +147,7 @@ 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 + " , "; } @@ -187,8 +158,7 @@ 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 1c7dae6..0e89bca 100644 --- a/lib/views/settings/services/create_services_page3.dart +++ b/lib/views/settings/services/create_services_page3.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + 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'; @@ -17,35 +19,56 @@ import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:provider/provider.dart'; -class CreateServicesPage3 extends StatelessWidget { +class CreateServicesPage3 extends StatefulWidget { CreateBranchModel? branchModel; CreateServicesPage3(this.branchModel, {Key? key}) : super(key: key); + @override + State createState() => _CreateServicesPage3State(); +} + +class _CreateServicesPage3State extends State { bool isAppointmentAvailable = false; + bool isHomeAppointmentAvailable = false; + int serviceRage = 0; + 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"); - } else { - isAppointmentAvailable = branchModel?.serviceProviderService?.isAllowAppointment ?? false; - // isHomeAppointmentAvailable=branchModel.serviceProviderService. - serviceRage = branchModel?.serviceProviderService?.customerLocationRange ?? 0; - if (serviceRage > 0) { - isHomeAppointmentAvailable = true; + void initState() { + // TODO: implement initState + super.initState(); + scheduleMicrotask(() { + ServiceVM serviceVM = context.read(); + if (widget.branchModel!.categoryId == null) { + serviceVM.fetchBranchCategory(EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA"); + } else { + isAppointmentAvailable = widget.branchModel?.serviceProviderService?.isAllowAppointment ?? false; + // isHomeAppointmentAvailable=branchModel.serviceProviderService. + serviceRage = widget.branchModel?.serviceProviderService?.customerLocationRange ?? 0; + if (serviceRage > 0) { + isHomeAppointmentAvailable = true; + } + chargersPerKm = widget.branchModel?.serviceProviderService?.rangePricePerKm ?? "0"; + serviceId = widget.branchModel?.serviceProviderService?.serviceId ?? -1; } - chargersPerKm = branchModel?.serviceProviderService?.rangePricePerKm ?? "0"; - serviceId = branchModel?.serviceProviderService?.serviceId ?? -1; - } + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( appBar: CustomAppBar(title: LocaleKeys.defineServices.tr()), body: SizedBox( @@ -62,7 +85,7 @@ class CreateServicesPage3 extends StatelessWidget { child: Column( children: [ Text( - branchModel!.branchName ?? "N/A", + widget.branchModel!.branchName ?? "N/A", style: const TextStyle( fontSize: 12, fontWeight: FontWeight.bold, @@ -74,9 +97,9 @@ class CreateServicesPage3 extends StatelessWidget { width: double.infinity, ), 12.height, - (branchModel!.categoryId != null) + (widget.branchModel!.categoryId != null) ? Text( - branchModel!.categoryName ?? "N/A", + widget.branchModel!.categoryName ?? "N/A", style: const TextStyle( fontSize: 12, fontWeight: FontWeight.bold, @@ -87,7 +110,7 @@ class CreateServicesPage3 extends StatelessWidget { borderRadius: 0, width: double.infinity, ) - : (branchModel!.categoryId == null && model.categoryDropList.isNotEmpty) + : (widget.branchModel!.categoryId == null && model.categoryDropList.isNotEmpty) ? DropdownField( (DropValue value) async { categoryId = value.id; @@ -104,9 +127,9 @@ class CreateServicesPage3 extends StatelessWidget { ) : const CircularProgressIndicator(), 12.height, - branchModel!.serviceProviderService != null + widget.branchModel!.serviceProviderService != null ? Text( - branchModel!.serviceProviderService!.serviceDescription ?? "N/A", + widget.branchModel!.serviceProviderService!.serviceDescription ?? "N/A", style: const TextStyle( fontSize: 12, fontWeight: FontWeight.bold, @@ -209,7 +232,7 @@ class CreateServicesPage3 extends StatelessWidget { maxWidth: double.infinity, margin: const EdgeInsets.all(20), onPressed: () { - if (branchModel!.serviceProviderService != null) { + if (widget.branchModel!.serviceProviderService != null) { updateService(context, model); } else { if (model.services != null) { @@ -240,7 +263,7 @@ class CreateServicesPage3 extends StatelessWidget { if (model.services!.data![i].isSelected ?? false) { var postParams = { // "id": services!.data![i].id, - "providerBranchID": branchModel!.branchId, + "providerBranchID": widget.branchModel!.branchId, "serviceID": model.services!.data![i].id, "isAllowAppointment": isAppointmentAvailable, "isActive": true, @@ -261,7 +284,7 @@ class CreateServicesPage3 extends StatelessWidget { updateService(BuildContext context, ServiceVM model) async { List> map = [ { - "id": branchModel!.serviceProviderService!.serviceId.toString(), + "id": widget.branchModel!.serviceProviderService!.serviceId.toString(), "isAllowAppointment": isAppointmentAvailable, "isActive": true, "customerLocationRange": serviceRage,