Updated both apps' structure

aamir_dev
Faiz Hashmi 2 years ago
parent 360048c3bf
commit 91ea03c834

@ -32,25 +32,15 @@ class CustomerAppRoutes {
AppRoutes.dashboard: (context) => DashboardPage(), AppRoutes.dashboard: (context) => DashboardPage(),
AppRoutes.bookProviderAppView: (context) => BookProviderAppView(), AppRoutes.bookProviderAppView: (context) => BookProviderAppView(),
AppRoutes.appointmentDetailView: (context) => AppointmentDetailView(appointmentListModel: ModalRoute.of(context)!.settings.arguments as AppointmentListModel), AppRoutes.appointmentDetailView: (context) => AppointmentDetailView(appointmentListModel: ModalRoute.of(context)!.settings.arguments as AppointmentListModel),
AppRoutes.adsDetailView: (context) => AdsDetailView(adDetails: ModalRoute.of(context)!.settings.arguments as AdDetailsModel),
AppRoutes.createAdView: (context) => CreateAdView(),
AppRoutes.adsFilterView: (context) => AdsFilterView(),
AppRoutes.selectAdTypeView: (context) => SelectAdTypeView(isProvider: ModalRoute.of(context)!.settings.arguments as bool),
AppRoutes.bookAppointmenServicesView: (context) => BookAppointmentServicesView(), AppRoutes.bookAppointmenServicesView: (context) => BookAppointmentServicesView(),
AppRoutes.bookAppointmenSchedulesView: (context) => AppRoutes.bookAppointmenSchedulesView: (context) => BookAppointmentSchedulesView(
BookAppointmentSchedulesView(screenArgumentsForAppointmentDetailPage: ModalRoute.of(context)!.settings.arguments as ScreenArgumentsForAppointmentDetailPage), screenArgumentsForAppointmentDetailPage: ModalRoute.of(context)!.settings.arguments as ScreenArgumentsForAppointmentDetailPage,
),
AppRoutes.bookAppointmentsItemView: (context) => BookAppointmentsItemView(), AppRoutes.bookAppointmentsItemView: (context) => BookAppointmentsItemView(),
AppRoutes.reviewAppointmentView: (context) => ReviewAppointment(), AppRoutes.reviewAppointmentView: (context) => ReviewAppointment(),
AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(paymentType: ModalRoute.of(context)!.settings.arguments as PaymentTypes),
AppRoutes.branchDetailPage: (context) => BranchDetailPage(branchDetailModel: ModalRoute.of(context)!.settings.arguments as BranchDetailModel), AppRoutes.branchDetailPage: (context) => BranchDetailPage(branchDetailModel: ModalRoute.of(context)!.settings.arguments as BranchDetailModel),
AppRoutes.branchSearchFilterPage: (context) => BranchesFilterView(), AppRoutes.branchSearchFilterPage: (context) => BranchesFilterView(),
AppRoutes.appoinmentSearchFilterPage: (context) => AppointmentsFilterView(), AppRoutes.appoinmentSearchFilterPage: (context) => AppointmentsFilterView(),
AppRoutes.providerProfilePage: (context) => ProviderProfilePage(providerId: ModalRoute.of(context)!.settings.arguments as int), AppRoutes.providerProfilePage: (context) => ProviderProfilePage(providerId: ModalRoute.of(context)!.settings.arguments as int),
AppRoutes.offersListPage: (context) => OfferListPage(offerListPageArguments: ModalRoute.of(context)!.settings.arguments as OfferListPageArguments),
AppRoutes.createRequestPage: (context) => CreateRequestPage(),
AppRoutes.chatView: (context) => ChatView(chatViewArguments: ModalRoute.of(context)!.settings.arguments as ChatViewArguments),
AppRoutes.settingOptionsFaqs: (context) => SettingOptionsFAQs(),
AppRoutes.settingOptionsLanguages: (context) => SettingOptionsLanguage(),
AppRoutes.settingOptionsInviteFriends: (context) => SettingOptionsInviteFriends(),
}; };
} }

@ -1,29 +1,15 @@
import 'dart:async'; import 'dart:async';
import 'dart:developer';
import 'package:car_customer_app/views/dashboard/fragments/ads_fragment.dart';
import 'package:car_customer_app/views/dashboard/fragments/appointments_fragment.dart'; import 'package:car_customer_app/views/dashboard/fragments/appointments_fragment.dart';
import 'package:car_customer_app/views/dashboard/fragments/home_fragment.dart'; import 'package:car_customer_app/views/dashboard/fragments/home_fragment.dart';
import 'package:car_customer_app/views/dashboard/fragments/my_requests_fragment.dart';
import 'package:car_customer_app/views/dashboard/widgets/bottom_nav_bar.dart'; import 'package:car_customer_app/views/dashboard/widgets/bottom_nav_bar.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/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/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/appointments_view_model.dart';
import 'package:mc_common_app/view_models/dashboard_view_model_customer.dart'; import 'package:mc_common_app/view_models/dashboard_view_model_customer.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
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 'fragments/branches_fragment.dart'; import 'fragments/branches_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);
@ -34,152 +20,28 @@ class DashboardPage extends StatefulWidget {
class _DashboardPageState extends State<DashboardPage> { class _DashboardPageState extends State<DashboardPage> {
late DashboardVmCustomer dashboardVM; late DashboardVmCustomer dashboardVM;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
dashboardVM = Provider.of<DashboardVmCustomer>(context, listen: false); dashboardVM = Provider.of<DashboardVmCustomer>(context, listen: false);
scheduleMicrotask(() { scheduleMicrotask(() => dashboardVM.onRefresh(context));
dashboardVM.onInitState(context);
dashboardVM.onRefresh(context);
});
}
List<Widget> fragments = [
const BranchesFragment(),
const AppointmentsFragment(),
const HomeFragment(),
AdsFragment(),
MyRequestsFragment(),
];
String getPageTitle(int index) {
if (index == 0) {
return LocaleKeys.branches.tr();
}
if (index == 1) {
return LocaleKeys.appointments.tr();
}
if (index == 2) {
return "";
}
if (index == 3) {
return LocaleKeys.ads.tr();
}
if (index == 4) {
return LocaleKeys.myRequests.tr();
}
return "";
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
DashboardVmCustomer dashboardVM = context.read<DashboardVmCustomer>(); List<Widget> fragments = [
bool isHomePage = dashboardVM.selectedNavbarBarIndex == 2; const BranchesFragment(),
const AppointmentsFragment(),
const HomeFragment(),
const AdsFragment(),
const MyRequestsFragment(),
];
return PopScope( return PopScope(
canPop: false, canPop: false,
child: Scaffold( child: Scaffold(
appBar: CustomAppBar( key: _scaffoldKey,
backgroundColor: null,
leadingWidth: 100,
title: getPageTitle(dashboardVM.selectedNavbarBarIndex),
isRemoveBackButton: true,
isDrawerEnabled: isHomePage ? true : false,
onTap: () {
if (isHomePage) {
navigateWithName(context, AppRoutes.settingOptionsLanguages);
}
},
actions: [
(isHomePage
? Row(
children: [
"${AppState().currentAppType}".toText(color: MyColors.darkTextColor).onPress(
() {
print("userId: ${AppState().getUser.data!.userInfo!.userId}");
print("customerId: ${AppState().getUser.data!.userInfo!.customerId}");
// context.read<ChatVM>().buildHubConnection();
},
),
10.width,
MyAssets.notificationsBellIcon.buildSvg().onPress(() {}),
15.width,
Icon(Icons.message, color: MyColors.darkTextColor)
],
)
: InkWell(
onTap: () async {
if (dashboardVM.selectedNavbarBarIndex == 0) {
navigateWithName(context, AppRoutes.branchSearchFilterPage);
}
if (dashboardVM.selectedNavbarBarIndex == 1) {
navigateWithName(context, AppRoutes.appoinmentSearchFilterPage);
}
if (dashboardVM.selectedNavbarBarIndex == 3) {
await context.read<AdVM>().populateDataForAdFilter();
navigateWithName(context, AppRoutes.adsFilterView);
}
},
child: Consumer2<AppointmentsVM, AdVM>(
builder: (BuildContext context, AppointmentsVM appointmentsVM, AdVM adVM, Widget? child) {
if (dashboardVM.selectedNavbarBarIndex == 0) {
if (appointmentsVM.branchFiltersCounter > 0) {
return Padding(
padding: const EdgeInsets.only(top: 20),
child: Badge(
largeSize: 15,
smallSize: 20,
backgroundColor: MyColors.darkPrimaryColor,
label: Text('${appointmentsVM.branchFiltersCounter}'),
child: MyAssets.searchIcon.buildSvg(),
),
);
} else {
return MyAssets.searchIcon.buildSvg();
}
}
if (dashboardVM.selectedNavbarBarIndex == 1) {
if (appointmentsVM.appointmentFiltersCounter > 0) {
return Padding(
padding: const EdgeInsets.only(top: 20),
child: Badge(
largeSize: 15,
smallSize: 20,
backgroundColor: MyColors.darkPrimaryColor,
label: Text('${appointmentsVM.appointmentFiltersCounter}'),
child: MyAssets.searchIcon.buildSvg(),
),
);
} else {
return MyAssets.searchIcon.buildSvg();
}
}
if (dashboardVM.selectedNavbarBarIndex == 3) {
if (adVM.adsFiltersCounter > 0) {
return Padding(
padding: const EdgeInsets.only(top: 20),
child: Badge(
largeSize: 15,
smallSize: 20,
backgroundColor: MyColors.darkPrimaryColor,
label: Text('${adVM.adsFiltersCounter}'),
child: MyAssets.searchIcon.buildSvg(),
),
);
} else {
return MyAssets.searchIcon.buildSvg();
}
}
return MyAssets.searchIcon.buildSvg();
},
),
))
.paddingOnly(right: 21)
],
),
bottomNavigationBar: CustomBottomNavbar(), bottomNavigationBar: CustomBottomNavbar(),
body: fragments[context.watch<DashboardVmCustomer>().selectedNavbarBarIndex], body: fragments[context.watch<DashboardVmCustomer>().selectedNavbarBarIndex],
), ),

@ -1,130 +1,153 @@
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/categories_list.dart'; // import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; // import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:provider/provider.dart'; // import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
import 'package:easy_localization/easy_localization.dart'; // import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
// import 'package:provider/provider.dart';
class AdsFragment extends StatelessWidget { // import 'package:easy_localization/easy_localization.dart';
AdsFragment({Key? key}) : super(key: key); //
// class AdsFragment extends StatelessWidget {
Future<void> _onRefreshAds(BuildContext context) async { // AdsFragment({Key? key}) : super(key: key);
AdVM adVM = context.read<AdVM>(); //
await adVM.getExploreAds(); // List<AdDetailsModel> getAdsList(AdVM adVM) {
await adVM.getMyAds(); // if (adVM.isExploreAdsTapped) {
} // return adVM.exploreAdsFilteredList;
// }
List<AdDetailsModel> getAdsList(AdVM adVM) { // if (adVM.myAdsFilteredList.isNotEmpty) {
if (adVM.isExploreAdsTapped) { // return adVM.myAdsFilteredList;
return adVM.exploreAdsFilteredList; // }
} // return [];
if (adVM.myAdsFilteredList.isNotEmpty) { // }
return adVM.myAdsFilteredList; //
} // @override
return []; // Widget build(BuildContext context) {
} // return Consumer(
// builder: (BuildContext context, AdVM adVM, Widget? child) {
@override // return Scaffold(
Widget build(BuildContext context) { // appBar: CustomAppBar(
return Scaffold( // title: LocaleKeys.ads.tr(),
body: Container( // isRemoveBackButton: true,
color: MyColors.backgroundColor, // actions: [
width: double.infinity, // Padding(
height: double.infinity, // padding: EdgeInsets.only(top: adVM.adsFiltersCounter > 0 ? 20 : 0, right: 21),
child: Column( // child: Badge(
children: [ // isLabelVisible: adVM.adsFiltersCounter > 0,
16.height, // largeSize: 15,
Consumer( // smallSize: 20,
builder: (BuildContext context, AdVM adVM, Widget? child) { // backgroundColor: MyColors.darkPrimaryColor,
return Column( // label: Text('${adVM.adsFiltersCounter}'),
children: [ // child: MyAssets.searchIcon.buildSvg(),
Row( // ),
children: [ // ).onPress(() {
Expanded( // navigateWithName(context, AppRoutes.adsFilterView);
child: ShowFillButton( // })
isFilled: adVM.isExploreAdsTapped, // ],
maxHeight: 55, // ),
title: LocaleKeys.exploreAds.tr(), // body: SizedBox(
txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, // width: double.infinity,
onPressed: () { // height: double.infinity,
print("ads: ${AppState().getUser.data!.accessToken}"); // child: Column(
adVM.populateAdsFilterList(); // children: [
if (adVM.myAds.isEmpty) { // 16.height,
adVM.getMyAds(); // Consumer(
} // builder: (BuildContext context, AdVM adVM, Widget? child) {
adVM.updateIsExploreAds(true); // return Column(
}, // children: [
), // Row(
), // children: [
12.width, // Expanded(
Expanded( // child: ShowFillButton(
child: ShowFillButton( // isFilled: adVM.isExploreAdsTapped,
isFilled: !adVM.isExploreAdsTapped, // maxHeight: 55,
txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, // title: LocaleKeys.exploreAds.tr(),
maxHeight: 55, // txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
title: LocaleKeys.myAds.tr(), // onPressed: () {
onPressed: () { // print("accessToken: ${AppState().getUser.data!.accessToken}");
adVM.updateIsExploreAds(false); // adVM.populateAdsFilterList();
}, // if (adVM.myAds.isEmpty) {
), // adVM.getMyAds();
), // }
], // adVM.updateIsExploreAds(true);
).horPaddingMain(), // },
if (adVM.isExploreAdsTapped) ...[ // ),
16.height, // ),
FiltersList( // 12.width,
filterList: adVM.exploreAdsFilterOptions, // Expanded(
onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(createdByRoleFilter: selectedFilterId.toCreatedByRoleEnum()), // child: ShowFillButton(
needLeftPadding: false) // isFilled: !adVM.isExploreAdsTapped,
.paddingOnly(left: 21), // txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
] else ...[ // maxHeight: 55,
16.height, // title: LocaleKeys.myAds.tr(),
FiltersList( // onPressed: () {
filterList: adVM.myAdsFilterOptions, // adVM.updateIsExploreAds(false);
onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(adPostStatusEnum: selectedFilterId.toAdPostEnum()), // },
needLeftPadding: false, // ),
).paddingOnly(left: 21), // ),
], // ],
], // ).horPaddingMain(),
); // if (adVM.isExploreAdsTapped) ...[
}, // if (adVM.adsFiltersCounter == 0) ...[
), // 16.height,
16.height, // FiltersList(
Expanded( // filterList: adVM.exploreAdsFilterOptions,
child: RefreshIndicator( // onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(createdByRoleFilter: selectedFilterId.toCreatedByRoleEnum()),
onRefresh: () => _onRefreshAds(context), // needLeftPadding: false)
child: Consumer( // .paddingOnly(left: 21),
builder: (BuildContext context, AdVM adVM, Widget? child) { // ]
return BuildAdsList(isAdsFragment: true, shouldShowAdStatus: !adVM.isExploreAdsTapped, adsList: getAdsList(adVM)); // ] else ...[
}, // 16.height,
), // FiltersList(
), // filterList: adVM.myAdsFilterOptions,
) // onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(adPostStatusEnum: selectedFilterId.toAdPostEnum()),
], // needLeftPadding: false,
), // ).paddingOnly(left: 21),
), // ],
floatingActionButton: FloatingActionButton( // ],
onPressed: () async { // );
navigateWithName(context, AppRoutes.selectAdTypeView, arguments: injector.get<AppState>().currentAppType == AppType.provider); // },
}, // ),
backgroundColor: MyColors.darkPrimaryColor, // 16.height,
child: Icon( // Expanded(
Icons.add, // child: RefreshIndicator(
color: MyColors.white, // 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: Icon(
// Icons.add,
// color: MyColors.white,
// ),
// ),
// );
// },
// );
// }
// }

@ -1,8 +1,8 @@
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
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/view_models/dashboard_view_model_customer.dart'; import 'package:mc_common_app/view_models/dashboard_view_model_customer.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:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
@ -11,24 +11,43 @@ import 'package:mc_common_app/models/appointments_models/appointment_list_model.
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/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: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';
class AppointmentsFragment extends StatelessWidget { class AppointmentsFragment extends StatelessWidget {
const AppointmentsFragment({Key? key}) : super(key: key); const AppointmentsFragment({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Consumer(
body: Container( builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
color: MyColors.backgroundColor, return Scaffold(
width: double.infinity, appBar: CustomAppBar(
height: double.infinity, title: LocaleKeys.appointments.tr(),
child: Consumer( isRemoveBackButton: true,
builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { actions: [
return Column( Padding(
padding: EdgeInsets.only(top: appointmentsVM.appointmentFiltersCounter > 0 ? 20 : 0, right: 21),
child: Badge(
isLabelVisible: appointmentsVM.appointmentFiltersCounter > 0,
largeSize: 15,
smallSize: 20,
backgroundColor: MyColors.darkPrimaryColor,
label: Text('${appointmentsVM.appointmentFiltersCounter}'),
child: MyAssets.searchIcon.buildSvg(),
),
).onPress(() {
navigateWithName(context, AppRoutes.appoinmentSearchFilterPage);
})
],
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: Column(
children: [ children: [
16.height, 16.height,
FiltersList( FiltersList(
@ -74,20 +93,20 @@ class AppointmentsFragment extends StatelessWidget {
), ),
), ),
], ],
); ),
}, ),
), floatingActionButton: FloatingActionButton(
), onPressed: () async {
floatingActionButton: FloatingActionButton( context.read<DashboardVmCustomer>().onNavbarTapped(0);
onPressed: () async { },
context.read<DashboardVmCustomer>().onNavbarTapped(0); backgroundColor: MyColors.darkPrimaryColor,
}, child: Icon(
backgroundColor: MyColors.darkPrimaryColor, Icons.add,
child: Icon( color: MyColors.white,
Icons.add, ),
color: MyColors.white, ),
), );
), },
); );
} }
} }

@ -10,8 +10,10 @@ import 'package:mc_common_app/models/provider_branches_models/branch_detail_mode
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/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:mc_common_app/widgets/common_widgets/provider_details_card.dart'; import 'package:mc_common_app/widgets/common_widgets/provider_details_card.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class BranchesFragment extends StatelessWidget { class BranchesFragment extends StatelessWidget {
@ -19,72 +21,92 @@ class BranchesFragment extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Consumer(
color: MyColors.backgroundColor, builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
width: double.infinity, return Scaffold(
height: double.infinity, appBar: CustomAppBar(
child: Consumer( title: LocaleKeys.branches.tr(),
builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { isRemoveBackButton: true,
return Column( actions: [
children: [ Padding(
if (appointmentsVM.branchesFilterOptions.isNotEmpty) ...[ padding: EdgeInsets.only(top: appointmentsVM.branchFiltersCounter > 0 ? 20 : 0, right: 21),
16.height, child: Badge(
FiltersList( largeSize: 15,
filterList: appointmentsVM.branchesFilterOptions, smallSize: 20,
onFilterTapped: (index, selectedFilterId) => appointmentsVM.applyFilterOnBranches(index: index), isLabelVisible: appointmentsVM.branchFiltersCounter > 0,
backgroundColor: MyColors.darkPrimaryColor,
label: Text('${appointmentsVM.branchFiltersCounter}'),
child: MyAssets.searchIcon.buildSvg(),
), ),
], ).onPress(() {
16.height, navigateWithName(context, AppRoutes.branchSearchFilterPage);
Expanded( }),
child: RefreshIndicator( ],
onRefresh: () async { ),
context.read<AppointmentsVM>().getAllNearBranches(isNeedToRebuild: true, isFromRefresh: true); body: SizedBox(
}, width: double.infinity,
child: Container( height: double.infinity,
width: double.infinity, child: Column(
height: MediaQuery.of(context).size.height / 1.37, children: [
child: appointmentsVM.state == ViewState.busy if (appointmentsVM.branchesFilterOptions.isNotEmpty) ...[
? const Center( 16.height,
child: CircularProgressIndicator(), FiltersList(
) filterList: appointmentsVM.branchesFilterOptions,
: appointmentsVM.nearbyBranches.isEmpty onFilterTapped: (index, selectedFilterId) => appointmentsVM.applyFilterOnBranches(index: index),
? Center( ),
child: LocaleKeys.no_branch.tr().toText( ],
fontSize: 16, 16.height,
color: MyColors.lightTextColor, Expanded(
), child: RefreshIndicator(
) onRefresh: () async {
: ListView.separated( context.read<AppointmentsVM>().getAllNearBranches(isNeedToRebuild: true, isFromRefresh: true);
itemCount: appointmentsVM.nearbyBranches.length, },
itemBuilder: (context, index) { child: Container(
BranchDetailModel branchDetailModel = appointmentsVM.nearbyBranches[index]; width: double.infinity,
height: MediaQuery.of(context).size.height / 1.37,
child: appointmentsVM.state == ViewState.busy
? const Center(
child: CircularProgressIndicator(),
)
: appointmentsVM.nearbyBranches.isEmpty
? Center(
child: LocaleKeys.no_branch.tr().toText(
fontSize: 16,
color: MyColors.lightTextColor,
),
)
: ListView.separated(
itemCount: appointmentsVM.nearbyBranches.length,
itemBuilder: (context, index) {
BranchDetailModel branchDetailModel = appointmentsVM.nearbyBranches[index];
return ProviderDetailsCard( return ProviderDetailsCard(
onCardTapped: () { onCardTapped: () {
navigateWithName(context, AppRoutes.branchDetailPage, arguments: branchDetailModel); navigateWithName(context, AppRoutes.branchDetailPage, arguments: branchDetailModel);
}, },
providerImageUrl: MyAssets.bnCar, providerImageUrl: MyAssets.bnCar,
title: branchDetailModel.branchName ?? "", title: branchDetailModel.branchName ?? "",
providerLocation: branchDetailModel.distanceKm.toString() + " KM", providerLocation: branchDetailModel.distanceKm.toString() + " KM",
providerName: branchDetailModel.serviceProviderName ?? "", providerName: branchDetailModel.serviceProviderName ?? "",
providerRatings: "4.9", providerRatings: "4.9",
services: branchDetailModel.branchServices, services: branchDetailModel.branchServices,
); );
}, },
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return 12.height; return 12.height;
}, },
padding: const EdgeInsets.all( padding: const EdgeInsets.all(
12, 12,
),
), ),
), ),
), ),
), ),
), ],
], ),
); ),
}, );
), },
); );
} }
} }

@ -1,17 +1,23 @@
import 'package:car_customer_app/views/dashboard/widgets/drawer_widget.dart'; import 'package:car_customer_app/views/dashboard/widgets/drawer_widget.dart';
import 'package:car_customer_app/views/dashboard/widgets/my_recent_branches_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/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/utils/enums.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/ad_view_model.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/view_models/dashboard_view_model_customer.dart'; import 'package:mc_common_app/view_models/dashboard_view_model_customer.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/my_service_provider.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:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:badges/badges.dart' as b;
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
class HomeFragment extends StatelessWidget { class HomeFragment extends StatelessWidget {
@ -21,97 +27,129 @@ class HomeFragment extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
drawer: CustomDrawer(dashboardVM: context.watch<DashboardVmCustomer>()), drawer: CustomDrawer(dashboardVM: context.watch<DashboardVmCustomer>()),
body: RefreshIndicator( appBar: CustomAppBar(
onRefresh: () async { isDrawerEnabled: true,
context.read<DashboardVmCustomer>().onInitState(context); leadingWidth: 100,
context.read<DashboardVmCustomer>().onRefresh(context); onTap: () => navigateWithName(context, AppRoutes.settingOptionsLanguages),
return; actions: [
}, IconButton(
child: SizedBox( onPressed: () {
width: double.infinity, context.read<DashboardVmCustomer>().onRefresh(context);
height: double.infinity, },
child: SingleChildScrollView( icon: const b.Badge(
child: Padding( badgeContent: Text(
padding: const EdgeInsets.only(top: 8), '3',
child: Column( style: TextStyle(
mainAxisSize: MainAxisSize.max, fontSize: 10,
children: [ color: Colors.white,
16.height, ),
ViewAllWidget( ),
title: LocaleKeys.upcoming_appointment.tr().toUpperCase(), badgeStyle: b.BadgeStyle(
subTitle: LocaleKeys.view_all.tr(), badgeColor: MyColors.primaryColor,
onSubtitleTapped: () { padding: EdgeInsets.all(5),
context.read<DashboardVmCustomer>().onNavbarTapped(1);
context.read<AppointmentsVM>().applyFilterOnAppointmentsVM(appointmentStatusEnum: AppointmentStatusEnum.allAppointments);
},
).horPaddingMain(),
CustomerAppointmentSliderWidget(),
7.height,
ViewAllWidget(
title: LocaleKeys.my_recent_providers.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVmCustomer>().onNavbarTapped(0);
context.read<AppointmentsVM>().applyFilterOnBranches(index: 0);
}).horPaddingMain(),
Consumer(builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) {
return ServiceProviderWidget(nearbyBranches: context.read<AppointmentsVM>().nearbyBranches).horPaddingMain();
}),
Consumer(
builder: (BuildContext context, AdVM adVM, Widget? child) {
return Column(
children: [
if (adVM.myActiveAdsForHome.isNotEmpty) ...[
Column(
children: [
15.height,
ViewAllWidget(
title: LocaleKeys.my_active_Ads.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVmCustomer>().onNavbarTapped(3);
context.read<AdVM>().updateIsExploreAds(false);
}).horPaddingMain(),
BuildAdsList(
shouldShowAdStatus: true,
isAdsFragment: false,
adsList: adVM.myActiveAdsForHome,
scrollPhysics: NeverScrollableScrollPhysics(),
),
],
)
],
if (adVM.exploreAds.isNotEmpty) ...[
Column(
children: [
15.height,
ViewAllWidget(
title: LocaleKeys.myRecommendedAds.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVmCustomer>().onNavbarTapped(3);
context.read<AdVM>().updateIsExploreAds(true);
context.read<AdVM>().applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds);
},
).horPaddingMain(),
BuildAdsList(
shouldShowAdStatus: false,
adsList: adVM.exploreAds.length >= 3 ? adVM.exploreAds.take(3).toList() : adVM.exploreAds,
isAdsFragment: false,
scrollPhysics: NeverScrollableScrollPhysics(),
),
],
)
]
],
);
},
),
20.height,
],
), ),
child: Icon(Icons.notifications_active),
), ),
), ),
10.width,
],
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: RefreshIndicator(
onRefresh: () async {
await context.read<DashboardVmCustomer>().onRefresh(context);
},
child: ListView(
children: [
16.height,
ViewAllWidget(
title: LocaleKeys.upcoming_appointment.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVmCustomer>().onNavbarTapped(1);
context.read<AppointmentsVM>().applyFilterOnAppointmentsVM(appointmentStatusEnum: AppointmentStatusEnum.allAppointments);
},
).horPaddingMain(),
CommonAppointmentSliderWidget(),
7.height,
Consumer(
builder: (BuildContext context, AppointmentsVM appointmentVM, Widget? child) {
if (appointmentVM.state == ViewState.busy) {
return Center(child: CircularProgressIndicator());
}
return Column(
children: [
ViewAllWidget(
title: LocaleKeys.my_recent_providers.tr().toUpperCase(),
subTitle: '',
onSubtitleTapped: () {
// context.read<DashboardVmCustomer>().onNavbarTapped(0);
// context.read<AppointmentsVM>().applyFilterOnBranches(index: 0);
})
.horPaddingMain(),
MyRecentBranchesWidget(nearbyBranches: appointmentVM.myRecentBranches).horPaddingMain(),
],
);
},
),
Consumer(
builder: (BuildContext context, AdVM adVM, Widget? child) {
if (adVM.state == ViewState.busy) {
return Center(child: CircularProgressIndicator());
}
return Column(
children: [
if (adVM.myActiveAdsForHome.isNotEmpty) ...[
Column(
children: [
15.height,
ViewAllWidget(
title: LocaleKeys.my_active_Ads.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVmCustomer>().onNavbarTapped(3);
context.read<AdVM>().updateIsExploreAds(false);
}).horPaddingMain(),
BuildAdsList(
shouldShowAdStatus: true,
isAdsFragment: false,
adsList: adVM.myActiveAdsForHome,
scrollPhysics: NeverScrollableScrollPhysics(),
),
],
)
],
if (adVM.exploreAds.isNotEmpty) ...[
Column(
children: [
15.height,
ViewAllWidget(
title: LocaleKeys.myRecommendedAds.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVmCustomer>().onNavbarTapped(3);
context.read<AdVM>().updateIsExploreAds(true);
context.read<AdVM>().applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds);
},
).horPaddingMain(),
BuildAdsList(
shouldShowAdStatus: false,
adsList: adVM.exploreAds.length >= 3 ? adVM.exploreAds.take(3).toList() : adVM.exploreAds,
isAdsFragment: false,
scrollPhysics: NeverScrollableScrollPhysics(),
),
],
)
]
],
);
},
),
20.height,
],
),
), ),
), ),
); );

@ -1,76 +1,80 @@
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/config/routes.dart'; // import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; // import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart'; // import 'package:mc_common_app/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/utils/navigator.dart'; // import 'package:mc_common_app/utils/navigator.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/categories_list.dart'; // import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:provider/provider.dart'; // import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
import 'package:easy_localization/easy_localization.dart'; // import 'package:provider/provider.dart';
// import 'package:easy_localization/easy_localization.dart';
class MyRequestsFragment extends StatelessWidget { //
const MyRequestsFragment({super.key}); // class MyRequestsFragment extends StatelessWidget {
// const MyRequestsFragment({super.key});
@override //
Widget build(BuildContext context) { // @override
return Scaffold( // Widget build(BuildContext context) {
body: Container( // return Scaffold(
color: MyColors.backgroundColor, // appBar: CustomAppBar(
width: double.infinity, // title: LocaleKeys.myRequests.tr(),
height: double.infinity, // isRemoveBackButton: true,
child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) { // ),
return Column( // body: SizedBox(
children: [ // width: double.infinity,
16.height, // height: double.infinity,
FiltersList( // child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) {
filterList: requestsVM.requestsTypeFilterOptions, // return Column(
onFilterTapped: (index, selectedFilterId) { // children: [
requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeStatusEnum()); // 16.height,
}, // FiltersList(
), // filterList: requestsVM.requestsTypeFilterOptions,
8.height, // onFilterTapped: (index, selectedFilterId) {
Expanded( // requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeStatusEnum());
child: RefreshIndicator( // },
onRefresh: () async => await requestsVM.getRequests(isNeedToRebuild: true, appType: AppType.customer), // ),
child: requestsVM.state == ViewState.busy // 8.height,
? const Center(child: CircularProgressIndicator()) // Expanded(
: requestsVM.myFilteredRequests.isEmpty // child: RefreshIndicator(
? Column( // onRefresh: () async => await requestsVM.getRequests(isNeedToRebuild: true, appType: AppType.customer),
mainAxisAlignment: MainAxisAlignment.center, // child: requestsVM.state == ViewState.busy
children: [ // ? const Center(child: CircularProgressIndicator())
LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor), // : requestsVM.myFilteredRequests.isEmpty
], // ? Column(
) // mainAxisAlignment: MainAxisAlignment.center,
: ListView.separated( // children: [
itemBuilder: (context, index) { // LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
return RequestItem( // ],
request: requestsVM.myFilteredRequests[index], // )
appType: AppType.customer, // : ListView.separated(
requestIndex: index, // itemBuilder: (context, index) {
); // return RequestItem(
}, // request: requestsVM.myFilteredRequests[index],
separatorBuilder: (context, index) => 16.height, // appType: AppType.customer,
itemCount: requestsVM.myFilteredRequests.length, // requestIndex: index,
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8), // );
), // },
), // separatorBuilder: (context, index) => 16.height,
) // itemCount: requestsVM.myFilteredRequests.length,
], // padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8),
); // ),
}), // ),
), // )
floatingActionButton: FloatingActionButton( // ],
onPressed: () => navigateWithName(context, AppRoutes.createRequestPage), // );
backgroundColor: MyColors.darkPrimaryColor, // }),
child: const Icon( // ),
Icons.add, // floatingActionButton: FloatingActionButton(
color: MyColors.white, // onPressed: () => navigateWithName(context, AppRoutes.createRequestPage),
), // backgroundColor: MyColors.darkPrimaryColor,
), // child: const Icon(
); // Icons.add,
} // color: MyColors.white,
} // ),
// ),
// );
// }
// }

@ -1,37 +1,45 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.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/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/models/provider_branches_models/branch_detail_model.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class ServiceProviderWidget extends StatelessWidget { class MyRecentBranchesWidget extends StatelessWidget {
const ServiceProviderWidget({Key? key}) : super(key: key); final List<BranchDetailModel> nearbyBranches;
const MyRecentBranchesWidget({Key? key, required this.nearbyBranches}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SizedBox( return SizedBox(
width: double.infinity, width: double.infinity,
height: 150, height: 140,
child: ListView.builder( child: ListView.builder(
itemCount: 9, itemCount: nearbyBranches.length,
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
shrinkWrap: true, shrinkWrap: true,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
BranchDetailModel branchDetailModel = nearbyBranches[index];
return SizedBox( return SizedBox(
width: 90, width: 90,
child: Column( child: Column(
children: [ children: [
Image.asset( Image.asset(
"assets/images/bn_car.jpeg", MyAssets.bnCar,
width: 80, width: 80,
height: 80, height: 80,
fit: BoxFit.cover, fit: BoxFit.cover,
).toCircle(borderRadius: 100), ).toCircle(borderRadius: 100),
8.height, 8.height,
"Olaya Branch".toText(fontSize: 14, isBold: true, textAlign: TextAlign.center), "${branchDetailModel.branchName}".toText(fontSize: 14, isBold: true, textAlign: TextAlign.center),
], ],
), ),
); ).onPress(() {
navigateWithName(context, AppRoutes.branchDetailPage, arguments: branchDetailModel);
});
}, },
), ),
); );
Loading…
Cancel
Save