aamir_dev
Aamir.Muhammad 1 year ago
parent 4fb6ee7fb5
commit ca563f41cd

@ -5,7 +5,7 @@ import Firebase
import flutter_local_notifications import flutter_local_notifications
@UIApplicationMain @main
@objc class AppDelegate: FlutterAppDelegate { @objc class AppDelegate: FlutterAppDelegate {
override func application( override func application(
_ application: UIApplication, _ application: UIApplication,

@ -122,6 +122,7 @@ class DashboardVM extends BaseVM {
void performCheckOnBranches(BuildContext context) async { void performCheckOnBranches(BuildContext context) async {
if (AppState().getproviderSubscription.isNotEmpty && AppState().getproviderSubscription.first.branchesRemaining! > 0) { if (AppState().getproviderSubscription.isNotEmpty && AppState().getproviderSubscription.first.branchesRemaining! > 0) {
logger.d(AppState().getproviderSubscription.first.toJson());
await navigateWithName(context, ProviderAppRoutes.defineBranch); await navigateWithName(context, ProviderAppRoutes.defineBranch);
} else { } else {
Utils.showToast("Upgrade your subscription to add more Branches."); Utils.showToast("Upgrade your subscription to add more Branches.");
@ -131,6 +132,7 @@ class DashboardVM extends BaseVM {
void performCheckOnAds(BuildContext context) async { void performCheckOnAds(BuildContext context) async {
//adsRemaining //adsRemaining
if (AppState().getproviderSubscription.isNotEmpty && AppState().getproviderSubscription.first.adsRemaining! > 0) { if (AppState().getproviderSubscription.isNotEmpty && AppState().getproviderSubscription.first.adsRemaining! > 0) {
logger.d(AppState().getproviderSubscription.first.toJson());
await navigateWithName(context, ProviderAppRoutes.defineBranch); await navigateWithName(context, ProviderAppRoutes.defineBranch);
} else { } else {
Utils.showToast("Upgrade your subscription to add more Ads."); Utils.showToast("Upgrade your subscription to add more Ads.");
@ -139,6 +141,7 @@ class DashboardVM extends BaseVM {
void performCheckOnUsers(BuildContext context, Function() callBack) async { void performCheckOnUsers(BuildContext context, Function() callBack) async {
if (AppState().getproviderSubscription.isNotEmpty && AppState().getproviderSubscription.first.subUsersRemaining! > 0) { if (AppState().getproviderSubscription.isNotEmpty && AppState().getproviderSubscription.first.subUsersRemaining! > 0) {
logger.d(AppState().getproviderSubscription.first.toJson());
showMyBottomSheet(context, isDismissible: false, child: const AddPhoneNumWidget(), callBackFunc: callBack); showMyBottomSheet(context, isDismissible: false, child: const AddPhoneNumWidget(), callBackFunc: callBack);
} else { } else {
Utils.showToast("Upgrade your subscription to add more Sub Users."); Utils.showToast("Upgrade your subscription to add more Sub Users.");

@ -8,6 +8,7 @@ import 'package:mc_common_app/models/services_models/item_model.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/utils/utils.dart'; import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/base_view_model.dart'; import 'package:mc_common_app/view_models/base_view_model.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
@ -24,7 +25,7 @@ class ItemsVM extends BaseVM {
ItemModel? serviceItems; ItemModel? serviceItems;
Future<String?> selectFile(BuildContext context) async { Future<String?> selectFile(BuildContext context) async {
File? file = await commonServices.pickFile(context,fileType: FileType.image); File? file = await commonServices.pickFile(context, fileType: FileType.image);
if (file != null) { if (file != null) {
int sizeInBytes = file.lengthSync(); int sizeInBytes = file.lengthSync();
@ -45,8 +46,7 @@ class ItemsVM extends BaseVM {
return response; return response;
} }
Future<ItemModel?> getServiceItems(int serviceId, Future<ItemModel?> getServiceItems(int serviceId, {List<PickerItem>? list}) async {
{List<PickerItem>? list}) async {
serviceItems = null; serviceItems = null;
setOnlyState(ViewState.busy); setOnlyState(ViewState.busy);
serviceItems = await itemsRepo.getServiceItems(serviceId); serviceItems = await itemsRepo.getServiceItems(serviceId);
@ -72,4 +72,10 @@ class ItemsVM extends BaseVM {
GenericRespModel response = await itemsRepo.updateServiceItem(map); GenericRespModel response = await itemsRepo.updateServiceItem(map);
return response; return response;
} }
Future<File?> pickSingleFile(BuildContext context) async {
File? file = await commonServices.pickFile(context, fileType: FileType.custom, allowedExtensions: ['jpg', 'png', 'jpeg']);
if (file == null) return null;
return file;
}
} }

@ -37,8 +37,10 @@ class UpdateAppointmentPage extends StatelessWidget {
child: Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { child: Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
appointmentListModel = appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![appointmentsVM.selectedAppointmentSubIndex]; appointmentListModel = appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![appointmentsVM.selectedAppointmentSubIndex];
if (appointmentsVM.state == ViewState.busy) { if (appointmentsVM.state == ViewState.busy) {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} else { } else {
print(appointmentListModel.appointmentPaymentStatusEnum);
return Column( return Column(
children: [ children: [
Expanded( Expanded(
@ -96,7 +98,10 @@ class UpdateAppointmentPage extends StatelessWidget {
if ((appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.arrived || appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.workStarted) && if ((appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.arrived || appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.workStarted) &&
appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.payNow) appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.payNow)
LocaleKeys.waitingPaymentfromtheCustomer.tr().toText().paddingAll(21),
buildStatusContainer(text: LocaleKeys.waitingPaymentfromtheCustomer.tr()).paddingAll(10),
// LocaleKeys.waitingPaymentfromtheCustomer.tr().toText().paddingAll(21),
if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.arrived && if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.arrived &&
(appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.paid || (appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.paid ||
@ -228,6 +233,22 @@ class UpdateAppointmentPage extends StatelessWidget {
); );
} }
Widget buildStatusContainer({required String text}) {
return Center(
child: text.toString().toText(
color: MyColors.adPendingStatusColor,
fontSize: 14,
// isItalic: true,
),
).toContainer(
marginAll: 10,
paddingAll: 10,
borderRadius: 8,
width: double.infinity,
backgroundColor: MyColors.adPendingStatusColor.withOpacity(0.16),
);
}
Widget showCompleteButton(BuildContext context, AppointmentsVM appointmentsVM) { Widget showCompleteButton(BuildContext context, AppointmentsVM appointmentsVM) {
return ShowFillButton( return ShowFillButton(
title: LocaleKeys.complete.tr(), title: LocaleKeys.complete.tr(),

@ -50,7 +50,7 @@ class BranchAppointmentFragment extends StatelessWidget {
return RefreshIndicator( return RefreshIndicator(
onRefresh: () async => serviceVM.getBranchAndServices(), onRefresh: () async => serviceVM.getBranchAndServices(),
child: branches.isEmpty child: branches.isEmpty
? Center(child: Text(LocaleKeys.noBranchFound.tr())) ? Center(child: LocaleKeys.noBranchFound.tr().toText(fontSize: 16, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium),)
: ListView.separated( : ListView.separated(
itemBuilder: (context, index) { itemBuilder: (context, index) {
return Row( return Row(

@ -2,14 +2,18 @@ import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/view_models/dashboard_view_model.dart'; import 'package:car_provider_app/view_models/dashboard_view_model.dart';
import 'package:car_provider_app/views/dashboard/widget/my_service_provider.dart'; import 'package:car_provider_app/views/dashboard/widget/my_service_provider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.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/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.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/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/view_models/ad_view_model.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/appointments_view_model.dart';
import 'package:mc_common_app/views/advertisement/components/ads_list_widget.dart'; import 'package:mc_common_app/views/advertisement/components/ads_list_widget.dart';
import 'package:mc_common_app/views/appointments/widgets/common_appointment_slider_widget.dart'; import 'package:mc_common_app/views/appointments/widgets/common_appointment_slider_widget.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
@ -69,11 +73,22 @@ class HomeFragment extends StatelessWidget {
context.read<DashboardVM>().onNavbarTapped(1); context.read<DashboardVM>().onNavbarTapped(1);
}).horPaddingMain(), }).horPaddingMain(),
// const AppointmentSliderWidget().horPaddingMain(), // const AppointmentSliderWidget().horPaddingMain(),
CommonAppointmentSliderWidget(
onAppointmentClick: (AppointmentListModel value) { //TODO TESTING PENDING
navigateWithName(context, ProviderAppRoutes.appointmentDetailList, arguments: value); if (AppState().currentAppType == AppType.provider && context.read<AppointmentsVM>().myUpComingAppointments.isEmpty) ...[
}, LocaleKeys.noUpcomingAppointments.tr().toText(fontSize: 16, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium).paddingAll(21),
).toWhiteContainer(width: double.infinity,backgroundColor: Colors.transparent).margin(left: 21,right: 21), ] else ...[
CommonAppointmentSliderWidget(
onAppointmentClick: (AppointmentListModel value) {
navigateWithName(context, ProviderAppRoutes.appointmentDetailList, arguments: value);
},
)
.toWhiteContainer(
width: double.infinity,
backgroundColor: Colors.transparent,
)
.margin(left: 21, right: 21),
],
24.height, 24.height,
ViewAllWidget( ViewAllWidget(
title: LocaleKeys.myBranches.tr(), title: LocaleKeys.myBranches.tr(),
@ -84,7 +99,9 @@ class HomeFragment extends StatelessWidget {
).horPaddingMain(), ).horPaddingMain(),
const ServiceProviderWidget().horPaddingMain(), const ServiceProviderWidget().horPaddingMain(),
], ],
).toWhiteContainer(width: double.infinity,), ).toWhiteContainer(
width: double.infinity,
),
Consumer( Consumer(
builder: (BuildContext context, AdVM adVM, Widget? child) { builder: (BuildContext context, AdVM adVM, Widget? child) {
if (adVM.state == ViewState.busy) { if (adVM.state == ViewState.busy) {

@ -173,17 +173,17 @@ class GeneralAppointmentWidget extends StatelessWidget {
), ),
], ],
), ),
Row( // Row(
children: [ // children: [
"Location: ".toText( // "Location: ".toText(
color: MyColors.lightTextColor, // color: MyColors.lightTextColor,
), // ),
2.width, // 2.width,
appointmentListModel.appointmentType.toString().toText( // appointmentListModel.appointmentType.toString().toText(
fontSize: 12, // fontSize: 12,
), // ),
], // ],
), // ),
], ],
), ),
), ),

@ -3,6 +3,7 @@ import 'package:car_provider_app/generated/locale_keys.g.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.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/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/view_models/service_view_model.dart'; import 'package:mc_common_app/view_models/service_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';
@ -28,9 +29,9 @@ class ServiceProviderWidget extends StatelessWidget {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} else { } else {
return model.branches == null || model.branches!.data == null return model.branches == null || model.branches!.data == null
? Center(child: Text(LocaleKeys.noBranchFound.tr())) ? Center(child: LocaleKeys.noBranchFound.tr().toText(fontSize: 16, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium))
: model.branches!.data!.serviceProviderBranch != null && model.branches!.data!.serviceProviderBranch!.isEmpty : model.branches!.data!.serviceProviderBranch != null && model.branches!.data!.serviceProviderBranch!.isEmpty
? Center(child: Text(LocaleKeys.no_branch.tr())) ? Center(child: LocaleKeys.no_branch.tr().toText(fontSize: 16, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium))
: ListView.builder( : ListView.builder(
itemCount: model.branches!.data!.serviceProviderBranch!.length, itemCount: model.branches!.data!.serviceProviderBranch!.length,
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,

@ -28,37 +28,17 @@ class BranchDetailPage extends StatelessWidget {
BranchDetailPage(this.branchData, {super.key}); BranchDetailPage(this.branchData, {super.key});
List<CategoryData> categories = [];
getBranchUsers(BuildContext context) { getBranchUsers(BuildContext context) {
scheduleMicrotask(() { scheduleMicrotask(() {
context.read<ServiceVM>().getAllProviderDealers( context.read<ServiceVM>().getAllProviderDealers(
{"ServiceProviderBranchID": branchData.id.toString(), "ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}, {"ServiceProviderBranchID": branchData.id.toString(), "ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""},
); );
context.read<ServiceVM>().filterUserBranchCategories();
}); });
} }
filterBranch() {
for (var element in branchData.branchServices!) {
categories.add(
CategoryData(
id: element.categoryId,
categoryName: element.categoryName,
categoryNameN: element.categoryName,
),
);
}
categories = categories.toSet().toList();
for (var payment in categories) {
for (var element in branchData.branchServices!) {
if (payment.id == element.categoryId) {
payment.services ??= [];
payment.services!.add(element);
}
}
}
branchData.categories = categories;
}
bool validation(BuildContext context) { bool validation(BuildContext context) {
bool isValid = false; bool isValid = false;
@ -167,7 +147,7 @@ class BranchDetailPage extends StatelessWidget {
return actionWidget.paddingAll(21); return actionWidget.paddingAll(21);
} }
Widget buildServiceTileWidget(int pIndex) { Widget buildServiceTileWidget(int pIndex, ServiceVM vmodel) {
return Row( return Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -189,7 +169,7 @@ class BranchDetailPage extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
categories[pIndex].categoryName.toString().toText(fontSize: 16), vmodel.categories[pIndex].categoryName.toString().toText(fontSize: 16),
], ],
), ),
8.height, 8.height,
@ -201,13 +181,16 @@ class BranchDetailPage extends StatelessWidget {
child: ListView.builder( child: ListView.builder(
itemBuilder: (context, index) { itemBuilder: (context, index) {
return Container( return Container(
child: (EasyLocalization.of(context)?.currentLocale?.countryCode == "SA" ? categories[pIndex].services![index].serviceDescriptionN.toString() : categories[pIndex].services![index].serviceDescription.toString()).toText( child: (EasyLocalization.of(context)?.currentLocale?.countryCode == "SA"
? vmodel.categories[pIndex].services![index].serviceDescriptionN.toString()
: vmodel.categories[pIndex].services![index].serviceDescription.toString())
.toText(
fontSize: 12, fontSize: 12,
color: MyColors.lightTextColor, color: MyColors.lightTextColor,
), ),
); );
}, },
itemCount: categories[pIndex].services?.length, itemCount: vmodel.categories[pIndex].services?.length,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
@ -223,7 +206,7 @@ class BranchDetailPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
filterBranch(); getBranchUsers(context);
return Scaffold( return Scaffold(
appBar: CustomAppBar(title: LocaleKeys.branchDetail.tr()), appBar: CustomAppBar(title: LocaleKeys.branchDetail.tr()),
body: Consumer<ServiceVM>(builder: (context, model, _) { body: Consumer<ServiceVM>(builder: (context, model, _) {
@ -350,13 +333,13 @@ class BranchDetailPage extends StatelessWidget {
}), }),
ListView.separated( ListView.separated(
itemBuilder: (context, pIndex) { itemBuilder: (context, pIndex) {
return buildServiceTileWidget(pIndex).onPress(() { return buildServiceTileWidget(pIndex, model).onPress(() {
categories[pIndex].branchId = branchData.id.toString(); model.categories[pIndex].branchId = branchData.id.toString();
categories[pIndex].branchName = branchData.branchName.toString(); model.categories[pIndex].branchName = branchData.branchName.toString();
navigateWithName(context, ProviderAppRoutes.servicesList, arguments: categories[pIndex]); navigateWithName(context, ProviderAppRoutes.servicesList, arguments: model.categories[pIndex]);
}); });
}, },
itemCount: categories.length, itemCount: model.categories.length,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
padding: const EdgeInsets.all(20), padding: const EdgeInsets.all(20),

@ -1,4 +1,5 @@
import 'package:car_provider_app/config/provider_routes.dart'; import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/view_models/dashboard_view_model.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
@ -104,7 +105,7 @@ class BranchListPage extends StatelessWidget {
return RefreshIndicator( return RefreshIndicator(
onRefresh: () async => await context.read<ServiceVM>().getBranchAndServices(), onRefresh: () async => await context.read<ServiceVM>().getBranchAndServices(),
child: branches.isEmpty child: branches.isEmpty
? Center(child: LocaleKeys.no_branch.tr().toText(fontSize: 16, color: MyColors.lightTextColor)) ? Center(child: LocaleKeys.no_branch.tr().toText(fontSize: 16, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium))
: ListView.separated( : ListView.separated(
itemBuilder: (context, index) { itemBuilder: (context, index) {
BranchDetailModel branchModel = branches[index]; BranchDetailModel branchModel = branches[index];
@ -204,7 +205,7 @@ class BranchListPage extends StatelessWidget {
color: Colors.white, color: Colors.white,
), ),
onPressed: () { onPressed: () {
navigateWithName(context, ProviderAppRoutes.defineBranch); context.read<DashboardVM>().checkUserSubscription(SubscriptionActionTypeEnum.branches, context, callback: () { });
}, },
), ),
); );

@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:car_provider_app/view_models/dashboard_view_model.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.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';
@ -10,7 +11,7 @@ import 'package:mc_common_app/views/location_views/pick_location_page.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.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/views/advertisement/ad_creation_steps/ad_creation_steps_containers.dart'; import 'package:mc_common_app/views/advertisement/ad_creation_steps/ad_creation_steps_containers.dart';

@ -309,7 +309,7 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
"fromDate": startDate, "fromDate": startDate,
"toDate": endDate, "toDate": endDate,
"startTime": startTime, "startTime": startTime,
"endTime": endDate, "endTime": endTime,
"slotDurationMinute": slotsTime, "slotDurationMinute": slotsTime,
"perSlotAppointment": appointmentPerSlot, "perSlotAppointment": appointmentPerSlot,
"deliveryServiceType": 1, "deliveryServiceType": 1,

@ -1,8 +1,11 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'package:car_provider_app/view_models/items_view_model.dart'; import 'package:car_provider_app/view_models/items_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/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/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/services_models/item_model.dart'; import 'package:mc_common_app/models/services_models/item_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
@ -10,6 +13,9 @@ import 'package:mc_common_app/utils/app_permission_handler.dart';
import 'package:mc_common_app/utils/date_helper.dart'; import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/views/advertisement/ad_creation_steps/ad_creation_steps_containers.dart';
import 'package:mc_common_app/views/advertisement/components/picked_images_container_widget.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/checkbox_with_title_desc.dart'; import 'package:mc_common_app/widgets/checkbox_with_title_desc.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
@ -17,6 +23,7 @@ import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class CreateItemPage extends StatefulWidget { class CreateItemPage extends StatefulWidget {
const CreateItemPage({Key? key}) : super(key: key); const CreateItemPage({Key? key}) : super(key: key);
@ -31,6 +38,7 @@ class _CreateItemPageState extends State<CreateItemPage> {
bool isWorkshopAppointmentAvailable = false; bool isWorkshopAppointmentAvailable = false;
bool isHomeAppointmentAvailable = false; bool isHomeAppointmentAvailable = false;
bool isDefaultValudDone = false; bool isDefaultValudDone = false;
File? file;
ItemsVM? model; ItemsVM? model;
ItemData? itemData; ItemData? itemData;
@ -113,59 +121,28 @@ class _CreateItemPageState extends State<CreateItemPage> {
}, },
), ),
12.height, 12.height,
if (itemImage != null && itemImage!.isNotEmpty) if (file != null) ...[
Column( PickedFilesContainer(
children: [ pickedFiles: pickedImages(),
Image.memory( onCrossPressedPrimary: onCrossPress,
base64Decode(itemImage ?? ""), isPdf: false,
).toContainer( isReview: false,
isEnabledBorder: true, isFromNetwork: false,
paddingAll: 12, onAddFilePressed: () async {
), file = await model!.pickSingleFile(context);
12.height,
],
),
InkWell(
onTap: () async {
bool isPermissionsAvailable = await requestPermissionGranted(context, Permission.storage);
if (isPermissionsAvailable && model != null) {
itemImage = await model!.selectFile(context) ?? "";
setState(() {}); setState(() {});
} },
},
child: Container(
width: double.infinity,
height: 45,
decoration: BoxDecoration(
color: Colors.transparent,
border: Border.all(color: MyColors.greyACColor, width: 2),
borderRadius: const BorderRadius.all(Radius.circular(0)),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Icon(
Icons.attach_file,
size: 18,
color: MyColors.darkPrimaryColor,
),
8.width,
const Text(
"Attach Item Image",
style: TextStyle(
color: MyColors.darkPrimaryColor,
),
),
const Icon(
Icons.attach_file,
size: 18,
color: Colors.transparent,
),
],
),
), ),
), ] else ...[
10.height,
DottedRectContainer(
onTap: () async {
file = await model!.pickSingleFile(context);
setState(() {});
},
text: LocaleKeys.attachImage.tr(),
icon: MyAssets.attachmentIcon.buildSvg())
],
20.height, 20.height,
CheckBoxWithTitleDescription( CheckBoxWithTitleDescription(
isSelected: isAppointmentAvailable, isSelected: isAppointmentAvailable,
@ -212,12 +189,13 @@ class _CreateItemPageState extends State<CreateItemPage> {
maxWidth: double.infinity, maxWidth: double.infinity,
onPressed: () async { onPressed: () async {
if (validation()) { if (validation()) {
var attachedFile = await Utils.convertFileToBase64(file!);
if (!(itemData?.isUpdateOrSelected ?? false)) { if (!(itemData?.isUpdateOrSelected ?? false)) {
Map map = { Map map = {
"name": name, "name": name,
"price": price, "price": price,
"description": description, "description": description,
"itemImage": itemImage ?? "", "itemImage": attachedFile ?? "",
"companyID": 1, "companyID": 1,
"manufactureDate": year, "manufactureDate": year,
"serviceProviderServiceID": itemData!.serviceProviderServiceId, "serviceProviderServiceID": itemData!.serviceProviderServiceId,
@ -240,7 +218,7 @@ class _CreateItemPageState extends State<CreateItemPage> {
"name": name, "name": name,
"price": price, "price": price,
"description": description, "description": description,
"itemImage": itemImage ?? "", "itemImage": attachedFile ?? "",
"companyID": 1, "companyID": 1,
"manufactureDate": year, "manufactureDate": year,
"serviceProviderServiceID": itemData!.serviceProviderServiceId, "serviceProviderServiceID": itemData!.serviceProviderServiceId,
@ -284,4 +262,17 @@ class _CreateItemPageState extends State<CreateItemPage> {
} }
return valid; return valid;
} }
void onCrossPress(String item) {
file = null;
setState(() {});
}
List<ImageModel> pickedImages() {
List<ImageModel> pickedImage = [];
if (file != null) {
pickedImage.add(ImageModel(isFromNetwork: false, id: 1, filePath: file!.path));
}
return pickedImage;
}
} }

@ -1,6 +1,8 @@
import 'dart:async'; import 'dart:async';
import 'package:mc_common_app/classes/app_state.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/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/service_view_model.dart'; import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:car_provider_app/views/settings/services/services_list_page.dart'; import 'package:car_provider_app/views/settings/services/services_list_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -266,9 +268,10 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
// print(map); // print(map);
Utils.showLoading(context); Utils.showLoading(context);
GenericRespModel mResponse = await model.createService(map); GenericRespModel mResponse = await model.createService(map);
model.getBranchAndServices(); await model.getBranchAndServices();
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.showToast(mResponse.message ?? ""); Utils.showToast(mResponse.message ?? "");
pop(context);
} }
updateService(BuildContext context, ServiceVM model) async { updateService(BuildContext context, ServiceVM model) async {
@ -286,7 +289,9 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
Utils.showLoading(context); Utils.showLoading(context);
GenericRespModel mResponse = await model.updateServices(map); GenericRespModel mResponse = await model.updateServices(map);
model.getBranchAndServices(); model.getBranchAndServices();
model.filterUserBranchCategories();
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.showToast(mResponse.message ?? ""); Utils.showToast(mResponse.message ?? "");
pop(context);
} }
} }

@ -98,7 +98,7 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
if (model.matchedServices == null) { if (model.matchedServices == null) {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} else if (model.matchedServices!.isEmpty) { } else if (model.matchedServices!.isEmpty) {
return const EmptyWidget(); return const EmptyWidget(text: "No Services found", isWrapedColumn: false);
} }
return ListView.separated( return ListView.separated(
itemBuilder: (context, index) { itemBuilder: (context, index) {
@ -123,7 +123,8 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
model.matchedServices![index].serviceDescription.toString().toText(fontSize: 16, isBold: true), model.matchedServices![index].serviceDescription.toString().toText(fontSize: 16, isBold: true),
"${model.matchedServices![index].serviceItems!.where((c) => c.isUpdateOrSelected == true).length} items selected out of ${model.matchedServices![index].serviceItems!.length}".toText(color: MyColors.lightTextColor) "${model.matchedServices![index].serviceItems!.where((c) => c.isUpdateOrSelected == true).length} items selected out of ${model.matchedServices![index].serviceItems!.length}"
.toText(color: MyColors.lightTextColor)
], ],
), ),
), ),

@ -41,7 +41,7 @@ class ItemsListPage extends StatelessWidget {
return model.state == ViewState.busy return model.state == ViewState.busy
? const Center(child: CircularProgressIndicator()) ? const Center(child: CircularProgressIndicator())
: model.serviceItems!.data!.isEmpty : model.serviceItems!.data!.isEmpty
? const EmptyWidget() ? const EmptyWidget(text: "No Service Items found", isWrapedColumn: false)
: ListView.separated( : ListView.separated(
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return SizedBox( return SizedBox(

@ -40,8 +40,8 @@ dependencies:
# path: C:/Users/mirza.shafique/AndroidStudioProjects/mc_common_app # path: C:/Users/mirza.shafique/AndroidStudioProjects/mc_common_app
mc_common_app: mc_common_app:
path: /Volumes/Data/Projects/Flutter/car_common_app # path: /Volumes/Data/Projects/Flutter/car_common_app
# path: /Users/amir/StudioProjects/car_common_app path: /Users/amir/StudioProjects/car_common_app

Loading…
Cancel
Save