changes & updates

aamir_dev
Aamir.Muhammad 2 years ago
parent c5edccb71f
commit 79d1f37b12

@ -5,6 +5,13 @@
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- Devices running Android 13 (API level 33) or higher -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<!-- To handle the reselection within the app on devices running Android 14
or higher if your app targets Android 14 (API level 34) or higher. -->
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
<application

@ -12,3 +12,5 @@
# org.gradle.parallel=true
#Wed Dec 13 16:00:22 AST 2023
org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M"
android.useAndroidX=true
android.enableJetifier=true

@ -34,7 +34,7 @@ class DashboardVM extends BaseVM {
return;
}
int sizeInBytes = pickedImageFile.lengthSync();
if (sizeInBytes > 1000) {
if (sizeInBytes > 1000000) {
Utils.showToast(LocaleKeys.fileLarger.tr());
return;
} else {

@ -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<PickerItem> 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;

@ -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(

@ -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<AddNewServiceAppointmentPage> createState() => _AddNewServiceAppointmentPageState();
}
class _AddNewServiceAppointmentPageState extends State<AddNewServiceAppointmentPage> {
DropValue? category;
DropValue? service;
List<ItemData> selectedList = [];
List<PickerItem>? pickedItems;
ServiceVM? serviceVM;
@override
void initState() {
// TODO: implement initState
super.initState();
scheduleMicrotask(() {
serviceVM = context.read<ServiceVM>();
serviceVM!.fetchBranchCategory(EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA");
});
}
@override
Widget build(BuildContext context) {
ServiceVM serviceVM = context.read<ServiceVM>();
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<ItemData> selectedList) {
onSelectItems: (List<ItemData> 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<ItemData> selectedList) {
onSelectItems: (List<ItemData> 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<int> 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<void> _updateAppointment(BuildContext context, int branchId) async {
await context.read<AppointmentsVM>().getMyAppointmentsForProvider({
"ServiceProviderID": injector
.get<AppState>()
.getUser
.data
?.userInfo
?.providerId
.toString() ??
"0",
"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0",
"ProviderBranchID": branchId.toString(),
}, isNeedToRebuild: true);
}

@ -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;

@ -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<AppointmentPage> createState() => _AppointmentPageState();
}
class _AppointmentPageState extends State<AppointmentPage> {
String date = "";
GlobalKey<RefreshIndicatorState> refreshIndicatorKey = GlobalKey<RefreshIndicatorState>();
Future<void> _pullRefresh(BuildContext context) async {
await context.read<AppointmentsVM>().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<AppointmentsVM>().getMyAppointmentsForProvider({
"ServiceProviderID": injector.get<AppState>().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<AppointmentsVM>().populateAppointmentsFilterList();
_pullRefresh(context);
context.read<AppointmentsVM>().selectedBranch = branch.id ?? 0;
void initState() {
// TODO: implement initState
super.initState();
scheduleMicrotask(() {
date = DateHelper.formatAsYearMonthDay(DateTime.now());
context.read<AppointmentsVM>().populateAppointmentsFilterList();
_pullRefresh(context);
context.read<AppointmentsVM>().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(

@ -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<DashboardPage> {
// context.read<AdVM>().populateAdsFilterList();
context.read<ServiceVM>().getBranchAndServices();
AdVM adVm = Provider.of<AdVM>(context, listen: false);
// context.read<AppointmentsVM>().myUpComingAppointments,
AppointmentsVM appointmentsVM = Provider.of<AppointmentsVM>(context, listen: false);
if (appointmentsVM.myAppointments.isEmpty) {
await appointmentsVM.getMyAppointmentsForProvider({"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0"});

@ -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<CustomDrawer> {
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<CustomDrawer> {
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<CustomDrawer> {
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<CustomDrawer> {
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<CustomDrawer> {
),
),
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<CustomDrawer> {
),
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'));

@ -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,

@ -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<DefineLicensePage> {
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(

@ -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<AddSchedulesPage> createState() => _AddSchedulesPageState();
}
class _AddSchedulesPageState extends State<AddSchedulesPage> {
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<ScheduleVM>();
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<ScheduleVM>();
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<int> 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<ScheduleVM>().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);

@ -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<SchedulesListPage> {
@override
void initState() {
// TODO: implement initState
super.initState();
context.read<ScheduleVM>().getSchedules(widget.branchId ?? "");
}
@ -56,16 +57,30 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
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<SchedulesListPage> {
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<SchedulesListPage> {
.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<SchedulesListPage> {
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<SchedulesListPage> {
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<SchedulesListPage> {
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),
],

@ -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<CreateServicesPage3> createState() => _CreateServicesPage3State();
}
class _CreateServicesPage3State extends State<CreateServicesPage3> {
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<ServiceVM>();
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<ServiceVM>();
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<String, dynamic>> map = [
{
"id": branchModel!.serviceProviderService!.serviceId.toString(),
"id": widget.branchModel!.serviceProviderService!.serviceId.toString(),
"isAllowAppointment": isAppointmentAvailable,
"isActive": true,
"customerLocationRange": serviceRage,

Loading…
Cancel
Save