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/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/view_models/payment_view_model.dart'; import 'package:mc_common_app/views/advertisement/ads_images_slider.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/info_bottom_sheet.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; class AdsDetailView extends StatelessWidget { final AdDetailsModel adDetails; const AdsDetailView({Key? key, required this.adDetails}) : super(key: key); @override Widget build(BuildContext context) { print("adId: ${adDetails.id}"); print("statusID: ${adDetails.adPostStatus}"); return Scaffold( appBar: CustomAppBar( title: "Ads", profileImageUrl: MyAssets.bnCar, isRemoveBackButton: false, isDrawerEnabled: false, actions: [const Icon(Icons.chat_outlined).paddingOnly(right: 21)], onTap: () {}, ), body: Container( padding: const EdgeInsets.only(bottom: 10, left: 21, right: 21), child: Column( children: [ Expanded( child: ListView( children: [ Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ CarouselWithIndicatorDemo(vehicleImages: adDetails.vehicle!.image!), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "${adDetails.vehicle!.vehicleTitle} | ${adDetails.vehicle!.color!.label}".toText(fontSize: 18, isBold: true), (adDetails.vehicle!.cityName ?? "").toText(fontSize: 10, isBold: true, color: MyColors.lightTextColor), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ "Model: ".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), "${adDetails.vehicle!.modelyear!.label}".toText( fontSize: 14, isBold: true, ), ], ), "${adDetails.vehicle!.countryID}".toText(fontSize: 10, isBold: true, color: MyColors.lightTextColor), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ "Mileage: ".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), "${adDetails.vehicle!.mileage!.mileageEnd}Km".toText( fontSize: 14, isBold: true, ), ], ), adDetails.createdOn != null ? DateTime.parse(adDetails.createdOn!).getTimeAgo().toText(fontSize: 10, isBold: true, color: MyColors.lightTextColor) : const SizedBox(), ], ), Row( children: [ "Transmission: ".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), "${adDetails.vehicle!.transmission!.label}".toText( fontSize: 14, isBold: true, ), ], ), 8.height, "Description: ".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), "${adDetails.vehicle!.vehicleDescription}".toText( fontSize: 14, isBold: true, ), ], ).toWhiteContainer(width: double.infinity, allPading: 12), ], ), ), SizedBox( child: Column( children: [ const Divider(thickness: 1, height: 1), 18.height, Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ adDetails.vehicle!.demandAmount!.toInt().toString().toText(fontSize: 30, isBold: true), " SAR".toText(fontSize: 15, isBold: true, color: MyColors.lightTextColor).paddingOnly(bottom: 5), ], ), 14.height, adDetails.isMyAd ?? false ? BuildAdDetailsActionButtonForMyAds(adDetailsModel: adDetails) : BuildAdDetailsActionButtonForExploreAds(adDetailsModel: adDetails), ], ), ) ], ), ), ); } } class BuildAdDetailsActionButtonForExploreAds extends StatelessWidget { final AdDetailsModel adDetailsModel; const BuildAdDetailsActionButtonForExploreAds({Key? key, required this.adDetailsModel}) : super(key: key); void reserveAdPriceBreakDownClicked(BuildContext context, AdDetailsModel adDetailsModel) { showModalBottomSheet( context: context, isScrollControlled: true, enableDrag: true, builder: (BuildContext context) { return InfoBottomSheet( title: "Reserve Ad", description: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Reservation Amounts".toText(fontSize: 16, isBold: true), Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ "${adDetailsModel.reservePrice}".toText(fontSize: 19, isBold: true), 2.width, "SAR".toText(color: MyColors.lightTextColor, fontSize: 10, isBold: true).paddingOnly(bottom: 3), ], ) ], ), const Divider(), "Below Amount that you will pay later".toText(fontSize: 12), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.end, children: [ "Car Price".toText(fontSize: 16, isBold: true), Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ "${adDetailsModel.vehicle!.demandAmount ?? 0.0}".toText(fontSize: 19, isBold: true), 2.width, "SAR".toText(color: MyColors.lightTextColor, fontSize: 10, isBold: true).paddingOnly(bottom: 3), ], ) ], ), // Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, // children: [ // "Tax".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), // Row( // crossAxisAlignment: CrossAxisAlignment.end, // children: [ // "${adDetailsModel.taxPrice}".toText(fontSize: 16, isBold: true), // 2.width, // "SAR".toText(color: MyColors.lightTextColor, fontSize: 10, isBold: true).paddingOnly(bottom: 0), // ], // ) // ], // ), Row( crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end, children: [ "VAT Excluded".toText(fontSize: 10, isBold: true), ], ), const Divider(), "Special Services".toText(fontSize: 16, isBold: true), 5.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Car insurance Service".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor, fontWeight: FontWeight.w500), "To be Decided".toText(fontSize: 12, isBold: true), ], ), 5.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Registration & Car Plates".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), "To be Decided".toText(fontSize: 12, isBold: true), ], ), 5.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Home Delivery Service".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), "To be Decided".toText(fontSize: 12, isBold: true), ], ), 12.height, "Special service charges will be added based on desired insurance and delivery Location".toText(fontSize: 12), 30.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Total Amount ".toText(fontSize: 16, isBold: true), Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ "${(adDetailsModel.vehicle!.demandAmount ?? 0.0)}".toText(fontSize: 19, isBold: true), 2.width, "SAR".toText(color: MyColors.lightTextColor, fontSize: 10, isBold: true).paddingOnly(bottom: 3), ], ) ], ), Row( crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end, children: [ "Estimated".toText(fontSize: 10, isBold: true), ], ), 44.height, Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ const Icon( Icons.warning, color: MyColors.adPendingStatusColor, size: 19, ).paddingOnly(bottom: 2), 3.width, "Some services are mandatory while reserving the Ad.".toText( color: MyColors.adPendingStatusColor, fontSize: 12, isItalic: true, ), ], ), 15.height, Row( children: [ Expanded( child: ShowFillButton( maxHeight: 55, title: "Complete Reservation", onPressed: () { Navigator.pop(context); navigateWithName(context, AppRoutes.paymentMethodsView, arguments: PaymentTypesEnum.adReserve); }, ), ), ], ), 19.height, ], )); }); } Widget cancelReservationAction(BuildContext context) { return Row( children: [ Expanded( child: ShowFillButton( borderColor: MyColors.redColor, txtColor: MyColors.redColor, isFilled: false, fontSize: 16, maxHeight: 55, title: "Cancel Reservation", onPressed: () {}, ), ), ], ); } Widget reserveAdAction(BuildContext context, AdDetailsModel adDetailsModel) { return Row( children: [ Expanded( child: ShowFillButton( maxHeight: 55, title: "Reserve Ad", onPressed: () { reserveAdPriceBreakDownClicked(context, adDetailsModel); // navigateWithName(context, AppRoutes.paymentMethodsView); }, ), ), if (adDetailsModel.whatsAppNo != null) ...[ 8.width, Container( height: 55, width: 55, alignment: Alignment.center, decoration: BoxDecoration(border: Border.all(color: MyColors.black, width: 2)), //TODO: It Will be replaced by a WhatsApp Icon child: const Icon(Icons.message, color: MyColors.black), ).onPress(() {}), ], if (adDetailsModel.phoneNo != null) ...[ 8.width, Container( height: 55, width: 55, alignment: Alignment.center, decoration: BoxDecoration(border: Border.all(color: MyColors.black, width: 2)), child: const Icon(Icons.phone, color: MyColors.black), ).onPress(() {}), ] ], ); } Widget defaultActionForProviderAndCustomer(BuildContext context, AdDetailsModel adDetailsModel) { return (adDetailsModel.phoneNo != null) ? Row( children: [ Expanded( child: ShowFillButton( maxHeight: 55, title: "Contact", fontSize: 18, isBold: false, iconWidget: const Padding( padding: EdgeInsets.only(right: 10), child: Icon(Icons.phone, color: MyColors.white, size: 24), ), onPressed: () {}, ), ), if (adDetailsModel.whatsAppNo != null) ...[ 8.width, Container( height: 55, width: 55, alignment: Alignment.center, decoration: BoxDecoration(border: Border.all(color: MyColors.black, width: 2)), //TODO: It Will be replaced by a WhatsApp Icon child: const Icon(Icons.message, color: MyColors.black), ).onPress(() {}), ], ], ) : const SizedBox.shrink(); } @override Widget build(BuildContext context) { context.read().updateCurrentAdId(id: adDetailsModel.id!); // switch (adPostStatus) { // case AdPostStatus.pendingForPayment: // break; // case AdPostStatus.active: // break; // 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); switch (adDetailsModel.createdByRoleEnum!) { case CreatedByRoleEnum.customer: case CreatedByRoleEnum.provider: return defaultActionForProviderAndCustomer(context, adDetailsModel); case CreatedByRoleEnum.admin: return reserveAdAction(context, adDetailsModel); case CreatedByRoleEnum.allAds: return SizedBox.shrink(); } } } class BuildAdDetailsActionButtonForMyAds extends StatelessWidget { final AdDetailsModel adDetailsModel; const BuildAdDetailsActionButtonForMyAds({Key? key, required this.adDetailsModel}) : super(key: key); void reserveAdPriceBreakDownClicked(BuildContext context) { showModalBottomSheet( context: context, isScrollControlled: true, enableDrag: true, builder: (BuildContext context) { return InfoBottomSheet( title: "Reserve Ad", description: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Reservation Amounts".toText(fontSize: 16, isBold: true), Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ "500".toText(fontSize: 19, isBold: true), 2.width, "SAR".toText(color: MyColors.lightTextColor, fontSize: 10, isBold: true).paddingOnly(bottom: 3), ], ) ], ), const Divider(), "Below Amount that you will pay later".toText(fontSize: 12), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.end, children: [ "Car Price".toText(fontSize: 16, isBold: true), Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ "30,000".toText(fontSize: 19, isBold: true), 2.width, "SAR".toText(color: MyColors.lightTextColor, fontSize: 10, isBold: true).paddingOnly(bottom: 3), ], ) ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Tax".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ "4,500".toText(fontSize: 16, isBold: true), 2.width, "SAR".toText(color: MyColors.lightTextColor, fontSize: 10, isBold: true).paddingOnly(bottom: 0), ], ) ], ), const Divider(), "Special Services".toText(fontSize: 16, isBold: true), 5.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Car insurance Service".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor, fontWeight: FontWeight.w500), "To be Decided".toText(fontSize: 12, isBold: true), ], ), 5.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Registration & Car Plates".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), "To be Decided".toText(fontSize: 12, isBold: true), ], ), 5.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Home Delivery Service".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), "To be Decided".toText(fontSize: 12, isBold: true), ], ), 12.height, "Special service charges will be added based on desired insurance and delivery Location".toText(fontSize: 12), 30.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Total Amount ".toText(fontSize: 16, isBold: true), Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ "34,500".toText(fontSize: 19, isBold: true), 2.width, "SAR".toText(color: MyColors.lightTextColor, fontSize: 10, isBold: true).paddingOnly(bottom: 3), ], ) ], ), Row( crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end, children: [ "Estimated".toText(fontSize: 10, isBold: true), ], ), 44.height, Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ const Icon( Icons.warning, color: MyColors.adPendingStatusColor, size: 19, ).paddingOnly(bottom: 2), 3.width, "Some services are mandatory while reserving the Ad.".toText( color: MyColors.adPendingStatusColor, fontSize: 12, isItalic: true, ), ], ), 15.height, Row( children: [ Expanded( child: ShowFillButton( maxHeight: 55, title: "Complete Reservation", onPressed: () { Navigator.pop(context); navigateWithName(context, AppRoutes.paymentMethodsView); }, ), ), ], ), 19.height, ], )); }); } Widget pendingForReviewAction(BuildContext context, {required int adID}) { return Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Row( children: [ Expanded( child: ShowFillButton( backgroundColor: MyColors.grey98Color.withOpacity(0.3), txtColor: MyColors.lightTextColor, maxHeight: 55, title: "Waiting for Admins Approval", isBold: false, onPressed: () {}, ), ), ], ), ], ); } Widget pendingForPaymentAction(BuildContext context, {required int adID}) { return Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Row( children: [ Expanded( child: ShowFillButton( maxHeight: 55, title: "Pay Now", onPressed: () { navigateWithName(context, AppRoutes.paymentMethodsView, arguments: PaymentTypesEnum.ads); }, ), ), ], ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ InkWell( onTap: () {}, child: Padding( padding: const EdgeInsets.all(8.0), child: "Delete Ad".toText(fontSize: 15, isBold: true, color: MyColors.redColor), ), ), ], ) ], ); } Widget markAsSoldAction(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Row( children: [ Expanded( child: ShowFillButton( maxHeight: 55, title: "Mark As Sold", onPressed: () {}, ), ), ], ), Row( children: [ Expanded( child: ShowFillButton( isFilled: true, borderColor: MyColors.darkPrimaryColor, maxHeight: 55, title: "Deactivate Ad", onPressed: () {}, ), ), ], ), ], ); } Widget cancelReservationAction(BuildContext context) { return Row( children: [ Expanded( child: ShowFillButton( borderColor: MyColors.redColor, txtColor: MyColors.redColor, isFilled: false, fontSize: 16, maxHeight: 55, title: "Cancel Reservation", onPressed: () {}, ), ), ], ); } Widget defaultAction(BuildContext context) { return Row( children: [ Expanded( child: ShowFillButton( maxHeight: 55, title: "Reserve Ad", onPressed: () { reserveAdPriceBreakDownClicked(context); // navigateWithName(context, AppRoutes.paymentMethodsView); }, ), ), 8.width, Container( height: 55, width: 55, alignment: Alignment.center, decoration: BoxDecoration(border: Border.all(color: MyColors.black, width: 2)), //TODO: It Will be replaced by a WhatsApp Icon child: const Icon(Icons.message, color: MyColors.black), ).onPress(() {}), 8.width, Container( height: 55, width: 55, alignment: Alignment.center, decoration: BoxDecoration(border: Border.all(color: MyColors.black, width: 2)), child: const Icon(Icons.phone, color: MyColors.black), ).onPress(() {}), ], ); } @override Widget build(BuildContext context) { context.read().updateCurrentAdId(id: adDetailsModel.id!); switch (adDetailsModel.adPostStatus!) { case AdPostStatus.pendingForPayment: return pendingForPaymentAction(context, adID: adDetailsModel.id!); case AdPostStatus.active: return markAsSoldAction(context); case AdPostStatus.reserved: break; case AdPostStatus.buyingService: case AdPostStatus.reserveCancel: case AdPostStatus.rejected: case AdPostStatus.cancelled: case AdPostStatus.pendingForPost: case AdPostStatus.pendingForReview: return pendingForReviewAction(context, adID: adDetailsModel.id!); // return pendingForPaymentAction(context, adID: adId); case AdPostStatus.sold: case AdPostStatus.expired: break; } return const SizedBox.shrink(); } }