Updated both apps' structure

aamir_dev
Faiz Hashmi 1 year ago
parent 272dfe06f4
commit 7eeb3ed208

1
.gitignore vendored

@ -44,3 +44,4 @@ app.*.map.json
/android/app/debug
/android/app/profile
/android/app/release
/pubspec.lock

@ -76,10 +76,7 @@ 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.createAdView: (context) => const CreateAdView(),
//setting
// defineLicense: (context) => DefineLicensePage(),
dealershipSetting: (context) => DealershipPage(),
// branchList: (context) => BranchListPage(),
@ -100,7 +97,6 @@ class ProviderAppRoutes {
//Subscriptions
mySubscriptionsPage: (context) => const MySubscriptionsPage(),
subscriptionsPage: (context) => const SubscriptionsPage(),
AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(paymentType: ModalRoute.of(context)!.settings.arguments as PaymentTypes),
//Services
dealerUser: (context) => DealerUserPage(ModalRoute.of(context)!.settings.arguments as String),
@ -117,10 +113,5 @@ class ProviderAppRoutes {
//Branch Duplication
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),
//ADS:
AppRoutes.selectAdTypeView: (context) => SelectAdTypeView(isProvider: ModalRoute.of(context)!.settings.arguments as bool),
};
}

@ -10,11 +10,18 @@ import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/models/user_models/image_response.dart';
import 'package:mc_common_app/repositories/user_repo.dart';
import 'package:mc_common_app/services/common_services.dart';
import 'package:mc_common_app/services/firebase_service.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:provider/provider.dart';
import 'package:mc_common_app/utils/location/Location.dart';
import 'package:mc_common_app/utils/shared_prefrence.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/appointments_view_model.dart';
import 'package:mc_common_app/view_models/base_view_model.dart';
import 'package:mc_common_app/view_models/chat_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:mc_common_app/view_models/subscriptions_view_model.dart';
class DashboardVM extends BaseVM {
final CommonAppServices commonServices;
@ -27,7 +34,7 @@ class DashboardVM extends BaseVM {
int selectedNavbarBarIndex = 2;
void onNavbarTapped(int index) {
print(AppState().getDeviceToken);
logger.i(AppState().getDeviceToken);
selectedNavbarBarIndex = index;
notifyListeners();
}
@ -71,9 +78,53 @@ class DashboardVM extends BaseVM {
notifyListeners();
}
updateIndex(int i) async {
print(AppState().getDeviceToken);
selectedNavbarBarIndex = i;
notifyListeners();
Future<void> onRefresh(BuildContext context) async {
final requestsVM = context.read<RequestsVM>();
final chatVM = context.read<ChatVM>();
final appointmentVM = context.read<AppointmentsVM>();
final serviceVM = context.read<ServiceVM>();
final adVm = context.read<AdVM>();
final subscriptionsVM = context.read<SubscriptionsVM>();
requestsVM.populateRequestsFilterList();
appointmentVM.populateAppointmentsFilterList();
await serviceVM.getBranchAndServices();
await appointmentVM.getMyAppointmentsForProvider({"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0"});
adVm.populateAdsFilterList();
await chatVM.buildHubConnection(context);
await adVm.getMyAds();
await adVm.getExploreAds();
await adVm.getVehicleTypes();
await adVm.getVehicleAdsDuration();
await requestsVM.getRequests(appType: AppType.provider);
await subscriptionsVM.getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "");
await subscriptionsVM.getSubscriptionBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "", true);
// 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);
// }
//
// if (subscriptionsVM.mySubscriptionsBySp.isEmpty) {
// await subscriptionsVM.getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "");
// }
//
// if (subscriptionsVM.tempSubscriptions.isEmpty) {
// await subscriptionsVM.getSubscriptionBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "", true);
// }
}
}

@ -1,29 +1,13 @@
import 'dart:async';
import 'package:car_provider_app/view_models/dashboard_view_model.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:car_provider_app/views/dashboard/fragments/ads_fragment.dart';
import 'package:car_provider_app/views/dashboard/fragments/my_requests_fragment.dart';
import 'package:car_provider_app/views/settings/branch/branch_list_page.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/config/routes.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/appointments_view_model.dart';
import 'package:mc_common_app/view_models/chat_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/view_models/subscriptions_view_model.dart';
import 'package:mc_common_app/widgets/common_widgets/bottom_nav_bar.dart';
import 'package:provider/provider.dart';
import 'fragments/branch_appointment_fragment.dart';
import 'fragments/home_fragment.dart';
import 'package:mc_common_app/views/common_fragments/ads_fragment.dart';
import 'package:mc_common_app/views/common_fragments/my_requests_fragment.dart';
class DashboardPage extends StatefulWidget {
const DashboardPage({Key? key}) : super(key: key);
@ -40,103 +24,27 @@ class _DashboardPageState extends State<DashboardPage> {
void initState() {
super.initState();
dashboardVM = Provider.of<DashboardVM>(context, listen: false);
context.read<RequestsVM>().populateRequestsFilterList();
context.read<AppointmentsVM>().populateAppointmentsFilterList();
scheduleMicrotask(() => _onRefresh());
}
Future<void> _onRefresh() async {
final requestsVM = context.read<RequestsVM>();
final chatVM = context.read<ChatVM>();
await context.read<ServiceVM>().getBranchAndServices();
AdVM adVm = Provider.of<AdVM>(context, listen: false);
SubscriptionsVM sVM = Provider.of<SubscriptionsVM>(context, listen: false);
await context.read<AppointmentsVM>().getMyAppointmentsForProvider({"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0"});
adVm.populateAdsFilterList();
await chatVM.buildHubConnection(context);
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);
}
if (sVM.mySubscriptionsBySp.isEmpty) {
await sVM.getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "");
}
if (sVM.tempSubscriptions.isEmpty) {
await sVM.getSubscriptionBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "", true);
}
scheduleMicrotask(() => dashboardVM.onRefresh(context));
}
@override
Widget build(BuildContext context) {
List<Widget> fragments = [
BranchListPage(
onBackButtonTapped: () {
dashboardVM.updateIndex(2);
},
onRefresh: () async {
context.read<ServiceVM>().getBranchAndServices();
},
),
BranchAppointmentFragment(
onBackButtonTapped: () {
dashboardVM.updateIndex(2);
},
onRefresh: () async {
context.read<ServiceVM>().getBranchAndServices();
},
),
HomeFragment(
onTap: () {
navigateWithName(context, AppRoutes.settingOptionsLanguages);
},
onRefresh: () async {
_onRefresh();
},
onNotificaitonClick: () {
_onRefresh();
},
),
AdsFragment(
onBackButtonTapped: () {
dashboardVM.updateIndex(2);
},
),
MyRequestsFragment(
onBackButtonTapped: () {
dashboardVM.updateIndex(2);
},
),
const BranchListPage(),
const BranchAppointmentFragment(),
const HomeFragment(),
const AdsFragment(),
const MyRequestsFragment(),
];
return PopScope(
canPop: false,
child: Scaffold(
key: _scaffoldKey,
// drawer: CustomDrawer(dashboardVM: dashboardVM),
// body: Consumer<DashboardVM>(builder: (context, model, _) {
// return fragments[dashboardVM.selectedNavbarBarIndex];
// }),
body: fragments[context.watch<DashboardVM>().selectedNavbarBarIndex],
bottomNavigationBar: CustomBottomNavbar(
onSelected: (i) {
dashboardVM.updateIndex(i);
onSelected: (index) {
dashboardVM.onNavbarTapped(index);
},
isProvider: true,
selectedNavbarBarIndex: dashboardVM.selectedNavbarBarIndex,

@ -1,135 +1,136 @@
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/config/routes.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/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/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 {
final bool isNeedAppBar;
final VoidCallback onBackButtonTapped;
const AdsFragment({Key? key, this.isNeedAppBar = true, required this.onBackButtonTapped}) : super(key: key);
Future<void> onRefreshAds(BuildContext context) async {
AdVM adVM = context.read<AdVM>();
await adVM.getExploreAds();
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.ads.tr(),
onBackButtonTapped: onBackButtonTapped,
),
body: Container(
color: MyColors.backgroundColor,
width: double.infinity,
height: double.infinity,
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) ...[
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: getAdsList(adVM));
},
),
),
)
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
navigateWithName(context, AppRoutes.selectAdTypeView, arguments: injector.get<AppState>().currentAppType == AppType.provider);
},
backgroundColor: MyColors.darkPrimaryColor,
child: const Icon(Icons.add, color: MyColors.white),
),
);
}
}
// 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/dependency_injection.dart';
// import 'package:mc_common_app/config/routes.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/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/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 {
// const AdsFragment({Key? key}) : super(key: key);
//
// 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 Consumer(
// builder: (BuildContext context, AdVM adVM, Widget? child) {
// return Scaffold(
// appBar: CustomAppBar(
// title: LocaleKeys.ads.tr(),
// isRemoveBackButton: true,
// actions: [
// Padding(
// padding: EdgeInsets.only(top: adVM.adsFiltersCounter > 0 ? 20 : 0, right: 21),
// child: Badge(
// isLabelVisible: adVM.adsFiltersCounter > 0,
// largeSize: 15,
// smallSize: 20,
// backgroundColor: MyColors.darkPrimaryColor,
// label: Text('${adVM.adsFiltersCounter}'),
// child: MyAssets.searchIcon.buildSvg(),
// ),
// ).onPress(() {
// navigateWithName(context, AppRoutes.adsFilterView);
// })
// ],
// ),
// body: SizedBox(
// width: double.infinity,
// height: double.infinity,
// child: Column(
// children: [
// 16.height,
// Column(
// children: [
// Row(
// children: [
// Expanded(
// child: ShowFillButton(
// isFilled: adVM.isExploreAdsTapped,
// maxHeight: 55,
// title: LocaleKeys.exploreAds.tr(),
// txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
// onPressed: () {
// print("accessToken: ${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: LocaleKeys.myAds.tr(),
// 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),
// ] else ...[
// 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: () async {
// await adVM.getExploreAds();
// await adVM.getMyAds();
// },
// child: BuildAdsList(isAdsFragment: true, shouldShowAdStatus: !adVM.isExploreAdsTapped, adsList: getAdsList(adVM)),
// ),
// )
// ],
// ),
// ),
// floatingActionButton: FloatingActionButton(
// onPressed: () async {
// navigateWithName(context, AppRoutes.selectAdTypeView, arguments: injector.get<AppState>().currentAppType == AppType.provider);
// },
// backgroundColor: MyColors.darkPrimaryColor,
// child: const Icon(Icons.add, color: MyColors.white),
// ),
// );
// },
// );
// }
// }

@ -1,223 +1,222 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/views/dashboard/widget/appointment_slider_widget.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/dependency_injection.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/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/view_models/appointments_view_model.dart';
import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:percent_indicator/percent_indicator.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class AppointmentFragment extends StatelessWidget {
String date = "";
final VoidCallback onBackButtonTapped;
AppointmentFragment({Key? key, required this.onBackButtonTapped}) : super(key: key);
GlobalKey<RefreshIndicatorState> refreshIndicatorKey = GlobalKey<RefreshIndicatorState>();
Future<void> _pullRefresh(BuildContext context) async {
await context.read<AppointmentsVM>().getMyAppointmentsForProvider({"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0"});
}
@override
Widget build(BuildContext context) {
date = DateHelper.formatAsDayMonthYear(DateTime.now());
return Scaffold(
appBar: CustomAppBar(
//profileImageUrl: MyAssets.carBanner,
title: LocaleKeys.appointments.tr(),
onBackButtonTapped: onBackButtonTapped,
actions: [
IconButton(
onPressed: () {},
icon: const Icon(Icons.search),
),
10.width,
],
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
return RefreshIndicator(
onRefresh: () => _pullRefresh(context),
key: refreshIndicatorKey,
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
child: Column(
children: [
progressWidget(context),
FiltersList(
filterList: appointmentsVM.appointmentsFilterOptions,
padding: const EdgeInsets.symmetric(horizontal: 18),
onFilterTapped: (index, selectedFilterId) {
appointmentsVM.applyFilterOnAppointmentsVM(
appointmentStatusEnum: selectedFilterId.toAppointmentStatusEnum(),
);
},
),
ListView.separated(
itemBuilder: (context, index) {
return AppointmentSliderWidget(
appointmentListModel: appointmentsVM.myFilteredAppointments2[index],
isNeedTotalPayment: false,
onTap: () {
navigateWithName(
context,
ProviderAppRoutes.appointmentDetailList,
arguments: appointmentsVM.myFilteredAppointments2[index].customerAppointmentList,
);
},
);
},
separatorBuilder: (context, snapchat) {
return 21.height;
},
itemCount: appointmentsVM.myFilteredAppointments2.length,
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
padding: const EdgeInsets.all(21),
),
],
),
),
);
}),
),
);
}
Widget progressWidget(BuildContext context) {
return Column(
children: [
Row(
children: [
Expanded(
child: "Slots Overview".toText(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
Row(
children: [
date.toText(
fontWeight: FontWeight.bold,
),
const Icon(
Icons.keyboard_arrow_down_outlined,
size: 16,
),
],
)
.toContainer(
backgroundColor: MyColors.lightGreyEAColor,
borderRadius: 100,
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 6,
),
)
.onPress(() async {
date = await Utils.pickDateFromDatePicker(
context,
firstDate: null,
);
context.read<AppointmentsVM>().notifyListeners();
}),
],
),
24.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
width: 14,
height: 14,
color: MyColors.lightGreyEAColor,
),
4.width,
"Empty: ".toText(
fontSize: 8,
color: Colors.white,
),
"8".toText(
fontSize: 9,
fontWeight: FontWeight.bold,
color: Colors.white,
),
],
).toContainer(
backgroundColor: MyColors.darkIconColor,
),
8.height,
Row(
children: [
Container(
width: 14,
height: 14,
color: MyColors.darkPrimaryColor,
),
4.width,
"Occupied: ".toText(
fontSize: 8,
color: Colors.white,
),
"54".toText(
fontSize: 9,
fontWeight: FontWeight.bold,
color: Colors.white,
),
],
).toContainer(
backgroundColor: MyColors.darkIconColor,
),
],
),
CircularPercentIndicator(
radius: 60.0,
lineWidth: 12.0,
percent: 0.7,
circularStrokeCap: CircularStrokeCap.round,
center: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
"Total Slots".toText(
fontSize: 13,
fontWeight: FontWeight.bold,
),
"24".toText(
fontSize: 24,
fontWeight: FontWeight.bold,
),
],
),
backgroundColor: MyColors.lightGreyEAColor,
progressColor: MyColors.darkPrimaryColor,
),
],
)
],
).toWhiteContainer(
width: double.infinity,
pading: const EdgeInsets.all(12),
margin: const EdgeInsets.all(21),
);
}
}
// import 'package:car_provider_app/config/provider_routes.dart';
// import 'package:car_provider_app/views/dashboard/widget/appointment_slider_widget.dart';
// import 'package:mc_common_app/classes/app_state.dart';
// import 'package:mc_common_app/config/dependency_injection.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/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/view_models/appointments_view_model.dart';
// import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
// import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
// import 'package:flutter/material.dart';
// import 'package:mc_common_app/extensions/int_extensions.dart';
// import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
// import 'package:percent_indicator/percent_indicator.dart';
// import 'package:provider/provider.dart';
// import 'package:easy_localization/easy_localization.dart';
//
// class AppointmentFragment extends StatelessWidget {
// String date = "";
// final VoidCallback onBackButtonTapped;
//
// AppointmentFragment({Key? key, required this.onBackButtonTapped}) : super(key: key);
//
// GlobalKey<RefreshIndicatorState> refreshIndicatorKey = GlobalKey<RefreshIndicatorState>();
//
// Future<void> _pullRefresh(BuildContext context) async {
// await context.read<AppointmentsVM>().getMyAppointmentsForProvider({"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0"});
// }
//
// @override
// Widget build(BuildContext context) {
// date = DateHelper.formatAsDayMonthYear(DateTime.now());
// return Scaffold(
// appBar: CustomAppBar(
// //profileImageUrl: MyAssets.carBanner,
// title: LocaleKeys.appointments.tr(),
// onBackButtonTapped: onBackButtonTapped,
// actions: [
// IconButton(
// onPressed: () {},
// icon: const Icon(Icons.search),
// ),
// 10.width,
// ],
// ),
// body: SizedBox(
// width: double.infinity,
// height: double.infinity,
// child: Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
// return RefreshIndicator(
// onRefresh: () => _pullRefresh(context),
// key: refreshIndicatorKey,
// child: SingleChildScrollView(
// physics: const AlwaysScrollableScrollPhysics(),
// child: Column(
// children: [
// progressWidget(context),
// FiltersList(
// filterList: appointmentsVM.appointmentsFilterOptions,
// padding: const EdgeInsets.symmetric(horizontal: 18),
// onFilterTapped: (index, selectedFilterId) {
// appointmentsVM.applyFilterOnAppointmentsVM(
// appointmentStatusEnum: selectedFilterId.toAppointmentStatusEnum(),
// );
// },
// ),
// ListView.separated(
// itemBuilder: (context, index) {
// return AppointmentSliderWidget(
// appointmentListModel: appointmentsVM.myFilteredAppointments2[index],
// isNeedTotalPayment: false,
// onTap: () {
// navigateWithName(
// context,
// ProviderAppRoutes.appointmentDetailList,
// arguments: appointmentsVM.myFilteredAppointments2[index].customerAppointmentList,
// );
// },
// );
// },
// separatorBuilder: (context, snapchat) {
// return 21.height;
// },
// itemCount: appointmentsVM.myFilteredAppointments2.length,
// physics: const NeverScrollableScrollPhysics(),
// shrinkWrap: true,
// padding: const EdgeInsets.all(21),
// ),
// ],
// ),
// ),
// );
// }),
// ),
// );
// }
//
// Widget progressWidget(BuildContext context) {
// return Column(
// children: [
// Row(
// children: [
// Expanded(
// child: "Slots Overview".toText(
// fontSize: 16,
// fontWeight: FontWeight.bold,
// ),
// ),
// Row(
// children: [
// date.toText(
// fontWeight: FontWeight.bold,
// ),
// const Icon(
// Icons.keyboard_arrow_down_outlined,
// size: 16,
// ),
// ],
// )
// .toContainer(
// backgroundColor: MyColors.lightGreyEAColor,
// borderRadius: 100,
// padding: const EdgeInsets.symmetric(
// horizontal: 12,
// vertical: 6,
// ),
// )
// .onPress(() async {
// date = await Utils.pickDateFromDatePicker(
// context,
// firstDate: null,
// );
// context.read<AppointmentsVM>().notifyListeners();
// }),
// ],
// ),
// 24.height,
// Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Row(
// children: [
// Container(
// width: 14,
// height: 14,
// color: MyColors.lightGreyEAColor,
// ),
// 4.width,
// "Empty: ".toText(
// fontSize: 8,
// color: Colors.white,
// ),
// "8".toText(
// fontSize: 9,
// fontWeight: FontWeight.bold,
// color: Colors.white,
// ),
// ],
// ).toContainer(
// backgroundColor: MyColors.darkIconColor,
// ),
// 8.height,
// Row(
// children: [
// Container(
// width: 14,
// height: 14,
// color: MyColors.darkPrimaryColor,
// ),
// 4.width,
// "Occupied: ".toText(
// fontSize: 8,
// color: Colors.white,
// ),
// "54".toText(
// fontSize: 9,
// fontWeight: FontWeight.bold,
// color: Colors.white,
// ),
// ],
// ).toContainer(
// backgroundColor: MyColors.darkIconColor,
// ),
// ],
// ),
// CircularPercentIndicator(
// radius: 60.0,
// lineWidth: 12.0,
// percent: 0.7,
// circularStrokeCap: CircularStrokeCap.round,
// center: Column(
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// "Total Slots".toText(
// fontSize: 13,
// fontWeight: FontWeight.bold,
// ),
// "24".toText(
// fontSize: 24,
// fontWeight: FontWeight.bold,
// ),
// ],
// ),
// backgroundColor: MyColors.lightGreyEAColor,
// progressColor: MyColors.darkPrimaryColor,
// ),
// ],
// )
// ],
// ).toWhiteContainer(
// width: double.infinity,
// pading: const EdgeInsets.all(12),
// margin: const EdgeInsets.all(21),
// );
// }
// }

@ -20,26 +20,17 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:easy_localization/easy_localization.dart';
class BranchAppointmentFragment extends StatelessWidget {
bool isNeedAppBar;
VoidCallback onBackButtonTapped;
RefreshCallback onRefresh;
BranchAppointmentFragment({
const BranchAppointmentFragment({
Key? key,
this.isNeedAppBar = true,
required this.onBackButtonTapped,
required this.onRefresh,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: !isNeedAppBar
? null
: CustomAppBar(
title: LocaleKeys.appointments.tr(),
onBackButtonTapped: onBackButtonTapped,
),
appBar: CustomAppBar(
title: LocaleKeys.appointments.tr(),
isRemoveBackButton: true,
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
@ -48,9 +39,7 @@ class BranchAppointmentFragment extends StatelessWidget {
Padding(
padding: const EdgeInsets.only(left: 21, right: 21, top: 21),
child: RoleTypeTab(
context.watch<ServiceVM>().selectedBranchStatus == 3
? 0
: context.watch<ServiceVM>().selectedBranchStatus,
context.watch<ServiceVM>().selectedBranchStatus == 3 ? 0 : context.watch<ServiceVM>().selectedBranchStatus,
[
DropValue(3, "Active", ""),
DropValue(1, "Requested", ""),
@ -62,19 +51,16 @@ class BranchAppointmentFragment extends StatelessWidget {
),
Expanded(
child: Consumer<ServiceVM>(
builder: (context, model, _) {
if (model.state == ViewState.busy) {
builder: (context, ServiceVM serviceVM, _) {
if (serviceVM.state == ViewState.busy) {
return const Center(child: CircularProgressIndicator());
} else {
List<BranchDetailModel> branches = [];
if (model.branches!.data != null) {
branches = model.branches!.data!.serviceProviderBranch!
.where((element) =>
model.selectedBranchStatus == element.statusId)
.toList();
if (serviceVM.branches!.data != null) {
branches = serviceVM.branches!.data!.serviceProviderBranch!.where((element) => serviceVM.selectedBranchStatus == element.statusId).toList();
}
return RefreshIndicator(
onRefresh: onRefresh,
onRefresh: () async => serviceVM.getBranchAndServices(),
child: branches.isEmpty
? Center(child: Text(LocaleKeys.noBranchFound.tr()))
: ListView.separated(
@ -86,8 +72,7 @@ class BranchAppointmentFragment extends StatelessWidget {
height: 50,
decoration: const BoxDecoration(
color: MyColors.darkPrimaryColor,
borderRadius:
BorderRadius.all(Radius.circular(8)),
borderRadius: BorderRadius.all(Radius.circular(8)),
),
padding: const EdgeInsets.all(6),
child: SvgPicture.asset(
@ -98,10 +83,8 @@ class BranchAppointmentFragment extends StatelessWidget {
12.width,
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(
children: [
@ -110,24 +93,12 @@ class BranchAppointmentFragment extends StatelessWidget {
size: 12,
color: MyColors.darkPrimaryColor,
),
Geolocator.distanceBetween(
AppState()
.currentLocation
.latitude,
AppState()
.currentLocation
.latitude,
double.parse(branches[index]
.latitude ??
"0"),
double.parse(branches[index]
.longitude ??
"0"))
Geolocator.distanceBetween(AppState().currentLocation.latitude, AppState().currentLocation.latitude, double.parse(branches[index].latitude ?? "0"),
double.parse(branches[index].longitude ?? "0"))
.toStringAsFixed(2)
.toText(
fontSize: 12,
color:
MyColors.darkPrimaryColor,
color: MyColors.darkPrimaryColor,
)
],
),
@ -138,22 +109,16 @@ class BranchAppointmentFragment extends StatelessWidget {
fontWeight: FontWeight.bold,
),
),
"Tap to view".toText(
fontSize: 10,
color: MyColors.grey70Color),
"Tap to view".toText(fontSize: 10, color: MyColors.grey70Color),
],
),
),
12.width,
],
).toContainer().onPress(() async {
branches[index].countryID =
model.branches!.data!.countryID;
branches[index].countryName =
model.branches!.data!.countryName;
navigateWithName(
context, ProviderAppRoutes.appointment,
arguments: branches[index]);
branches[index].countryID = serviceVM.branches!.data!.countryID;
branches[index].countryName = serviceVM.branches!.data!.countryName;
navigateWithName(context, ProviderAppRoutes.appointment, arguments: branches[index]);
});
},
separatorBuilder: (context, index) {

@ -2,9 +2,7 @@ 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/views/dashboard/widget/my_service_provider.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.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/extensions/int_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart';
@ -12,11 +10,8 @@ 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/appointments_view_model.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:mc_common_app/views/advertisement/ads_list.dart';
import 'package:mc_common_app/views/appointments/widgets/customer_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/view_all_widget.dart';
import 'package:badges/badges.dart' as b;
@ -24,13 +19,8 @@ import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
import '../widget/appointment_slider_widget.dart';
class HomeFragment extends StatelessWidget {
VoidCallback onTap, onNotificaitonClick;
RefreshCallback onRefresh;
HomeFragment({required this.onTap, required this.onRefresh, required this.onNotificaitonClick, Key? key}) : super(key: key);
const HomeFragment({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -38,10 +28,14 @@ class HomeFragment extends StatelessWidget {
appBar: CustomAppBar(
isDrawerEnabled: true,
leadingWidth: 100,
onTap: onTap,
onTap: () {
navigateWithName(context, AppRoutes.settingOptionsLanguages);
},
actions: [
IconButton(
onPressed: onNotificaitonClick,
onPressed: () {
context.read<DashboardVM>().onRefresh(context);
},
icon: const b.Badge(
badgeContent: Text(
'3',
@ -64,7 +58,9 @@ class HomeFragment extends StatelessWidget {
width: double.infinity,
height: double.infinity,
child: RefreshIndicator(
onRefresh: onRefresh,
onRefresh: () async {
await context.read<DashboardVM>().onRefresh(context);
},
child: ListView(
children: [
10.height,
@ -72,10 +68,10 @@ class HomeFragment extends StatelessWidget {
title: LocaleKeys.upcoming_appointment.tr(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVM>().updateIndex(1);
context.read<DashboardVM>().onNavbarTapped(1);
}).horPaddingMain(),
// const AppointmentSliderWidget().horPaddingMain(),
CustomerAppointmentSliderWidget(
CommonAppointmentSliderWidget(
onAppointmentClick: (AppointmentListModel value) {
navigateWithName(context, ProviderAppRoutes.appointmentDetailList, arguments: value);
},
@ -85,7 +81,7 @@ class HomeFragment extends StatelessWidget {
title: LocaleKeys.myBranches.tr(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVM>().updateIndex(0);
context.read<DashboardVM>().onNavbarTapped(0);
},
).horPaddingMain(),
const ServiceProviderWidget().horPaddingMain(),

@ -1,74 +1,68 @@
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/views/requests/widget/request_item.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:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class MyRequestsFragment extends StatelessWidget {
final bool isNeedAppBar;
VoidCallback onBackButtonTapped;
MyRequestsFragment({super.key, this.isNeedAppBar = true, required this.onBackButtonTapped});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: !isNeedAppBar
? null
: CustomAppBar(
title: LocaleKeys.myServiceBranches.tr(),
onBackButtonTapped: onBackButtonTapped,
),
body: Container(
color: MyColors.backgroundColor,
width: double.infinity,
height: double.infinity,
child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) {
return Column(
children: [
16.height,
FiltersList(
filterList: requestsVM.requestsTypeFilterOptions,
onFilterTapped: (index, selectedFilterId) {
requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeStatusEnum());
},
),
8.height,
Expanded(
child: RefreshIndicator(
onRefresh: () async => await requestsVM.getRequests(isNeedToRebuild: true, appType: AppType.provider),
child: requestsVM.state == ViewState.busy
? const Center(child: CircularProgressIndicator())
: requestsVM.myFilteredRequests.isEmpty
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
],
)
: ListView.separated(
itemBuilder: (context, index) {
return RequestItem(request: requestsVM.myFilteredRequests[index], appType: AppType.provider, requestIndex: index);
},
separatorBuilder: (context, index) {
return 16.height;
},
itemCount: requestsVM.myFilteredRequests.length,
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8),
),
))
],
);
}),
),
);
}
}
// import 'package:mc_common_app/generated/locale_keys.g.dart';
// import 'package:mc_common_app/view_models/requests_view_model.dart';
// import 'package:flutter/material.dart';
// import 'package:mc_common_app/extensions/int_extensions.dart';
// import 'package:mc_common_app/extensions/string_extensions.dart';
// import 'package:mc_common_app/theme/colors.dart';
// import 'package:mc_common_app/utils/enums.dart';
// import 'package:mc_common_app/views/requests/widget/request_item.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:provider/provider.dart';
// import 'package:easy_localization/easy_localization.dart';
//
// class MyRequestsFragment extends StatelessWidget {
// const MyRequestsFragment({super.key});
//
// @override
// Widget build(BuildContext context) {
// return Scaffold(
// appBar: CustomAppBar(
// title: LocaleKeys.myRequests.tr(),
// isRemoveBackButton: true,
// ),
// body: Container(
// color: MyColors.backgroundColor,
// width: double.infinity,
// height: double.infinity,
// child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) {
// return Column(
// children: [
// 16.height,
// FiltersList(
// filterList: requestsVM.requestsTypeFilterOptions,
// onFilterTapped: (index, selectedFilterId) {
// requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeStatusEnum());
// },
// ),
// 8.height,
// Expanded(
// child: RefreshIndicator(
// onRefresh: () async => await requestsVM.getRequests(isNeedToRebuild: true, appType: AppType.provider),
// child: requestsVM.state == ViewState.busy
// ? const Center(child: CircularProgressIndicator())
// : requestsVM.myFilteredRequests.isEmpty
// ? Column(
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
// ],
// )
// : ListView.separated(
// itemBuilder: (context, index) {
// return RequestItem(request: requestsVM.myFilteredRequests[index], appType: AppType.provider, requestIndex: index);
// },
// separatorBuilder: (context, index) {
// return 16.height;
// },
// itemCount: requestsVM.myFilteredRequests.length,
// padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8),
// ),
// ))
// ],
// );
// }),
// ),
// );
// }
// }

@ -10,46 +10,38 @@ import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:flutter_svg/flutter_svg.dart';
class AppointmentSliderWidget extends StatelessWidget {
AppointmentListModel appointmentListModel;
bool isNeedTotalPayment;
bool isNeedToShowItems;
bool isNeedToShowToMoreText;
bool isSelectable;
bool isNeedToShowAppointmentStatus;
bool isNeedToShowMergeStatus;
Function()? onTap;
final AppointmentListModel appointmentListModel;
final bool isNeedTotalPayment;
final bool isNeedToShowItems;
final bool isNeedToShowToMoreText;
final bool isSelectable;
final bool isNeedToShowAppointmentStatus;
final bool isNeedToShowMergeStatus;
final Function()? onTap;
AppointmentSliderWidget(
{required this.appointmentListModel,
required this.onTap,
this.isNeedTotalPayment = false,
this.isNeedToShowItems = false,
this.isNeedToShowToMoreText = true,
this.isSelectable = false,
this.isNeedToShowAppointmentStatus = false,
this.isNeedToShowMergeStatus = false,
Key? key})
: super(key: key);
const AppointmentSliderWidget({
required this.appointmentListModel,
required this.onTap,
this.isNeedTotalPayment = false,
this.isNeedToShowItems = false,
this.isNeedToShowToMoreText = true,
this.isSelectable = false,
this.isNeedToShowAppointmentStatus = false,
this.isNeedToShowMergeStatus = false,
Key? key,
}) : super(key: key);
List<Widget> buildServicesFromAppointment(
{required AppointmentListModel appointmentListModel}) {
if (appointmentListModel.appointmentServicesList == null ||
appointmentListModel.appointmentServicesList!.isEmpty) {
return [SizedBox()];
List<Widget> buildServicesFromAppointment({required AppointmentListModel appointmentListModel}) {
if (appointmentListModel.appointmentServicesList == null || appointmentListModel.appointmentServicesList!.isEmpty) {
return [const SizedBox()];
}
if (appointmentListModel.appointmentServicesList!.length == 1) {
List<Widget> itemsList = [];
if (isNeedToShowItems) {
itemsList = List.generate(
appointmentListModel
.appointmentServicesList?.first.serviceItems?.length ??
0,
(index) => (appointmentListModel.appointmentServicesList?.first
.serviceItems?[index].name ??
"")
.toString()
.toText(
appointmentListModel.appointmentServicesList?.first.serviceItems?.length ?? 0,
(index) => (appointmentListModel.appointmentServicesList?.first.serviceItems?[index].name ?? "").toString().toText(
color: MyColors.lightTextColor,
isBold: true,
),
@ -61,8 +53,7 @@ class AppointmentSliderWidget extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start,
children: [
showServices(
appointmentListModel
.appointmentServicesList![0].providerServiceDescription,
appointmentListModel.appointmentServicesList![0].providerServiceDescription,
MyAssets.modificationsIcon,
),
if (isNeedToShowItems) ...itemsList,
@ -72,41 +63,30 @@ class AppointmentSliderWidget extends StatelessWidget {
}
List<Widget> servicesList = List.generate(
isNeedToShowToMoreText
? 2
: appointmentListModel.appointmentServicesList?.length ?? 0,
isNeedToShowToMoreText ? 2 : appointmentListModel.appointmentServicesList?.length ?? 0,
(index) {
List<Widget> itemsList = [];
if (isNeedToShowItems) {
itemsList = List.generate(
appointmentListModel
.appointmentServicesList?[index].serviceItems?.length ??
0,
(mIndex) =>
(" - ${appointmentListModel.appointmentServicesList?[index].serviceItems?[mIndex].name ?? ""}")
.toString()
.toText(
color: MyColors.lightTextColor,
isBold: true,
),
appointmentListModel.appointmentServicesList?[index].serviceItems?.length ?? 0,
(mIndex) => (" - ${appointmentListModel.appointmentServicesList?[index].serviceItems?[mIndex].name ?? ""}").toString().toText(
color: MyColors.lightTextColor,
isBold: true,
),
);
}
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
showServices(
appointmentListModel
.appointmentServicesList![index].providerServiceDescription,
MyAssets.modificationsIcon),
showServices(appointmentListModel.appointmentServicesList![index].providerServiceDescription, MyAssets.modificationsIcon),
if (isNeedToShowItems) ...itemsList,
],
).paddingOnly(bottom: 4);
},
);
if (isNeedToShowToMoreText &&
appointmentListModel.appointmentServicesList!.length > 1) {
if (isNeedToShowToMoreText && appointmentListModel.appointmentServicesList!.length > 1) {
servicesList.add(
showServices(
"+ ${appointmentListModel.appointmentServicesList!.length - 1} More",
@ -133,9 +113,7 @@ class AppointmentSliderWidget extends StatelessWidget {
borderRadius: 24,
marginAll: 4,
paddingAll: 0,
backgroundColor: (appointmentListModel.isSelected ?? false)
? MyColors.primaryColor
: MyColors.greyButtonColor,
backgroundColor: (appointmentListModel.isSelected ?? false) ? MyColors.primaryColor : MyColors.greyButtonColor,
),
).toContainer(
borderRadius: 24,
@ -152,8 +130,7 @@ class AppointmentSliderWidget extends StatelessWidget {
children: [
if (isNeedToShowMergeStatus)
"Appointment Merged".toText(color: MyColors.white).toContainer(
padding: const EdgeInsets.symmetric(
horizontal: 6, vertical: 3),
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 3),
borderRadius: 12,
backgroundColor: MyColors.greenColor,
),
@ -171,17 +148,14 @@ class AppointmentSliderWidget extends StatelessWidget {
color: MyColors.darkTextColor,
isBold: true,
),
(appointmentListModel.customerName ?? "").toText(
color: MyColors.black, isBold: true, fontSize: 16),
(appointmentListModel.customerName ?? "").toText(color: MyColors.black, isBold: true, fontSize: 16),
Row(
children: [
"Phone:".toText(
color: MyColors.lightTextColor,
),
2.width,
appointmentListModel.customerMobileNum
.toString()
.toText(
appointmentListModel.customerMobileNum.toString().toText(
fontSize: 12,
),
],
@ -195,9 +169,7 @@ class AppointmentSliderWidget extends StatelessWidget {
),
2.width,
Expanded(
child:
"${appointmentListModel.duration ?? ""} ${appointmentListModel.appointmentDate!.toFormattedDateWithoutTime()}"
.toText(
child: "${appointmentListModel.duration ?? ""} ${appointmentListModel.appointmentDate!.toFormattedDateWithoutTime()}".toText(
fontSize: 12,
),
),
@ -209,9 +181,7 @@ class AppointmentSliderWidget extends StatelessWidget {
color: MyColors.lightTextColor,
),
2.width,
appointmentListModel.appointmentType
.toString()
.toText(
appointmentListModel.appointmentType.toString().toText(
fontSize: 12,
),
],
@ -220,8 +190,7 @@ class AppointmentSliderWidget extends StatelessWidget {
),
),
if (!isNeedTotalPayment)
if (appointmentListModel.customerAppointmentList!.length >
1)
if (appointmentListModel.customerAppointmentList!.length > 1)
"${appointmentListModel.customerAppointmentList!.length - 1}+ Appointments"
.toText(
fontSize: 8,
@ -235,12 +204,8 @@ class AppointmentSliderWidget extends StatelessWidget {
),
),
if (isNeedToShowAppointmentStatus)
(appointmentListModel.appointmentStatusEnum!
.getAppointmentNameFromEnum())
.toText(color: MyColors.white)
.toContainer(
padding: const EdgeInsets.symmetric(
horizontal: 6, vertical: 3),
(appointmentListModel.appointmentStatusEnum!.getAppointmentNameFromEnum()).toText(color: MyColors.white).toContainer(
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 3),
borderRadius: 12,
backgroundColor: MyColors.primaryColor,
),
@ -253,8 +218,7 @@ class AppointmentSliderWidget extends StatelessWidget {
Expanded(
child: Column(
children: [
...buildServicesFromAppointment(
appointmentListModel: appointmentListModel),
...buildServicesFromAppointment(appointmentListModel: appointmentListModel),
if (isNeedTotalPayment)
Column(
children: [
@ -271,9 +235,7 @@ class AppointmentSliderWidget extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
appointmentListModel.totalAmount
.toString()
.toText(fontSize: 16, isBold: true),
appointmentListModel.totalAmount.toString().toText(fontSize: 16, isBold: true),
2.width,
"SAR:".toText(
color: MyColors.lightTextColor,
@ -295,9 +257,7 @@ class AppointmentSliderWidget extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
appointmentListModel.remainingAmount
.toString()
.toText(fontSize: 16, isBold: true),
appointmentListModel.remainingAmount.toString().toText(fontSize: 16, isBold: true),
2.width,
"SAR:".toText(
color: MyColors.lightTextColor,
@ -326,11 +286,11 @@ class AppointmentSliderWidget extends StatelessWidget {
double calculateTotalPrice() {
double totalServiceListPrice = 0;
appointmentListModel.appointmentServicesList!.forEach((servicesElement) {
servicesElement.serviceItems!.forEach((itemsElement) {
for (var servicesElement in appointmentListModel.appointmentServicesList!) {
for (var itemsElement in servicesElement.serviceItems!) {
totalServiceListPrice += double.parse(itemsElement.price ?? "0");
});
});
}
}
return totalServiceListPrice;
}

@ -26,35 +26,14 @@ import 'package:mc_common_app/widgets/tab/role_type_tab.dart';
import 'package:provider/provider.dart';
class BranchListPage extends StatelessWidget {
bool isNeedAppBar;
VoidCallback onBackButtonTapped;
RefreshCallback onRefresh;
BranchListPage(
{Key? key,
this.isNeedAppBar = true,
required this.onRefresh,
required this.onBackButtonTapped})
: super(key: key);
const BranchListPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: !isNeedAppBar
? null
: CustomAppBar(
title: LocaleKeys.myServiceBranches.tr(),
onBackButtonTapped: onBackButtonTapped,
),
floatingActionButton: FloatingActionButton(
backgroundColor: MyColors.darkPrimaryColor,
child: const Icon(
Icons.add,
color: Colors.white,
),
onPressed: () async {
await navigateWithName(context, ProviderAppRoutes.defineBranch);
},
appBar: CustomAppBar(
title: LocaleKeys.myBranches.tr(),
isRemoveBackButton: true,
),
body: SizedBox(
width: double.infinity,
@ -64,9 +43,7 @@ class BranchListPage extends StatelessWidget {
Padding(
padding: const EdgeInsets.only(left: 21, right: 21, top: 21),
child: RoleTypeTab(
context.watch<ServiceVM>().selectedBranchStatus == 3
? 0
: context.watch<ServiceVM>().selectedBranchStatus,
context.watch<ServiceVM>().selectedBranchStatus == 3 ? 0 : context.watch<ServiceVM>().selectedBranchStatus,
[
DropValue(3, "Active", ""),
DropValue(1, "Requested", ""),
@ -84,13 +61,12 @@ class BranchListPage extends StatelessWidget {
} else {
List<BranchDetailModel> branches = [];
if (model.branches!.data != null) {
branches = model.branches!.data!.serviceProviderBranch!
.where((element) =>
model.selectedBranchStatus == element.statusId)
.toList();
branches = model.branches!.data!.serviceProviderBranch!.where((element) => model.selectedBranchStatus == element.statusId).toList();
}
return RefreshIndicator(
onRefresh: onRefresh,
onRefresh: () async {
await context.read<ServiceVM>().getBranchAndServices();
},
child: branches.isEmpty
? Center(child: Text(LocaleKeys.no_branch.tr()))
: ListView.separated(
@ -102,8 +78,7 @@ class BranchListPage extends StatelessWidget {
height: 50,
decoration: const BoxDecoration(
color: MyColors.darkPrimaryColor,
borderRadius:
BorderRadius.all(Radius.circular(8)),
borderRadius: BorderRadius.all(Radius.circular(8)),
),
padding: const EdgeInsets.all(6),
child: SvgPicture.asset(
@ -114,10 +89,8 @@ class BranchListPage extends StatelessWidget {
12.width,
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(
children: [
@ -126,24 +99,12 @@ class BranchListPage extends StatelessWidget {
size: 12,
color: MyColors.darkPrimaryColor,
),
Geolocator.distanceBetween(
AppState()
.currentLocation
.latitude,
AppState()
.currentLocation
.latitude,
double.parse(branches[index]
.latitude ??
"0"),
double.parse(branches[index]
.longitude ??
"0"))
Geolocator.distanceBetween(AppState().currentLocation.latitude, AppState().currentLocation.latitude, double.parse(branches[index].latitude ?? "0"),
double.parse(branches[index].longitude ?? "0"))
.toStringAsFixed(2)
.toText(
fontSize: 12,
color:
MyColors.darkPrimaryColor,
color: MyColors.darkPrimaryColor,
)
],
),
@ -154,9 +115,7 @@ class BranchListPage extends StatelessWidget {
fontWeight: FontWeight.bold,
),
),
LocaleKeys.tapToEdit.tr().toText(
fontSize: 10,
color: MyColors.grey70Color),
LocaleKeys.tapToEdit.tr().toText(fontSize: 10, color: MyColors.grey70Color),
],
),
),
@ -164,20 +123,12 @@ class BranchListPage extends StatelessWidget {
IconButton(
onPressed: () async {
Utils.showLoading(context);
MResponse res = await model.updateBranch(
branches[index].id ?? 0,
branches[index].branchName ?? "",
branches[index].branchDescription ??
"",
branches[index].cityId.toString(),
branches[index].address ?? "",
branches[index].latitude.toString(),
branches[index].longitude.toString(),
MResponse res = await model.updateBranch(branches[index].id ?? 0, branches[index].branchName ?? "", branches[index].branchDescription ?? "",
branches[index].cityId.toString(), branches[index].address ?? "", branches[index].latitude.toString(), branches[index].longitude.toString(),
isNeedToDelete: false);
Utils.hideLoading(context);
if (res.messageStatus == 1) {
Utils.showToast(
LocaleKeys.branch_deleted.tr());
Utils.showToast(LocaleKeys.branch_deleted.tr());
model.setState(ViewState.idle);
} else {
Utils.showToast(res.message ?? "");
@ -192,13 +143,9 @@ class BranchListPage extends StatelessWidget {
),
],
).toContainer().onPress(() async {
branches[index].countryID =
model.branches!.data!.countryID;
branches[index].countryName =
model.branches!.data!.countryName;
navigateWithName(
context, ProviderAppRoutes.branchDetail,
arguments: branches[index]);
branches[index].countryID = model.branches!.data!.countryID;
branches[index].countryName = model.branches!.data!.countryName;
navigateWithName(context, ProviderAppRoutes.branchDetail, arguments: branches[index]);
});
},
separatorBuilder: (context, index) {
@ -215,6 +162,16 @@ class BranchListPage extends StatelessWidget {
],
),
),
floatingActionButton: FloatingActionButton(
backgroundColor: MyColors.darkPrimaryColor,
child: const Icon(
Icons.add,
color: Colors.white,
),
onPressed: () {
navigateWithName(context, ProviderAppRoutes.defineBranch);
},
),
);
}
}

Loading…
Cancel
Save