small changes based on the services

mirza_dev
Mirza.Shafique@cloudsolutions.com.sa 2 years ago
parent e67701d132
commit 9c190bd730

@ -31,6 +31,7 @@ import 'package:mc_common_app/models/appointments_models/appointment_list_model.
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.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/select_ad_type_view.dart';
import 'package:mc_common_app/views/chat/chat_view.dart';
import '../views/dashboard/dashboard_page.dart';
@ -73,7 +74,9 @@ class ProviderAppRoutes {
static final Map<String, WidgetBuilder> routes = {
//Home page
AppRoutes.dashboard: (context) => const DashboardPage(),
AppRoutes.adsDetailView: (context) => AdsDetailView(adDetails: ModalRoute.of(context)!.settings.arguments as AdDetailsModel),
AppRoutes.adsDetailView: (context) => AdsDetailView(
adDetails:
ModalRoute.of(context)!.settings.arguments as AdDetailsModel),
AppRoutes.createAdView: (context) => const CreateAdView(),
//setting
@ -100,7 +103,8 @@ class ProviderAppRoutes {
//Requests
AppRoutes.requestsDetailPage: (context) => RequestDetailPage(
requestDetailPageArguments: ModalRoute.of(context)!.settings.arguments as RequestDetailPageArguments,
requestDetailPageArguments: ModalRoute.of(context)!.settings.arguments
as RequestDetailPageArguments,
),
AppRoutes.sendOfferPage: (context) => const SendOfferPage(),
@ -130,10 +134,19 @@ class ProviderAppRoutes {
addSchedule: (context) => AddSchedulesPage(),
//Branch Duplication
matchServices: (context) => MatchedServicesPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as MatchServicesArguments)),
matchServices: (context) => MatchedServicesPage(
(ModalRoute.of(context)!.settings.arguments) == null
? null
: (ModalRoute.of(context)!.settings.arguments
as MatchServicesArguments)),
AppRoutes.chatView: (context) => ChatView(
chatViewArguments: ModalRoute.of(context)!.settings.arguments as ChatViewArguments,
chatViewArguments:
ModalRoute.of(context)!.settings.arguments as ChatViewArguments,
),
//ADS:
AppRoutes.selectAdTypeView: (context) => SelectAdTypeView(
isProvider: ModalRoute.of(context)!.settings.arguments as bool),
};
}

@ -382,9 +382,10 @@ class ServiceVM extends BaseVM {
Future<void> getAllCities(
BranchDetailModel? branchData, String countryCode) async {
setState(ViewState.busy);
citiesDropList.clear();
citiesDropList=[];
cities = null;
cityId = -1;
cityValue=null;
cities = await commonRepo.getAllCites(countryId.toString());
cities!.data?.forEach((element) {
if (branchData != null && branchData.id != null) {

@ -80,7 +80,7 @@ class UpdateAppointmentPage extends StatelessWidget {
Column(
children: [
showPayNowButton(context, appointmentsVM),
21.height,
12.height,
showCancelButton(context, appointmentsVM),
],
).paddingAll(21),
@ -102,7 +102,7 @@ class UpdateAppointmentPage extends StatelessWidget {
Column(
children: [
showPayNowButton(context, appointmentsVM),
21.height,
12.height,
showPayLaterButton(context, appointmentsVM),
],
).paddingAll(21),
@ -113,7 +113,9 @@ class UpdateAppointmentPage extends StatelessWidget {
AppointmentStatusEnum.workStarted) &&
appointmentListModel.appointmentPaymentStatusEnum ==
AppointmentPaymentStatusEnum.payNow)
"Waiting for the payment from the customer".toText(),
"Waiting for the payment from the customer"
.toText()
.paddingAll(21),
if (appointmentListModel.appointmentStatusEnum ==
AppointmentStatusEnum.arrived &&
@ -134,7 +136,7 @@ class UpdateAppointmentPage extends StatelessWidget {
Column(
children: [
showPayLaterButton(context, appointmentsVM),
21.height,
12.height,
showPayNowButton(context, appointmentsVM),
],
).paddingAll(21),
@ -154,7 +156,7 @@ class UpdateAppointmentPage extends StatelessWidget {
AppointmentStatusEnum.workStarted &&
appointmentListModel.appointmentPaymentStatusEnum ==
AppointmentPaymentStatusEnum.payLater)
showPayNowButton(context, appointmentsVM),
showPayNowButton(context, appointmentsVM).paddingAll(21),
if (appointmentListModel.appointmentStatusEnum ==
AppointmentStatusEnum.visitCompleted)
@ -234,6 +236,7 @@ class UpdateAppointmentPage extends StatelessWidget {
"appointmentID": appointmentListModel.id.toString(),
"appointmentServicePaymentStatusID": 2
});
_updateAppointment(context, appointmentListModel.branchId ?? 0);
Utils.hideLoading(context);
},
);
@ -249,6 +252,7 @@ class UpdateAppointmentPage extends StatelessWidget {
"appointmentID": appointmentListModel.id.toString(),
"appointmentStatusID": 3
});
_updateAppointment(context, appointmentListModel.branchId ?? 0);
Utils.hideLoading(context);
},
);
@ -265,6 +269,7 @@ class UpdateAppointmentPage extends StatelessWidget {
"appointmentID": appointmentListModel.id.toString(),
"appointmentServicePaymentStatusID": 4
});
_updateAppointment(context, appointmentListModel.branchId ?? 0);
Utils.hideLoading(context);
},
);
@ -281,6 +286,7 @@ class UpdateAppointmentPage extends StatelessWidget {
"appointmentID": appointmentListModel.id.toString(),
"appointmentStatusID": 8
});
_updateAppointment(context, appointmentListModel.branchId ?? 0);
Utils.hideLoading(context);
},
);

@ -43,10 +43,8 @@ class _DashboardPageState extends State<DashboardPage> {
void initState() {
super.initState();
dashboardVM = Provider.of<DashboardVM>(context, listen: false);
scheduleMicrotask(() {
context.read<RequestsVM>().populateRequestsFilterList();
_onRefresh();
});
context.read<RequestsVM>().populateRequestsFilterList();
_onRefresh();
}
Future<void> _onRefresh() async {
@ -70,18 +68,26 @@ class _DashboardPageState extends State<DashboardPage> {
"0"
});
}
adVm.populateAdsFilterList();
if (adVm.myAds.isEmpty) {
await adVm.getMyAds();
}
if (adVm.exploreAds.isEmpty) {
await adVm.getExploreAds();
} if (adVm.vehicleTypes.isEmpty) {
await adVm.getVehicleTypes();
}
if (adVm.vehicleAdsDurations.isEmpty) {
await adVm.getVehicleAdsDuration();
}
if (requestsVM.myRequests.isEmpty) {
await requestsVM.getRequests(appType: AppType.provider);
}
await chatVM.buildHubConnection(context);
// await chatVM.buildHubConnection(context);
}

@ -1,19 +1,20 @@
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/config/routes.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/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/views/advertisement/ads_list.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/common_widgets/categories_list.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class AdsFragment extends StatelessWidget {
bool isNeedAppBar;
@ -27,15 +28,25 @@ class AdsFragment extends StatelessWidget {
await adVM.getMyAds();
}
List<AdDetailsModel> getAdsList(AdVM adVM) {
if (adVM.isExploreAdsTapped) {
return adVM.exploreAdsFilteredList;
}
if (adVM.myAdsFilteredList.isNotEmpty) {
return adVM.myAdsFilteredList;
}
return [];
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: !isNeedAppBar
? null
: CustomAppBar(
title: LocaleKeys.myServiceBranches.tr(),
onBackButtonTapped: onBackButtonTapped,
),
title: "Ads",
onBackButtonTapped: onBackButtonTapped,
),
body: Container(
color: MyColors.backgroundColor,
width: double.infinity,
@ -43,70 +54,65 @@ class AdsFragment extends StatelessWidget {
child: Column(
children: [
16.height,
// Consumer(
// builder: (BuildContext context, AdVM adVM, Widget? child) {
// return Column(
// children: [
// Row(
// children: [
// Expanded(
// child: ShowFillButton(
// isFilled: adVM.isExploreAdsTapped,
// maxHeight: 55,
// title: "Explore Ads",
// txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
// onPressed: () {
// print("ads: ${AppState().getUser.data!.accessToken}");
// adVM.updateIsExploreAds(true);
// },
// ),
// ),
// 12.width,
// Expanded(
// child: ShowFillButton(
// isFilled: !adVM.isExploreAdsTapped,
// txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
// maxHeight: 55,
// title: "My Ads",
// onPressed: () {
// adVM.updateIsExploreAds(false);
// },
// ),
// ),
// ],
// ).horPaddingMain(),
// if (adVM.isExploreAdsTapped && adVM.exploreAds.isNotEmpty) ...[
// 16.height,
// FiltersList(filterList: adVM.exploreAdsFilterOptions, onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(index: index), needLeftPadding: false)
// .paddingOnly(left: 21),
// ],
// if (!adVM.isExploreAdsTapped && adVM.myAds.isNotEmpty) ...[
// 16.height,
// FiltersList(
// filterList: adVM.myAdsFilterOptions,
// onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(index: index, selectedFilterId: selectedFilterId),
// needLeftPadding: false)
// .paddingOnly(left: 21),
// ],
// ],
// );
// },
// ),
Consumer(
builder: (BuildContext context, AdVM adVM, Widget? child) {
return Column(
children: [
Row(
children: [
Expanded(
child: ShowFillButton(
isFilled: adVM.isExploreAdsTapped,
maxHeight: 55,
title: "Explore Ads",
txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
onPressed: () {
print("ads: ${AppState().getUser.data!.accessToken}");
adVM.updateIsExploreAds(true);
},
),
),
12.width,
Expanded(
child: ShowFillButton(
isFilled: !adVM.isExploreAdsTapped,
txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
maxHeight: 55,
title: "My Ads",
onPressed: () {
adVM.updateIsExploreAds(false);
},
),
),
],
).horPaddingMain(),
if (adVM.isExploreAdsTapped) ...[
16.height,
FiltersList(
filterList: adVM.exploreAdsFilterOptions,
onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(createdByRoleFilter: selectedFilterId.toCreatedByRoleEnum()),
needLeftPadding: false)
.paddingOnly(left: 21),
],
if (!adVM.isExploreAdsTapped) ...[
16.height,
FiltersList(
filterList: adVM.myAdsFilterOptions,
onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(adPostStatusEnum: selectedFilterId.toAdPostEnum()),
needLeftPadding: false,
).paddingOnly(left: 21),
],
],
);
},
),
16.height,
Expanded(
child: RefreshIndicator(
onRefresh: () => onRefreshAds(context),
child: Consumer(
builder: (BuildContext context, AdVM adVM, Widget? child) {
return BuildAdsList(
isAdsFragment: true,
shouldShowAdStatus: !adVM.isExploreAdsTapped,
adsList: adVM.isExploreAdsTapped && adVM.exploreAdsFilteredList.isNotEmpty
? adVM.exploreAdsFilteredList
: !adVM.isExploreAdsTapped && adVM.myAdsFilteredList.isNotEmpty
? adVM.myAdsFilteredList
: [],
);
return BuildAdsList(isAdsFragment: true, shouldShowAdStatus: !adVM.isExploreAdsTapped, adsList: getAdsList(adVM));
},
),
),
@ -115,14 +121,11 @@ class AdsFragment extends StatelessWidget {
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
context.read<AdVM>().getVehicleTypes();
context.read<RequestsVM>().populateRequestsFilterList();
navigateWithName(context, AppRoutes.createAdView);
onPressed: () async {
navigateWithName(context, AppRoutes.selectAdTypeView, arguments: injector.get<AppState>().currentAppType == AppType.provider);
},
backgroundColor: MyColors.darkPrimaryColor,
child: const Icon(
child: Icon(
Icons.add,
color: MyColors.white,
),

@ -12,13 +12,15 @@ class AppMap extends StatefulWidget {
late AppMapState _state;
final Function onMapCreated;
AppMap(this.initialCamera, {required this.onCameraMove, required this.onMapCreated});
AppMap(this.initialCamera,
{required this.onCameraMove, required this.onMapCreated});
@override
State<StatefulWidget> createState() => _state = AppMapState();
moveTo({required CameraPosition cameraPostion}) {
_state.googleMapController.animateCamera(CameraUpdate.newCameraPosition(cameraPostion));
_state.googleMapController
.animateCamera(CameraUpdate.newCameraPosition(cameraPostion));
}
}
@ -35,6 +37,12 @@ class AppMapState extends State<AppMap> {
@override
void initState() {}
@override
void dispose() {
super.dispose();
googleMapController.dispose();
}
@override
Widget build(BuildContext context) {
if (isHuawei == null) return CircularProgressIndicator();
@ -47,7 +55,9 @@ class AppMapState extends State<AppMap> {
zoomControlsEnabled: true,
myLocationButtonEnabled: true,
myLocationEnabled: true,
initialCameraPosition: CameraPosition.fromMap(widget.initialCamera) ?? const CameraPosition(target: LatLng(-26.1711459, 27.9002758), zoom: 2.0),
initialCameraPosition: CameraPosition.fromMap(widget.initialCamera) ??
const CameraPosition(
target: LatLng(-26.1711459, 27.9002758), zoom: 2.0),
onCameraMove: widget.onCameraMove,
onMapCreated: (GoogleMapController controller) {
googleMapController = controller;

@ -9,7 +9,7 @@ import 'package:car_provider_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/utils/navigator.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:geocoding/geocoding.dart';
import 'package:permission_handler/permission_handler.dart';
import 'map_selection_widget.dart';
@ -54,6 +54,11 @@ class _PickLocationPageState extends State<PickLocationPage> {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
@ -117,10 +122,7 @@ class _PickLocationPageState extends State<PickLocationPage> {
Future<void> _updatePosition(CameraPosition _position) async {
latitude = _position.target.latitude;
longitude = _position.target.longitude;
// List<Placemark> placemarks = await placemarkFromCoordinates(latitude, longitude);
// _counter.value = '${placemarks.first.street}, ${placemarks.first.subLocality}, ${placemarks.first.locality}, ${placemarks.first.postalCode}, ${placemarks.first.country}';
print("Address121: " + _counter.value);
// _counter.value = (placemarks.first.name) ?? "" + " " + (placemarks.first.street ?? "") + " " + (placemarks.first.country ?? "");
updateAddress(latitude, longitude);
}
void _getUserLocation() async {
@ -130,21 +132,32 @@ class _PickLocationPageState extends State<PickLocationPage> {
latitude = position.latitude;
longitude = position.longitude;
setMap();
updateAddress(latitude, longitude);
} else {
requestPermissions().then(
(value) async {
if (value[Permission.location]!.isGranted) {
var position = await GeolocatorPlatform.instance.getCurrentPosition();
var position =
await GeolocatorPlatform.instance.getCurrentPosition();
currentPostion = LatLng(position.latitude, position.longitude);
latitude = position.latitude;
longitude = position.longitude;
setMap();
updateAddress(latitude, longitude);
}
},
);
}
}
updateAddress(double latitude, double longitude) async {
// List<Placemark> placemarks =
// await placemarkFromCoordinates(latitude, longitude);
// _counter.value =
// '${placemarks.first.street}, ${placemarks.first.subLocality}, ${placemarks.first.locality}, ${placemarks.first.postalCode}, ${placemarks.first.country}';
// print("Address121: " + placemarks[0].toString());
}
setMap() {
setState(() {
_kGooglePlex = CameraPosition(

@ -165,7 +165,7 @@ class BranchDetailPage extends StatelessWidget {
);
}),
categories.isEmpty
? LocaleKeys.no_branch.tr().toText(fontSize: 12)
? "No Service Added Yet".toText(fontSize: 12)
: ListView.separated(
itemBuilder: (context, pIndex) {
return InkWell(

@ -28,7 +28,8 @@ class DefineBranchPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
ServiceVM branchVM = context.read<ServiceVM>();
branchVM.getAllCountriesList(branchData, EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA");
branchVM.getAllCountriesList(branchData,
EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA");
return Scaffold(
appBar: CustomAppBar(
title: LocaleKeys.defineBranches.tr(),
@ -50,9 +51,16 @@ class DefineBranchPage extends StatelessWidget {
model.country != null
? DropdownField(
(DropValue value) {
model.countryValue =
DropValue(value.id, value.value, "");
model.countryCode = value.subValue;
model.countryId = value.id;
model.getAllCities(branchData, EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA");
model.getAllCities(
branchData,
EasyLocalization.of(context)
?.currentLocale
?.countryCode ??
"SA");
},
list: model.countryDropList,
dropdownValue: model.countryValue,
@ -66,7 +74,8 @@ class DefineBranchPage extends StatelessWidget {
? Text(LocaleKeys.no_city_available.tr())
: DropdownField(
(DropValue value) {
// countryCode = value.subValue;
model.cityValue = DropValue(
value.id, value.value, "");
model.setOnlyState(ViewState.busy);
model.cityId = value.id;
model.setState(ViewState.idle);
@ -111,7 +120,9 @@ class DefineBranchPage extends StatelessWidget {
navigateTo(
context,
PickLocationPage(
onPickAddress: (double latitude, double longitude, String address) {
onPickAddress: (double latitude,
double longitude, String address) {
print("tesssgngl "+address);
model.latitude = latitude;
model.longitude = longitude;
model.address = address;
@ -125,12 +136,16 @@ class DefineBranchPage extends StatelessWidget {
height: 45,
decoration: BoxDecoration(
color: Colors.transparent,
border: Border.all(color: MyColors.darkPrimaryColor, width: 2),
borderRadius: const BorderRadius.all(Radius.circular(8)),
border: Border.all(
color: MyColors.darkPrimaryColor,
width: 2),
borderRadius: const BorderRadius.all(
Radius.circular(8)),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
const Icon(
Icons.place_outlined,
@ -163,14 +178,24 @@ class DefineBranchPage extends StatelessWidget {
SizedBox(
width: double.infinity,
child: Padding(
padding: const EdgeInsets.only(left: 20, right: 20, bottom: 20),
padding:
const EdgeInsets.only(left: 20, right: 20, bottom: 20),
child: ShowFillButton(
title: branchData != null ? (branchData!.id == null ? LocaleKeys.createBranch.tr() : LocaleKeys.updateBranch.tr()) : LocaleKeys.createBranch.tr(),
title: branchData != null
? (branchData!.id == null
? LocaleKeys.createBranch.tr()
: LocaleKeys.updateBranch.tr())
: LocaleKeys.createBranch.tr(),
onPressed: () async {
if (branchData == null) {
Utils.showLoading(context);
MResponse res =
await model.createBranch(model.branchName, model.branchDescription, model.cityId.toString(), model.address, model.latitude.toString(), model.longitude.toString());
MResponse res = await model.createBranch(
model.branchName,
model.branchDescription,
model.cityId.toString(),
model.address,
model.latitude.toString(),
model.longitude.toString());
Utils.hideLoading(context);
if (res.messageStatus == 1) {
Utils.showToast(LocaleKeys.branch_created.tr());
@ -182,7 +207,13 @@ class DefineBranchPage extends StatelessWidget {
} else {
Utils.showLoading(context);
MResponse res = await model.updateBranch(
branchData!.id ?? 0, model.branchName, model.branchDescription, model.cityId.toString(), model.address, model.latitude.toString(), model.longitude.toString());
branchData!.id ?? 0,
model.branchName,
model.branchDescription,
model.cityId.toString(),
model.address,
model.latitude.toString(),
model.longitude.toString());
Utils.hideLoading(context);
if (res.messageStatus == 1) {
Utils.showToast(LocaleKeys.branch_updated.tr());

@ -1,4 +1,3 @@
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';
@ -10,6 +9,7 @@ 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';
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';
@ -19,15 +19,24 @@ import 'package:mc_common_app/widgets/bottom_sheet.dart';
class AddSchedulesPage extends StatelessWidget {
late ScheduleVM mModel;
String name = "", startDate = "", endDate = "", startTime = "", endTime = "", slotsTime = "", appointmentPerSlot = "", servicesGroupID = "";
String name = "",
startDate = "",
endDate = "",
startTime = "",
endTime = "",
slotsTime = "",
appointmentPerSlot = "",
servicesGroupID = "";
late ScheduleData scheduleData;
AddSchedulesPage({Key? key}) : super(key: key);
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();
@ -35,7 +44,9 @@ class AddSchedulesPage extends StatelessWidget {
// mModel.selectedServicesItems.clear();
scheduleData.scheduleServices?.forEach((element) {
mModel.selectedServicesItems.add(PickerItem(id: element.providerServiceId ?? 0, title: element.providerServiceName ?? ""));
mModel.selectedServicesItems.add(PickerItem(
id: element.providerServiceId ?? 0,
title: element.serviceDescription ?? ""));
});
mModel.selectedDaysItems.clear();
scheduleData.weeklyOffDays?.forEach((element) {
@ -134,7 +145,7 @@ class AddSchedulesPage extends StatelessWidget {
),
8.height,
ChipsPickerItem(
hint: 'Days',
hint: 'Off Days',
itemsList: [...model.selectedDaysItems],
onClick: () {
showMyBottomSheet(
@ -179,7 +190,12 @@ 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,
@ -315,8 +331,11 @@ class AddSchedulesPage extends StatelessWidget {
Utils.hideLoading(context);
if (servicesResponse.messageStatus == 1) {
Utils.showToast("Successfully schedule created");
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);
@ -362,8 +381,11 @@ class AddSchedulesPage extends StatelessWidget {
Utils.hideLoading(context);
if (servicesResponse.messageStatus == 1) {
Utils.showToast("Successfully schedule updated");
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);

@ -58,7 +58,10 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
Row(
children: [
Expanded(
child: value.schedule!.data![index].scheduleName.toString().toText(
child: value.schedule!.data![index]
.scheduleName
.toString()
.toText(
fontSize: 16,
isBold: true,
),
@ -71,33 +74,81 @@ 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,
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(
children: value.schedule!.data![index].scheduleServices!
.map((element) => Container(child: element.providerServiceName.toString().toText(fontSize: 12, isBold: true)))
crossAxisAlignment:
CrossAxisAlignment.start,
children: value.schedule!.data![index]
.scheduleServices!
.map(
(element) => Container(
child: element.serviceDescription
.toString()
.toText(
fontSize: 12,
isBold: true,
),
),
)
.toList(),
crossAxisAlignment: CrossAxisAlignment.start,
)
],
).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),
@ -111,7 +162,8 @@ 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 ?? ""));
},
),
],
@ -123,7 +175,8 @@ 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 + " , ";
}
@ -134,7 +187,8 @@ 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,4 +1,3 @@
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';
@ -29,20 +28,26 @@ class CreateServicesPage3 extends StatelessWidget {
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");
serviceVM.fetchBranchCategory(
EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA");
} else {
isAppointmentAvailable = branchModel?.serviceProviderService?.isAllowAppointment ?? false;
isAppointmentAvailable =
branchModel?.serviceProviderService?.isAllowAppointment ?? false;
// isHomeAppointmentAvailable=branchModel.serviceProviderService.
serviceRage = branchModel?.serviceProviderService?.customerLocationRange ?? 0;
serviceRage =
branchModel?.serviceProviderService?.customerLocationRange ?? 0;
if (serviceRage > 0) {
isHomeAppointmentAvailable = true;
}
chargersPerKm = branchModel?.serviceProviderService?.rangePricePerKm ?? "0";
chargersPerKm =
branchModel?.serviceProviderService?.rangePricePerKm ?? "0";
serviceId = branchModel?.serviceProviderService?.serviceId ?? -1;
}
return Scaffold(
@ -67,7 +72,8 @@ class CreateServicesPage3 extends StatelessWidget {
fontWeight: FontWeight.bold,
),
).toContainer(
padding: const EdgeInsets.only(left: 8, right: 8, bottom: 12, top: 12),
padding: const EdgeInsets.only(
left: 8, right: 8, bottom: 12, top: 12),
backgroundColor: MyColors.textFieldColor,
borderRadius: 0,
width: double.infinity,
@ -81,34 +87,44 @@ class CreateServicesPage3 extends StatelessWidget {
fontWeight: FontWeight.bold,
),
).toContainer(
padding: const EdgeInsets.only(left: 8, right: 8, bottom: 12, top: 12),
padding: const EdgeInsets.only(
left: 8, right: 8, bottom: 12, top: 12),
backgroundColor: MyColors.textFieldColor,
borderRadius: 0,
width: double.infinity,
)
: (branchModel!.categoryId == null && model.categoryDropList.isNotEmpty)
: (branchModel!.categoryId == null &&
model.categoryDropList.isNotEmpty)
? DropdownField(
(DropValue value) async {
categoryId = value.id;
category = value;
service = null;
serviceId = -1;
isAppointmentAvailable = false;
isHomeAppointmentAvailable = false;
model.fetchServicesByCategoryId(value.id.toString());
model.fetchServicesByCategoryId(
value.id.toString());
},
dropdownValue: category,
list: model.categoryDropList,
hint: LocaleKeys.selectServiceCategory.tr(),
hint:
LocaleKeys.selectServiceCategory.tr(),
)
: const CircularProgressIndicator(),
12.height,
branchModel!.serviceProviderService != null
? Text(
branchModel!.serviceProviderService!.serviceDescription ?? "N/A",
branchModel!.serviceProviderService!
.serviceDescription ??
"N/A",
style: const TextStyle(
fontSize: 12,
fontWeight: FontWeight.bold,
),
).toContainer(
padding: const EdgeInsets.only(left: 8, right: 8, bottom: 12, top: 12),
padding: const EdgeInsets.only(
left: 8, right: 8, bottom: 12, top: 12),
backgroundColor: MyColors.textFieldColor,
borderRadius: 0,
width: double.infinity,
@ -117,10 +133,12 @@ class CreateServicesPage3 extends StatelessWidget {
? DropdownField(
(DropValue value) {
serviceId = value.id;
service = value;
isAppointmentAvailable = false;
isHomeAppointmentAvailable = false;
model.setState(ViewState.idle);
},
dropdownValue: service,
list: model.servicesDropList,
hint: LocaleKeys.defineServices.tr(),
)
@ -135,7 +153,8 @@ class CreateServicesPage3 extends StatelessWidget {
CheckBoxWithTitleDescription(
isSelected: isAppointmentAvailable,
title: 'Available for appointment',
description: 'This option will allow customer to book appointment for these services',
description:
'This option will allow customer to book appointment for these services',
onSelection: (bool v) {
isAppointmentAvailable = v;
model.setState(ViewState.idle);
@ -145,7 +164,8 @@ class CreateServicesPage3 extends StatelessWidget {
CheckBoxWithTitleDescription(
isSelected: isHomeAppointmentAvailable,
title: 'Allow home services',
description: 'This option will allow customer to book appointment at their desired location',
description:
'This option will allow customer to book appointment at their desired location',
onSelection: (bool v) {
isHomeAppointmentAvailable = v;
model.setState(ViewState.idle);
@ -158,13 +178,18 @@ class CreateServicesPage3 extends StatelessWidget {
TxtField(
hint: "Home Services Range",
keyboardType: TextInputType.number,
value: serviceRage == 0 ? null : serviceRage.toString(),
value: serviceRage == 0
? null
: serviceRage.toString(),
postfixWidget: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.center,
children: [
"KM".toText(color: MyColors.lightTextColor),
"KM".toText(
color: MyColors.lightTextColor),
],
),
onChanged: (v) {
@ -179,7 +204,9 @@ class CreateServicesPage3 extends StatelessWidget {
TxtField(
hint: "Charges per Kilometer",
keyboardType: TextInputType.number,
value: chargersPerKm == "0.0" ? null : chargersPerKm,
value: chargersPerKm == "0.0"
? null
: chargersPerKm,
onChanged: (v) {
if (v.isNotEmpty) {
chargersPerKm = v;

@ -269,6 +269,38 @@ packages:
url: "https://pub.dev"
source: hosted
version: "8.2.2"
geocoding:
dependency: transitive
description:
name: geocoding
sha256: e1dc0ac56666d9ed1d5a9ae5543ce9eb5986db6209cc7600103487d09192059c
url: "https://pub.dev"
source: hosted
version: "2.1.1"
geocoding_android:
dependency: transitive
description:
name: geocoding_android
sha256: "609db1d71bc364dd9d0616f72a41c01e0c74f3a3807efb85e0d5a67e57baf50f"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
geocoding_ios:
dependency: transitive
description:
name: geocoding_ios
sha256: "8f79e380abb640ef4d88baee8bb65390058c802601158d0813dc990b36b189d2"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
geocoding_platform_interface:
dependency: transitive
description:
name: geocoding_platform_interface
sha256: "8848605d307d844d89937cdb4b8ad7dfa880552078f310fa24d8a460f6dddab4"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
geolocator:
dependency: transitive
description:

Loading…
Cancel
Save