Updated the New Models

pull/3/head
FaizHashmiCS22 3 years ago
parent 86c9419484
commit 8bc13dff34

@ -4,7 +4,7 @@ import 'package:mc_common_app/config/dependencies.dart';
class CustomerDependencies { class CustomerDependencies {
static void addDependencies() { static void addDependencies() {
AppDependencies.addDependencies(); AppDependencies.addDependencies();
injector.registerSingleton<ProviderRepo>(() => ProviderRepoImp()); injector.registerSingleton<BranchRepo>(() => BranchRepoImp());
} }
} }

@ -10,7 +10,7 @@ import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart'; import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart';
import 'package:mc_common_app/models/services/branch_model.dart'; import 'package:mc_common_app/models/branch_models/branch_detail_model.dart';
import 'package:mc_common_app/views/advertisement/ads_detail_view.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/create_ad_view.dart';
import 'package:mc_common_app/views/payments/payment_methods_view.dart'; import 'package:mc_common_app/views/payments/payment_methods_view.dart';
@ -26,7 +26,7 @@ class CustomerAppRoutes {
AppRoutes.bookAppointmentsItemView: (context) => BookAppointmentsItemView(), AppRoutes.bookAppointmentsItemView: (context) => BookAppointmentsItemView(),
AppRoutes.reviewAppointmentView: (context) => ReviewAppointment(), AppRoutes.reviewAppointmentView: (context) => ReviewAppointment(),
AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(), AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(),
AppRoutes.branchDetailPage: (context) => BranchDetailPage(branchModel: ModalRoute.of(context)!.settings.arguments as BranchModel), AppRoutes.branchDetailPage: (context) => BranchDetailPage(branchDetailModel: ModalRoute.of(context)!.settings.arguments as BranchDetailModel),
AppRoutes.providerProfilePage: (context) => ProviderProfilePage(providerId: ModalRoute.of(context)!.settings.arguments as int), AppRoutes.providerProfilePage: (context) => ProviderProfilePage(providerId: ModalRoute.of(context)!.settings.arguments as int),
}; };
} }

@ -55,16 +55,10 @@ Future<void> main() async {
adsRepo: injector.get<AdsRepo>(), adsRepo: injector.get<AdsRepo>(),
), ),
), ),
ChangeNotifierProvider<ProvidersVM>(
create: (_) => ProvidersVM(
commonServices: injector.get<CommonAppServices>(),
commonRepo: injector.get<CommonRepo>(),
providerRepo: injector.get<ProviderRepo>(),
),
),
ChangeNotifierProvider<AppointmentsVM>( ChangeNotifierProvider<AppointmentsVM>(
create: (_) => AppointmentsVM( create: (_) => AppointmentsVM(
commonServices: injector.get<CommonAppServices>(), commonServices: injector.get<CommonAppServices>(),
branchRepo: injector.get<BranchRepo>(),
commonRepo: injector.get<CommonRepo>(), commonRepo: injector.get<CommonRepo>(),
), ),
), ),

@ -1,33 +1,38 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:mc_common_app/models/model/provider_model.dart';
import 'package:mc_common_app/models/services/item_model.dart';
import 'package:mc_common_app/models/services/near_branch_model.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/api/api_client.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/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependencies.dart'; import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/models/branch_models/branch_detail_model.dart';
import 'package:mc_common_app/models/generic_resp_model.dart';
import 'package:mc_common_app/models/model/provider_model.dart';
import 'package:mc_common_app/models/services/item_model.dart';
import 'package:flutter/cupertino.dart'; abstract class BranchRepo {
Future<List<BranchDetailModel>> getAllNearBranchAndServices();
abstract class ProviderRepo {
Future<NearBrancheModel> getAllNearBranchAndServices();
Future<ItemModel> getServiceItems(int serviceId); Future<ItemModel> getServiceItems(int serviceId);
Future<ProviderModel> getBranchAndServices(int providerId); Future<ProviderModel> getBranchAndServices(int providerId);
} }
class ProviderRepoImp implements ProviderRepo { class BranchRepoImp implements BranchRepo {
ApiClient apiClient = injector.get<ApiClient>();
AppState appState = injector.get<AppState>();
@override @override
Future<NearBrancheModel> getAllNearBranchAndServices() async { Future<List<BranchDetailModel>> getAllNearBranchAndServices() async {
// var postParams = {"serviceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
String t = AppState().getUser.data!.accessToken ?? ""; (json) => GenericRespModel.fromJson(json),
return await injector.get<ApiClient>().getJsonForObject((json) => NearBrancheModel.fromJson(json), ApiConsts.GetAllNearBranches, token: t); ApiConsts.GetAllNearBranches,
token: appState.getUser.data!.accessToken,
);
List<BranchDetailModel> branches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index]));
return branches;
} }
@override @override

@ -1,17 +1,71 @@
import 'package:flutter/cupertino.dart'; import 'package:car_customer_app/repositories/provider_repo.dart';
import 'package:mc_common_app/classes/consts.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/appointments_models/appointment_list_model.dart';
import 'package:mc_common_app/models/branch_models/branch_detail_model.dart';
import 'package:mc_common_app/models/provider_category_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/widgets_models.dart'; import 'package:mc_common_app/models/widgets_models.dart';
import 'package:mc_common_app/repositories/common_repo.dart'; import 'package:mc_common_app/repositories/common_repo.dart';
import 'package:mc_common_app/services/common_services.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/models/services/item_model.dart';
class AppointmentsVM extends ChangeNotifier {
class AppointmentsVM extends BaseVM {
final CommonRepo commonRepo; final CommonRepo commonRepo;
final BranchRepo branchRepo;
final CommonAppServices commonServices; final CommonAppServices commonServices;
AppointmentsVM({required this.commonServices, required this.commonRepo}); AppointmentsVM({required this.commonServices, required this.branchRepo, required this.commonRepo});
List<FilterListModel> providersFilterOptions = [];
List<BranchDetailModel> nearbyBranchesList = [];
ItemModel? serviceItems;
ProviderModel? providerModel;
populateProvidersFilterList() {
providersFilterOptions.clear();
providersFilterOptions = [
FilterListModel(title: "All Branches", isSelected: true, id: -1),
FilterListModel(title: "Maintenance", isSelected: false, id: 0),
FilterListModel(title: "Oil Service", isSelected: false, id: 1),
FilterListModel(title: "Accessories", isSelected: false, id: 2),
FilterListModel(title: "Tire Service", isSelected: false, id: 3),
FilterListModel(title: "Dent and Paint", isSelected: false, id: 4),
];
notifyListeners();
}
applyFilterOnProviders({required int index}) {
if (providersFilterOptions.isEmpty) return;
for (var value in providersFilterOptions) {
value.isSelected = false;
}
providersFilterOptions[index].isSelected = true;
notifyListeners();
}
//Create new branch
getAllNearBranches({bool isNeedToRebuild = false}) async {
//TODO: needs to lat,long into API
nearbyBranchesList.clear();
if (isNeedToRebuild) setState(ViewState.busy);
nearbyBranchesList = await branchRepo.getAllNearBranchAndServices();
setState(ViewState.idle);
}
Future<ItemModel?> getServiceItems(int serviceId) async {
serviceItems = null;
serviceItems = await branchRepo.getServiceItems(serviceId);
setState(ViewState.idle);
return serviceItems;
}
getBranchAndServices(int providerId) async {
providerModel = null;
providerModel = await branchRepo.getBranchAndServices(providerId);
setState(ViewState.idle);
}
bool isFetchingLists = false; bool isFetchingLists = false;
@ -20,7 +74,7 @@ class AppointmentsVM extends ChangeNotifier {
bool isFetchingServices = false; bool isFetchingServices = false;
List<ProviderCategoryModel> providerCategories = []; List<ProviderCategoryModel> branchCategories = [];
bool isHomeTapped = false; bool isHomeTapped = false;
@ -47,27 +101,48 @@ class AppointmentsVM extends ChangeNotifier {
void updateProviderCategoryId(SelectionModel id) async { void updateProviderCategoryId(SelectionModel id) async {
providerCategoryId = id; providerCategoryId = id;
await getProviderServices(id.selectedId); await getBranchServices(id.selectedId);
notifyListeners(); notifyListeners();
} }
List<ProviderServiceModel> providerServices = []; List<BranchServices> branchServices = [];
SelectionModel providerServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); SelectionModel branchServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
void updateProviderServiceId(SelectionModel id) async { void updateProviderServiceId(SelectionModel id) async {
providerServiceId = id; branchServiceId = id;
notifyListeners();
}
void getBranchCategories() async {
notifyListeners();
branchCategories = await commonRepo.getProviderServiceCategories();
notifyListeners(); notifyListeners();
} }
void getProviderCategories() async { getBranchServices(int categoryId) async {
branchServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
isHomeTapped = false;
pickedHomeLocation = "";
pickHomeLocationError = "";
if (categoryId != -1) {
isFetchingServices = true;
notifyListeners(); notifyListeners();
providerCategories = await commonRepo.getProviderServiceCategories(); branchServices = getFilteredBranchServices(categoryId: categoryId, branchId: 6);
isFetchingServices = false;
notifyListeners(); notifyListeners();
} }
}
List<BranchServices> getFilteredBranchServices({required int branchId, required int categoryId}) {
// List<BranchServices> filteredServices = nearbyBranchesList.where((element) => element)
return [];
}
bool isServiceSelectionValidated() { bool isServiceSelectionValidated() {
if (providerServiceId.selectedId == -1) { if (branchServiceId.selectedId == -1) {
return false; return false;
} }
@ -80,21 +155,6 @@ class AppointmentsVM extends ChangeNotifier {
return true; return true;
} }
getProviderServices(int categoryId) async {
providerServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
isHomeTapped = false;
pickedHomeLocation = "";
pickHomeLocationError = "";
if (categoryId != -1) {
isFetchingServices = true;
notifyListeners();
providerServices = await commonRepo.getProviderServices(categoryId: categoryId);
isFetchingServices = false;
notifyListeners();
}
}
populateAppointmentsFilterList() { populateAppointmentsFilterList() {
appointmentsFilterOptions.clear(); appointmentsFilterOptions.clear();
appointmentsFilterOptions = [ appointmentsFilterOptions = [

@ -1,67 +1,18 @@
import 'package:mc_common_app/models/model/provider_model.dart'; // import 'package:car_customer_app/repositories/provider_repo.dart';
import 'package:mc_common_app/models/services/item_model.dart'; // import 'package:mc_common_app/models/branch_models/branch_detail_model.dart';
import 'package:mc_common_app/models/services/near_branch_model.dart'; // import 'package:mc_common_app/models/model/provider_model.dart';
import 'package:car_customer_app/repositories/provider_repo.dart'; // import 'package:mc_common_app/models/services/item_model.dart';
import 'package:flutter/cupertino.dart'; // import 'package:mc_common_app/models/widgets_models.dart';
import 'package:mc_common_app/models/widgets_models.dart'; // import 'package:mc_common_app/repositories/common_repo.dart';
import 'package:mc_common_app/repositories/common_repo.dart'; // import 'package:mc_common_app/services/common_services.dart';
import 'package:mc_common_app/services/common_services.dart'; // import 'package:mc_common_app/utils/enums.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/view_models/base_view_model.dart';
// class ProvidersVM extends BaseVM {
class ProvidersVM extends BaseVM { // final CommonRepo commonRepo;
final CommonRepo commonRepo; // final CommonAppServices commonServices;
final CommonAppServices commonServices; // final ProviderRepo providerRepo;
final ProviderRepo providerRepo; //
// ProvidersVM({required this.commonServices, required this.commonRepo, required this.providerRepo});
ProvidersVM({required this.commonServices, required this.commonRepo, required this.providerRepo}); //
// }
List<FilterListModel> providersFilterOptions = [];
NearBrancheModel? branches;
ItemModel? serviceItems;
ProviderModel? providerModel;
populateProvidersFilterList() {
providersFilterOptions.clear();
providersFilterOptions = [
FilterListModel(title: "All Providers", isSelected: true, id: -1),
FilterListModel(title: "Maintenance", isSelected: false, id: 0),
FilterListModel(title: "Oil Service", isSelected: false, id: 1),
FilterListModel(title: "Accessories", isSelected: false, id: 2),
FilterListModel(title: "Tire Service", isSelected: false, id: 3),
FilterListModel(title: "Dent and Paint", isSelected: false, id: 4),
];
notifyListeners();
}
applyFilterOnProviders({required int index}) {
if (providersFilterOptions.isEmpty) return;
for (var value in providersFilterOptions) {
value.isSelected = false;
}
providersFilterOptions[index].isSelected = true;
notifyListeners();
}
//Create new branch
getAllNearBranches({bool isNeedToRebuild = false}) async {
//TODO: needs to lat,long into API
branches = null;
if (isNeedToRebuild) setState(ViewState.busy);
branches = await providerRepo.getAllNearBranchAndServices();
setState(ViewState.idle);
}
Future<ItemModel?> getServiceItems(int serviceId) async {
serviceItems = null;
serviceItems = await providerRepo.getServiceItems(serviceId);
setState(ViewState.idle);
return serviceItems;
}
getBranchAndServices(int providerId) async {
providerModel = null;
providerModel = await providerRepo.getBranchAndServices(providerId);
setState(ViewState.idle);
}
}

@ -42,7 +42,7 @@ class AppointmentServicePickBottomSheet extends StatelessWidget {
Builder( Builder(
builder: (context) { builder: (context) {
List<DropValue> serviceCategories = []; List<DropValue> serviceCategories = [];
for (var element in appointmentsVM.providerCategories) { for (var element in appointmentsVM.branchCategories) {
if (!element.isSelected!) { if (!element.isSelected!) {
serviceCategories.add(DropValue(element.id?.toInt() ?? 0, element.categoryName ?? "", "")); serviceCategories.add(DropValue(element.id?.toInt() ?? 0, element.categoryName ?? "", ""));
} }
@ -62,28 +62,28 @@ class AppointmentServicePickBottomSheet extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [const CircularProgressIndicator().paddingAll(10)], children: [const CircularProgressIndicator().paddingAll(10)],
), ),
] else if (appointmentsVM.providerServices.isNotEmpty) ...[ ] else if (appointmentsVM.branchServices.isNotEmpty) ...[
8.height, 8.height,
Builder( Builder(
builder: (context) { builder: (context) {
List<DropValue> serviceCategories = []; List<DropValue> serviceCategories = [];
for (var element in appointmentsVM.providerServices) { for (var element in appointmentsVM.branchServices) {
if (!element.isSelected!) { if (!element.isSelected!) {
serviceCategories.add(DropValue(element.id?.toInt() ?? 0, element.id.toString(), "")); serviceCategories.add(DropValue(element.providerBranchServiceID ?? 0, element.providerBranchServiceID.toString(), ""));
} }
} }
return DropdownField( return DropdownField(
(DropValue value) => appointmentsVM.updateProviderServiceId(SelectionModel(selectedId: value.id, selectedOption: value.value, itemPrice: value.subValue)), (DropValue value) => appointmentsVM.updateProviderServiceId(SelectionModel(selectedId: value.id, selectedOption: value.value, itemPrice: value.subValue)),
list: serviceCategories, list: serviceCategories,
hint: "Select Services", hint: "Select Services",
dropdownValue: appointmentsVM.providerServiceId.selectedId != -1 dropdownValue: appointmentsVM.branchServiceId.selectedId != -1
? DropValue(appointmentsVM.providerServiceId.selectedId, appointmentsVM.providerServiceId.selectedOption, "") ? DropValue(appointmentsVM.branchServiceId.selectedId, appointmentsVM.branchServiceId.selectedOption, "")
: null, : null,
); );
}, },
), ),
], ],
if (appointmentsVM.providerServiceId.selectedId != -1 && !appointmentsVM.isFetchingServices) ...[ if (appointmentsVM.branchServiceId.selectedId != -1 && !appointmentsVM.isFetchingServices) ...[
16.height, 16.height,
Row( Row(
children: [ children: [

@ -2,11 +2,9 @@ import 'dart:async';
import 'package:car_customer_app/view_models/appointments_view_model.dart'; import 'package:car_customer_app/view_models/appointments_view_model.dart';
import 'package:car_customer_app/view_models/dashboard_view_model.dart'; import 'package:car_customer_app/view_models/dashboard_view_model.dart';
import 'package:car_customer_app/view_models/providers_view_model.dart';
import 'package:car_customer_app/views/dashboard/fragments/ads_fragment.dart'; import 'package:car_customer_app/views/dashboard/fragments/ads_fragment.dart';
import 'package:car_customer_app/views/dashboard/fragments/appointments_fragment.dart'; import 'package:car_customer_app/views/dashboard/fragments/appointments_fragment.dart';
import 'package:car_customer_app/views/dashboard/fragments/home_fragment.dart'; import 'package:car_customer_app/views/dashboard/fragments/home_fragment.dart';
import 'package:car_customer_app/views/dashboard/fragments/providers_fragment.dart';
import 'package:car_customer_app/views/dashboard/fragments/settings_fragment.dart'; import 'package:car_customer_app/views/dashboard/fragments/settings_fragment.dart';
import 'package:car_customer_app/views/dashboard/widgets/bottom_nav_bar.dart'; import 'package:car_customer_app/views/dashboard/widgets/bottom_nav_bar.dart';
import 'package:car_customer_app/views/dashboard/widgets/drawer_widget.dart'; import 'package:car_customer_app/views/dashboard/widgets/drawer_widget.dart';
@ -36,9 +34,9 @@ class _DashboardPageState extends State<DashboardPage> {
fetchUsername(); fetchUsername();
scheduleMicrotask(() { scheduleMicrotask(() {
context.read<AppointmentsVM>().populateAppointmentsFilterList(); context.read<AppointmentsVM>().populateAppointmentsFilterList();
context.read<ProvidersVM>().populateProvidersFilterList(); context.read<AppointmentsVM>().populateProvidersFilterList();
context.read<AdVM>().populateAdsFilterList(); context.read<AdVM>().populateAdsFilterList();
context.read<ProvidersVM>().getAllNearBranches(); context.read<AppointmentsVM>().getAllNearBranches();
_onRefresh(); _onRefresh();
}); });
} }
@ -69,7 +67,7 @@ class _DashboardPageState extends State<DashboardPage> {
String getPageTitle(int index) { String getPageTitle(int index) {
if (index == 0) { if (index == 0) {
return "Branchs"; return "Branches";
} }
if (index == 1) { if (index == 1) {
return "Appointments"; return "Appointments";

@ -41,7 +41,11 @@ class AppointmentsFragment extends StatelessWidget {
itemCount: appointmentsVM.myAppointments.length, itemCount: appointmentsVM.myAppointments.length,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return BuildAppointmentContainerForCustomer( return BuildAppointmentContainerForCustomer(
onTapped: () => navigateWithName(context, AppRoutes.appointmentDetailView, arguments: appointmentsVM.myAppointments[index]), onTapped: () => navigateWithName(
context,
AppRoutes.appointmentDetailView,
arguments: appointmentsVM.myAppointments[index],
),
appointmentListModel: appointmentsVM.myAppointments[index], appointmentListModel: appointmentsVM.myAppointments[index],
); );
}, },

@ -1,17 +1,16 @@
import 'package:car_customer_app/view_models/providers_view_model.dart'; import 'package:car_customer_app/view_models/appointments_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.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/branch_models/branch_detail_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.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/categories_list.dart';
import 'package:mc_common_app/widgets/common_widgets/provider_details_card.dart'; import 'package:mc_common_app/widgets/common_widgets/provider_details_card.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class BranchesFragment extends StatelessWidget { class BranchesFragment extends StatelessWidget {
const BranchesFragment({Key? key}) : super(key: key); const BranchesFragment({Key? key}) : super(key: key);
@ -23,7 +22,7 @@ class BranchesFragment extends StatelessWidget {
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
child: Consumer( child: Consumer(
builder: (BuildContext context, ProvidersVM providersVM, Widget? child) { builder: (BuildContext context, AppointmentsVM providersVM, Widget? child) {
return Column( return Column(
children: [ children: [
16.height, 16.height,
@ -35,39 +34,38 @@ class BranchesFragment extends StatelessWidget {
Expanded( Expanded(
child: RefreshIndicator( child: RefreshIndicator(
onRefresh: () async { onRefresh: () async {
context.read<ProvidersVM>().getAllNearBranches(isNeedToRebuild: true); context.read<AppointmentsVM>().getAllNearBranches(isNeedToRebuild: true);
}, },
child: SingleChildScrollView( child: SingleChildScrollView(
child: Container( child: Container(
width: double.infinity, width: double.infinity,
height: MediaQuery.of(context).size.height / 1.37, height: MediaQuery.of(context).size.height / 1.37,
child: Consumer<ProvidersVM>( child: Consumer<AppointmentsVM>(
builder: (context, model, _) { builder: (context, viewModel, _) {
if (model.state == ViewState.busy) { if (viewModel.state == ViewState.busy) {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} else { } else {
return model.branches?.data == null return viewModel.nearbyBranchesList.isEmpty
? const Center(child: Text("No Branch Found")) ? Center(child: "No Branches to show.".toText(fontSize: 16, color: MyColors.lightTextColor))
: model.branches!.data!.isEmpty
? Center(child: Text(LocaleKeys.no_branch.tr()))
: ListView.separated( : ListView.separated(
itemCount: viewModel.nearbyBranchesList.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
BranchDetailModel branchDetailModel = viewModel.nearbyBranchesList[index];
return ProviderDetailsCard( return ProviderDetailsCard(
onCardTapped: () { onCardTapped: () {
navigateWithName(context, AppRoutes.branchDetailPage, arguments: model.branches!.data![index]); navigateWithName(context, AppRoutes.branchDetailPage, arguments: branchDetailModel);
}, },
providerImageUrl: MyAssets.bnCar, providerImageUrl: MyAssets.bnCar,
title: model.branches!.data![index].branchName ?? "", title: branchDetailModel.branchName ?? "",
providerLocation: model.branches!.data![index].distanceKm.toString() + " KM", providerLocation: branchDetailModel.distanceKM.toString() + " KM",
providerName: model.branches!.data![index].serviceProviderName ?? "", providerName: branchDetailModel.serviceProviderName ?? "",
providerRatings: "4.9", providerRatings: "4.9",
items: model.branches!.data![index].branchServices, items: branchDetailModel.branchServices,
); );
}, },
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return 12.height; return 12.height;
}, },
itemCount: model.branches!.data!.length,
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
); );
} }

@ -43,7 +43,7 @@ class HomeFragment extends StatelessWidget {
onSubtitleTapped: () { onSubtitleTapped: () {
print("value: ${AppState().getUser.data!.accessToken}"); print("value: ${AppState().getUser.data!.accessToken}");
context.read<DashboardVM>().onNavbarTapped(0); context.read<DashboardVM>().onNavbarTapped(0);
context.read<ProvidersVM>().applyFilterOnProviders(index: 0); context.read<AppointmentsVM>().applyFilterOnProviders(index: 0);
}).horPaddingMain(), }).horPaddingMain(),
const ServiceProviderWidget().horPaddingMain(), const ServiceProviderWidget().horPaddingMain(),
Consumer( Consumer(

@ -1,5 +1,4 @@
import 'package:car_customer_app/view_models/appointments_view_model.dart'; import 'package:car_customer_app/view_models/appointments_view_model.dart';
import 'package:car_customer_app/view_models/providers_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
@ -20,7 +19,7 @@ class ProvidersFragment extends StatelessWidget {
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
child: Consumer( child: Consumer(
builder: (BuildContext context, ProvidersVM providersVM, Widget? child) { builder: (BuildContext context, AppointmentsVM providersVM, Widget? child) {
return Column( return Column(
children: [ children: [
16.height, 16.height,
@ -37,8 +36,8 @@ class ProvidersFragment extends StatelessWidget {
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return ProviderDetailsCard( return ProviderDetailsCard(
onCardTapped: () { onCardTapped: () {
if (context.read<AppointmentsVM>().providerCategories.isEmpty) { if (context.read<AppointmentsVM>().branchCategories.isEmpty) {
context.read<AppointmentsVM>().getProviderCategories(); context.read<AppointmentsVM>().getBranchCategories();
} }
navigateWithName(context, AppRoutes.bookAppointmenServicesView); navigateWithName(context, AppRoutes.bookAppointmenServicesView);
}, },

@ -1,13 +1,12 @@
import 'package:car_customer_app/views/provider/sheet/items_list_sheet.dart'; import 'package:car_customer_app/views/provider/sheet/items_list_sheet.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/services/branch_model.dart'; import 'package:mc_common_app/models/branch_models/branch_detail_model.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:mc_common_app/models/services/service_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/widgets/bottom_sheet.dart'; import 'package:mc_common_app/widgets/bottom_sheet.dart';
@ -16,9 +15,9 @@ import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class BranchDetailPage extends StatefulWidget { class BranchDetailPage extends StatefulWidget {
BranchModel branchModel; final BranchDetailModel branchDetailModel;
BranchDetailPage({required this.branchModel}); BranchDetailPage({required this.branchDetailModel});
@override @override
State<BranchDetailPage> createState() => _BranchDetailPageState(); State<BranchDetailPage> createState() => _BranchDetailPageState();
@ -29,7 +28,7 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
void initState() { void initState() {
// TODO: implement initState // TODO: implement initState
super.initState(); super.initState();
if (widget.branchModel.branchServices!.length > 0) widget.branchModel.branchServices?.first.isExpanded = true; if (widget.branchDetailModel.branchServices!.length > 0) widget.branchDetailModel.branchServices?.first.isExpanded = true;
} }
@override @override
@ -52,7 +51,7 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
children: [ children: [
Image.asset(MyAssets.bnCar), Image.asset(MyAssets.bnCar),
12.height, 12.height,
"${widget.branchModel.branchName} | ${widget.branchModel.serviceProviderName}".toString().toText( "${widget.branchDetailModel.branchName} | ${widget.branchDetailModel.serviceProviderName}".toString().toText(
fontSize: 16, fontSize: 16,
isBold: true, isBold: true,
), ),
@ -60,14 +59,14 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
children: [ children: [
(LocaleKeys.location.tr() + ":").toText(color: MyColors.lightTextColor, fontSize: 12), (LocaleKeys.location.tr() + ":").toText(color: MyColors.lightTextColor, fontSize: 12),
4.width, 4.width,
(widget.branchModel.distanceKm.toString() + " km").toText(fontSize: 12, isBold: true), (widget.branchDetailModel.distanceKM.toString() + " km").toText(fontSize: 12, isBold: true),
], ],
), ),
Row( Row(
children: [ children: [
("Time" + ":").toText(color: MyColors.lightTextColor, fontSize: 12), ("Time" + ":").toText(color: MyColors.lightTextColor, fontSize: 12),
4.width, 4.width,
"${widget.branchModel.openTime} - ${widget.branchModel.closeTime}".toText(fontSize: 12, isBold: true), "${widget.branchDetailModel.openTime} - ${widget.branchDetailModel.closeTime}".toText(fontSize: 12, isBold: true),
], ],
), ),
2.height, 2.height,
@ -123,7 +122,7 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
) )
.onPress( .onPress(
() { () {
navigateWithName(context, AppRoutes.providerProfilePage, arguments: widget.branchModel.serviceProviderId); navigateWithName(context, AppRoutes.providerProfilePage, arguments: widget.branchDetailModel.serviceProviderID);
}, },
), ),
], ],
@ -134,7 +133,7 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
color: MyColors.lightTextColor, color: MyColors.lightTextColor,
isBold: true, isBold: true,
), ),
if (widget.branchModel.branchServices!.length == 0) "No Services Available".toText(fontSize: 12, isBold: true), if (widget.branchDetailModel.branchServices!.length == 0) "No Services Available".toText(fontSize: 12, isBold: true),
showServicesList(), showServicesList(),
], ],
).toWhiteContainer( ).toWhiteContainer(
@ -150,7 +149,9 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
title: "Book Appointment", title: "Book Appointment",
maxWidth: double.infinity, maxWidth: double.infinity,
margin: EdgeInsets.all(21), margin: EdgeInsets.all(21),
onPressed: () {}, onPressed: () {
navigateWithName(context, AppRoutes.bookAppointmenServicesView);
},
).toContainer( ).toContainer(
paddingAll: 0, paddingAll: 0,
backgroundColor: Colors.white, backgroundColor: Colors.white,
@ -165,7 +166,7 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
itemBuilder: (context, index) { itemBuilder: (context, index) {
return ExpansionTile( return ExpansionTile(
tilePadding: EdgeInsets.zero, tilePadding: EdgeInsets.zero,
title: (widget.branchModel.branchServices![index].serviceDescription ?? "").toText( title: (widget.branchDetailModel.branchServices![index].serviceDescription ?? "").toText(
fontSize: 16, fontSize: 16,
isBold: true, isBold: true,
), ),
@ -173,11 +174,11 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
showItem("Allowing home service:", (widget.branchModel.branchServices![index].isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green), showItem("Allowing home service:", (widget.branchDetailModel.branchServices![index].isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green),
showItem("Home service range", widget.branchModel.branchServices![index].customerLocationRange.toString() + "KM"), showItem("Home service range", widget.branchDetailModel.branchServices![index].customerLocationRange.toString() + "KM"),
showItem("Charges per KM", widget.branchModel.branchServices![index].customerLocationRange.toString() + "SAR"), showItem("Charges per KM", widget.branchDetailModel.branchServices![index].customerLocationRange.toString() + "SAR"),
8.height, 8.height,
(widget.branchModel.branchServices![index].itemsCount.toString() + "+ items").toText( (widget.branchDetailModel.branchServices![index].itemsCount.toString() + "+ items").toText(
fontSize: 12, fontSize: 12,
isBold: true, isBold: true,
color: MyColors.primaryColor, color: MyColors.primaryColor,
@ -186,26 +187,24 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
20.height, 20.height,
], ],
).onPress(() { ).onPress(() {
showMyBottomSheet(context, child: ItemsListSheet(widget.branchModel.branchServices![index].providerBranchServiceId ?? 0)); showMyBottomSheet(context, child: ItemsListSheet(widget.branchDetailModel.branchServices![index].providerBranchServiceID ?? 0));
}), }),
], ],
onExpansionChanged: (value) { onExpansionChanged: (value) {
setState(() { setState(() {
widget.branchModel.branchServices![index].isExpanded = value; widget.branchDetailModel.branchServices![index].isExpanded = value;
}); });
}, },
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
collapsedBackgroundColor: Colors.transparent, collapsedBackgroundColor: Colors.transparent,
initiallyExpanded: widget.branchModel.branchServices![index].isExpanded, initiallyExpanded: widget.branchDetailModel.branchServices![index].isExpanded!,
trailing: widget.branchModel.branchServices![index].isExpanded ? Icon(Icons.keyboard_arrow_up) : Icon(Icons.keyboard_arrow_down), trailing: widget.branchDetailModel.branchServices![index].isExpanded! ? Icon(Icons.keyboard_arrow_up) : Icon(Icons.keyboard_arrow_down),
); );
}, },
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return Divider( return Divider(height: 1);
height: 1,
);
}, },
itemCount: widget.branchModel.branchServices!.length, itemCount: widget.branchDetailModel.branchServices!.length,
physics: NeverScrollableScrollPhysics(), physics: NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
); );

@ -1,4 +1,4 @@
import 'package:car_customer_app/view_models/providers_view_model.dart'; import 'package:car_customer_app/view_models/appointments_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
@ -10,7 +10,7 @@ import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class ProviderProfilePage extends StatefulWidget { class ProviderProfilePage extends StatefulWidget {
int providerId; final int providerId;
ProviderProfilePage({required this.providerId}); ProviderProfilePage({required this.providerId});
@ -22,20 +22,18 @@ class _ProviderProfilePageState extends State<ProviderProfilePage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
context.read<ProvidersVM>().getBranchAndServices(widget.providerId ?? 0); context.read<AppointmentsVM>().getBranchAndServices(widget.providerId);
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: CustomAppBar( appBar: CustomAppBar(title: "Provider Details"),
title: "Provider Details",
),
body: Container( body: Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
padding: EdgeInsets.all(21), padding: EdgeInsets.all(21),
child: Consumer<ProvidersVM>( child: Consumer<AppointmentsVM>(
builder: (context, model, _) { builder: (context, model, _) {
return model.providerModel == null return model.providerModel == null
? const Center(child: CircularProgressIndicator()) ? const Center(child: CircularProgressIndicator())

@ -1,19 +1,14 @@
import 'package:flutter_svg/flutter_svg.dart'; import 'package:car_customer_app/view_models/appointments_view_model.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; 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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/widgets/empty_widget.dart'; import 'package:mc_common_app/widgets/empty_widget.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../../view_models/providers_view_model.dart';
class ItemsListSheet extends StatefulWidget { class ItemsListSheet extends StatefulWidget {
int serviceId; final int serviceId;
ItemsListSheet(this.serviceId); ItemsListSheet(this.serviceId);
@ -25,14 +20,14 @@ class _ItemsListSheetState extends State<ItemsListSheet> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
context.read<ProvidersVM>().getServiceItems(widget.serviceId ?? 0); context.read<AppointmentsVM>().getServiceItems(widget.serviceId);
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SizedBox( return SizedBox(
height: MediaQuery.of(context).size.height / 1.2, height: MediaQuery.of(context).size.height / 1.2,
child: Consumer<ProvidersVM>( child: Consumer<AppointmentsVM>(
builder: (context, model, _) { builder: (context, model, _) {
return model.serviceItems == null return model.serviceItems == null
? const Center(child: CircularProgressIndicator()) ? const Center(child: CircularProgressIndicator())

@ -36,7 +36,7 @@ dependencies:
cupertino_icons: ^1.0.2 cupertino_icons: ^1.0.2
mc_common_app: mc_common_app:
path: C:/Users/mirza.shafique/AndroidStudioProjects/mc_common_app path: D:/Development/car_common_app
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

Loading…
Cancel
Save