You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
317 lines
11 KiB
Dart
317 lines
11 KiB
Dart
import 'package:car_customer_app/repositories/provider_repo.dart';
|
|
import 'package:car_customer_app/repositories/schedule_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/service_schedule_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;
|
|
final CommonAppServices commonServices;
|
|
final ProviderRepo providerRepo;
|
|
final ScheduleRepo scheduleRepo;
|
|
|
|
AppointmentsVM({required this.commonServices, required this.scheduleRepo, required this.providerRepo, required this.commonRepo});
|
|
|
|
bool isFetchingLists = false;
|
|
|
|
List<AppointmentListModel> myAppointments = [];
|
|
List<FilterListModel> appointmentsFilterOptions = [];
|
|
|
|
// List<ScheduleData> availableSchedules = [];
|
|
|
|
bool isFetchingServices = false;
|
|
|
|
List<DropValue> branchCategories = [];
|
|
|
|
bool isHomeTapped = false;
|
|
|
|
List<ServiceAppointmentScheduleModel> serviceAppointmentScheduleList = [];
|
|
|
|
// Future<void> getSchedulesByBranchId() async {
|
|
// availableSchedules = await scheduleRepo.getSchedules(selectedBranchModel!.id!.toString());
|
|
// log("schedules: ${availableSchedules.toString()}");
|
|
// notifyListeners();
|
|
// }
|
|
|
|
List<DropValue> servicesInSchedule = [];
|
|
|
|
Future<void> mergeServiceIntoAvailableSchedules() async {
|
|
List<String> serviceItemIds = [];
|
|
serviceItems.forEach((serviceItem) {
|
|
if (serviceItem.isUpdateOrSelected!) {
|
|
serviceItemIds.add(serviceItem.id!.toString());
|
|
}
|
|
});
|
|
var scheduleList = await scheduleRepo.mergeServiceIntoAvailableSchedules(serviceItemIds: serviceItemIds);
|
|
serviceAppointmentScheduleList.addAll(scheduleList);
|
|
servicesInSchedule.clear();
|
|
serviceAppointmentScheduleList.forEach((schedule) {
|
|
schedule.serviceItemList!.forEach((item) {
|
|
if (!ifItemAlreadyThere(item.serviceProviderServiceId!)) {
|
|
servicesInSchedule.add(DropValue(item.serviceProviderServiceId!, item.description!, ""));
|
|
}
|
|
});
|
|
});
|
|
notifyListeners();
|
|
}
|
|
|
|
bool ifItemAlreadyThere(int id) {
|
|
int index = servicesInSchedule.indexWhere((element) => element.id == id);
|
|
if (index == -1) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void updateIsHomeTapped(bool value) {
|
|
isHomeTapped = value;
|
|
notifyListeners();
|
|
}
|
|
|
|
String pickedHomeLocation = "";
|
|
|
|
void updatePickedHomeLocation(String value) {
|
|
pickedHomeLocation = value;
|
|
pickHomeLocationError = "";
|
|
notifyListeners();
|
|
}
|
|
|
|
SelectionModel branchSelectedCategoryId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
|
|
|
|
void updateProviderCategoryId(SelectionModel id) {
|
|
branchSelectedCategoryId = id;
|
|
getBranchServices(categoryId: branchSelectedCategoryId.selectedId);
|
|
notifyListeners();
|
|
}
|
|
|
|
List<FilterListModel> providersFilterOptions = [];
|
|
List<BranchDetailModel> nearbyBranches = [];
|
|
BranchDetailModel? selectedBranchModel;
|
|
|
|
List<ServiceModel> branchServices = [];
|
|
ServiceModel? currentServiceSelection;
|
|
|
|
void updateBranchServiceId(SelectionModel id) async {
|
|
branchSelectedServiceId = id;
|
|
currentServiceSelection = branchServices.firstWhere((element) => element.serviceProviderServiceId == id.selectedId);
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
resetCategorySelectionBottomSheet() {
|
|
selectedSubServicesCounter = 0;
|
|
branchSelectedCategoryId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
|
|
isHomeTapped = false;
|
|
branchSelectedServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
|
|
currentServiceSelection = null;
|
|
}
|
|
|
|
populateAppointmentsFilterList() {
|
|
appointmentsFilterOptions.clear();
|
|
appointmentsFilterOptions = [
|
|
FilterListModel(title: "All Appointments", isSelected: true, id: -1),
|
|
FilterListModel(title: "Booked", isSelected: false, id: 1),
|
|
FilterListModel(title: "Confirmed", isSelected: false, id: 2),
|
|
FilterListModel(title: "Arrived", isSelected: false, id: 3),
|
|
FilterListModel(title: "Cancelled", isSelected: false, id: 4),
|
|
];
|
|
notifyListeners();
|
|
}
|
|
|
|
applyFilterOnAppointmentsVM({required int index}) {
|
|
if (appointmentsFilterOptions.isEmpty) return;
|
|
for (var value in appointmentsFilterOptions) {
|
|
value.isSelected = false;
|
|
}
|
|
appointmentsFilterOptions[index].isSelected = true;
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<void> getMyAppointments() async {
|
|
isFetchingLists = true;
|
|
myAppointments = await commonRepo.getMyAppointments();
|
|
isFetchingLists = false;
|
|
notifyListeners();
|
|
}
|
|
|
|
updateSelectedBranch(BranchDetailModel branchDetailModel) {
|
|
selectedBranchModel = branchDetailModel;
|
|
getBranchCategories();
|
|
notifyListeners();
|
|
}
|
|
|
|
List<ItemData> serviceItems = [];
|
|
List<ItemData> selectedServiceItems = [];
|
|
ProviderProfileModel? providerProfileModel;
|
|
|
|
int selectedSubServicesCounter = 0;
|
|
|
|
updateSelectedSubServicesCounter(int value) {
|
|
selectedSubServicesCounter = value;
|
|
notifyListeners();
|
|
}
|
|
|
|
onItemUpdateOrSelected(int index, bool selected, int itemId) {
|
|
serviceItems[index].isUpdateOrSelected = selected;
|
|
if (selected) {
|
|
selectedSubServicesCounter = selectedSubServicesCounter + 1;
|
|
updateSelectedSubServicesCounter(selectedSubServicesCounter);
|
|
selectSubServicesError = "";
|
|
currentServiceSelection!.serviceItems!.add(serviceItems[index]);
|
|
}
|
|
if (!selected) {
|
|
selectedSubServicesCounter = selectedSubServicesCounter - 1;
|
|
updateSelectedSubServicesCounter(selectedSubServicesCounter);
|
|
currentServiceSelection!.serviceItems!.removeWhere((element) => element.id == itemId);
|
|
}
|
|
notifyListeners();
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
getAllNearBranches({bool isNeedToRebuild = false}) async {
|
|
//TODO: needs to lat,long into API
|
|
nearbyBranches.clear();
|
|
if (isNeedToRebuild) setState(ViewState.busy);
|
|
nearbyBranches = await providerRepo.getAllNearBranchAndServices();
|
|
setState(ViewState.idle);
|
|
}
|
|
|
|
Future<List<ItemData>> getServiceItems(int serviceId) async {
|
|
serviceItems.clear();
|
|
serviceItems = await providerRepo.getServiceItems(serviceId);
|
|
setState(ViewState.idle);
|
|
return serviceItems;
|
|
}
|
|
|
|
getBranchAndServices(int providerId) async {
|
|
providerProfileModel = null;
|
|
providerProfileModel = await providerRepo.getBranchAndServices(providerId);
|
|
setState(ViewState.idle);
|
|
}
|
|
|
|
String pickHomeLocationError = "";
|
|
String selectSubServicesError = "";
|
|
|
|
SelectionModel branchSelectedServiceId = 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 selectedBranchModel!.branchServices!) {
|
|
if (!isCategoryAlreadyPresent(value.categoryId!)) {
|
|
branchCategories.add(DropValue(value.categoryId!, value.categoryName!, ""));
|
|
}
|
|
}
|
|
notifyListeners();
|
|
}
|
|
|
|
getBranchServices({required int categoryId}) async {
|
|
branchSelectedServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
|
|
isHomeTapped = false;
|
|
pickedHomeLocation = "";
|
|
pickHomeLocationError = "";
|
|
if (categoryId != -1) {
|
|
isFetchingServices = true;
|
|
// notifyListeners();
|
|
branchServices = getFilteredBranchServices(categoryId: categoryId);
|
|
isFetchingServices = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
List<ServiceModel> getFilteredBranchServices({required int categoryId}) {
|
|
List<ServiceModel> filteredServices = selectedBranchModel!.branchServices!.where((element) => element.categoryId == categoryId).toList();
|
|
return filteredServices;
|
|
}
|
|
|
|
void updatePickHomeLocationError(String value) {
|
|
pickHomeLocationError = value;
|
|
notifyListeners();
|
|
}
|
|
|
|
bool isServiceSelectionValidated() {
|
|
if (branchSelectedServiceId.selectedId == -1) {
|
|
return false;
|
|
}
|
|
|
|
if (isHomeTapped) {
|
|
if (pickedHomeLocation == "") {
|
|
updatePickHomeLocationError(GlobalConsts.homeLocationEmptyError);
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool onSubServicesNextPressed() {
|
|
for (var value in serviceItems) {
|
|
if (value.isUpdateOrSelected!) {
|
|
return true;
|
|
}
|
|
}
|
|
selectSubServicesError = "Please select at least one sub service";
|
|
notifyListeners();
|
|
return false;
|
|
}
|
|
|
|
// void mergeServiceInAvailableSchedule() {
|
|
// log("schedules: ${availableSchedules}");
|
|
// for (var schedule in availableSchedules) {
|
|
// for (var service in schedule.scheduleServices!) {
|
|
// if (branchSelectedServiceId.selectedId == service.serviceId) {
|
|
// log("ID matched: ${service.serviceId}");
|
|
// log("SelectedServices: ${schedule.selectedServices}");
|
|
//
|
|
//
|
|
// int isAlreadyThereIndex = schedule.selectedServices!.indexWhere((element) => element.serviceProviderServiceId == branchSelectedServiceId.selectedId);
|
|
// if (isAlreadyThereIndex != -1) {
|
|
// log("removing: ${service.serviceId}");
|
|
// schedule.selectedServices!.removeAt(isAlreadyThereIndex);
|
|
// }
|
|
// schedule.selectedServices!.add(currentServiceSelection!);
|
|
// notifyListeners();
|
|
// return;
|
|
// }
|
|
// }
|
|
// }
|
|
// notifyListeners();
|
|
// }
|
|
}
|