From 75fd7260277eea0f187f7d505aefa3c6971dbbda Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Tue, 6 Jun 2023 10:44:58 +0300 Subject: [PATCH] Added few updations --- lib/theme/colors.dart | 7 +- lib/utils/enums.dart | 16 +++ lib/utils/utils.dart | 51 ++++++- lib/view_models/ad_view_model.dart | 19 ++- lib/views/advertisement/ads_detail_view.dart | 137 ++++++++++++++++--- lib/views/advertisement/ads_list.dart | 28 +++- 6 files changed, 226 insertions(+), 32 deletions(-) diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index c057d05..726975a 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -36,6 +36,12 @@ class MyColors { static const Color borderColor = Color(0xffE8E8E8); static const Color greyAddBorderColor = Color(0xffEEEEEE); + //AdStatusColors: + static const Color adActiveStatusColor = Color(0xff5FC16A); + static const Color adCancelledStatusColor = Color(0xffDD0505); + static const Color adSoldStatusColor = Color(0xff22742B); + static const Color adPendingStatusColor = Color(0xffEDB947); + static Decoration gradient = BoxDecoration( gradient: const LinearGradient(colors: [ darkPrimaryColor, @@ -75,4 +81,3 @@ Color? borderLightColor = Colors.blueGrey[50]; const Color iconColor = Colors.blueGrey; Color? headingColor = Colors.blueGrey[800]; Color? txtColor = Colors.blueGrey[500]; - diff --git a/lib/utils/enums.dart b/lib/utils/enums.dart index d89d2fe..fb6a8c8 100644 --- a/lib/utils/enums.dart +++ b/lib/utils/enums.dart @@ -19,6 +19,22 @@ enum AdPostStatus { reserveCancel, } +enum PaymentMethodsEnum { + mada, + visa, + applePay, + masterCard, + tamara, +} + +enum PaymentTypesEnum { + subscription, + appointment, + ads, + adReserve, + request, +} + enum AdCreationStepsEnum { vehicleDetails, damageParts, diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index ae599e0..00f3394 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -4,12 +4,13 @@ import 'dart:typed_data'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:path/path.dart' as p; - import 'package:fluttertoast/fluttertoast.dart'; import 'package:mc_common_app/exceptions/api_exception.dart'; +import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/widgets/loading_dialog.dart'; +import 'package:path/path.dart' as p; class Utils { static bool _isLoadingVisible = false; @@ -24,8 +25,6 @@ class Utils { static Future pickDateFromDatePicker(BuildContext context) async { DateTime? pickedDate = await showDatePicker( context: context, - - initialDate: DateTime.now(), //get today's date firstDate: DateTime.now(), //DateTime.now() - not to allow to choose before today. lastDate: DateTime(2101)); @@ -156,6 +155,50 @@ class Utils { ); } + static Color getChipColorByAdStatus(AdPostStatus adPostStatus) { + switch (adPostStatus) { + case AdPostStatus.pendingForReview: + return MyColors.adPendingStatusColor; + + case AdPostStatus.pendingForPayment: + return MyColors.adPendingStatusColor; + + case AdPostStatus.rejected: + return MyColors.adCancelledStatusColor; + + case AdPostStatus.cancelled: + return MyColors.adCancelledStatusColor; + + case AdPostStatus.pendingForPost: + return MyColors.adPendingStatusColor; + + case AdPostStatus.active: + return MyColors.adActiveStatusColor; + + case AdPostStatus.expired: + return MyColors.adCancelledStatusColor; + + case AdPostStatus.sold: + return MyColors.adSoldStatusColor; + + case AdPostStatus.reserved: + return MyColors.primaryColor; + + case AdPostStatus.buyingService: + case AdPostStatus.reserveCancel: + return MyColors.greenColor; + } + } + + static statusContainerChip({required String text, EdgeInsetsGeometry padding = const EdgeInsets.symmetric(vertical: 3, horizontal: 6), Color chipColor = MyColors.greenColor}) { + return Container( + decoration: BoxDecoration( + color: chipColor, + borderRadius: const BorderRadius.all(Radius.circular(200)), + ), + padding: padding, + child: text.toText(fontSize: 10, color: MyColors.white)); + } static InputDecoration txtField(String label) { return InputDecoration( diff --git a/lib/view_models/ad_view_model.dart b/lib/view_models/ad_view_model.dart index 4b6bf5b..faf4a97 100644 --- a/lib/view_models/ad_view_model.dart +++ b/lib/view_models/ad_view_model.dart @@ -69,6 +69,7 @@ class AdVM extends BaseVM { List exploreAdsFilteredList = []; List myAdsFilteredList = []; List myAds = []; + List myActiveAdsForHome = []; List vehicleDamageCards = []; @@ -95,7 +96,10 @@ class AdVM extends BaseVM { } void removeSpecialServiceCard(int index) { - String option = specialServiceCards.elementAt(index).serviceSelectedId!.selectedOption; + String option = specialServiceCards + .elementAt(index) + .serviceSelectedId! + .selectedOption; for (var value in vehicleAdsSpecialServices) { if (value.name == option) { @@ -202,12 +206,16 @@ class AdVM extends BaseVM { Future getMyAds() async { isFetchingLists = true; myAds = await adsRepo.getAllAds(isMyAds: true); + final myActiveAds = myAds.where((element) => element.adPostStatus == AdPostStatus.active).toList(); + myActiveAdsForHome = myActiveAds.length >= 3 ? myActiveAds.take(3).toList() : myActiveAds; + isFetchingLists = true; notifyListeners(); } Future getExploreAds() async { exploreAds = await adsRepo.getAllAds(isMyAds: false); + myAdsFilteredList = exploreAds; notifyListeners(); } @@ -860,7 +868,10 @@ class AdVM extends BaseVM { } void removeDamagePartCard(int index) { - String option = vehicleDamageCards.elementAt(index).partSelectedId!.selectedOption; + String option = vehicleDamageCards + .elementAt(index) + .partSelectedId! + .selectedOption; for (var value in vehicleDamageParts) { if (value.partName == option) { @@ -992,7 +1003,9 @@ class AdVM extends BaseVM { Future convertFileToVehiclePostingImages({required File file}) async { List imageBytes = await file.readAsBytes(); String image = base64Encode(imageBytes); - String fileName = file.path.split('/').last; + String fileName = file.path + .split('/') + .last; VehiclePostingImages vehiclePostingImages = VehiclePostingImages( imageName: fileName, imageStr: image, diff --git a/lib/views/advertisement/ads_detail_view.dart b/lib/views/advertisement/ads_detail_view.dart index 53f0e29..d749971 100644 --- a/lib/views/advertisement/ads_detail_view.dart +++ b/lib/views/advertisement/ads_detail_view.dart @@ -5,6 +5,7 @@ import 'package:mc_common_app/extensions/int_extensions.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/theme/colors.dart'; +import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/views/advertisement/ads_images_slider.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; @@ -104,27 +105,7 @@ class AdsDetailView extends StatelessWidget { ], ), 14.height, - Row( - children: [ - Expanded( - child: ShowFillButton( - maxHeight: 55, - title: "Reserve Ad", - onPressed: () { - navigateWithName(context, AppRoutes.paymentMethodsView); - }, - ), - ), - 12.width, - Container( - height: 55, - width: 55, - alignment: Alignment.center, - decoration: BoxDecoration(border: Border.all(color: MyColors.black, width: 3)), - child: const Icon(Icons.phone, color: MyColors.black), - ).onPress(() {}), - ], - ), + BuildAdDetailsActionButton(adPostStatus: adDetails.adPostStatus!), ], ), )), @@ -134,3 +115,117 @@ class AdsDetailView extends StatelessWidget { ); } } + +class BuildAdDetailsActionButton extends StatelessWidget { + final AdPostStatus adPostStatus; + + const BuildAdDetailsActionButton({Key? key, required this.adPostStatus}) : super(key: key); + + Widget pendingForPaymentAction(BuildContext context) { + return Column( + children: [ + Row( + children: [ + Expanded( + child: ShowFillButton( + maxHeight: 55, + title: "Reserve Ad", + onPressed: () { + navigateWithName(context, AppRoutes.paymentMethodsView); + }, + ), + ), + ], + ), + Row( + children: [ + Expanded( + child: ShowFillButton( + maxHeight: 55, + title: "Reserve Ad", + onPressed: () { + navigateWithName(context, AppRoutes.paymentMethodsView); + }, + ), + ), + ], + ) + ], + ); + } + + Widget markAsSoldAction(BuildContext context) { + return Row( + children: [ + Expanded( + child: ShowFillButton( + maxHeight: 55, + title: "Mark As Sold", + onPressed: () {}, + ), + ), + ], + ); + } + + Widget cancelReservationAction(BuildContext context) { + return Row( + children: [ + Expanded( + child: ShowFillButton( + maxHeight: 55, + title: "Cancel Reservation", + onPressed: () {}, + ), + ), + ], + ); + } + + Widget defaultAction(BuildContext context) { + return Row( + children: [ + Expanded( + child: ShowFillButton( + maxHeight: 55, + title: "Reserve Ad", + onPressed: () { + navigateWithName(context, AppRoutes.paymentMethodsView); + }, + ), + ), + 12.width, + Container( + height: 55, + width: 55, + alignment: Alignment.center, + decoration: BoxDecoration(border: Border.all(color: MyColors.black, width: 3)), + child: const Icon(Icons.phone, color: MyColors.black), + ).onPress(() {}), + ], + ); + } + + @override + Widget build(BuildContext context) { + switch (adPostStatus) { + case AdPostStatus.pendingForPayment: + return pendingForPaymentAction(context); + case AdPostStatus.active: + return markAsSoldAction(context); + case AdPostStatus.reserved: + return cancelReservationAction(context); + + case AdPostStatus.buyingService: + case AdPostStatus.reserveCancel: + case AdPostStatus.rejected: + case AdPostStatus.cancelled: + case AdPostStatus.pendingForPost: + case AdPostStatus.pendingForReview: + case AdPostStatus.sold: + case AdPostStatus.expired: + break; + } + return defaultAction(context); + } +} diff --git a/lib/views/advertisement/ads_list.dart b/lib/views/advertisement/ads_list.dart index fecbfb4..73af6a9 100644 --- a/lib/views/advertisement/ads_list.dart +++ b/lib/views/advertisement/ads_list.dart @@ -6,14 +6,24 @@ 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/theme/colors.dart'; import 'package:mc_common_app/utils/navigator.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/widgets/extensions/extensions_widget.dart'; +import 'package:provider/provider.dart'; class BuildAdsList extends StatelessWidget { final List adsList; final ScrollPhysics? scrollPhysics; final bool isAdsFragment; + final bool shouldShowAdStatus; - const BuildAdsList({Key? key, required this.adsList, this.scrollPhysics, this.isAdsFragment = false}) : super(key: key); + const BuildAdsList({ + Key? key, + required this.adsList, + this.scrollPhysics, + required this.shouldShowAdStatus, + this.isAdsFragment = false, + }) : super(key: key); @override Widget build(BuildContext context) { @@ -32,7 +42,11 @@ class BuildAdsList extends StatelessWidget { itemBuilder: (BuildContext context, int index) { return Padding( padding: const EdgeInsets.only(bottom: 8), - child: AdCard(adDetails: adsList[index]), + child: AdCard( + adDetails: adsList[index], + isAdsFragment: isAdsFragment, + shouldShowAdStatus: shouldShowAdStatus, + ), ).onPress(() { navigateWithName(context, AppRoutes.adsDetailView, arguments: adsList[index]); }); @@ -42,8 +56,10 @@ class BuildAdsList extends StatelessWidget { class AdCard extends StatelessWidget { final AdDetailsModel adDetails; + final bool isAdsFragment; + final bool shouldShowAdStatus; - const AdCard({Key? key, required this.adDetails}) : super(key: key); + const AdCard({Key? key, required this.adDetails, required this.isAdsFragment, required this.shouldShowAdStatus}) : super(key: key); @override Widget build(BuildContext context) { @@ -79,6 +95,12 @@ class AdCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ + if (isAdsFragment && context.read().isExploreAdsTapped) ...[ + Utils.statusContainerChip(text: adDetails.statuslabel!, chipColor: Utils.getChipColorByAdStatus(adDetails.adPostStatus!)), + ], + if (shouldShowAdStatus) ...[ + Utils.statusContainerChip(text: adDetails.statuslabel!, chipColor: Utils.getChipColorByAdStatus(adDetails.adPostStatus!)), + ], (adDetails.vehicle!.vehicleTitle ?? "").toText(fontSize: 16, isBold: true), Row( children: [