diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 25d1884..acd83a1 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -5,7 +5,8 @@
-
+
+
routes = {
- AppRoutes.dashboard: (context) => DashboardView(),
- AppRoutes.bookProviderAppView: (context) => BookProviderAppView(),
+ AppRoutes.dashboard: (context) => DashboardView(dashboardRouteEnum: ModalRoute.of(context)!.settings.arguments as DashboardRouteEnum),
AppRoutes.appointmentDetailView: (context) => AppointmentDetailView(appointmentListModel: ModalRoute.of(context)!.settings.arguments as AppointmentListModel),
AppRoutes.bookAppointmenServicesView: (context) => BookAppointmentServicesView(),
AppRoutes.bookAppointmenSchedulesView: (context) => BookAppointmentSchedulesView(
diff --git a/lib/views/branches/branch_detail_view.dart b/lib/views/branches/branch_detail_view.dart
index 52dfed2..a3c89bb 100644
--- a/lib/views/branches/branch_detail_view.dart
+++ b/lib/views/branches/branch_detail_view.dart
@@ -1,6 +1,7 @@
import 'dart:async';
import 'package:car_customer_app/views/branches/components/branch_reviews_widget.dart';
import 'package:car_customer_app/views/branches/components/items_list_sheet.dart';
+import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/appointments_view_model.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
@@ -106,25 +107,35 @@ class _BranchDetailViewState extends State {
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.center,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- LocaleKeys.openMapLocation.tr().toText(
- fontSize: 12,
- isBold: true,
- color: MyColors.primaryColor,
- isUnderLine: true,
- ),
- 4.width,
- Image.asset(
- MyAssets.icRightUpPng,
- height: 6,
- width: 6,
- color: MyColors.primaryColor,
- ),
- ],
- ).padding(EdgeInsets.symmetric(vertical: 6, horizontal: 2)),
+ if ((widget.branchDetailModel.latitude != null && widget.branchDetailModel.latitude!.isNotEmpty) && (widget.branchDetailModel.longitude != null && widget.branchDetailModel.longitude!.isNotEmpty)) ...[
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ LocaleKeys.openMapLocation.tr().toText(
+ fontSize: 12,
+ isBold: true,
+ color: MyColors.primaryColor,
+ isUnderLine: true,
+ ),
+ 4.width,
+ Image.asset(
+ MyAssets.icRightUpPng,
+ height: 6,
+ width: 6,
+ color: MyColors.primaryColor,
+ ),
+ ],
+ ).padding(EdgeInsets.symmetric(vertical: 6, horizontal: 2)).onPress(() async {
+ double latitude, longitude = 0.0;
+
+ latitude = double.parse(widget.branchDetailModel.latitude!);
+ longitude = double.parse(widget.branchDetailModel.longitude!);
+ await Utils.openLocationInMaps(latitude: latitude, longitude: longitude);
+ }),
+ ] else ...[
+ SizedBox(),
+ ],
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
@@ -169,11 +180,15 @@ class _BranchDetailViewState extends State {
),
ShowFillButton(
maxHeight: 55,
- // isDisabled: widget.branchDetailModel.branchServices!.length == 0,
+ isDisabled: widget.branchDetailModel.branchServices!.length == 0,
title: LocaleKeys.bookAppointment.tr(),
margin: EdgeInsets.all(12),
maxWidth: double.infinity,
onPressed: () {
+ if (widget.branchDetailModel.branchServices!.length == 0) {
+ Utils.showToast(LocaleKeys.noServicesAvailable.tr());
+ return;
+ }
navigateWithName(context, AppRoutes.bookAppointmenServicesView);
context.read().updateSelectedBranch(widget.branchDetailModel);
},
diff --git a/lib/views/branches/components/items_list_sheet.dart b/lib/views/branches/components/items_list_sheet.dart
index d6ccf08..92cb113 100644
--- a/lib/views/branches/components/items_list_sheet.dart
+++ b/lib/views/branches/components/items_list_sheet.dart
@@ -2,6 +2,7 @@ import 'dart:async';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/services_models/item_model.dart';
+import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/view_models/appointments_view_model.dart';
import 'package:flutter/material.dart';
@@ -14,19 +15,19 @@ import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class ItemsListSheet extends StatefulWidget {
- final int serviceId;
+ final int serviceProviderServiceId;
- ItemsListSheet(this.serviceId);
+ ItemsListSheet(this.serviceProviderServiceId);
@override
State createState() => _ItemsListSheetState();
}
class _ItemsListSheetState extends State {
- void initState() {
+ void initState() {
super.initState();
scheduleMicrotask(() {
- context.read().getServiceItems(widget.serviceId);
+ context.read().getServiceItems(widget.serviceProviderServiceId);
});
}
@@ -40,7 +41,7 @@ class _ItemsListSheetState extends State {
return Center(child: CircularProgressIndicator());
}
return appointmentsVM.serviceItemsFromApi.isEmpty
- ? EmptyWidget(text: LocaleKeys.noItemstoShow.tr(), isWrappedColumn: false)
+ ? EmptyWidget(text: LocaleKeys.noItemsToShow.tr(), isWrappedColumn: false)
: ListView.separated(
itemCount: appointmentsVM.serviceItemsFromApi.length,
itemBuilder: (BuildContext context, int index) {
@@ -57,7 +58,11 @@ class _ItemsListSheetState extends State {
mainAxisAlignment: MainAxisAlignment.start,
children: [
serviceItemModel.name.toString().toText(fontSize: 16, isBold: true),
- 4.height,
+ serviceItemModel.description.toString().toText(fontSize: 12, color: MyColors.lightTextColor),
+ 8.height,
+ if (serviceItemModel.manufactureDate != null && serviceItemModel.manufactureDate!.isNotEmpty) ...[
+ showItem(LocaleKeys.manufacturedOn.tr() + ":", (DateHelper.formatAsDayMonthYear(DateHelper.parseStringToDate(serviceItemModel.manufactureDate!))), valueColor: MyColors.darkTextColor),
+ ],
showItem(LocaleKeys.availableforAppointment.tr() + ":", (serviceItemModel.isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green),
showItem(LocaleKeys.allowingWorkshopService.tr() + ":", (serviceItemModel.isAppointmentCompanyLoc ?? false) ? "Yes" : "No", valueColor: Colors.green),
showItem(LocaleKeys.allowingHomeService.tr() + ":", (serviceItemModel.isAppointmentCustomerLoc ?? false) ? "Yes" : "No", valueColor: Colors.green),
@@ -104,7 +109,7 @@ class _ItemsListSheetState extends State {
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
- item.toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
+ item.toText(fontSize: 12, color: MyColors.lightTextColor),
4.width,
value.toText(fontSize: 12, color: valueColor, isBold: true),
],
diff --git a/lib/views/branches/favourite_list_view.dart b/lib/views/branches/favourite_list_view.dart
index 3329ef9..a690d3d 100644
--- a/lib/views/branches/favourite_list_view.dart
+++ b/lib/views/branches/favourite_list_view.dart
@@ -41,43 +41,49 @@ class _FavoriteListViewState extends State {
title: LocaleKeys.favoriteList.tr(),
isRemoveBackButton: false,
),
- body: SizedBox(
- width: double.infinity,
- height: double.infinity,
- child: Column(
- children: [
- Expanded(
- child: Container(
- width: double.infinity,
- child: appointmentsVM.state == ViewState.busy
- ? const Center(child: CircularProgressIndicator())
- : appointmentsVM.myFavProvidersList.isEmpty
- ? Center(
- child: (LocaleKeys.noProvidersInFav.tr()).toText(
- fontSize: 16,
- color: MyColors.lightTextColor,
+ body: RefreshIndicator(
+ onRefresh: () async {
+ await context.read().getMyFavoriteProviders();
+ },
+ child: SizedBox(
+ width: double.infinity,
+ height: double.infinity,
+ child: Column(
+ children: [
+ Expanded(
+ child: Container(
+ width: double.infinity,
+ child: appointmentsVM.state == ViewState.busy
+ ? const Center(child: CircularProgressIndicator())
+ : appointmentsVM.myFavProvidersList.isEmpty
+ ? Center(
+ child: (LocaleKeys.noProvidersInFav.tr()).toText(
+ fontSize: 16,
+ color: MyColors.lightTextColor,
+ ),
+ )
+ : ListView.separated(
+ itemCount: appointmentsVM.myFavProvidersList.length,
+ itemBuilder: (context, index) {
+ ProviderProfileModel providerProfileModel = appointmentsVM.myFavProvidersList[index];
+ return ProviderDetailCard(
+ isFromFavoriteList: true,
+ onCardTapped: () => navigateWithName(context, AppRoutes.providerProfileView, arguments: providerProfileModel.providerID),
+ providerImageUrl: MyAssets.bnCar,
+ title: providerProfileModel.name ?? "",
+ description: providerProfileModel.companyDescription ?? "",
+ startedSince: DateHelper.formatAsDayMonthYear(DateHelper.parseStringToDate(DateHelper.formatDateT(providerProfileModel.memberSince ?? ""))),
+ branches: providerProfileModel.serviceProviderBranch ?? [],
+ totalBranches: (providerProfileModel.noOfBranches ?? 0).toString(),
+ );
+ },
+ separatorBuilder: (context, index) => 12.height,
+ padding: const EdgeInsets.all(12),
),
- )
- : ListView.separated(
- itemCount: appointmentsVM.myFavProvidersList.length,
- itemBuilder: (context, index) {
- ProviderProfileModel providerProfileModel = appointmentsVM.myFavProvidersList[index];
- return ProviderDetailCard(
- onCardTapped: () => navigateWithName(context, AppRoutes.providerProfileView, arguments: providerProfileModel.providerID),
- providerImageUrl: MyAssets.bnCar,
- title: providerProfileModel.name ?? "",
- description: providerProfileModel.companyDescription ?? "",
- startedSince: DateHelper.formatAsMonthYear(DateHelper.parseStringToDate(DateHelper.formatDateT(providerProfileModel.memberSince ?? ""))),
- branches: providerProfileModel.serviceProviderBranch ?? [],
- totalBranches: (providerProfileModel.noOfBranches ?? 0).toString(),
- );
- },
- separatorBuilder: (context, index) => 12.height,
- padding: const EdgeInsets.all(12),
- ),
- ).paddingOnly(left: 10, right: 10),
- ),
- ],
+ ).paddingOnly(left: 10, right: 10),
+ ),
+ ],
+ ),
),
),
);
diff --git a/lib/views/dashboard/dashboard_view.dart b/lib/views/dashboard/dashboard_view.dart
index b81942f..5a51fa3 100644
--- a/lib/views/dashboard/dashboard_view.dart
+++ b/lib/views/dashboard/dashboard_view.dart
@@ -1,8 +1,10 @@
import 'dart:async';
+import 'dart:developer';
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/widgets/bottom_nav_bar.dart';
import 'package:flutter/material.dart';
+import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/view_models/dashboard_view_model_customer.dart';
import 'package:mc_common_app/views/common_fragments/requests_fragment.dart';
import 'package:provider/provider.dart';
@@ -10,7 +12,9 @@ import 'fragments/branches_fragment.dart';
import 'package:mc_common_app/views/common_fragments/ads_fragment.dart';
class DashboardView extends StatefulWidget {
- const DashboardView({Key? key}) : super(key: key);
+ final DashboardRouteEnum dashboardRouteEnum;
+
+ const DashboardView({Key? key, required this.dashboardRouteEnum}) : super(key: key);
@override
State createState() => _DashboardViewState();
@@ -24,7 +28,7 @@ class _DashboardViewState extends State {
void initState() {
super.initState();
dashboardVM = Provider.of(context, listen: false);
- scheduleMicrotask(() => dashboardVM.onRefresh(context));
+ scheduleMicrotask(() => dashboardVM.onRefresh(context, dashboardRouteEnum: widget.dashboardRouteEnum));
}
@override
diff --git a/lib/views/dashboard/fragments/appointments_fragment.dart b/lib/views/dashboard/fragments/appointments_fragment.dart
index 8beea72..df8621f 100644
--- a/lib/views/dashboard/fragments/appointments_fragment.dart
+++ b/lib/views/dashboard/fragments/appointments_fragment.dart
@@ -59,7 +59,7 @@ class AppointmentsFragment extends StatelessWidget {
Expanded(
child: RefreshIndicator(
onRefresh: () async {
- appointmentsVM.getMyAppointments();
+ appointmentsVM.getMyAppointmentsForCustomer(isNeedToRebuild: true);
},
child: appointmentsVM.state == ViewState.busy
? const Center(child: CircularProgressIndicator())
@@ -68,6 +68,20 @@ class AppointmentsFragment extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center,
children: [
LocaleKeys.noAppointmentstoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
+ if (appointmentsVM.appointmentFiltersCounter > 0) ...[
+ 8.height,
+ InkWell(
+ onTap: () async {
+ appointmentsVM.clearAppointmentFilters();
+ await appointmentsVM.getMyAppointmentsForCustomer(isNeedToRebuild: true);
+ },
+ child: LocaleKeys.clearFilters.tr().toText(
+ fontSize: 14,
+ isBold: true,
+ color: MyColors.darkPrimaryColor,
+ ),
+ ),
+ ],
],
)
: ListView.separated(
diff --git a/lib/views/dashboard/widgets/bottom_nav_bar.dart b/lib/views/dashboard/widgets/bottom_nav_bar.dart
index 802a004..e28edab 100644
--- a/lib/views/dashboard/widgets/bottom_nav_bar.dart
+++ b/lib/views/dashboard/widgets/bottom_nav_bar.dart
@@ -32,7 +32,7 @@ class CustomBottomNavbar extends StatelessWidget {
color: MyColors.lightIconColor,
).paddingAll(5),
activeIcon: SvgPicture.asset(MyAssets.homeIcon, color: MyColors.darkIconColor).paddingAll(5),
- label: LocaleKeys.home.tr(),
+ label: LocaleKeys.explore.tr(),
),
BottomNavigationBarItem(
icon: SvgPicture.asset(MyAssets.announcementIcon).paddingAll(5),