Code Refactoring

aamir_dev
Faiz Hashmi 2 years ago
parent 082cd766a5
commit a25ec69694

@ -1,13 +1,12 @@
import 'package:mc_common_app/repositories/branch_repo.dart'; import 'package:mc_common_app/repositories/branch_repo.dart';
import 'package:car_provider_app/repositories/items_repo.dart'; import 'package:mc_common_app/repositories/items_repo.dart';
import 'package:car_provider_app/repositories/schedule_repo.dart'; import 'package:mc_common_app/repositories/schedule_repo.dart';
import 'package:mc_common_app/config/dependencies.dart'; import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/repositories/subscription_repo.dart'; import 'package:mc_common_app/repositories/subscription_repo.dart';
class ProviderAppDependencies { class ProviderAppDependencies {
static void addDependencies() { static void addDependencies() {
AppDependencies.addDependencies(); AppDependencies.addDependencies();
injector.registerSingleton<BranchRepo>(() => BranchRepoImp());
injector.registerSingleton<ItemsRepo>(() => ItemsRepoImp()); injector.registerSingleton<ItemsRepo>(() => ItemsRepoImp());
injector.registerSingleton<SubscriptionRepo>(() => SubscriptionRepoImp()); injector.registerSingleton<SubscriptionRepo>(() => SubscriptionRepoImp());
injector.registerSingleton<ScheduleRepo>(() => ScheduleRepoImp()); injector.registerSingleton<ScheduleRepo>(() => ScheduleRepoImp());

@ -1,6 +1,6 @@
import 'package:car_provider_app/config/provider_dependencies.dart'; import 'package:car_provider_app/config/provider_dependencies.dart';
import 'package:car_provider_app/repositories/items_repo.dart'; import 'package:mc_common_app/repositories/items_repo.dart';
import 'package:car_provider_app/repositories/schedule_repo.dart'; import 'package:mc_common_app/repositories/schedule_repo.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/view_models/items_view_model.dart'; import 'package:car_provider_app/view_models/items_view_model.dart';
import 'package:car_provider_app/view_models/schedule_view_model.dart'; import 'package:car_provider_app/view_models/schedule_view_model.dart';
@ -102,7 +102,7 @@ Future<void> main() async {
), ),
ChangeNotifierProvider<AppointmentsVM>( ChangeNotifierProvider<AppointmentsVM>(
create: (_) => AppointmentsVM( create: (_) => AppointmentsVM(
scheduleRepo: injector.get<AppointmentRepo>(), appointmentRepo: injector.get<AppointmentRepo>(),
commonServices: injector.get<CommonAppServices>(), commonServices: injector.get<CommonAppServices>(),
commonRepo: injector.get<CommonRepo>(), commonRepo: injector.get<CommonRepo>(),
branchRepo: injector.get<BranchRepo>(), branchRepo: injector.get<BranchRepo>(),

@ -1,43 +0,0 @@
import 'package:flutter/material.dart';
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/models/general_models/m_response.dart';
import 'package:mc_common_app/models/services_models/item_model.dart';
abstract class ItemsRepo {
Future<MResponse> createServiceItems(Map map);
Future<ItemModel> getServiceItems(int serviceId);
Future<MResponse> updateServiceItem(Map map);
}
class ItemsRepoImp implements ItemsRepo {
@override
Future<MResponse> createServiceItems(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
debugPrint(t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createItems, map, token: t);
}
@override
Future<ItemModel> getServiceItems(int serviceId) async {
var queryParameters = {
"ServiceProviderServiceID": serviceId.toString(),
};
String? token = AppState().getUser.data?.accessToken;
debugPrint(token);
return await injector
.get<ApiClient>()
.getJsonForObject((json) => ItemModel.fromJson(json), ApiConsts.getServiceItems, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? "");
}
@override
Future<MResponse> updateServiceItem(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
debugPrint(t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateServiceItem, map, token: t);
}
}

@ -1,62 +0,0 @@
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';
import 'package:mc_common_app/api/api_client.dart';
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';
abstract class ScheduleRepo {
Future<Services> getAllServices(String branchId);
Future<MResponse> createSchedule(Map map);
Future<MResponse> addServicesInSchedule(Map map);
Future<MResponse> updateSchedule(Map map);
Future<Schedule> getSchedules(String branchId);
Future<MResponse> updateServicesInSchedule(Map map);
}
class ScheduleRepoImp implements ScheduleRepo {
@override
Future<Services> getAllServices(String branchId) async {
print("braanchId $branchId");
Map<String, dynamic> map = {"ProviderBranchID": branchId};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().getJsonForObject((json) => Services.fromJson(json), ApiConsts.getServicesOfBranch, token: t, queryParameters: map);
}
@override
Future<MResponse> createSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createSchedule, map, token: t);
}
@override
Future<MResponse> addServicesInSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createGroup, map, token: t);
}
@override
Future<Schedule> getSchedules(String branchId) async {
Map<String, dynamic> map = {"ServiceProviderBranchID": branchId};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().getJsonForObject((json) => Schedule.fromJson(json), ApiConsts.getSchedule, token: t, queryParameters: map);
}
@override
Future<MResponse> updateSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateSchedule, map, token: t);
}
@override
Future<MResponse> updateServicesInSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateGroup, map, token: t);
}
}

@ -1,6 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:car_provider_app/repositories/items_repo.dart'; import 'package:mc_common_app/repositories/items_repo.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/models/general_models/m_response.dart'; import 'package:mc_common_app/models/general_models/m_response.dart';
import 'package:mc_common_app/models/services_models/item_model.dart'; import 'package:mc_common_app/models/services_models/item_model.dart';

@ -1,7 +1,7 @@
import 'package:mc_common_app/models/appointments_models/schedule_model.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/general_models/m_response.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/services.dart'; import 'package:mc_common_app/models/provider_branches_models/profile/services.dart';
import 'package:car_provider_app/repositories/schedule_repo.dart'; import 'package:mc_common_app/repositories/schedule_repo.dart';
import 'package:car_provider_app/views/settings/schedule/widgets/chips_picker_item.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/enums.dart';

@ -263,7 +263,7 @@ class AddNewServiceAppointmentPage extends StatelessWidget {
} }
Future<void> _updateAppointment(BuildContext context, int branchId) async { Future<void> _updateAppointment(BuildContext context, int branchId) async {
await context.read<AppointmentsVM>().getProviderMyAppointments({ await context.read<AppointmentsVM>().getMyAppointmentsForProvider({
"ServiceProviderID": injector "ServiceProviderID": injector
.get<AppState>() .get<AppState>()
.getUser .getUser

@ -1,18 +1,16 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/views/dashboard/widget/appointment_slider_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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/appointments_models/appointment_list_model.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/appointments_view_model.dart'; import 'package:mc_common_app/view_models/appointments_view_model.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/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import '../../config/provider_routes.dart';
import '../dashboard/widget/appointment_slider_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class AppointmentDetailListPage extends StatelessWidget { class AppointmentDetailListPage extends StatelessWidget {
AppointmentDetailListPage({Key? key}) : super(key: key); const AppointmentDetailListPage({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -26,47 +24,29 @@ class AppointmentDetailListPage extends StatelessWidget {
child: Column( child: Column(
children: [ children: [
Expanded( Expanded(
child: Consumer(builder: (BuildContext context, child: Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
AppointmentsVM appointmentsVM, Widget? child) {
if (appointmentsVM.state == ViewState.busy) { if (appointmentsVM.state == ViewState.busy) {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} else { } else {
return ListView.separated( return ListView.separated(
itemBuilder: (context, index) { itemBuilder: (context, index) {
return AppointmentSliderWidget( return AppointmentSliderWidget(
appointmentListModel: appointmentsVM appointmentListModel: appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![index],
.myFilteredAppointments2[
appointmentsVM.selectedAppointmentIndex]
.customerAppointmentList![index],
isNeedTotalPayment: true, isNeedTotalPayment: true,
isNeedToShowAppointmentStatus: true, isNeedToShowAppointmentStatus: true,
isNeedToShowMergeStatus: true, isNeedToShowMergeStatus: true,
onTap: () { onTap: () {
appointmentsVM.selectedAppointmentId = appointmentsVM.selectedAppointmentId = appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![index].id ?? 0;
appointmentsVM
.myFilteredAppointments2[appointmentsVM
.selectedAppointmentIndex]
.customerAppointmentList![index]
.id ??
0;
appointmentsVM.selectedAppointmentSubIndex = index; appointmentsVM.selectedAppointmentSubIndex = index;
navigateWithName(context, navigateWithName(context, ProviderAppRoutes.updateAppointmentPage,
ProviderAppRoutes.updateAppointmentPage, arguments: appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![index]);
arguments: appointmentsVM
.myFilteredAppointments2[
appointmentsVM.selectedAppointmentIndex]
.customerAppointmentList![index]);
}, },
); );
}, },
separatorBuilder: (context, snapchat) { separatorBuilder: (context, snapchat) {
return 21.height; return 21.height;
}, },
itemCount: appointmentsVM itemCount: appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList!.length,
.myFilteredAppointments2[
appointmentsVM.selectedAppointmentIndex]
.customerAppointmentList!
.length,
padding: const EdgeInsets.all(21), padding: const EdgeInsets.all(21),
); );
} }
@ -77,8 +57,7 @@ class AppointmentDetailListPage extends StatelessWidget {
maxWidth: double.infinity, maxWidth: double.infinity,
margin: const EdgeInsets.all(21), margin: const EdgeInsets.all(21),
onPressed: () { onPressed: () {
navigateWithName( navigateWithName(context, ProviderAppRoutes.mergeAppointments);
context, ProviderAppRoutes.mergeAppointments);
}, },
), ),
], ],

@ -28,28 +28,16 @@ class AppointmentPage extends StatelessWidget {
Key? key, Key? key,
}) : super(key: key); }) : super(key: key);
GlobalKey<RefreshIndicatorState> refreshIndicatorKey = GlobalKey<RefreshIndicatorState> refreshIndicatorKey = GlobalKey<RefreshIndicatorState>();
GlobalKey<RefreshIndicatorState>();
Future<void> _pullRefresh(BuildContext context) async { Future<void> _pullRefresh(BuildContext context) async {
await context.read<AppointmentsVM>().getAppointmentSlotsInfo( await context.read<AppointmentsVM>().getAppointmentSlotsInfo(
context: context, context: context,
map: { map: {"ProviderBranchID": branch.id.toString(), "FromDate": date, "ToDate": date},
"ProviderBranchID": branch.id.toString(),
"FromDate": date,
"ToDate": date
},
isNeedToRebuild: true, isNeedToRebuild: true,
); );
await context.read<AppointmentsVM>().getProviderMyAppointments({ await context.read<AppointmentsVM>().getMyAppointmentsForProvider({
"ServiceProviderID": injector "ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0",
.get<AppState>()
.getUser
.data
?.userInfo
?.providerId
.toString() ??
"0",
"ProviderBranchID": branch.id.toString(), "ProviderBranchID": branch.id.toString(),
"FromDate": date, "FromDate": date,
"DateTo": date, "DateTo": date,
@ -59,7 +47,7 @@ class AppointmentPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
date = DateHelper.formatAsYearMonthDay(DateTime.now()); date = DateHelper.formatAsYearMonthDay(DateTime.now());
context.read<AppointmentsVM>().setupProviderAppointmentFilter(); context.read<AppointmentsVM>().populateAppointmentsFilterList();
_pullRefresh(context); _pullRefresh(context);
context.read<AppointmentsVM>().selectedBranch = branch.id ?? 0; context.read<AppointmentsVM>().selectedBranch = branch.id ?? 0;
@ -71,8 +59,7 @@ class AppointmentPage extends StatelessWidget {
body: SizedBox( body: SizedBox(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
child: Consumer(builder: (BuildContext context, child: Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
AppointmentsVM appointmentsVM, Widget? child) {
if (appointmentsVM.state == ViewState.busy) { if (appointmentsVM.state == ViewState.busy) {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} else { } else {
@ -89,8 +76,7 @@ class AppointmentPage extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 18), padding: const EdgeInsets.symmetric(horizontal: 18),
onFilterTapped: (index, selectedFilterId) { onFilterTapped: (index, selectedFilterId) {
appointmentsVM.applyFilterOnAppointmentsVM( appointmentsVM.applyFilterOnAppointmentsVM(
appointmentStatusEnum: appointmentStatusEnum: selectedFilterId.toAppointmentStatusEnum(),
selectedFilterId.toAppointmentStatusEnum(),
isNeedCustomerFilter: true, isNeedCustomerFilter: true,
); );
}, },
@ -103,13 +89,10 @@ class AppointmentPage extends StatelessWidget {
ListView.separated( ListView.separated(
itemBuilder: (context, index) { itemBuilder: (context, index) {
return AppointmentSliderWidget( return AppointmentSliderWidget(
appointmentListModel: appointmentListModel: appointmentsVM.myFilteredAppointments2[index],
appointmentsVM.myFilteredAppointments2[index],
isNeedTotalPayment: false, isNeedTotalPayment: false,
onTap: () { onTap: () {
context context.read<AppointmentsVM>().selectedAppointmentIndex = index;
.read<AppointmentsVM>()
.selectedAppointmentIndex = index;
navigateWithName( navigateWithName(
context, context,
ProviderAppRoutes.appointmentDetailList, ProviderAppRoutes.appointmentDetailList,
@ -139,10 +122,7 @@ class AppointmentPage extends StatelessWidget {
} }
Widget progressWidget(BuildContext context, AppointmentsVM appointmentsVM) { Widget progressWidget(BuildContext context, AppointmentsVM appointmentsVM) {
double percent = (appointmentsVM.appointmentSlots?.occupiedSlots ?? double percent = (appointmentsVM.appointmentSlots?.occupiedSlots ?? 0.0 / (appointmentsVM.appointmentSlots?.totalSlots ?? 0.0)).toDouble() * 100;
0.0 / (appointmentsVM.appointmentSlots?.totalSlots ?? 0.0))
.toDouble() *
100;
return Column( return Column(
children: [ children: [
Row( Row(
@ -201,9 +181,7 @@ class AppointmentPage extends StatelessWidget {
fontSize: 8, fontSize: 8,
color: Colors.white, color: Colors.white,
), ),
(appointmentsVM.appointmentSlots?.emptySlots ?? 0) (appointmentsVM.appointmentSlots?.emptySlots ?? 0).toString().toText(
.toString()
.toText(
fontSize: 9, fontSize: 9,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Colors.white, color: Colors.white,
@ -225,9 +203,7 @@ class AppointmentPage extends StatelessWidget {
fontSize: 8, fontSize: 8,
color: Colors.white, color: Colors.white,
), ),
(appointmentsVM.appointmentSlots?.occupiedSlots ?? 0) (appointmentsVM.appointmentSlots?.occupiedSlots ?? 0).toString().toText(
.toString()
.toText(
fontSize: 9, fontSize: 9,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Colors.white, color: Colors.white,
@ -250,9 +226,7 @@ class AppointmentPage extends StatelessWidget {
fontSize: 13, fontSize: 13,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
(appointmentsVM.appointmentSlots?.totalSlots ?? 0) (appointmentsVM.appointmentSlots?.totalSlots ?? 0).toString().toText(
.toString()
.toText(
fontSize: 24, fontSize: 24,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),

@ -144,7 +144,7 @@ class MergeAppointmentListPage extends StatelessWidget {
} }
Future<void> _updateAppointment(BuildContext context, int branchId) async { Future<void> _updateAppointment(BuildContext context, int branchId) async {
await context.read<AppointmentsVM>().getProviderMyAppointments({ await context.read<AppointmentsVM>().getMyAppointmentsForProvider({
"ServiceProviderID": injector "ServiceProviderID": injector
.get<AppState>() .get<AppState>()
.getUser .getUser

@ -33,13 +33,8 @@ class UpdateAppointmentPage extends StatelessWidget {
body: SizedBox( body: SizedBox(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
child: Consumer(builder: (BuildContext context, child: Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
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 {
@ -72,11 +67,8 @@ class UpdateAppointmentPage extends StatelessWidget {
], ],
), ),
), ),
if (appointmentListModel.appointmentStatusEnum == if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.cancelled) "Appointment is Canceled".toText(),
AppointmentStatusEnum.cancelled) if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.booked)
"Appointment is Canceled".toText(),
if (appointmentListModel.appointmentStatusEnum ==
AppointmentStatusEnum.booked)
Column( Column(
children: [ children: [
showPayNowButton(context, appointmentsVM), showPayNowButton(context, appointmentsVM),
@ -85,20 +77,14 @@ class UpdateAppointmentPage extends StatelessWidget {
], ],
).paddingAll(21), ).paddingAll(21),
if (appointmentListModel.appointmentStatusEnum == if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.confirmed && appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.defaultStatus)
AppointmentStatusEnum.confirmed &&
appointmentListModel.appointmentPaymentStatusEnum ==
AppointmentPaymentStatusEnum.defaultStatus)
Column( Column(
children: [ children: [
showArrivedutton(context, appointmentsVM), showArrivedutton(context, appointmentsVM),
], ],
).paddingAll(21), ).paddingAll(21),
if (appointmentListModel.appointmentStatusEnum == if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.arrived && appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.defaultStatus)
AppointmentStatusEnum.arrived &&
appointmentListModel.appointmentPaymentStatusEnum ==
AppointmentPaymentStatusEnum.defaultStatus)
Column( Column(
children: [ children: [
showPayNowButton(context, appointmentsVM), showPayNowButton(context, appointmentsVM),
@ -107,32 +93,20 @@ class UpdateAppointmentPage extends StatelessWidget {
], ],
).paddingAll(21), ).paddingAll(21),
if ((appointmentListModel.appointmentStatusEnum == if ((appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.arrived || appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.workStarted) &&
AppointmentStatusEnum.arrived || appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.payNow)
appointmentListModel.appointmentStatusEnum == "Waiting for the payment from the customer".toText().paddingAll(21),
AppointmentStatusEnum.workStarted) &&
appointmentListModel.appointmentPaymentStatusEnum ==
AppointmentPaymentStatusEnum.payNow)
"Waiting for the payment from the customer"
.toText()
.paddingAll(21),
if (appointmentListModel.appointmentStatusEnum == if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.arrived &&
AppointmentStatusEnum.arrived && (appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.paid ||
(appointmentListModel.appointmentPaymentStatusEnum == appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.payLater))
AppointmentPaymentStatusEnum.paid ||
appointmentListModel.appointmentPaymentStatusEnum ==
AppointmentPaymentStatusEnum.payLater))
Column( Column(
children: [ children: [
showWorkStartButton(context, appointmentsVM), showWorkStartButton(context, appointmentsVM),
], ],
).paddingAll(21), ).paddingAll(21),
if (appointmentListModel.appointmentStatusEnum == if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.workStarted && appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.payPartial)
AppointmentStatusEnum.workStarted &&
appointmentListModel.appointmentPaymentStatusEnum ==
AppointmentPaymentStatusEnum.payPartial)
Column( Column(
children: [ children: [
showPayLaterButton(context, appointmentsVM), showPayLaterButton(context, appointmentsVM),
@ -142,25 +116,17 @@ class UpdateAppointmentPage extends StatelessWidget {
).paddingAll(21), ).paddingAll(21),
// "Show Pay Now".toText(), // "Show Pay Now".toText(),
if (appointmentListModel.appointmentStatusEnum == if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.workStarted && appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.paid)
AppointmentStatusEnum.workStarted &&
appointmentListModel.appointmentPaymentStatusEnum ==
AppointmentPaymentStatusEnum.paid)
Column( Column(
children: [ children: [
showCompleteButton(context, appointmentsVM), showCompleteButton(context, appointmentsVM),
], ],
).paddingAll(21), ).paddingAll(21),
// "Show Complete Button".toText(), // "Show Complete Button".toText(),
if (appointmentListModel.appointmentStatusEnum == if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.workStarted && appointmentListModel.appointmentPaymentStatusEnum == AppointmentPaymentStatusEnum.payLater)
AppointmentStatusEnum.workStarted &&
appointmentListModel.appointmentPaymentStatusEnum ==
AppointmentPaymentStatusEnum.payLater)
showPayNowButton(context, appointmentsVM).paddingAll(21), showPayNowButton(context, appointmentsVM).paddingAll(21),
if (appointmentListModel.appointmentStatusEnum == if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.visitCompleted) "Appointment is completed".toText().paddingAll(21),
AppointmentStatusEnum.visitCompleted)
"Appointment is completed".toText().paddingAll(21),
// Padding( // Padding(
// padding: const EdgeInsets.all(21.0), // padding: const EdgeInsets.all(21.0),
@ -203,17 +169,13 @@ class UpdateAppointmentPage extends StatelessWidget {
); );
} }
Widget showWorkStartButton( Widget showWorkStartButton(BuildContext context, AppointmentsVM appointmentsVM) {
BuildContext context, AppointmentsVM appointmentsVM) {
return ShowFillButton( return ShowFillButton(
title: "Work Start", title: "Work Start",
maxWidth: double.infinity, maxWidth: double.infinity,
onPressed: () async { onPressed: () async {
Utils.showLoading(context); Utils.showLoading(context);
await appointmentsVM.updateAppointmentStatus({ await appointmentsVM.updateAppointmentStatus({"appointmentID": appointmentListModel.id.toString(), "appointmentStatusID": 7});
"appointmentID": appointmentListModel.id.toString(),
"appointmentStatusID": 7
});
Utils.hideLoading(context); Utils.hideLoading(context);
// showMyBottomSheet( // showMyBottomSheet(
// context, // context,
@ -232,10 +194,7 @@ class UpdateAppointmentPage extends StatelessWidget {
maxWidth: double.infinity, maxWidth: double.infinity,
onPressed: () async { onPressed: () async {
Utils.showLoading(context); Utils.showLoading(context);
await appointmentsVM.updateAppointmentPaymentStatus({ await appointmentsVM.updateAppointmentPaymentStatus({"appointmentID": appointmentListModel.id.toString(), "appointmentServicePaymentStatusID": 2});
"appointmentID": appointmentListModel.id.toString(),
"appointmentServicePaymentStatusID": 2
});
_updateAppointment(context, appointmentListModel.branchId ?? 0); _updateAppointment(context, appointmentListModel.branchId ?? 0);
Utils.hideLoading(context); Utils.hideLoading(context);
}, },
@ -248,44 +207,33 @@ class UpdateAppointmentPage extends StatelessWidget {
maxWidth: double.infinity, maxWidth: double.infinity,
onPressed: () async { onPressed: () async {
Utils.showLoading(context); Utils.showLoading(context);
await appointmentsVM.updateAppointmentStatus({ await appointmentsVM.updateAppointmentStatus({"appointmentID": appointmentListModel.id.toString(), "appointmentStatusID": 3});
"appointmentID": appointmentListModel.id.toString(),
"appointmentStatusID": 3
});
_updateAppointment(context, appointmentListModel.branchId ?? 0); _updateAppointment(context, appointmentListModel.branchId ?? 0);
Utils.hideLoading(context); Utils.hideLoading(context);
}, },
); );
} }
Widget showPayLaterButton( Widget showPayLaterButton(BuildContext context, AppointmentsVM appointmentsVM) {
BuildContext context, AppointmentsVM appointmentsVM) {
return ShowFillButton( return ShowFillButton(
title: "Pay Later", title: "Pay Later",
maxWidth: double.infinity, maxWidth: double.infinity,
onPressed: () async { onPressed: () async {
Utils.showLoading(context); Utils.showLoading(context);
await appointmentsVM.updateAppointmentPaymentStatus({ await appointmentsVM.updateAppointmentPaymentStatus({"appointmentID": appointmentListModel.id.toString(), "appointmentServicePaymentStatusID": 4});
"appointmentID": appointmentListModel.id.toString(),
"appointmentServicePaymentStatusID": 4
});
_updateAppointment(context, appointmentListModel.branchId ?? 0); _updateAppointment(context, appointmentListModel.branchId ?? 0);
Utils.hideLoading(context); Utils.hideLoading(context);
}, },
); );
} }
Widget showCompleteButton( Widget showCompleteButton(BuildContext context, AppointmentsVM appointmentsVM) {
BuildContext context, AppointmentsVM appointmentsVM) {
return ShowFillButton( return ShowFillButton(
title: "Complete", title: "Complete",
maxWidth: double.infinity, maxWidth: double.infinity,
onPressed: () async { onPressed: () async {
Utils.showLoading(context); Utils.showLoading(context);
await appointmentsVM.updateAppointmentStatus({ await appointmentsVM.updateAppointmentStatus({"appointmentID": appointmentListModel.id.toString(), "appointmentStatusID": 8});
"appointmentID": appointmentListModel.id.toString(),
"appointmentStatusID": 8
});
_updateAppointment(context, appointmentListModel.branchId ?? 0); _updateAppointment(context, appointmentListModel.branchId ?? 0);
Utils.hideLoading(context); Utils.hideLoading(context);
}, },
@ -312,15 +260,8 @@ class UpdateAppointmentPage extends StatelessWidget {
} }
Future<void> _updateAppointment(BuildContext context, int branchId) async { Future<void> _updateAppointment(BuildContext context, int branchId) async {
await context.read<AppointmentsVM>().getProviderMyAppointments({ await context.read<AppointmentsVM>().getMyAppointmentsForProvider({
"ServiceProviderID": injector "ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0",
.get<AppState>()
.getUser
.data
?.userInfo
?.providerId
.toString() ??
"0",
"ProviderBranchID": branchId.toString(), "ProviderBranchID": branchId.toString(),
}, isNeedToRebuild: true); }, isNeedToRebuild: true);
} }

@ -44,29 +44,19 @@ class _DashboardPageState extends State<DashboardPage> {
super.initState(); super.initState();
dashboardVM = Provider.of<DashboardVM>(context, listen: false); dashboardVM = Provider.of<DashboardVM>(context, listen: false);
context.read<RequestsVM>().populateRequestsFilterList(); context.read<RequestsVM>().populateRequestsFilterList();
context.read<AppointmentsVM>().populateAppointmentsFilterList();
_onRefresh(); _onRefresh();
} }
Future<void> _onRefresh() async { Future<void> _onRefresh() async {
final requestsVM = context.read<RequestsVM>(); final requestsVM = context.read<RequestsVM>();
final chatVM = context.read<ChatVM>(); // final chatVM = context.read<ChatVM>();
// context.read<AdVM>().populateAdsFilterList(); // context.read<AdVM>().populateAdsFilterList();
context.read<ServiceVM>().getBranchAndServices(); context.read<ServiceVM>().getBranchAndServices();
AdVM adVm = Provider.of<AdVM>(context, listen: false); AdVM adVm = Provider.of<AdVM>(context, listen: false);
AppointmentsVM appointmentsVM = AppointmentsVM appointmentsVM = Provider.of<AppointmentsVM>(context, listen: false);
Provider.of<AppointmentsVM>(context, listen: false);
if (appointmentsVM.myAppointments.isEmpty) { if (appointmentsVM.myAppointments.isEmpty) {
await appointmentsVM.getProviderMyAppointments({ await appointmentsVM.getMyAppointmentsForProvider({"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0"});
"ServiceProviderID": injector
.get<AppState>()
.getUser
.data
?.userInfo
?.providerId
.toString() ??
"0"
});
} }
adVm.populateAdsFilterList(); adVm.populateAdsFilterList();
if (adVm.myAds.isEmpty) { if (adVm.myAds.isEmpty) {

@ -8,44 +8,29 @@ 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/appointments_view_model.dart'; import 'package:mc_common_app/view_models/appointments_view_model.dart';
import 'package:mc_common_app/views/appointments/widgets/customer_appointment_slider_widget.dart';
import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/tab/menu_tabs.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
import 'package:percent_indicator/percent_indicator.dart'; import 'package:percent_indicator/percent_indicator.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class AppointmentFragment extends StatelessWidget { class AppointmentFragment extends StatelessWidget {
String date = ""; String date = "";
VoidCallback onBackButtonTapped; final VoidCallback onBackButtonTapped;
AppointmentFragment({Key? key, required this.onBackButtonTapped}) AppointmentFragment({Key? key, required this.onBackButtonTapped}) : super(key: key);
: super(key: key);
GlobalKey<RefreshIndicatorState> refreshIndicatorKey = GlobalKey<RefreshIndicatorState> refreshIndicatorKey = GlobalKey<RefreshIndicatorState>();
GlobalKey<RefreshIndicatorState>();
Future<void> _pullRefresh(BuildContext context) async { Future<void> _pullRefresh(BuildContext context) async {
await context.read<AppointmentsVM>().getProviderMyAppointments({ 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"
});
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
context.read<AppointmentsVM>().setupProviderAppointmentFilter();
date = DateHelper.formatAsDayMonthYear(DateTime.now()); date = DateHelper.formatAsDayMonthYear(DateTime.now());
return Scaffold( return Scaffold(
appBar: CustomAppBar( appBar: CustomAppBar(
@ -63,8 +48,7 @@ class AppointmentFragment extends StatelessWidget {
body: SizedBox( body: SizedBox(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
child: Consumer(builder: (BuildContext context, child: Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
AppointmentsVM appointmentsVM, Widget? child) {
return RefreshIndicator( return RefreshIndicator(
onRefresh: () => _pullRefresh(context), onRefresh: () => _pullRefresh(context),
key: refreshIndicatorKey, key: refreshIndicatorKey,
@ -78,25 +62,20 @@ class AppointmentFragment extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 18), padding: const EdgeInsets.symmetric(horizontal: 18),
onFilterTapped: (index, selectedFilterId) { onFilterTapped: (index, selectedFilterId) {
appointmentsVM.applyFilterOnAppointmentsVM( appointmentsVM.applyFilterOnAppointmentsVM(
appointmentStatusEnum: appointmentStatusEnum: selectedFilterId.toAppointmentStatusEnum(),
selectedFilterId.toAppointmentStatusEnum(),
); );
}, },
), ),
ListView.separated( ListView.separated(
itemBuilder: (context, index) { itemBuilder: (context, index) {
return AppointmentSliderWidget( return AppointmentSliderWidget(
appointmentListModel: appointmentListModel: appointmentsVM.myFilteredAppointments2[index],
appointmentsVM.myFilteredAppointments2[index],
isNeedTotalPayment: false, isNeedTotalPayment: false,
onTap: () { onTap: () {
navigateWithName( navigateWithName(
context, context,
ProviderAppRoutes.appointmentDetailList, ProviderAppRoutes.appointmentDetailList,
arguments: appointmentsVM arguments: appointmentsVM.myFilteredAppointments2[index].customerAppointmentList,
.myFilteredAppointments2[index]
.customerAppointmentList,
); );
}, },
); );

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

Loading…
Cancel
Save