From 436befd111513ffcafc0961acec758928624a142 Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Wed, 21 Jun 2023 15:26:37 +0300 Subject: [PATCH] Updated the MOdels --- lib/config/customer_dependencies.dart | 2 +- lib/main.dart | 1 - lib/repositories/provider_repo.dart | 17 ++- lib/view_models/appointments_view_model.dart | 95 +++++++++++--- ...rt => book_appointment_services_view.dart} | 4 +- ...appointment_service_pick_bottom_sheet.dart | 25 ++-- .../fragments/providers_fragment.dart | 120 +++++++++--------- .../provider/sheet/items_list_sheet.dart | 108 ++++++++-------- 8 files changed, 211 insertions(+), 161 deletions(-) rename lib/views/appointments/{appointment_services_list_view.dart => book_appointment_services_view.dart} (98%) diff --git a/lib/config/customer_dependencies.dart b/lib/config/customer_dependencies.dart index b41d76a..3debdff 100644 --- a/lib/config/customer_dependencies.dart +++ b/lib/config/customer_dependencies.dart @@ -4,7 +4,7 @@ import 'package:mc_common_app/config/dependencies.dart'; class CustomerDependencies { static void addDependencies() { AppDependencies.addDependencies(); - injector.registerSingleton(() => BranchRepoImp()); + injector.registerSingleton(() => ProviderRepoImp()); } } diff --git a/lib/main.dart b/lib/main.dart index 87a905d..a2cfeff 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -58,7 +58,6 @@ Future main() async { create: (_) => AppointmentsVM( providerRepo: injector.get(), commonServices: injector.get(), - branchRepo: injector.get(), commonRepo: injector.get(), ), ), diff --git a/lib/repositories/provider_repo.dart b/lib/repositories/provider_repo.dart index 3a6804a..702a764 100644 --- a/lib/repositories/provider_repo.dart +++ b/lib/repositories/provider_repo.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:flutter/cupertino.dart'; import 'package:mc_common_app/api/api_client.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/consts.dart'; @@ -13,7 +12,7 @@ import 'package:mc_common_app/models/services/item_model.dart'; abstract class ProviderRepo { Future> getAllNearBranchAndServices(); - Future getServiceItems(int serviceId); + Future> getServiceItems(int serviceId); Future getBranchAndServices(int providerId); } @@ -30,13 +29,19 @@ class ProviderRepoImp implements ProviderRepo { } @override - Future getServiceItems(int serviceId) async { + Future> getServiceItems(int serviceId) async { var queryParameters = { "ServiceProviderServiceID": serviceId.toString(), }; - String? token = appState.getUser.data?.accessToken; - debugPrint(token); - return await apiClient.getJsonForObject((json) => ItemModel.fromJson(json), ApiConsts.getServiceItems, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? ""); + + GenericRespModel adsGenericModel = await apiClient.getJsonForObject( + (json) => GenericRespModel.fromJson(json), + ApiConsts.getServiceItems, + token: appState.getUser.data!.accessToken, + queryParameters: queryParameters, + ); + List serviceItems = List.generate(adsGenericModel.data.length, (index) => ServiceItemModel.fromJson(adsGenericModel.data[index])); + return serviceItems; } @override diff --git a/lib/view_models/appointments_view_model.dart b/lib/view_models/appointments_view_model.dart index fc4daae..a65a99c 100644 --- a/lib/view_models/appointments_view_model.dart +++ b/lib/view_models/appointments_view_model.dart @@ -1,15 +1,16 @@ import 'package:car_customer_app/repositories/provider_repo.dart'; +import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/models/provider_branches_models/provider_profile_model.dart'; -import 'package:mc_common_app/models/provider_category_model.dart'; -import 'package:mc_common_app/models/provider_service_model.dart'; import 'package:mc_common_app/models/services/item_model.dart'; +import 'package:mc_common_app/models/services/service_model.dart'; import 'package:mc_common_app/models/widgets_models.dart'; import 'package:mc_common_app/repositories/common_repo.dart'; import 'package:mc_common_app/services/common_services.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/view_models/base_view_model.dart'; +import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; class AppointmentsVM extends BaseVM { final CommonRepo commonRepo; @@ -25,7 +26,7 @@ class AppointmentsVM extends BaseVM { bool isFetchingServices = false; - List providerCategories = []; + List branchCategories = []; bool isHomeTapped = false; @@ -41,37 +42,31 @@ class AppointmentsVM extends BaseVM { notifyListeners(); } - SelectionModel providerCategoryId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); + SelectionModel branchSelectedCategoryId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); void updateProviderCategoryId(SelectionModel id) async { - providerCategoryId = id; + branchSelectedCategoryId = id; await getProviderServices(id.selectedId); notifyListeners(); } - List providerServices = []; + List branchServices = []; - SelectionModel providerServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); + SelectionModel branchSelectedServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); - void updateProviderServiceId(SelectionModel id) async { - providerServiceId = id; - notifyListeners(); - } - - void getProviderCategories() async { - notifyListeners(); - providerCategories = await commonRepo.getProviderServiceCategories(); + void updateBranchServiceId(SelectionModel id) async { + branchSelectedServiceId = id; notifyListeners(); } getProviderServices(int categoryId) async { - providerServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); + branchSelectedServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); isHomeTapped = false; pickedHomeLocation = ""; if (categoryId != -1) { isFetchingServices = true; notifyListeners(); - providerServices = await commonRepo.getProviderServices(categoryId: categoryId); + // branchServices = await commonRepo.getProviderServices(categoryId: categoryId); isFetchingServices = false; notifyListeners(); @@ -108,7 +103,7 @@ class AppointmentsVM extends BaseVM { List providersFilterOptions = []; List nearbyBranches = []; - ItemModel? serviceItems; + List serviceItems = []; ProviderProfileModel? providerProfileModel; populateProvidersFilterList() { @@ -142,8 +137,8 @@ class AppointmentsVM extends BaseVM { setState(ViewState.idle); } - Future getServiceItems(int serviceId) async { - serviceItems = null; + Future> getServiceItems(int serviceId) async { + serviceItems.clear(); serviceItems = await providerRepo.getServiceItems(serviceId); setState(ViewState.idle); return serviceItems; @@ -154,4 +149,64 @@ class AppointmentsVM extends BaseVM { providerProfileModel = await providerRepo.getBranchAndServices(providerId); setState(ViewState.idle); } + + String pickHomeLocationError = ""; + + SelectionModel branchServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); + + bool isCategoryAlreadyPresent(int id) { + final contain = branchCategories.where((element) => element.id == id); + if (contain.isEmpty) { + return false; + } + return true; + } + + void getBranchCategories() async { + for (var value in branchServices) { + if (!isCategoryAlreadyPresent(value.categoryId!)) { + branchCategories.add(DropValue(value.categoryId!, value.categoryName!, "")); + } + } + notifyListeners(); + } + + getBranchServices(int categoryId) async { + branchServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); + isHomeTapped = false; + pickedHomeLocation = ""; + pickHomeLocationError = ""; + if (categoryId != -1) { + isFetchingServices = true; + notifyListeners(); + branchServices = getFilteredBranchServices(categoryId: categoryId, branchId: 6); + isFetchingServices = false; + + notifyListeners(); + } + } + + List getFilteredBranchServices({required int branchId, required int categoryId}) { + // List filteredServices = nearbyBranchesList.where((element) => element) + return []; + } + + void updatePickHomeLocationError(String value) { + pickHomeLocationError = value; + notifyListeners(); + } + + bool isServiceSelectionValidated() { + if (branchServiceId.selectedId == -1) { + return false; + } + + if (isHomeTapped) { + if (pickedHomeLocation == "") { + updatePickHomeLocationError(GlobalConsts.homeLocationEmptyError); + return false; + } + } + return true; + } } diff --git a/lib/views/appointments/appointment_services_list_view.dart b/lib/views/appointments/book_appointment_services_view.dart similarity index 98% rename from lib/views/appointments/appointment_services_list_view.dart rename to lib/views/appointments/book_appointment_services_view.dart index 3d6355c..ed6f6f0 100644 --- a/lib/views/appointments/appointment_services_list_view.dart +++ b/lib/views/appointments/book_appointment_services_view.dart @@ -16,8 +16,8 @@ import 'package:mc_common_app/widgets/common_widgets/time_slots.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; -class AppointmentServicesListView extends StatelessWidget { - AppointmentServicesListView({Key? key}) : super(key: key); +class BookAppointmentServicesView extends StatelessWidget { + BookAppointmentServicesView({Key? key}) : super(key: key); void openTheAddServiceBottomSheet(BuildContext context, AppointmentsVM appointmentsVM) { showModalBottomSheet( diff --git a/lib/views/appointments/widgets/appointment_service_pick_bottom_sheet.dart b/lib/views/appointments/widgets/appointment_service_pick_bottom_sheet.dart index 6ea7081..63a2cb9 100644 --- a/lib/views/appointments/widgets/appointment_service_pick_bottom_sheet.dart +++ b/lib/views/appointments/widgets/appointment_service_pick_bottom_sheet.dart @@ -41,18 +41,12 @@ class AppointmentServicePickBottomSheet extends StatelessWidget { children: [ Builder( builder: (context) { - List serviceCategories = []; - for (var element in appointmentsVM.branchCategories) { - if (!element.isSelected!) { - serviceCategories.add(DropValue(element.id?.toInt() ?? 0, element.categoryName ?? "", "")); - } - } return DropdownField( - (DropValue value) => appointmentsVM.updateProviderCategoryId(SelectionModel(selectedId: value.id, selectedOption: value.value, itemPrice: value.subValue)), - list: serviceCategories, + (DropValue value) => appointmentsVM.updateProviderCategoryId(SelectionModel(selectedId: value.id, selectedOption: value.value, itemPrice: value.subValue)), + list: appointmentsVM.branchCategories, hint: "Select Category", - dropdownValue: appointmentsVM.providerCategoryId.selectedId != -1 - ? DropValue(appointmentsVM.providerCategoryId.selectedId, appointmentsVM.providerCategoryId.selectedOption, "") + dropdownValue: appointmentsVM.branchSelectedCategoryId.selectedId != -1 + ? DropValue(appointmentsVM.branchSelectedCategoryId.selectedId, appointmentsVM.branchSelectedCategoryId.selectedOption, "") : null, ); }, @@ -68,17 +62,14 @@ class AppointmentServicePickBottomSheet extends StatelessWidget { builder: (context) { List serviceCategories = []; for (var element in appointmentsVM.branchServices) { - if (!element.isSelected!) { - serviceCategories.add(DropValue(element.providerBranchServiceID ?? 0, element.providerBranchServiceID.toString(), "")); - } + serviceCategories.add(DropValue(element.serviceProviderServiceId ?? 0, element.serviceProviderServiceId.toString(), "")); } return DropdownField( - (DropValue value) => appointmentsVM.updateProviderServiceId(SelectionModel(selectedId: value.id, selectedOption: value.value, itemPrice: value.subValue)), + (DropValue value) => appointmentsVM.updateBranchServiceId(SelectionModel(selectedId: value.id, selectedOption: value.value, itemPrice: value.subValue)), list: serviceCategories, hint: "Select Services", - dropdownValue: appointmentsVM.branchServiceId.selectedId != -1 - ? DropValue(appointmentsVM.branchServiceId.selectedId, appointmentsVM.branchServiceId.selectedOption, "") - : null, + dropdownValue: + appointmentsVM.branchServiceId.selectedId != -1 ? DropValue(appointmentsVM.branchServiceId.selectedId, appointmentsVM.branchServiceId.selectedOption, "") : null, ); }, ), diff --git a/lib/views/dashboard/fragments/providers_fragment.dart b/lib/views/dashboard/fragments/providers_fragment.dart index 9419afd..f2f7593 100644 --- a/lib/views/dashboard/fragments/providers_fragment.dart +++ b/lib/views/dashboard/fragments/providers_fragment.dart @@ -1,60 +1,60 @@ -import 'package:car_customer_app/view_models/appointments_view_model.dart'; -import 'package:flutter/material.dart'; -import 'package:mc_common_app/classes/consts.dart'; -import 'package:mc_common_app/config/routes.dart'; -import 'package:mc_common_app/extensions/int_extensions.dart'; -import 'package:mc_common_app/theme/colors.dart'; -import 'package:mc_common_app/utils/navigator.dart'; -import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; -import 'package:mc_common_app/widgets/common_widgets/provider_details_card.dart'; -import 'package:provider/provider.dart'; - -class ProvidersFragment extends StatelessWidget { - const ProvidersFragment({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - color: MyColors.backgroundColor, - width: double.infinity, - height: double.infinity, - child: Consumer( - builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { - return Column( - children: [ - 16.height, - FiltersList( - filterList: appointmentsVM.providersFilterOptions, - onFilterTapped: (index, selectedFilterId) => appointmentsVM.applyFilterOnProviders(index: index), - ), - 16.height, - Expanded( - child: Container( - child: ListView.builder( - shrinkWrap: true, - itemCount: 30, - itemBuilder: (BuildContext context, int index) { - return ProviderDetailsCard( - onCardTapped: () { - if (context.read().providerCategories.isEmpty) { - context.read().getProviderCategories(); - } - navigateWithName(context, AppRoutes.bookAppointmenServicesView); - }, - providerImageUrl: MyAssets.bnCar, - title: "", - providerLocation: " 3km", - providerName: "Al Ahmed Maintenance", - providerRatings: "4.9", - ); - }, - ), - ), - ), - ], - ); - }, - ), - ); - } -} +// import 'package:car_customer_app/view_models/appointments_view_model.dart'; +// import 'package:flutter/material.dart'; +// import 'package:mc_common_app/classes/consts.dart'; +// import 'package:mc_common_app/config/routes.dart'; +// import 'package:mc_common_app/extensions/int_extensions.dart'; +// import 'package:mc_common_app/theme/colors.dart'; +// import 'package:mc_common_app/utils/navigator.dart'; +// import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; +// import 'package:mc_common_app/widgets/common_widgets/provider_details_card.dart'; +// import 'package:provider/provider.dart'; +// +// class ProvidersFragment extends StatelessWidget { +// const ProvidersFragment({Key? key}) : super(key: key); +// +// @override +// Widget build(BuildContext context) { +// return Container( +// color: MyColors.backgroundColor, +// width: double.infinity, +// height: double.infinity, +// child: Consumer( +// builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { +// return Column( +// children: [ +// 16.height, +// FiltersList( +// filterList: appointmentsVM.providersFilterOptions, +// onFilterTapped: (index, selectedFilterId) => appointmentsVM.applyFilterOnProviders(index: index), +// ), +// 16.height, +// Expanded( +// child: Container( +// child: ListView.builder( +// shrinkWrap: true, +// itemCount: 30, +// itemBuilder: (BuildContext context, int index) { +// return ProviderDetailsCard( +// onCardTapped: () { +// if (context.read().branchCategories.isEmpty) { +// context.read().getBranchCategories(); +// } +// navigateWithName(context, AppRoutes.bookAppointmenServicesView); +// }, +// providerImageUrl: MyAssets.bnCar, +// title: "", +// providerLocation: " 3km", +// providerName: "Al Ahmed Maintenance", +// providerRatings: "4.9", +// ); +// }, +// ), +// ), +// ), +// ], +// ); +// }, +// ), +// ); +// } +// } diff --git a/lib/views/provider/sheet/items_list_sheet.dart b/lib/views/provider/sheet/items_list_sheet.dart index 7870b53..25cb5f4 100644 --- a/lib/views/provider/sheet/items_list_sheet.dart +++ b/lib/views/provider/sheet/items_list_sheet.dart @@ -2,6 +2,7 @@ import 'package:car_customer_app/view_models/appointments_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/models/services/item_model.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/widgets/empty_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; @@ -28,66 +29,65 @@ class _ItemsListSheetState extends State { return SizedBox( height: MediaQuery.of(context).size.height / 1.2, child: Consumer( - builder: (context, model, _) { - return model.serviceItems == null - ? const Center(child: CircularProgressIndicator()) - : model.serviceItems!.data!.isEmpty - ? const EmptyWidget() - : ListView.separated( - itemBuilder: (BuildContext context, int index) { - return SizedBox( - width: double.infinity, - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, + builder: (context, appointmentsVM, _) { + return appointmentsVM.serviceItems.isEmpty + ? const EmptyWidget() + : ListView.separated( + itemCount: appointmentsVM.serviceItems.length, + itemBuilder: (BuildContext context, int index) { + ServiceItemModel serviceItemModel = appointmentsVM.serviceItems[index]; + return SizedBox( + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + serviceItemModel.name.toString().toText(fontSize: 16, isBold: true), + 4.height, + showItem("Available for appointment:", (serviceItemModel.isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green), + showItem("Allowing Workshop service:", (serviceItemModel.isAppointmentCompanyLoc ?? false) ? "Yes" : "No", valueColor: Colors.green), + showItem("Allowing home service:", (serviceItemModel.isAppointmentCustomerLoc ?? false) ? "Yes" : "No", valueColor: Colors.green), + 12.height, + "Service Amount".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), + Row( + crossAxisAlignment: CrossAxisAlignment.end, children: [ - model.serviceItems!.data![index].name.toString().toText(fontSize: 16, isBold: true), - 4.height, - showItem("Available for appointment:", (model.serviceItems!.data![index].isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green), - showItem("Allowing Workshop service:", (model.serviceItems!.data![index].isAppointmentCompanyLoc ?? false) ? "Yes" : "No", valueColor: Colors.green), - showItem("Allowing home service:", (model.serviceItems!.data![index].isAppointmentCustomerLoc ?? false) ? "Yes" : "No", valueColor: Colors.green), - 12.height, - "Service Amount".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), - Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - model.serviceItems!.data![index].price!.toText(fontSize: 22, isBold: true), - 2.width, - Padding( - padding: const EdgeInsets.only(bottom: 4), - child: "SAR".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), - ), - ], + serviceItemModel.price!.toText(fontSize: 22, isBold: true), + 2.width, + Padding( + padding: const EdgeInsets.only(bottom: 4), + child: "SAR".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), ), ], ), - ), - // Padding( - // padding: const EdgeInsets.all(4.0), - // child: SvgPicture.asset( - // MyAssets.icEdit, - // width: 16, - // height: 16, - // ), - // ) - ], + ], + ), ), - ).toWhiteContainer( - width: double.infinity, - allPading: 12, - ); - }, - separatorBuilder: (BuildContext context, int index) { - return 12.height; - }, - padding: const EdgeInsets.all(20), - itemCount: model.serviceItems!.data!.length, + // Padding( + // padding: const EdgeInsets.all(4.0), + // child: SvgPicture.asset( + // MyAssets.icEdit, + // width: 16, + // height: 16, + // ), + // ) + ], + ), + ).toWhiteContainer( + width: double.infinity, + allPading: 12, ); + }, + separatorBuilder: (BuildContext context, int index) { + return 12.height; + }, + padding: const EdgeInsets.all(20), + ); }, ), );