diff --git a/lib/config/customer_routes.dart b/lib/config/customer_routes.dart index d0ccfba..0b4cd9f 100644 --- a/lib/config/customer_routes.dart +++ b/lib/config/customer_routes.dart @@ -1,4 +1,5 @@ import 'package:car_customer_app/views/branches/branch_detail_view.dart'; +import 'package:car_customer_app/views/branches/favourite_list_view.dart'; import 'package:car_customer_app/views/branches/provider_profile_view.dart'; import 'package:mc_common_app/views/appointments/appointment_detail_view.dart'; import 'package:mc_common_app/views/appointments/book_appointment_schedules_view.dart'; @@ -29,5 +30,6 @@ class CustomerAppRoutes { AppRoutes.branchSearchFilterPage: (context) => BranchesFilterView(), AppRoutes.appoinmentSearchFilterPage: (context) => AppointmentsFilterView(), AppRoutes.providerProfileView: (context) => ProviderProfileView(providerId: ModalRoute.of(context)!.settings.arguments as int), + AppRoutes.favoriteListView: (context) => FavoriteListView(), }; } diff --git a/lib/main.dart b/lib/main.dart index 99acad9..7d8fe22 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -46,7 +46,7 @@ Future main() async { appId: '1:294636898500:android:e93b7e5d1cc15ae6b0e191', messagingSenderId: '294636898500', projectId: 'mowater-2c81a', - )); + )); CustomerDependencies.addDependencies(); injector.get().initializeNotifications(); diff --git a/lib/views/branches/branch_detail_view.dart b/lib/views/branches/branch_detail_view.dart index 05f26c8..6c16e27 100644 --- a/lib/views/branches/branch_detail_view.dart +++ b/lib/views/branches/branch_detail_view.dart @@ -14,6 +14,7 @@ import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/navigator.dart'; +import 'package:mc_common_app/views/advertisement/components/ads_images_corousel_widget.dart'; import 'package:mc_common_app/widgets/bottom_sheet.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; @@ -55,7 +56,19 @@ class _BranchDetailViewState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: CustomAppBar(title: LocaleKeys.branchDetail.tr()), + appBar: CustomAppBar( + title: LocaleKeys.branchDetail.tr(), + actions: [ + Padding( + padding: EdgeInsets.only(top: 8, bottom: 8, right: 21), + child: const Icon(Icons.messenger_outline_rounded, color: Colors.black, size: 18).toContainer( + borderRadius: 100, + borderColor: MyColors.lightGreyEFColor, + isEnabledBorder: true, + ), + ).onPress(() {}) + ], + ), body: Column( children: [ Expanded( @@ -68,7 +81,7 @@ class _BranchDetailViewState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Image.asset(MyAssets.bnCar), + ImagesCorouselWidget(imagesList: widget.branchDetailModel.branchImages ?? []), 12.height, "${widget.branchDetailModel.branchName} | ${widget.branchDetailModel.serviceProviderName}".toString().toText( fontSize: 16, diff --git a/lib/views/branches/components/branch_reviews_widget.dart b/lib/views/branches/components/branch_reviews_widget.dart index 7adde3a..6ae5f21 100644 --- a/lib/views/branches/components/branch_reviews_widget.dart +++ b/lib/views/branches/components/branch_reviews_widget.dart @@ -38,7 +38,7 @@ class BranchReviewsWidget extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - "This branch has no reviews.".toText(fontSize: 14, color: MyColors.lightTextColor), + LocaleKeys.noReviewsBranch.tr().toText(fontSize: 14, color: MyColors.lightTextColor), ], ), ] else ...[ @@ -89,11 +89,11 @@ class BranchReviewsWidget extends StatelessWidget { }, ), if (appointmentsVM.isReadMoreEnabled) ...[ - ("Read Less").toText(fontSize: 13, color: MyColors.darkPrimaryColor, isUnderLine: true).onPress(() { + LocaleKeys.readLess.tr().toText(fontSize: 13, color: MyColors.darkPrimaryColor, isUnderLine: true).onPress(() { appointmentsVM.updateIsReadMoreEnabled(false); }), ] else ...[ - ("Read More Reviews").toText(fontSize: 13, color: MyColors.darkPrimaryColor, isUnderLine: true).onPress(() { + LocaleKeys.readMoreReviews.tr().toText(fontSize: 13, color: MyColors.darkPrimaryColor, isUnderLine: true).onPress(() { appointmentsVM.updateIsReadMoreEnabled(true); }), ] diff --git a/lib/views/branches/favourite_list_view.dart b/lib/views/branches/favourite_list_view.dart new file mode 100644 index 0000000..3329ef9 --- /dev/null +++ b/lib/views/branches/favourite_list_view.dart @@ -0,0 +1,87 @@ +import 'dart:async'; + +import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/models/provider_branches_models/provider_profile_model.dart'; +import 'package:mc_common_app/utils/date_helper.dart'; +import 'package:mc_common_app/view_models/appointments_view_model.dart'; +import 'package:easy_localization/easy_localization.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/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/navigator.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.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'; + +class FavoriteListView extends StatefulWidget { + const FavoriteListView({Key? key}) : super(key: key); + + @override + State createState() => _FavoriteListViewState(); +} + +class _FavoriteListViewState extends State { + @override + void initState() { + scheduleMicrotask(() async => context.read().getMyFavoriteProviders()); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { + return Scaffold( + appBar: CustomAppBar( + 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, + ), + ) + : 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), + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/lib/views/branches/provider_profile_view.dart b/lib/views/branches/provider_profile_view.dart index 2bf2f1d..353e001 100644 --- a/lib/views/branches/provider_profile_view.dart +++ b/lib/views/branches/provider_profile_view.dart @@ -1,6 +1,4 @@ import 'dart:async'; -import 'dart:developer'; - import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/view_models/appointments_view_model.dart'; @@ -14,7 +12,7 @@ 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/widgets/common_widgets/app_bar.dart'; -import 'package:mc_common_app/widgets/common_widgets/provider_details_card.dart'; +import 'package:mc_common_app/widgets/common_widgets/branch_details_card.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; @@ -88,49 +86,56 @@ class _ProviderProfileViewState extends State { //TODO: company logo/banner not added form provider app yet Image.asset(MyAssets.bnCar), 12.height, - appointmentsVM.providerProfileModel!.companyName.toString().toText( - fontSize: 16, - isBold: true, - ), - Row( - children: [ - ("Mowater Member Since:").toText(color: MyColors.lightTextColor, fontSize: 12), - 4.width, - //TODO: date is missing from API side - "2023".toText(fontSize: 12, isBold: true), - ], + (appointmentsVM.providerProfileModel!.name ?? appointmentsVM.providerProfileModel!.companyName).toString().toText( + fontSize: 16, + isBold: true, ), + + if (appointmentsVM.providerProfileModel!.memberSince!.isNotEmpty ) ...[ + Row( + children: [ + ("Member Since:").toText(color: MyColors.lightTextColor, fontSize: 12), + 4.width, + "${appointmentsVM.providerProfileModel!.memberSince ?? ""}".toText(fontSize: 12, isBold: true), + ], + ), + ], 4.height, appointmentsVM.providerProfileModel!.companyDescription!.toText(color: MyColors.lightTextColor, fontSize: 12), ], ).toWhiteContainer(width: double.infinity, allPading: 12), 12.height, appointmentsVM.providerProfileModel!.serviceProviderBranch == null - ? Center(child: Text(LocaleKeys.noBranchFound)) + ? Center( + child: (LocaleKeys.noBranchFound.tr()).toText( + fontSize: 16, + color: MyColors.lightTextColor, + ), + ) : appointmentsVM.providerProfileModel!.serviceProviderBranch!.isEmpty - ? Center(child: Text(LocaleKeys.no_branch.tr())) - : ListView.separated( - itemBuilder: (context, index) { - BranchDetailModel branchModel = appointmentsVM.providerProfileModel!.serviceProviderBranch![index]; - return ProviderDetailsCard( - onCardTapped: () { - navigateWithName(context, AppRoutes.branchDetailView, arguments: branchModel); - }, - providerImageUrl: MyAssets.bnCar, - title: branchModel.branchName ?? "", - providerLocation: branchModel.distanceKm.toString() + " KM", - providerName: branchModel.serviceProviderName ?? "", - providerRatings: (branchModel.branchRateAvg ?? 0.0), - services: branchModel.branchServices, - ); - }, - separatorBuilder: (context, index) { - return 12.height; - }, - itemCount: appointmentsVM.providerProfileModel!.serviceProviderBranch!.length, - physics: NeverScrollableScrollPhysics(), - shrinkWrap: true, - ) + ? Center(child: Text(LocaleKeys.no_branch.tr())) + : ListView.separated( + itemBuilder: (context, index) { + BranchDetailModel branchModel = appointmentsVM.providerProfileModel!.serviceProviderBranch![index]; + return BranchDetailCard( + onCardTapped: () { + navigateWithName(context, AppRoutes.branchDetailView, arguments: branchModel); + }, + providerImageUrl: MyAssets.bnCar, + title: branchModel.branchName ?? "", + providerLocation: branchModel.distanceKm.toString() + " KM", + providerName: branchModel.serviceProviderName ?? "", + providerRatings: (branchModel.branchRateAvg ?? 0.0), + services: branchModel.branchServices, + ); + }, + separatorBuilder: (context, index) { + return 12.height; + }, + itemCount: appointmentsVM.providerProfileModel!.serviceProviderBranch!.length, + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + ) ], ), ), diff --git a/lib/views/dashboard/dashboard_page.dart b/lib/views/dashboard/dashboard_page.dart deleted file mode 100644 index e69de29..0000000 diff --git a/lib/views/dashboard/fragments/branches_fragment.dart b/lib/views/dashboard/fragments/branches_fragment.dart index eb1fe39..eb01a1a 100644 --- a/lib/views/dashboard/fragments/branches_fragment.dart +++ b/lib/views/dashboard/fragments/branches_fragment.dart @@ -11,8 +11,8 @@ import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/branch_details_card.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/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; @@ -78,12 +78,9 @@ class BranchesFragment extends StatelessWidget { itemCount: appointmentsVM.nearbyBranches.length, itemBuilder: (context, index) { BranchDetailModel branchDetailModel = appointmentsVM.nearbyBranches[index]; - - return ProviderDetailsCard( - onCardTapped: () { - navigateWithName(context, AppRoutes.branchDetailView, arguments: branchDetailModel); - }, - providerImageUrl: MyAssets.bnCar, + return BranchDetailCard( + onCardTapped: () => navigateWithName(context, AppRoutes.branchDetailView, arguments: branchDetailModel), + providerImageUrl: branchDetailModel.branchProfileImage ?? "", title: branchDetailModel.branchName ?? "", providerLocation: branchDetailModel.distanceKm.toString() + " KM", providerName: branchDetailModel.serviceProviderName ?? "", diff --git a/lib/views/dashboard/widgets/my_recent_branches_widget.dart b/lib/views/dashboard/widgets/my_recent_branches_widget.dart index 5018eed..4b80435 100644 --- a/lib/views/dashboard/widgets/my_recent_branches_widget.dart +++ b/lib/views/dashboard/widgets/my_recent_branches_widget.dart @@ -27,17 +27,27 @@ class MyRecentBranchesWidget extends StatelessWidget { width: 90, child: Column( children: [ - Image.asset( - MyAssets.bnCar, - width: 80, - height: 80, - fit: BoxFit.cover, - ).toCircle(borderRadius: 100), + branchDetailModel.branchProfileImage + .buildNetworkImage( + height: 80, + width: 80, + ) + .toCircle(borderRadius: 100), 8.height, - "${branchDetailModel.branchName}".toText(fontSize: 14, isBold: true, textAlign: TextAlign.center), + Flexible( + child: "${branchDetailModel.branchName}".toText( + fontSize: 14, + isBold: true, + textAlign: TextAlign.center, + ), + ), ], ), - ).onPress(() => navigateWithName(context, AppRoutes.branchDetailView, arguments: branchDetailModel)); + ).onPress(() => navigateWithName( + context, + AppRoutes.branchDetailView, + arguments: branchDetailModel, + )); }, ), );