Updated both apps' structure

aamir_dev
Faiz Hashmi 2 years ago
parent 272dfe06f4
commit 7eeb3ed208

1
.gitignore vendored

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

@ -76,10 +76,7 @@ class ProviderAppRoutes {
static final Map<String, WidgetBuilder> routes = { static final Map<String, WidgetBuilder> routes = {
//Home page //Home page
AppRoutes.dashboard: (context) => const DashboardPage(), 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(), // defineLicense: (context) => DefineLicensePage(),
dealershipSetting: (context) => DealershipPage(), dealershipSetting: (context) => DealershipPage(),
// branchList: (context) => BranchListPage(), // branchList: (context) => BranchListPage(),
@ -100,7 +97,6 @@ class ProviderAppRoutes {
//Subscriptions //Subscriptions
mySubscriptionsPage: (context) => const MySubscriptionsPage(), mySubscriptionsPage: (context) => const MySubscriptionsPage(),
subscriptionsPage: (context) => const SubscriptionsPage(), subscriptionsPage: (context) => const SubscriptionsPage(),
AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(paymentType: ModalRoute.of(context)!.settings.arguments as PaymentTypes),
//Services //Services
dealerUser: (context) => DealerUserPage(ModalRoute.of(context)!.settings.arguments as String), dealerUser: (context) => DealerUserPage(ModalRoute.of(context)!.settings.arguments as String),
@ -117,10 +113,5 @@ class ProviderAppRoutes {
//Branch Duplication //Branch Duplication
matchServices: (context) => MatchedServicesPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as MatchServicesArguments)), matchServices: (context) => MatchedServicesPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as MatchServicesArguments)),
AppRoutes.chatView: (context) => ChatView(chatViewArguments: ModalRoute.of(context)!.settings.arguments as ChatViewArguments),
//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/models/user_models/image_response.dart';
import 'package:mc_common_app/repositories/user_repo.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/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/location/Location.dart';
import 'package:mc_common_app/utils/shared_prefrence.dart'; import 'package:mc_common_app/utils/shared_prefrence.dart';
import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/appointments_view_model.dart';
import 'package:mc_common_app/view_models/base_view_model.dart'; import 'package:mc_common_app/view_models/base_view_model.dart';
import 'package: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 { class DashboardVM extends BaseVM {
final CommonAppServices commonServices; final CommonAppServices commonServices;
@ -27,7 +34,7 @@ class DashboardVM extends BaseVM {
int selectedNavbarBarIndex = 2; int selectedNavbarBarIndex = 2;
void onNavbarTapped(int index) { void onNavbarTapped(int index) {
print(AppState().getDeviceToken); logger.i(AppState().getDeviceToken);
selectedNavbarBarIndex = index; selectedNavbarBarIndex = index;
notifyListeners(); notifyListeners();
} }
@ -71,9 +78,53 @@ class DashboardVM extends BaseVM {
notifyListeners(); notifyListeners();
} }
updateIndex(int i) async { Future<void> onRefresh(BuildContext context) async {
print(AppState().getDeviceToken); final requestsVM = context.read<RequestsVM>();
selectedNavbarBarIndex = i; final chatVM = context.read<ChatVM>();
notifyListeners(); 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 'dart:async';
import 'package:car_provider_app/view_models/dashboard_view_model.dart'; 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:car_provider_app/views/settings/branch/branch_list_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/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:mc_common_app/widgets/common_widgets/bottom_nav_bar.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'fragments/branch_appointment_fragment.dart'; import 'fragments/branch_appointment_fragment.dart';
import 'fragments/home_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 { class DashboardPage extends StatefulWidget {
const DashboardPage({Key? key}) : super(key: key); const DashboardPage({Key? key}) : super(key: key);
@ -40,103 +24,27 @@ class _DashboardPageState extends State<DashboardPage> {
void initState() { void initState() {
super.initState(); super.initState();
dashboardVM = Provider.of<DashboardVM>(context, listen: false); dashboardVM = Provider.of<DashboardVM>(context, listen: false);
context.read<RequestsVM>().populateRequestsFilterList(); scheduleMicrotask(() => dashboardVM.onRefresh(context));
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);
}
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<Widget> fragments = [ List<Widget> fragments = [
BranchListPage( const BranchListPage(),
onBackButtonTapped: () { const BranchAppointmentFragment(),
dashboardVM.updateIndex(2); const HomeFragment(),
}, const AdsFragment(),
onRefresh: () async { const MyRequestsFragment(),
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);
},
),
]; ];
return PopScope( return PopScope(
canPop: false, canPop: false,
child: Scaffold( child: Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
// drawer: CustomDrawer(dashboardVM: dashboardVM),
// body: Consumer<DashboardVM>(builder: (context, model, _) {
// return fragments[dashboardVM.selectedNavbarBarIndex];
// }),
body: fragments[context.watch<DashboardVM>().selectedNavbarBarIndex], body: fragments[context.watch<DashboardVM>().selectedNavbarBarIndex],
bottomNavigationBar: CustomBottomNavbar( bottomNavigationBar: CustomBottomNavbar(
onSelected: (i) { onSelected: (index) {
dashboardVM.updateIndex(i); dashboardVM.onNavbarTapped(index);
}, },
isProvider: true, isProvider: true,
selectedNavbarBarIndex: dashboardVM.selectedNavbarBarIndex, selectedNavbarBarIndex: dashboardVM.selectedNavbarBarIndex,

@ -1,135 +1,136 @@
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart'; // import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/dependency_injection.dart'; // import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart'; // import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; // import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/string_extensions.dart'; // import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; // import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; // import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/theme/colors.dart'; // import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/utils/enums.dart'; // import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/navigator.dart'; // import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart'; // import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/views/advertisement/ads_list.dart'; // import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; // import 'package:mc_common_app/views/advertisement/ads_list.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; // import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; // import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; // import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
import 'package:provider/provider.dart'; // import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:easy_localization/easy_localization.dart'; // import 'package:provider/provider.dart';
// import 'package:easy_localization/easy_localization.dart';
//
class AdsFragment extends StatelessWidget { // class AdsFragment extends StatelessWidget {
final bool isNeedAppBar; // const AdsFragment({Key? key}) : super(key: key);
final VoidCallback onBackButtonTapped; //
// List<AdDetailsModel> getAdsList(AdVM adVM) {
const AdsFragment({Key? key, this.isNeedAppBar = true, required this.onBackButtonTapped}) : super(key: key); // if (adVM.isExploreAdsTapped) {
// return adVM.exploreAdsFilteredList;
Future<void> onRefreshAds(BuildContext context) async { // }
AdVM adVM = context.read<AdVM>(); // if (adVM.myAdsFilteredList.isNotEmpty) {
await adVM.getExploreAds(); // return adVM.myAdsFilteredList;
await adVM.getMyAds(); // }
} // return [];
// }
List<AdDetailsModel> getAdsList(AdVM adVM) { //
if (adVM.isExploreAdsTapped) { // @override
return adVM.exploreAdsFilteredList; // Widget build(BuildContext context) {
} // return Consumer(
if (adVM.myAdsFilteredList.isNotEmpty) { // builder: (BuildContext context, AdVM adVM, Widget? child) {
return adVM.myAdsFilteredList; // return Scaffold(
} // appBar: CustomAppBar(
return []; // title: LocaleKeys.ads.tr(),
} // isRemoveBackButton: true,
// actions: [
@override // Padding(
Widget build(BuildContext context) { // padding: EdgeInsets.only(top: adVM.adsFiltersCounter > 0 ? 20 : 0, right: 21),
return Scaffold( // child: Badge(
appBar: !isNeedAppBar // isLabelVisible: adVM.adsFiltersCounter > 0,
? null // largeSize: 15,
: CustomAppBar( // smallSize: 20,
title: LocaleKeys.ads.tr(), // backgroundColor: MyColors.darkPrimaryColor,
onBackButtonTapped: onBackButtonTapped, // label: Text('${adVM.adsFiltersCounter}'),
), // child: MyAssets.searchIcon.buildSvg(),
body: Container( // ),
color: MyColors.backgroundColor, // ).onPress(() {
width: double.infinity, // navigateWithName(context, AppRoutes.adsFilterView);
height: double.infinity, // })
child: Column( // ],
children: [ // ),
16.height, // body: SizedBox(
Consumer( // width: double.infinity,
builder: (BuildContext context, AdVM adVM, Widget? child) { // height: double.infinity,
return Column( // child: Column(
children: [ // children: [
Row( // 16.height,
children: [ // Column(
Expanded( // children: [
child: ShowFillButton( // Row(
isFilled: adVM.isExploreAdsTapped, // children: [
maxHeight: 55, // Expanded(
title: "Explore Ads", // child: ShowFillButton(
txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, // isFilled: adVM.isExploreAdsTapped,
onPressed: () { // maxHeight: 55,
print("ads: ${AppState().getUser.data!.accessToken}"); // title: LocaleKeys.exploreAds.tr(),
adVM.updateIsExploreAds(true); // 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, // 12.width,
txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, // Expanded(
maxHeight: 55, // child: ShowFillButton(
title: "My Ads", // isFilled: !adVM.isExploreAdsTapped,
onPressed: () { // txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
adVM.updateIsExploreAds(false); // maxHeight: 55,
}, // title: LocaleKeys.myAds.tr(),
), // onPressed: () {
), // adVM.updateIsExploreAds(false);
], // },
).horPaddingMain(), // ),
if (adVM.isExploreAdsTapped) ...[ // ),
16.height, // ],
FiltersList( // ).horPaddingMain(),
filterList: adVM.exploreAdsFilterOptions, // if (adVM.isExploreAdsTapped) ...[
onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(createdByRoleFilter: selectedFilterId.toCreatedByRoleEnum()), // 16.height,
needLeftPadding: false) // FiltersList(
.paddingOnly(left: 21), // filterList: adVM.exploreAdsFilterOptions,
], // onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(createdByRoleFilter: selectedFilterId.toCreatedByRoleEnum()),
if (!adVM.isExploreAdsTapped) ...[ // needLeftPadding: false)
16.height, // .paddingOnly(left: 21),
FiltersList( // ] else ...[
filterList: adVM.myAdsFilterOptions, // 16.height,
onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(adPostStatusEnum: selectedFilterId.toAdPostEnum()), // FiltersList(
needLeftPadding: false, // filterList: adVM.myAdsFilterOptions,
).paddingOnly(left: 21), // onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(adPostStatusEnum: selectedFilterId.toAdPostEnum()),
], // needLeftPadding: false,
], // ).paddingOnly(left: 21),
); // ],
}, // ],
), // ),
16.height, // 16.height,
Expanded( // Expanded(
child: RefreshIndicator( // child: RefreshIndicator(
onRefresh: () => onRefreshAds(context), // onRefresh: () async {
child: Consumer( // await adVM.getExploreAds();
builder: (BuildContext context, AdVM adVM, Widget? child) { // await adVM.getMyAds();
return BuildAdsList(isAdsFragment: true, shouldShowAdStatus: !adVM.isExploreAdsTapped, adsList: getAdsList(adVM)); // },
}, // child: BuildAdsList(isAdsFragment: true, shouldShowAdStatus: !adVM.isExploreAdsTapped, adsList: getAdsList(adVM)),
), // ),
), // )
) // ],
], // ),
), // ),
), // floatingActionButton: FloatingActionButton(
floatingActionButton: FloatingActionButton( // onPressed: () async {
onPressed: () async { // navigateWithName(context, AppRoutes.selectAdTypeView, arguments: injector.get<AppState>().currentAppType == AppType.provider);
navigateWithName(context, AppRoutes.selectAdTypeView, arguments: injector.get<AppState>().currentAppType == AppType.provider); // },
}, // backgroundColor: MyColors.darkPrimaryColor,
backgroundColor: MyColors.darkPrimaryColor, // child: const Icon(Icons.add, color: MyColors.white),
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/config/provider_routes.dart';
import 'package:car_provider_app/views/dashboard/widget/appointment_slider_widget.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/classes/app_state.dart';
import 'package:mc_common_app/config/dependency_injection.dart'; // import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/extensions/string_extensions.dart'; // import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; // import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/theme/colors.dart'; // import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/date_helper.dart'; // import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/navigator.dart'; // import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.dart'; // import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/appointments_view_model.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/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: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/widgets/common_widgets/app_bar.dart'; // import 'package:mc_common_app/widgets/common_widgets/app_bar.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';
import 'package:easy_localization/easy_localization.dart'; // import 'package:easy_localization/easy_localization.dart';
//
// class AppointmentFragment extends StatelessWidget {
class AppointmentFragment extends StatelessWidget { // String date = "";
String date = ""; // final VoidCallback onBackButtonTapped;
final VoidCallback onBackButtonTapped; //
// AppointmentFragment({Key? key, required this.onBackButtonTapped}) : super(key: key);
AppointmentFragment({Key? key, required this.onBackButtonTapped}) : super(key: key); //
// GlobalKey<RefreshIndicatorState> refreshIndicatorKey = GlobalKey<RefreshIndicatorState>();
GlobalKey<RefreshIndicatorState> refreshIndicatorKey = GlobalKey<RefreshIndicatorState>(); //
// Future<void> _pullRefresh(BuildContext context) async {
Future<void> _pullRefresh(BuildContext context) async { // await context.read<AppointmentsVM>().getMyAppointmentsForProvider({"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0"});
await context.read<AppointmentsVM>().getMyAppointmentsForProvider({"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0"}); // }
} //
// @override
@override // Widget build(BuildContext context) {
Widget build(BuildContext context) { // date = DateHelper.formatAsDayMonthYear(DateTime.now());
date = DateHelper.formatAsDayMonthYear(DateTime.now()); // return Scaffold(
return Scaffold( // appBar: CustomAppBar(
appBar: CustomAppBar( // //profileImageUrl: MyAssets.carBanner,
//profileImageUrl: MyAssets.carBanner, // title: LocaleKeys.appointments.tr(),
title: LocaleKeys.appointments.tr(), // onBackButtonTapped: onBackButtonTapped,
onBackButtonTapped: onBackButtonTapped, // actions: [
actions: [ // IconButton(
IconButton( // onPressed: () {},
onPressed: () {}, // icon: const Icon(Icons.search),
icon: const Icon(Icons.search), // ),
), // 10.width,
10.width, // ],
], // ),
), // body: SizedBox(
body: SizedBox( // width: double.infinity,
width: double.infinity, // height: double.infinity,
height: double.infinity, // child: Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
child: Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { // return RefreshIndicator(
return RefreshIndicator( // onRefresh: () => _pullRefresh(context),
onRefresh: () => _pullRefresh(context), // key: refreshIndicatorKey,
key: refreshIndicatorKey, // child: SingleChildScrollView(
child: SingleChildScrollView( // physics: const AlwaysScrollableScrollPhysics(),
physics: const AlwaysScrollableScrollPhysics(), // child: Column(
child: Column( // children: [
children: [ // progressWidget(context),
progressWidget(context), // FiltersList(
FiltersList( // filterList: appointmentsVM.appointmentsFilterOptions,
filterList: appointmentsVM.appointmentsFilterOptions, // padding: const EdgeInsets.symmetric(horizontal: 18),
padding: const EdgeInsets.symmetric(horizontal: 18), // onFilterTapped: (index, selectedFilterId) {
onFilterTapped: (index, selectedFilterId) { // appointmentsVM.applyFilterOnAppointmentsVM(
appointmentsVM.applyFilterOnAppointmentsVM( // appointmentStatusEnum: selectedFilterId.toAppointmentStatusEnum(),
appointmentStatusEnum: selectedFilterId.toAppointmentStatusEnum(), // );
); // },
}, // ),
), // ListView.separated(
ListView.separated( // itemBuilder: (context, index) {
itemBuilder: (context, index) { // return AppointmentSliderWidget(
return AppointmentSliderWidget( // appointmentListModel: appointmentsVM.myFilteredAppointments2[index],
appointmentListModel: appointmentsVM.myFilteredAppointments2[index], // isNeedTotalPayment: false,
isNeedTotalPayment: false, // onTap: () {
onTap: () { // navigateWithName(
navigateWithName( // context,
context, // ProviderAppRoutes.appointmentDetailList,
ProviderAppRoutes.appointmentDetailList, // arguments: appointmentsVM.myFilteredAppointments2[index].customerAppointmentList,
arguments: appointmentsVM.myFilteredAppointments2[index].customerAppointmentList, // );
); // },
}, // );
); // },
}, // separatorBuilder: (context, snapchat) {
separatorBuilder: (context, snapchat) { // return 21.height;
return 21.height; // },
}, // itemCount: appointmentsVM.myFilteredAppointments2.length,
itemCount: appointmentsVM.myFilteredAppointments2.length, // physics: const NeverScrollableScrollPhysics(),
physics: const NeverScrollableScrollPhysics(), // shrinkWrap: true,
shrinkWrap: true, // padding: const EdgeInsets.all(21),
padding: const EdgeInsets.all(21), // ),
), // ],
], // ),
), // ),
), // );
); // }),
}), // ),
), // );
); // }
} //
// Widget progressWidget(BuildContext context) {
Widget progressWidget(BuildContext context) { // return Column(
return Column( // children: [
children: [ // Row(
Row( // children: [
children: [ // Expanded(
Expanded( // child: "Slots Overview".toText(
child: "Slots Overview".toText( // fontSize: 16,
fontSize: 16, // fontWeight: FontWeight.bold,
fontWeight: FontWeight.bold, // ),
), // ),
), // Row(
Row( // children: [
children: [ // date.toText(
date.toText( // fontWeight: FontWeight.bold,
fontWeight: FontWeight.bold, // ),
), // const Icon(
const Icon( // Icons.keyboard_arrow_down_outlined,
Icons.keyboard_arrow_down_outlined, // size: 16,
size: 16, // ),
), // ],
], // )
) // .toContainer(
.toContainer( // backgroundColor: MyColors.lightGreyEAColor,
backgroundColor: MyColors.lightGreyEAColor, // borderRadius: 100,
borderRadius: 100, // padding: const EdgeInsets.symmetric(
padding: const EdgeInsets.symmetric( // horizontal: 12,
horizontal: 12, // vertical: 6,
vertical: 6, // ),
), // )
) // .onPress(() async {
.onPress(() async { // date = await Utils.pickDateFromDatePicker(
date = await Utils.pickDateFromDatePicker( // context,
context, // firstDate: null,
firstDate: null, // );
); // context.read<AppointmentsVM>().notifyListeners();
context.read<AppointmentsVM>().notifyListeners(); // }),
}), // ],
], // ),
), // 24.height,
24.height, // Row(
Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.spaceBetween, // children: [
children: [ // Column(
Column( // crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, // children: [
children: [ // Row(
Row( // children: [
children: [ // Container(
Container( // width: 14,
width: 14, // height: 14,
height: 14, // color: MyColors.lightGreyEAColor,
color: MyColors.lightGreyEAColor, // ),
), // 4.width,
4.width, // "Empty: ".toText(
"Empty: ".toText( // fontSize: 8,
fontSize: 8, // color: Colors.white,
color: Colors.white, // ),
), // "8".toText(
"8".toText( // fontSize: 9,
fontSize: 9, // fontWeight: FontWeight.bold,
fontWeight: FontWeight.bold, // color: Colors.white,
color: Colors.white, // ),
), // ],
], // ).toContainer(
).toContainer( // backgroundColor: MyColors.darkIconColor,
backgroundColor: MyColors.darkIconColor, // ),
), // 8.height,
8.height, // Row(
Row( // children: [
children: [ // Container(
Container( // width: 14,
width: 14, // height: 14,
height: 14, // color: MyColors.darkPrimaryColor,
color: MyColors.darkPrimaryColor, // ),
), // 4.width,
4.width, // "Occupied: ".toText(
"Occupied: ".toText( // fontSize: 8,
fontSize: 8, // color: Colors.white,
color: Colors.white, // ),
), // "54".toText(
"54".toText( // fontSize: 9,
fontSize: 9, // fontWeight: FontWeight.bold,
fontWeight: FontWeight.bold, // color: Colors.white,
color: Colors.white, // ),
), // ],
], // ).toContainer(
).toContainer( // backgroundColor: MyColors.darkIconColor,
backgroundColor: MyColors.darkIconColor, // ),
), // ],
], // ),
), // CircularPercentIndicator(
CircularPercentIndicator( // radius: 60.0,
radius: 60.0, // lineWidth: 12.0,
lineWidth: 12.0, // percent: 0.7,
percent: 0.7, // circularStrokeCap: CircularStrokeCap.round,
circularStrokeCap: CircularStrokeCap.round, // center: Column(
center: Column( // mainAxisAlignment: MainAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, // children: [
children: [ // "Total Slots".toText(
"Total Slots".toText( // fontSize: 13,
fontSize: 13, // fontWeight: FontWeight.bold,
fontWeight: FontWeight.bold, // ),
), // "24".toText(
"24".toText( // fontSize: 24,
fontSize: 24, // fontWeight: FontWeight.bold,
fontWeight: FontWeight.bold, // ),
), // ],
], // ),
), // backgroundColor: MyColors.lightGreyEAColor,
backgroundColor: MyColors.lightGreyEAColor, // progressColor: MyColors.darkPrimaryColor,
progressColor: MyColors.darkPrimaryColor, // ),
), // ],
], // )
) // ],
], // ).toWhiteContainer(
).toWhiteContainer( // width: double.infinity,
width: double.infinity, // pading: const EdgeInsets.all(12),
pading: const EdgeInsets.all(12), // margin: const EdgeInsets.all(21),
margin: const EdgeInsets.all(21), // );
); // }
} // }
}

@ -20,26 +20,17 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
class BranchAppointmentFragment extends StatelessWidget { class BranchAppointmentFragment extends StatelessWidget {
bool isNeedAppBar; const BranchAppointmentFragment({
VoidCallback onBackButtonTapped;
RefreshCallback onRefresh;
BranchAppointmentFragment({
Key? key, Key? key,
this.isNeedAppBar = true,
required this.onBackButtonTapped,
required this.onRefresh,
}) : super(key: key); }) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: !isNeedAppBar appBar: CustomAppBar(
? null title: LocaleKeys.appointments.tr(),
: CustomAppBar( isRemoveBackButton: true,
title: LocaleKeys.appointments.tr(), ),
onBackButtonTapped: onBackButtonTapped,
),
body: SizedBox( body: SizedBox(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
@ -48,9 +39,7 @@ class BranchAppointmentFragment extends StatelessWidget {
Padding( Padding(
padding: const EdgeInsets.only(left: 21, right: 21, top: 21), padding: const EdgeInsets.only(left: 21, right: 21, top: 21),
child: RoleTypeTab( child: RoleTypeTab(
context.watch<ServiceVM>().selectedBranchStatus == 3 context.watch<ServiceVM>().selectedBranchStatus == 3 ? 0 : context.watch<ServiceVM>().selectedBranchStatus,
? 0
: context.watch<ServiceVM>().selectedBranchStatus,
[ [
DropValue(3, "Active", ""), DropValue(3, "Active", ""),
DropValue(1, "Requested", ""), DropValue(1, "Requested", ""),
@ -62,19 +51,16 @@ class BranchAppointmentFragment extends StatelessWidget {
), ),
Expanded( Expanded(
child: Consumer<ServiceVM>( child: Consumer<ServiceVM>(
builder: (context, model, _) { builder: (context, ServiceVM serviceVM, _) {
if (model.state == ViewState.busy) { if (serviceVM.state == ViewState.busy) {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} else { } else {
List<BranchDetailModel> branches = []; List<BranchDetailModel> branches = [];
if (model.branches!.data != null) { if (serviceVM.branches!.data != null) {
branches = model.branches!.data!.serviceProviderBranch! branches = serviceVM.branches!.data!.serviceProviderBranch!.where((element) => serviceVM.selectedBranchStatus == element.statusId).toList();
.where((element) =>
model.selectedBranchStatus == element.statusId)
.toList();
} }
return RefreshIndicator( return RefreshIndicator(
onRefresh: onRefresh, onRefresh: () async => serviceVM.getBranchAndServices(),
child: branches.isEmpty child: branches.isEmpty
? Center(child: Text(LocaleKeys.noBranchFound.tr())) ? Center(child: Text(LocaleKeys.noBranchFound.tr()))
: ListView.separated( : ListView.separated(
@ -86,8 +72,7 @@ class BranchAppointmentFragment extends StatelessWidget {
height: 50, height: 50,
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: MyColors.darkPrimaryColor, color: MyColors.darkPrimaryColor,
borderRadius: borderRadius: BorderRadius.all(Radius.circular(8)),
BorderRadius.all(Radius.circular(8)),
), ),
padding: const EdgeInsets.all(6), padding: const EdgeInsets.all(6),
child: SvgPicture.asset( child: SvgPicture.asset(
@ -98,10 +83,8 @@ class BranchAppointmentFragment extends StatelessWidget {
12.width, 12.width,
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: crossAxisAlignment: CrossAxisAlignment.start,
CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.start,
children: [ children: [
Row( Row(
children: [ children: [
@ -110,24 +93,12 @@ class BranchAppointmentFragment extends StatelessWidget {
size: 12, size: 12,
color: MyColors.darkPrimaryColor, color: MyColors.darkPrimaryColor,
), ),
Geolocator.distanceBetween( Geolocator.distanceBetween(AppState().currentLocation.latitude, AppState().currentLocation.latitude, double.parse(branches[index].latitude ?? "0"),
AppState() double.parse(branches[index].longitude ?? "0"))
.currentLocation
.latitude,
AppState()
.currentLocation
.latitude,
double.parse(branches[index]
.latitude ??
"0"),
double.parse(branches[index]
.longitude ??
"0"))
.toStringAsFixed(2) .toStringAsFixed(2)
.toText( .toText(
fontSize: 12, fontSize: 12,
color: color: MyColors.darkPrimaryColor,
MyColors.darkPrimaryColor,
) )
], ],
), ),
@ -138,22 +109,16 @@ class BranchAppointmentFragment extends StatelessWidget {
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
), ),
"Tap to view".toText( "Tap to view".toText(fontSize: 10, color: MyColors.grey70Color),
fontSize: 10,
color: MyColors.grey70Color),
], ],
), ),
), ),
12.width, 12.width,
], ],
).toContainer().onPress(() async { ).toContainer().onPress(() async {
branches[index].countryID = branches[index].countryID = serviceVM.branches!.data!.countryID;
model.branches!.data!.countryID; branches[index].countryName = serviceVM.branches!.data!.countryName;
branches[index].countryName = navigateWithName(context, ProviderAppRoutes.appointment, arguments: branches[index]);
model.branches!.data!.countryName;
navigateWithName(
context, ProviderAppRoutes.appointment,
arguments: branches[index]);
}); });
}, },
separatorBuilder: (context, 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/view_models/dashboard_view_model.dart';
import 'package:car_provider_app/views/dashboard/widget/my_service_provider.dart'; import 'package:car_provider_app/views/dashboard/widget/my_service_provider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart'; import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart';
@ -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/enums.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/appointments_view_model.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:mc_common_app/views/advertisement/ads_list.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/app_bar.dart';
import 'package:mc_common_app/widgets/common_widgets/view_all_widget.dart'; import 'package:mc_common_app/widgets/common_widgets/view_all_widget.dart';
import 'package:badges/badges.dart' as b; 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:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import '../widget/appointment_slider_widget.dart';
class HomeFragment extends StatelessWidget { class HomeFragment extends StatelessWidget {
VoidCallback onTap, onNotificaitonClick; const HomeFragment({Key? key}) : super(key: key);
RefreshCallback onRefresh;
HomeFragment({required this.onTap, required this.onRefresh, required this.onNotificaitonClick, Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -38,10 +28,14 @@ class HomeFragment extends StatelessWidget {
appBar: CustomAppBar( appBar: CustomAppBar(
isDrawerEnabled: true, isDrawerEnabled: true,
leadingWidth: 100, leadingWidth: 100,
onTap: onTap, onTap: () {
navigateWithName(context, AppRoutes.settingOptionsLanguages);
},
actions: [ actions: [
IconButton( IconButton(
onPressed: onNotificaitonClick, onPressed: () {
context.read<DashboardVM>().onRefresh(context);
},
icon: const b.Badge( icon: const b.Badge(
badgeContent: Text( badgeContent: Text(
'3', '3',
@ -64,7 +58,9 @@ class HomeFragment extends StatelessWidget {
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
child: RefreshIndicator( child: RefreshIndicator(
onRefresh: onRefresh, onRefresh: () async {
await context.read<DashboardVM>().onRefresh(context);
},
child: ListView( child: ListView(
children: [ children: [
10.height, 10.height,
@ -72,10 +68,10 @@ class HomeFragment extends StatelessWidget {
title: LocaleKeys.upcoming_appointment.tr(), title: LocaleKeys.upcoming_appointment.tr(),
subTitle: LocaleKeys.view_all.tr(), subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () { onSubtitleTapped: () {
context.read<DashboardVM>().updateIndex(1); context.read<DashboardVM>().onNavbarTapped(1);
}).horPaddingMain(), }).horPaddingMain(),
// const AppointmentSliderWidget().horPaddingMain(), // const AppointmentSliderWidget().horPaddingMain(),
CustomerAppointmentSliderWidget( CommonAppointmentSliderWidget(
onAppointmentClick: (AppointmentListModel value) { onAppointmentClick: (AppointmentListModel value) {
navigateWithName(context, ProviderAppRoutes.appointmentDetailList, arguments: value); navigateWithName(context, ProviderAppRoutes.appointmentDetailList, arguments: value);
}, },
@ -85,7 +81,7 @@ class HomeFragment extends StatelessWidget {
title: LocaleKeys.myBranches.tr(), title: LocaleKeys.myBranches.tr(),
subTitle: LocaleKeys.view_all.tr(), subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () { onSubtitleTapped: () {
context.read<DashboardVM>().updateIndex(0); context.read<DashboardVM>().onNavbarTapped(0);
}, },
).horPaddingMain(), ).horPaddingMain(),
const ServiceProviderWidget().horPaddingMain(), const ServiceProviderWidget().horPaddingMain(),

@ -1,74 +1,68 @@
import 'package:mc_common_app/generated/locale_keys.g.dart'; // import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart'; // import 'package:mc_common_app/view_models/requests_view_model.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/extensions/string_extensions.dart'; // import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/theme/colors.dart'; // import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; // import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/views/requests/widget/request_item.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/app_bar.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:provider/provider.dart'; // import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart'; // import 'package:easy_localization/easy_localization.dart';
//
// class MyRequestsFragment extends StatelessWidget {
class MyRequestsFragment extends StatelessWidget { // const MyRequestsFragment({super.key});
final bool isNeedAppBar; //
VoidCallback onBackButtonTapped; // @override
// Widget build(BuildContext context) {
MyRequestsFragment({super.key, this.isNeedAppBar = true, required this.onBackButtonTapped}); // return Scaffold(
// appBar: CustomAppBar(
@override // title: LocaleKeys.myRequests.tr(),
Widget build(BuildContext context) { // isRemoveBackButton: true,
return Scaffold( // ),
appBar: !isNeedAppBar // body: Container(
? null // color: MyColors.backgroundColor,
: CustomAppBar( // width: double.infinity,
title: LocaleKeys.myServiceBranches.tr(), // height: double.infinity,
onBackButtonTapped: onBackButtonTapped, // child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) {
), // return Column(
body: Container( // children: [
color: MyColors.backgroundColor, // 16.height,
width: double.infinity, // FiltersList(
height: double.infinity, // filterList: requestsVM.requestsTypeFilterOptions,
child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) { // onFilterTapped: (index, selectedFilterId) {
return Column( // requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeStatusEnum());
children: [ // },
16.height, // ),
FiltersList( // 8.height,
filterList: requestsVM.requestsTypeFilterOptions, // Expanded(
onFilterTapped: (index, selectedFilterId) { // child: RefreshIndicator(
requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeStatusEnum()); // onRefresh: () async => await requestsVM.getRequests(isNeedToRebuild: true, appType: AppType.provider),
}, // child: requestsVM.state == ViewState.busy
), // ? const Center(child: CircularProgressIndicator())
8.height, // : requestsVM.myFilteredRequests.isEmpty
Expanded( // ? Column(
child: RefreshIndicator( // mainAxisAlignment: MainAxisAlignment.center,
onRefresh: () async => await requestsVM.getRequests(isNeedToRebuild: true, appType: AppType.provider), // children: [
child: requestsVM.state == ViewState.busy // LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
? const Center(child: CircularProgressIndicator()) // ],
: requestsVM.myFilteredRequests.isEmpty // )
? Column( // : ListView.separated(
mainAxisAlignment: MainAxisAlignment.center, // itemBuilder: (context, index) {
children: [ // return RequestItem(request: requestsVM.myFilteredRequests[index], appType: AppType.provider, requestIndex: index);
LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor), // },
], // separatorBuilder: (context, index) {
) // return 16.height;
: ListView.separated( // },
itemBuilder: (context, index) { // itemCount: requestsVM.myFilteredRequests.length,
return RequestItem(request: requestsVM.myFilteredRequests[index], appType: AppType.provider, requestIndex: index); // padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8),
}, // ),
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'; import 'package:flutter_svg/flutter_svg.dart';
class AppointmentSliderWidget extends StatelessWidget { class AppointmentSliderWidget extends StatelessWidget {
AppointmentListModel appointmentListModel; final AppointmentListModel appointmentListModel;
bool isNeedTotalPayment; final bool isNeedTotalPayment;
bool isNeedToShowItems; final bool isNeedToShowItems;
bool isNeedToShowToMoreText; final bool isNeedToShowToMoreText;
bool isSelectable; final bool isSelectable;
bool isNeedToShowAppointmentStatus; final bool isNeedToShowAppointmentStatus;
bool isNeedToShowMergeStatus; final bool isNeedToShowMergeStatus;
Function()? onTap; final Function()? onTap;
AppointmentSliderWidget( const AppointmentSliderWidget({
{required this.appointmentListModel, required this.appointmentListModel,
required this.onTap, required this.onTap,
this.isNeedTotalPayment = false, this.isNeedTotalPayment = false,
this.isNeedToShowItems = false, this.isNeedToShowItems = false,
this.isNeedToShowToMoreText = true, this.isNeedToShowToMoreText = true,
this.isSelectable = false, this.isSelectable = false,
this.isNeedToShowAppointmentStatus = false, this.isNeedToShowAppointmentStatus = false,
this.isNeedToShowMergeStatus = false, this.isNeedToShowMergeStatus = false,
Key? key}) Key? key,
: super(key: key); }) : super(key: key);
List<Widget> buildServicesFromAppointment( List<Widget> buildServicesFromAppointment({required AppointmentListModel appointmentListModel}) {
{required AppointmentListModel appointmentListModel}) { if (appointmentListModel.appointmentServicesList == null || appointmentListModel.appointmentServicesList!.isEmpty) {
if (appointmentListModel.appointmentServicesList == null || return [const SizedBox()];
appointmentListModel.appointmentServicesList!.isEmpty) {
return [SizedBox()];
} }
if (appointmentListModel.appointmentServicesList!.length == 1) { if (appointmentListModel.appointmentServicesList!.length == 1) {
List<Widget> itemsList = []; List<Widget> itemsList = [];
if (isNeedToShowItems) { if (isNeedToShowItems) {
itemsList = List.generate( itemsList = List.generate(
appointmentListModel appointmentListModel.appointmentServicesList?.first.serviceItems?.length ?? 0,
.appointmentServicesList?.first.serviceItems?.length ?? (index) => (appointmentListModel.appointmentServicesList?.first.serviceItems?[index].name ?? "").toString().toText(
0,
(index) => (appointmentListModel.appointmentServicesList?.first
.serviceItems?[index].name ??
"")
.toString()
.toText(
color: MyColors.lightTextColor, color: MyColors.lightTextColor,
isBold: true, isBold: true,
), ),
@ -61,8 +53,7 @@ class AppointmentSliderWidget extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
showServices( showServices(
appointmentListModel appointmentListModel.appointmentServicesList![0].providerServiceDescription,
.appointmentServicesList![0].providerServiceDescription,
MyAssets.modificationsIcon, MyAssets.modificationsIcon,
), ),
if (isNeedToShowItems) ...itemsList, if (isNeedToShowItems) ...itemsList,
@ -72,41 +63,30 @@ class AppointmentSliderWidget extends StatelessWidget {
} }
List<Widget> servicesList = List.generate( List<Widget> servicesList = List.generate(
isNeedToShowToMoreText isNeedToShowToMoreText ? 2 : appointmentListModel.appointmentServicesList?.length ?? 0,
? 2
: appointmentListModel.appointmentServicesList?.length ?? 0,
(index) { (index) {
List<Widget> itemsList = []; List<Widget> itemsList = [];
if (isNeedToShowItems) { if (isNeedToShowItems) {
itemsList = List.generate( itemsList = List.generate(
appointmentListModel appointmentListModel.appointmentServicesList?[index].serviceItems?.length ?? 0,
.appointmentServicesList?[index].serviceItems?.length ?? (mIndex) => (" - ${appointmentListModel.appointmentServicesList?[index].serviceItems?[mIndex].name ?? ""}").toString().toText(
0, color: MyColors.lightTextColor,
(mIndex) => isBold: true,
(" - ${appointmentListModel.appointmentServicesList?[index].serviceItems?[mIndex].name ?? ""}") ),
.toString()
.toText(
color: MyColors.lightTextColor,
isBold: true,
),
); );
} }
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
showServices( showServices(appointmentListModel.appointmentServicesList![index].providerServiceDescription, MyAssets.modificationsIcon),
appointmentListModel
.appointmentServicesList![index].providerServiceDescription,
MyAssets.modificationsIcon),
if (isNeedToShowItems) ...itemsList, if (isNeedToShowItems) ...itemsList,
], ],
).paddingOnly(bottom: 4); ).paddingOnly(bottom: 4);
}, },
); );
if (isNeedToShowToMoreText && if (isNeedToShowToMoreText && appointmentListModel.appointmentServicesList!.length > 1) {
appointmentListModel.appointmentServicesList!.length > 1) {
servicesList.add( servicesList.add(
showServices( showServices(
"+ ${appointmentListModel.appointmentServicesList!.length - 1} More", "+ ${appointmentListModel.appointmentServicesList!.length - 1} More",
@ -133,9 +113,7 @@ class AppointmentSliderWidget extends StatelessWidget {
borderRadius: 24, borderRadius: 24,
marginAll: 4, marginAll: 4,
paddingAll: 0, paddingAll: 0,
backgroundColor: (appointmentListModel.isSelected ?? false) backgroundColor: (appointmentListModel.isSelected ?? false) ? MyColors.primaryColor : MyColors.greyButtonColor,
? MyColors.primaryColor
: MyColors.greyButtonColor,
), ),
).toContainer( ).toContainer(
borderRadius: 24, borderRadius: 24,
@ -152,8 +130,7 @@ class AppointmentSliderWidget extends StatelessWidget {
children: [ children: [
if (isNeedToShowMergeStatus) if (isNeedToShowMergeStatus)
"Appointment Merged".toText(color: MyColors.white).toContainer( "Appointment Merged".toText(color: MyColors.white).toContainer(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 3),
horizontal: 6, vertical: 3),
borderRadius: 12, borderRadius: 12,
backgroundColor: MyColors.greenColor, backgroundColor: MyColors.greenColor,
), ),
@ -171,17 +148,14 @@ class AppointmentSliderWidget extends StatelessWidget {
color: MyColors.darkTextColor, color: MyColors.darkTextColor,
isBold: true, isBold: true,
), ),
(appointmentListModel.customerName ?? "").toText( (appointmentListModel.customerName ?? "").toText(color: MyColors.black, isBold: true, fontSize: 16),
color: MyColors.black, isBold: true, fontSize: 16),
Row( Row(
children: [ children: [
"Phone:".toText( "Phone:".toText(
color: MyColors.lightTextColor, color: MyColors.lightTextColor,
), ),
2.width, 2.width,
appointmentListModel.customerMobileNum appointmentListModel.customerMobileNum.toString().toText(
.toString()
.toText(
fontSize: 12, fontSize: 12,
), ),
], ],
@ -195,9 +169,7 @@ class AppointmentSliderWidget extends StatelessWidget {
), ),
2.width, 2.width,
Expanded( Expanded(
child: child: "${appointmentListModel.duration ?? ""} ${appointmentListModel.appointmentDate!.toFormattedDateWithoutTime()}".toText(
"${appointmentListModel.duration ?? ""} ${appointmentListModel.appointmentDate!.toFormattedDateWithoutTime()}"
.toText(
fontSize: 12, fontSize: 12,
), ),
), ),
@ -209,9 +181,7 @@ class AppointmentSliderWidget extends StatelessWidget {
color: MyColors.lightTextColor, color: MyColors.lightTextColor,
), ),
2.width, 2.width,
appointmentListModel.appointmentType appointmentListModel.appointmentType.toString().toText(
.toString()
.toText(
fontSize: 12, fontSize: 12,
), ),
], ],
@ -220,8 +190,7 @@ class AppointmentSliderWidget extends StatelessWidget {
), ),
), ),
if (!isNeedTotalPayment) if (!isNeedTotalPayment)
if (appointmentListModel.customerAppointmentList!.length > if (appointmentListModel.customerAppointmentList!.length > 1)
1)
"${appointmentListModel.customerAppointmentList!.length - 1}+ Appointments" "${appointmentListModel.customerAppointmentList!.length - 1}+ Appointments"
.toText( .toText(
fontSize: 8, fontSize: 8,
@ -235,12 +204,8 @@ class AppointmentSliderWidget extends StatelessWidget {
), ),
), ),
if (isNeedToShowAppointmentStatus) if (isNeedToShowAppointmentStatus)
(appointmentListModel.appointmentStatusEnum! (appointmentListModel.appointmentStatusEnum!.getAppointmentNameFromEnum()).toText(color: MyColors.white).toContainer(
.getAppointmentNameFromEnum()) padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 3),
.toText(color: MyColors.white)
.toContainer(
padding: const EdgeInsets.symmetric(
horizontal: 6, vertical: 3),
borderRadius: 12, borderRadius: 12,
backgroundColor: MyColors.primaryColor, backgroundColor: MyColors.primaryColor,
), ),
@ -253,8 +218,7 @@ class AppointmentSliderWidget extends StatelessWidget {
Expanded( Expanded(
child: Column( child: Column(
children: [ children: [
...buildServicesFromAppointment( ...buildServicesFromAppointment(appointmentListModel: appointmentListModel),
appointmentListModel: appointmentListModel),
if (isNeedTotalPayment) if (isNeedTotalPayment)
Column( Column(
children: [ children: [
@ -271,9 +235,7 @@ class AppointmentSliderWidget extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
appointmentListModel.totalAmount appointmentListModel.totalAmount.toString().toText(fontSize: 16, isBold: true),
.toString()
.toText(fontSize: 16, isBold: true),
2.width, 2.width,
"SAR:".toText( "SAR:".toText(
color: MyColors.lightTextColor, color: MyColors.lightTextColor,
@ -295,9 +257,7 @@ class AppointmentSliderWidget extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
appointmentListModel.remainingAmount appointmentListModel.remainingAmount.toString().toText(fontSize: 16, isBold: true),
.toString()
.toText(fontSize: 16, isBold: true),
2.width, 2.width,
"SAR:".toText( "SAR:".toText(
color: MyColors.lightTextColor, color: MyColors.lightTextColor,
@ -326,11 +286,11 @@ class AppointmentSliderWidget extends StatelessWidget {
double calculateTotalPrice() { double calculateTotalPrice() {
double totalServiceListPrice = 0; double totalServiceListPrice = 0;
appointmentListModel.appointmentServicesList!.forEach((servicesElement) { for (var servicesElement in appointmentListModel.appointmentServicesList!) {
servicesElement.serviceItems!.forEach((itemsElement) { for (var itemsElement in servicesElement.serviceItems!) {
totalServiceListPrice += double.parse(itemsElement.price ?? "0"); totalServiceListPrice += double.parse(itemsElement.price ?? "0");
}); }
}); }
return totalServiceListPrice; return totalServiceListPrice;
} }

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