diff --git a/android/app/src/main/res/ic_launcher-web.png b/android/app/src/main/res/ic_launcher-web.png new file mode 100644 index 0000000..97553a3 Binary files /dev/null and b/android/app/src/main/res/ic_launcher-web.png differ diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 345888d..79d695e 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,4 @@ - - + - \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..79d695e --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..62a0b51 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..263b3ed Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..bdf769a Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/play_store_512.png b/android/app/src/main/res/play_store_512.png deleted file mode 100644 index f0c67d2..0000000 Binary files a/android/app/src/main/res/play_store_512.png and /dev/null differ diff --git a/android/app/src/main/res/playstore-icon.png b/android/app/src/main/res/playstore-icon.png new file mode 100644 index 0000000..566d741 Binary files /dev/null and b/android/app/src/main/res/playstore-icon.png differ diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..4db2c8a --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,3 @@ + + #ff643c + \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml deleted file mode 100644 index d2aa524..0000000 --- a/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/assets/translations/en_En.json b/assets/translations/en-US.json similarity index 96% rename from assets/translations/en_En.json rename to assets/translations/en-US.json index 3552d0d..bdb591d 100644 --- a/assets/translations/en_En.json +++ b/assets/translations/en-US.json @@ -102,5 +102,7 @@ "rideHistory": "Ride History", "plsLoginToAcc": "Please Log In to Continue", "youAreNotLoggedIn": "You’re not logged in. Please sign in to access your account and explore all features.", - "noOrderfound": "No order found" + "noOrderfound": "No order found", + "reset_password_link_sent": "A reset link has been sent to {email}", + "pay_amount": "Pay Amount: {amount}" } \ No newline at end of file diff --git a/assets/translations/ru-RU.json b/assets/translations/ru-RU.json new file mode 100644 index 0000000..bdb591d --- /dev/null +++ b/assets/translations/ru-RU.json @@ -0,0 +1,108 @@ +{ + "loginToExplore" : "Log in to explore your all in one vendor app favourites and shop effortlessly.", + "emailAddress": "Email Address*", + "password": "Password*", + "enterPassword": "Enter password", + "forgotPassword": "Forgot Password", + "login": "Log in", + "orContinueWith": "or continue with", + + + "withGoogle": "with Google", + "withApple": "with Apple", + "dontHaveAccount": "Didn't have an account?", + "signUp": "Sign up", + "skip": "Skip", + "signUpToExplore": "Sign up to explore all our services and start shopping, riding, and more.", + "firstName": "First Name*", + "lastName": "Last Name*", + "enterMobileNumber": "Enter Mobile number", + "confirmPassword": "Confirm Password*", + "enterConfirmPassword": "Enter confirm password", + "referralCode": "Referral Code", + "enterReferralCode": "Enter referral code", + "alreadyHaveAccount":"Already have an account?", + "enterYourregisteredEmail": "Enter your registered email to receive a reset link.", + "sendLink": "Send Link", + "rememberPassword": "Remember Password?", + "enterOtpSent": "Enter the OTP sent to your mobile", + "resendOTP": "Resend OTP", + "verify": "Verify", + "useYourMobileNumber": "Use your mobile number to Log in easily and securely.", + "sendCode":"Send Code", + "serviceIsUnavailable": "Service is unavailable at the selected address.", + "pickUpLocation": "Pickup Location", + "destinationLocation": "Destination Location", + "continueT":"Continue", + "plsSelectSourceLocation": "Please select source location", + "plsSelectDestinationLocations": "Please select destination location", + "selectVehicleType": "Select Your Vehicle Type", + "plsSelectVehicleTypeFirst": "Please select a vehicle type first.", + "plsSelectPaymentMethod": "Please select a payment method", + "insufficientWallet": "Insufficient wallet balance. Please select another payment method.", + "promoCode": "Promo code", + "thisOfferNotEligible": "This offer not eligible for this booking", + "viewAll": "View All", + "writeCoupon": "Write coupon Code", + "redeemNow": "Redeem now", + "plsEnterCouponCode":"Please enter a coupon code", + "couponApplied": "Coupon applied successfully", + "couponExpired": "This coupon code has been expired", + "invalidCouponCode": "Invalid coupon code", + "orderSummary": "Order Summary", + "subtotal": "Subtotal", + "discount": "Discount", + "orderTotal": "Order Total", + "confirmBooking": "Confirm Booking", + "waitingForDriver": "Waiting for driver....", + "cancelRide": "Cancel Ride", + "riderCancelledSucces": "Ride cancelled successfully", + "failedToCancel": "Failed to cancel ride", + "pleaseWait": "Please wait...", + "change": "Change", + "yourSosRequest": "Your SOS request has been submitted to admin", + "yourSosrequestAlreadySubmitted": "Your SOS request is already submitted", + "payNow": "Pay Now", + "youDoNothaveSufficientwalletBalance": "You do not have sufficient wallet balance", + "somethingWentWrong": "Something went wrong, please contact admin.", + "cash": "Cash", + "coupon": "Coupon", + "couponNotFound": "Coupon not found.", + "tapToApply": "Tap To Apply", + "home": "Home", + "myBookings": "My Bookings", + "profile": "profile", + "wallet": "Wallet", + "cabServiceType": "Cab Service Type", + "everyRideVerified": "Every Ride. Every Driver. Verified.", + "allDriversIDCheck": "All drivers go through ID checks and background verification for your safety.", + "intercity": "Intercity", + "aroundTheCity": "Around the city", + "rideDetails": "Ride Details", + "orderId": "Order Id:", + "bookingData": "Booking Date:", + "rideAndFareSummary": "Ride & Fare Summary", + "updateReview": "Update Review", + "addReview": "Add Review", + "complain": "Complain", + "distance": "Distance", + "km": "KM", + "duration": "Duration", + "howWasTrip": "How was your trip?", + "yourFeedbackWillHelp": "Your feedback will help us improve \n driving experience better", + "rateFor": "Rate for", + "typeComment": "Type comment....", + "title": "Title", + "typeDescription": "Type Description...", + "save": "Save", + "popularDestinations": "Popular Destinations", + "selectPaymentMethod": "Select Payment Method", + "prefferedPayment": "Preferred Payment", + "otherPaymentOptions": "Other Payment Options", + "rideHistory": "Ride History", + "plsLoginToAcc": "Please Log In to Continue", + "youAreNotLoggedIn": "You’re not logged in. Please sign in to access your account and explore all features.", + "noOrderfound": "No order found", + "reset_password_link_sent": "A reset link has been sent to {email}", + "pay_amount": "Pay Amount: {amount}" +} \ No newline at end of file diff --git a/assets/translations/ru_RU.json b/assets/translations/ru_RU.json deleted file mode 100644 index e69de29..0000000 diff --git a/assets/translations/uz-UZ.json b/assets/translations/uz-UZ.json new file mode 100644 index 0000000..bdb591d --- /dev/null +++ b/assets/translations/uz-UZ.json @@ -0,0 +1,108 @@ +{ + "loginToExplore" : "Log in to explore your all in one vendor app favourites and shop effortlessly.", + "emailAddress": "Email Address*", + "password": "Password*", + "enterPassword": "Enter password", + "forgotPassword": "Forgot Password", + "login": "Log in", + "orContinueWith": "or continue with", + + + "withGoogle": "with Google", + "withApple": "with Apple", + "dontHaveAccount": "Didn't have an account?", + "signUp": "Sign up", + "skip": "Skip", + "signUpToExplore": "Sign up to explore all our services and start shopping, riding, and more.", + "firstName": "First Name*", + "lastName": "Last Name*", + "enterMobileNumber": "Enter Mobile number", + "confirmPassword": "Confirm Password*", + "enterConfirmPassword": "Enter confirm password", + "referralCode": "Referral Code", + "enterReferralCode": "Enter referral code", + "alreadyHaveAccount":"Already have an account?", + "enterYourregisteredEmail": "Enter your registered email to receive a reset link.", + "sendLink": "Send Link", + "rememberPassword": "Remember Password?", + "enterOtpSent": "Enter the OTP sent to your mobile", + "resendOTP": "Resend OTP", + "verify": "Verify", + "useYourMobileNumber": "Use your mobile number to Log in easily and securely.", + "sendCode":"Send Code", + "serviceIsUnavailable": "Service is unavailable at the selected address.", + "pickUpLocation": "Pickup Location", + "destinationLocation": "Destination Location", + "continueT":"Continue", + "plsSelectSourceLocation": "Please select source location", + "plsSelectDestinationLocations": "Please select destination location", + "selectVehicleType": "Select Your Vehicle Type", + "plsSelectVehicleTypeFirst": "Please select a vehicle type first.", + "plsSelectPaymentMethod": "Please select a payment method", + "insufficientWallet": "Insufficient wallet balance. Please select another payment method.", + "promoCode": "Promo code", + "thisOfferNotEligible": "This offer not eligible for this booking", + "viewAll": "View All", + "writeCoupon": "Write coupon Code", + "redeemNow": "Redeem now", + "plsEnterCouponCode":"Please enter a coupon code", + "couponApplied": "Coupon applied successfully", + "couponExpired": "This coupon code has been expired", + "invalidCouponCode": "Invalid coupon code", + "orderSummary": "Order Summary", + "subtotal": "Subtotal", + "discount": "Discount", + "orderTotal": "Order Total", + "confirmBooking": "Confirm Booking", + "waitingForDriver": "Waiting for driver....", + "cancelRide": "Cancel Ride", + "riderCancelledSucces": "Ride cancelled successfully", + "failedToCancel": "Failed to cancel ride", + "pleaseWait": "Please wait...", + "change": "Change", + "yourSosRequest": "Your SOS request has been submitted to admin", + "yourSosrequestAlreadySubmitted": "Your SOS request is already submitted", + "payNow": "Pay Now", + "youDoNothaveSufficientwalletBalance": "You do not have sufficient wallet balance", + "somethingWentWrong": "Something went wrong, please contact admin.", + "cash": "Cash", + "coupon": "Coupon", + "couponNotFound": "Coupon not found.", + "tapToApply": "Tap To Apply", + "home": "Home", + "myBookings": "My Bookings", + "profile": "profile", + "wallet": "Wallet", + "cabServiceType": "Cab Service Type", + "everyRideVerified": "Every Ride. Every Driver. Verified.", + "allDriversIDCheck": "All drivers go through ID checks and background verification for your safety.", + "intercity": "Intercity", + "aroundTheCity": "Around the city", + "rideDetails": "Ride Details", + "orderId": "Order Id:", + "bookingData": "Booking Date:", + "rideAndFareSummary": "Ride & Fare Summary", + "updateReview": "Update Review", + "addReview": "Add Review", + "complain": "Complain", + "distance": "Distance", + "km": "KM", + "duration": "Duration", + "howWasTrip": "How was your trip?", + "yourFeedbackWillHelp": "Your feedback will help us improve \n driving experience better", + "rateFor": "Rate for", + "typeComment": "Type comment....", + "title": "Title", + "typeDescription": "Type Description...", + "save": "Save", + "popularDestinations": "Popular Destinations", + "selectPaymentMethod": "Select Payment Method", + "prefferedPayment": "Preferred Payment", + "otherPaymentOptions": "Other Payment Options", + "rideHistory": "Ride History", + "plsLoginToAcc": "Please Log In to Continue", + "youAreNotLoggedIn": "You’re not logged in. Please sign in to access your account and explore all features.", + "noOrderfound": "No order found", + "reset_password_link_sent": "A reset link has been sent to {email}", + "pay_amount": "Pay Amount: {amount}" +} \ No newline at end of file diff --git a/assets/translations/uz_UZ.json b/assets/translations/uz_UZ.json deleted file mode 100644 index e69de29..0000000 diff --git a/lib/constant/constant.dart b/lib/constant/constant.dart index 4d13a6b..6becfc0 100644 --- a/lib/constant/constant.dart +++ b/lib/constant/constant.dart @@ -19,7 +19,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:geolocator/geolocator.dart' as geolocator; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:intl/intl.dart'; import 'package:mailer/mailer.dart'; @@ -172,7 +172,10 @@ class Constant { static bool checkZoneCheck(double latitude, double longLatitude) { bool isZoneAvailable = false; for (var element in Constant.zoneList) { - if (Constant.isPointInPolygon(LatLng(latitude, longLatitude), element.area!)) { + if (Constant.isPointInPolygon( + LatLng(latitude, longLatitude), + element.area!, + )) { isZoneAvailable = true; break; } else { @@ -185,7 +188,10 @@ class Constant { static String? getZoneId(double latitude, double longLatitude) { String? zoneId; for (var element in Constant.zoneList) { - if (Constant.isPointInPolygon(LatLng(latitude, longLatitude), element.area!)) { + if (Constant.isPointInPolygon( + LatLng(latitude, longLatitude), + element.area!, + )) { zoneId = element.id; break; } @@ -198,13 +204,18 @@ class Constant { return (rng.nextInt(900000) + 100000).toString(); // 6 digit } - static Future checkPermission({required BuildContext context, required Function() onTap}) async { + static Future checkPermission({ + required BuildContext context, + required Function() onTap, + }) async { LocationPermission permission = await Geolocator.checkPermission(); if (permission == LocationPermission.denied) { permission = await Geolocator.requestPermission(); } if (permission == LocationPermission.denied) { - ShowToastDialog.showToast("You have to allow location permission to use your location"); + ShowToastDialog.showToast( + "You have to allow location permission to use your location", + ); } else if (permission == LocationPermission.deniedForever) { showDialog( context: context, @@ -241,7 +252,10 @@ class Constant { return isPlanExpire; } - static bool isExpireDate({required bool expiryDay, Timestamp? subscriptionExpiryDate}) { + static bool isExpireDate({ + required bool expiryDay, + Timestamp? subscriptionExpiryDate, + }) { bool isPlanExpire = false; if (expiryDay == true) { isPlanExpire = false; @@ -301,17 +315,49 @@ class Constant { String commission = "0"; if (sectionConstantModel!.adminCommision!.isEnabled == true) { if (vendorModel.adminCommission == null) { - if (sectionConstantModel!.adminCommision!.commissionType!.toLowerCase() == "Percent".toLowerCase() || - sectionConstantModel!.adminCommision!.commissionType?.toLowerCase() == "Percentage".toLowerCase()) { - commission = (double.parse(price) + (double.parse(price) * double.parse(sectionConstantModel!.adminCommision!.amount.toString()) / 100)).toString(); + if (sectionConstantModel!.adminCommision!.commissionType! + .toLowerCase() == + "Percent".toLowerCase() || + sectionConstantModel!.adminCommision!.commissionType + ?.toLowerCase() == + "Percentage".toLowerCase()) { + commission = + (double.parse(price) + + (double.parse(price) * + double.parse( + sectionConstantModel!.adminCommision!.amount + .toString(), + ) / + 100)) + .toString(); } else { - commission = (double.parse(price) + double.parse(sectionConstantModel!.adminCommision!.amount.toString())).toString(); + commission = + (double.parse(price) + + double.parse( + sectionConstantModel!.adminCommision!.amount.toString(), + )) + .toString(); } } else { - if (vendorModel.adminCommission!.commissionType!.toLowerCase() == "Percent".toLowerCase() || vendorModel.adminCommission!.commissionType?.toLowerCase() == "Percentage".toLowerCase()) { - commission = (double.parse(price) + (double.parse(price) * double.parse(vendorModel.adminCommission!.amount.toString()) / 100)).toString(); + if (vendorModel.adminCommission!.commissionType!.toLowerCase() == + "Percent".toLowerCase() || + vendorModel.adminCommission!.commissionType?.toLowerCase() == + "Percentage".toLowerCase()) { + commission = + (double.parse(price) + + (double.parse(price) * + double.parse( + vendorModel.adminCommission!.amount.toString(), + ) / + 100)) + .toString(); } else { - commission = (double.parse(price) + double.parse(vendorModel.adminCommission!.amount.toString())).toString(); + commission = + (double.parse(price) + + double.parse( + vendorModel.adminCommission!.amount.toString(), + )) + .toString(); } } } else { @@ -327,7 +373,10 @@ class Constant { if (taxModel.type == "fix") { taxAmount = double.parse(taxModel.tax.toString()); } else { - taxAmount = (double.parse(amount.toString()) * double.parse(taxModel.tax!.toString())) / 100; + taxAmount = + (double.parse(amount.toString()) * + double.parse(taxModel.tax!.toString())) / + 100; } } return taxAmount; @@ -336,8 +385,12 @@ class Constant { static double calculateDiscount({String? amount, CouponModel? offerModel}) { double taxAmount = 0.0; if (offerModel != null) { - if (offerModel.discountType == "Percentage" || offerModel.discountType == "percentage") { - taxAmount = (double.parse(amount.toString()) * double.parse(offerModel.discount.toString())) / 100; + if (offerModel.discountType == "Percentage" || + offerModel.discountType == "percentage") { + taxAmount = + (double.parse(amount.toString()) * + double.parse(offerModel.discount.toString())) / + 100; } else { taxAmount = double.parse(offerModel.discount.toString()); } @@ -345,11 +398,17 @@ class Constant { return taxAmount; } - static String calculateReview({required String? reviewCount, required String? reviewSum}) { - if (0 == double.parse(reviewSum.toString()) && 0 == double.parse(reviewSum.toString())) { + static String calculateReview({ + required String? reviewCount, + required String? reviewSum, + }) { + if (0 == double.parse(reviewSum.toString()) && + 0 == double.parse(reviewSum.toString())) { return "0"; } - return (double.parse(reviewSum.toString()) / double.parse(reviewCount.toString())).toStringAsFixed(1); + return (double.parse(reviewSum.toString()) / + double.parse(reviewCount.toString())) + .toStringAsFixed(1); } static String getUuid() { @@ -357,13 +416,24 @@ class Constant { } static Widget loader() { - return Center(child: CircularProgressIndicator(color: AppThemeData.primary300)); + return Center( + child: CircularProgressIndicator(color: AppThemeData.primary300), + ); } static Widget showEmptyView({required String message}) { final themeController = Get.find(); final isDark = themeController.isDark.value; - return Center(child: Text(message, style: TextStyle(fontFamily: AppThemeData.fontFamily, fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center( + child: Text( + message, + style: TextStyle( + fontFamily: AppThemeData.fontFamily, + fontSize: 18, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + ); } static String maskingString(String documentId, int maskingDigit) { @@ -382,7 +452,8 @@ class Constant { } String? validateEmail(String? value) { - String pattern = r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'; + String pattern = + r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'; RegExp regExp = RegExp(pattern); if (value == null || value.isEmpty) { return "Email is Required"; @@ -393,9 +464,19 @@ class Constant { } } - static String getDistance({required String lat1, required String lng1, required String lat2, required String lng2}) { + static String getDistance({ + required String lat1, + required String lng1, + required String lat2, + required String lng2, + }) { double distance; - double distanceInMeters = Geolocator.distanceBetween(double.parse(lat1), double.parse(lng1), double.parse(lat2), double.parse(lng2)); + double distanceInMeters = Geolocator.distanceBetween( + double.parse(lat1), + double.parse(lng1), + double.parse(lat2), + double.parse(lng2), + ); if (distanceType == "miles") { distance = distanceInMeters / 1609; } else { @@ -405,7 +486,8 @@ class Constant { } bool hasValidUrl(String? value) { - String pattern = r'(http|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?'; + String pattern = + r'(http|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?'; RegExp regExp = RegExp(pattern); if (value == null || value.isEmpty) { return false; @@ -415,10 +497,17 @@ class Constant { return true; } - static Future uploadUserImageToFireStorage(File image, String filePath, String fileName) async { - Reference upload = FirebaseStorage.instance.ref().child('$filePath/$fileName'); + static Future uploadUserImageToFireStorage( + File image, + String filePath, + String fileName, + ) async { + Reference upload = FirebaseStorage.instance.ref().child( + '$filePath/$fileName', + ); UploadTask uploadTask = upload.putFile(image); - var downloadUrl = await (await uploadTask.whenComplete(() {})).ref.getDownloadURL(); + var downloadUrl = + await (await uploadTask.whenComplete(() {})).ref.getDownloadURL(); return downloadUrl.toString(); } @@ -435,14 +524,22 @@ class Constant { Future getBytesFromAsset(String path, int width) async { ByteData data = await rootBundle.load(path); - ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List(), targetWidth: width); + ui.Codec codec = await ui.instantiateImageCodec( + data.buffer.asUint8List(), + targetWidth: width, + ); ui.FrameInfo fi = await codec.getNextFrame(); - return (await fi.image.toByteData(format: ui.ImageByteFormat.png))!.buffer.asUint8List(); + return (await fi.image.toByteData( + format: ui.ImageByteFormat.png, + ))!.buffer.asUint8List(); } static Future selectTime(context) async { FocusScope.of(context).requestFocus(FocusNode()); //remove focus - TimeOfDay? newTime = await showTimePicker(context: context, initialTime: TimeOfDay.now()); + TimeOfDay? newTime = await showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ); if (newTime != null) { return newTime; } @@ -480,7 +577,11 @@ class Constant { static int calculateDifference(DateTime date) { DateTime now = DateTime.now(); - return DateTime(date.year, date.month, date.day).difference(DateTime(now.year, now.month, now.day)).inDays; + return DateTime( + date.year, + date.month, + date.day, + ).difference(DateTime(now.year, now.month, now.day)).inDays; } static String timestampToDate(Timestamp timestamp) { @@ -509,7 +610,15 @@ class Constant { } static DateTime stringToDate(String openDineTime) { - return DateFormat('HH:mm').parse(DateFormat('HH:mm').format(DateFormat("hh:mm a").parse((Intl.getCurrentLocale() == "en_US") ? openDineTime : openDineTime.toLowerCase()))); + return DateFormat('HH:mm').parse( + DateFormat('HH:mm').format( + DateFormat("hh:mm a").parse( + (Intl.getCurrentLocale() == "en_US") + ? openDineTime + : openDineTime.toLowerCase(), + ), + ), + ); } static LanguageModel getLanguage() { @@ -527,7 +636,10 @@ class Constant { int crossings = 0; for (int i = 0; i < polygon.length; i++) { int next = (i + 1) % polygon.length; - if (polygon[i].latitude <= point.latitude && polygon[next].latitude > point.latitude || polygon[i].latitude > point.latitude && polygon[next].latitude <= point.latitude) { + if (polygon[i].latitude <= point.latitude && + polygon[next].latitude > point.latitude || + polygon[i].latitude > point.latitude && + polygon[next].latitude <= point.latitude) { double edgeLong = polygon[next].longitude - polygon[i].longitude; double edgeLat = polygon[next].latitude - polygon[i].latitude; double interpol = (point.latitude - polygon[i].latitude) / edgeLat; @@ -549,7 +661,12 @@ class Constant { allowInsecure: true, ); - static Future sendMail({String? subject, String? body, bool? isAdmin = false, List? recipients}) async { + static Future sendMail({ + String? subject, + String? body, + bool? isAdmin = false, + List? recipients, + }) async { // Create our message. if (mailSettings != null) { if (isAdmin == true) { @@ -557,7 +674,10 @@ class Constant { } final message = Message() - ..from = Address(mailSettings!.userName.toString(), mailSettings!.fromName.toString()) + ..from = Address( + mailSettings!.userName.toString(), + mailSettings!.fromName.toString(), + ) ..recipients = recipients! ..subject = subject ..text = body @@ -581,10 +701,17 @@ class Constant { // await connection.send(message); } - static Uri createCoordinatesUrl(double latitude, double longitude, [String? label]) { + static Uri createCoordinatesUrl( + double latitude, + double longitude, [ + String? label, + ]) { Uri uri; if (kIsWeb) { - uri = Uri.https('www.google.com', '/maps/search/', {'api': '1', 'query': '$latitude,$longitude'}); + uri = Uri.https('www.google.com', '/maps/search/', { + 'api': '1', + 'query': '$latitude,$longitude', + }); } else if (Platform.isAndroid) { var query = '$latitude,$longitude'; if (label != null) query += '($label)'; @@ -594,14 +721,18 @@ class Constant { if (label != null) params['q'] = label; uri = Uri.https('maps.apple.com', '/', params); } else { - uri = Uri.https('www.google.com', '/maps/search/', {'api': '1', 'query': '$latitude,$longitude'}); + uri = Uri.https('www.google.com', '/maps/search/', { + 'api': '1', + 'query': '$latitude,$longitude', + }); } return uri; } static Future sendOrderEmail({required OrderModel orderModel}) async { - EmailTemplateModel? emailTemplateModel = await FireStoreUtils.getEmailTemplates(newOrderPlaced); + EmailTemplateModel? emailTemplateModel = + await FireStoreUtils.getEmailTemplates(newOrderPlaced); if (emailTemplateModel != null) { String firstHTML = """ @@ -618,11 +749,23 @@ class Constant { """; String newString = emailTemplateModel.message.toString(); - newString = newString.replaceAll("{username}", "${Constant.userModel!.firstName} ${Constant.userModel!.lastName}"); + newString = newString.replaceAll( + "{username}", + "${Constant.userModel!.firstName} ${Constant.userModel!.lastName}", + ); newString = newString.replaceAll("{orderid}", orderModel.id.toString()); - newString = newString.replaceAll("{date}", DateFormat('yyyy-MM-dd').format(orderModel.createdAt!.toDate())); - newString = newString.replaceAll("{address}", orderModel.address!.getFullAddress()); - newString = newString.replaceAll("{paymentmethod}", orderModel.paymentMethod.toString()); + newString = newString.replaceAll( + "{date}", + DateFormat('yyyy-MM-dd').format(orderModel.createdAt!.toDate()), + ); + newString = newString.replaceAll( + "{address}", + orderModel.address!.getFullAddress(), + ); + newString = newString.replaceAll( + "{paymentmethod}", + orderModel.paymentMethod.toString(), + ); double deliveryCharge = 0.0; double total = 0.0; @@ -630,7 +773,8 @@ class Constant { double discount = 0.0; double taxAmount = 0.0; double tipValue = 0.0; - String specialLabel = '(${orderModel.specialDiscount!['special_discount_label']}${orderModel.specialDiscount!['specialType'] == "amount" ? currencyModel!.symbol : "%"})'; + String specialLabel = + '(${orderModel.specialDiscount!['special_discount_label']}${orderModel.specialDiscount!['specialType'] == "amount" ? currencyModel!.symbol : "%"})'; List htmlList = []; if (orderModel.deliveryCharge != null) { @@ -640,15 +784,22 @@ class Constant { tipValue = double.parse(orderModel.tipAmount.toString()); } for (var element in orderModel.products!) { - if (element.extrasPrice != null && element.extrasPrice!.isNotEmpty && double.parse(element.extrasPrice!) != 0.0) { - total += double.parse(element.quantity.toString()) * double.parse(element.extrasPrice!); + if (element.extrasPrice != null && + element.extrasPrice!.isNotEmpty && + double.parse(element.extrasPrice!) != 0.0) { + total += + double.parse(element.quantity.toString()) * + double.parse(element.extrasPrice!); } - total += double.parse(element.quantity.toString()) * double.parse(element.price.toString()); + total += + double.parse(element.quantity.toString()) * + double.parse(element.price.toString()); List? addon = element.extras; String extrasDisVal = ''; for (int i = 0; i < addon!.length; i++) { - extrasDisVal += '${addon[i].toString().replaceAll("\"", "")} ${(i == addon.length - 1) ? "" : ","}'; + extrasDisVal += + '${addon[i].toString().replaceAll("\"", "")} ${(i == addon.length - 1) ? "" : ","}'; } String product = """ @@ -666,7 +817,9 @@ class Constant { } if (orderModel.specialDiscount!.isNotEmpty) { - specialDiscount = double.parse(orderModel.specialDiscount!['special_discount'].toString()); + specialDiscount = double.parse( + orderModel.specialDiscount!['special_discount'].toString(), + ); } if (orderModel.couponId != null && orderModel.couponId!.isNotEmpty) { @@ -675,35 +828,81 @@ class Constant { List taxHtmlList = []; for (var element in taxList) { - taxAmount = taxAmount + calculateTax(amount: (total - discount - specialDiscount).toString(), taxModel: element); + taxAmount = + taxAmount + + calculateTax( + amount: (total - discount - specialDiscount).toString(), + taxModel: element, + ); String taxHtml = """${element.title}: ${amountShow(amount: calculateTax(amount: (total - discount - specialDiscount).toString(), taxModel: element).toString())}${taxList.indexOf(element) == taxList.length - 1 ? "" : "
"}"""; taxHtmlList.add(taxHtml); } var totalamount = - orderModel.deliveryCharge == null || orderModel.deliveryCharge!.isEmpty + orderModel.deliveryCharge == null || + orderModel.deliveryCharge!.isEmpty ? total + taxAmount - discount - specialDiscount - : total + taxAmount + double.parse(orderModel.deliveryCharge!) + double.parse(orderModel.tipAmount!) - discount - specialDiscount; + : total + + taxAmount + + double.parse(orderModel.deliveryCharge!) + + double.parse(orderModel.tipAmount!) - + discount - + specialDiscount; - newString = newString.replaceAll("{subtotal}", amountShow(amount: total.toString())); - newString = newString.replaceAll("{coupon}", orderModel.couponId.toString()); - newString = newString.replaceAll("{discountamount}", amountShow(amount: orderModel.discount.toString())); + newString = newString.replaceAll( + "{subtotal}", + amountShow(amount: total.toString()), + ); + newString = newString.replaceAll( + "{coupon}", + orderModel.couponId.toString(), + ); + newString = newString.replaceAll( + "{discountamount}", + amountShow(amount: orderModel.discount.toString()), + ); newString = newString.replaceAll("{specialcoupon}", specialLabel); - newString = newString.replaceAll("{specialdiscountamount}", amountShow(amount: specialDiscount.toString())); - newString = newString.replaceAll("{shippingcharge}", amountShow(amount: deliveryCharge.toString())); - newString = newString.replaceAll("{tipamount}", amountShow(amount: tipValue.toString())); - newString = newString.replaceAll("{totalAmount}", amountShow(amount: totalamount.toString())); + newString = newString.replaceAll( + "{specialdiscountamount}", + amountShow(amount: specialDiscount.toString()), + ); + newString = newString.replaceAll( + "{shippingcharge}", + amountShow(amount: deliveryCharge.toString()), + ); + newString = newString.replaceAll( + "{tipamount}", + amountShow(amount: tipValue.toString()), + ); + newString = newString.replaceAll( + "{totalAmount}", + amountShow(amount: totalamount.toString()), + ); String tableHTML = htmlList.join(); String lastHTML = "
"; - newString = newString.replaceAll("{productdetails}", firstHTML + tableHTML + lastHTML); + newString = newString.replaceAll( + "{productdetails}", + firstHTML + tableHTML + lastHTML, + ); newString = newString.replaceAll("{taxdetails}", taxHtmlList.join()); - newString = newString.replaceAll("{newwalletbalance}.", amountShow(amount: Constant.userModel!.walletAmount.toString())); + newString = newString.replaceAll( + "{newwalletbalance}.", + amountShow(amount: Constant.userModel!.walletAmount.toString()), + ); String subjectNewString = emailTemplateModel.subject.toString(); - subjectNewString = subjectNewString.replaceAll("{orderid}", orderModel.id.toString()); - await sendMail(subject: subjectNewString, isAdmin: emailTemplateModel.isSendToAdmin, body: newString, recipients: [Constant.userModel!.email]); + subjectNewString = subjectNewString.replaceAll( + "{orderid}", + orderModel.id.toString(), + ); + await sendMail( + subject: subjectNewString, + isAdmin: emailTemplateModel.isSendToAdmin, + body: newString, + recipients: [Constant.userModel!.email], + ); } } @@ -711,7 +910,12 @@ class Constant { const R = 6371; // Earth's radius in km final dLat = _degToRad(lat2 - lat1); final dLon = _degToRad(lon2 - lon1); - final a = sin(dLat / 2) * sin(dLat / 2) + cos(_degToRad(lat1)) * cos(_degToRad(lat2)) * sin(dLon / 2) * sin(dLon / 2); + final a = + sin(dLat / 2) * sin(dLat / 2) + + cos(_degToRad(lat1)) * + cos(_degToRad(lat2)) * + sin(dLon / 2) * + sin(dLon / 2); final c = 2 * atan2(sqrt(a), sqrt(1 - a)); return R * c; } @@ -725,13 +929,19 @@ class Constant { } /// Calculate tax amount for a single tax model - static double getTaxValue({required String amount, required TaxModel taxModel}) { + static double getTaxValue({ + required String amount, + required TaxModel taxModel, + }) { double taxVal = 0.0; if (taxModel.enable == true) { if (taxModel.type == "fix") { taxVal = double.tryParse(taxModel.tax.toString()) ?? 0.0; } else { - taxVal = (double.tryParse(amount) ?? 0.0) * (double.tryParse(taxModel.tax.toString()) ?? 0.0) / 100; + taxVal = + (double.tryParse(amount) ?? 0.0) * + (double.tryParse(taxModel.tax.toString()) ?? 0.0) / + 100; } } return taxVal; @@ -743,10 +953,15 @@ class Constant { if (response.statusCode != 200) throw Exception("Failed to load image"); final Uint8List bytes = response.bodyBytes; - final ui.Codec codec = await ui.instantiateImageCodec(bytes, targetWidth: width); + final ui.Codec codec = await ui.instantiateImageCodec( + bytes, + targetWidth: width, + ); final ui.FrameInfo frameInfo = await codec.getNextFrame(); - final ByteData? byteData = await frameInfo.image.toByteData(format: ui.ImageByteFormat.png); + final ByteData? byteData = await frameInfo.image.toByteData( + format: ui.ImageByteFormat.png, + ); return byteData!.buffer.asUint8List(); } catch (e) { print("⚠️ getBytesFromUrl error: $e — using default cab icon"); diff --git a/lib/controllers/0n_demand_payment_controller.dart b/lib/controllers/0n_demand_payment_controller.dart index 6a8e3cd..e53d848 100644 --- a/lib/controllers/0n_demand_payment_controller.dart +++ b/lib/controllers/0n_demand_payment_controller.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import '../../models/onprovider_order_model.dart'; import '../models/wallet_transaction_model.dart'; @@ -48,7 +48,9 @@ import '../utils/preferences.dart'; import 'on_demand_dashboard_controller.dart'; class OnDemandPaymentController extends GetxController { - Rx onDemandOrderModel = Rx(null); + Rx onDemandOrderModel = Rx( + null, + ); RxDouble totalAmount = 0.0.obs; late bool isExtra; @@ -76,19 +78,37 @@ class OnDemandPaymentController extends GetxController { ShowToastDialog.showLoader("Please wait...".tr()); onDemandOrderModel.value?.payment_method = selectedPaymentMethod.value; - onDemandOrderModel.value?.paymentStatus = onDemandOrderModel.value?.provider.priceUnit == "Fixed" && selectedPaymentMethod.value == "cod" ? false : true; + onDemandOrderModel.value?.paymentStatus = + onDemandOrderModel.value?.provider.priceUnit == "Fixed" && + selectedPaymentMethod.value == "cod" + ? false + : true; onDemandOrderModel.value?.extraPaymentStatus = true; - await FireStoreUtils.onDemandOrderPlace(onDemandOrderModel.value!, totalAmount.value); + await FireStoreUtils.onDemandOrderPlace( + onDemandOrderModel.value!, + totalAmount.value, + ); if (onDemandOrderModel.value?.status == Constant.orderPlaced) { - await FireStoreUtils.sendOrderOnDemandServiceEmail(orderModel: onDemandOrderModel.value!); + await FireStoreUtils.sendOrderOnDemandServiceEmail( + orderModel: onDemandOrderModel.value!, + ); - final providerUser = await FireStoreUtils.getUserProfile(onDemandOrderModel.value!.provider.author!); + final providerUser = await FireStoreUtils.getUserProfile( + onDemandOrderModel.value!.provider.author!, + ); if (providerUser != null) { - final payLoad = {"type": 'provider_order', "orderId": onDemandOrderModel.value?.id}; - await SendNotification.sendFcmMessage(Constant.bookingPlaced, providerUser.fcmToken ?? '', payLoad); + final payLoad = { + "type": 'provider_order', + "orderId": onDemandOrderModel.value?.id, + }; + await SendNotification.sendFcmMessage( + Constant.bookingPlaced, + providerUser.fcmToken ?? '', + payLoad, + ); } ShowToastDialog.showToast("OnDemand Service successfully booked".tr()); @@ -107,16 +127,23 @@ class OnDemandPaymentController extends GetxController { paymentStatus: "success".tr(), ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()).then((value) {}); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ).then((value) {}); } }); } ShowToastDialog.closeLoader(); Get.offAll(const OnDemandDashboardScreen()); - OnDemandDashboardController controller = Get.put(OnDemandDashboardController()); + OnDemandDashboardController controller = Get.put( + OnDemandDashboardController(), + ); controller.selectedIndex.value = 2; } else { // Extra Charges Flow @@ -137,9 +164,14 @@ class OnDemandPaymentController extends GetxController { paymentStatus: "success".tr(), ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()).then((value) {}); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ).then((value) {}); } }); } @@ -160,9 +192,14 @@ class OnDemandPaymentController extends GetxController { paymentStatus: "success".tr(), ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-$totalAmount", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: "-$totalAmount", + userId: FireStoreUtils.getCurrentUid(), + ); } }); } @@ -171,7 +208,9 @@ class OnDemandPaymentController extends GetxController { ShowToastDialog.closeLoader(); Get.offAll(const OnDemandDashboardScreen()); - OnDemandDashboardController controller = Get.put(OnDemandDashboardController()); + OnDemandDashboardController controller = Get.put( + OnDemandDashboardController(), + ); controller.selectedIndex.value = 2; } } @@ -194,19 +233,45 @@ class OnDemandPaymentController extends GetxController { Future getPaymentSettings() async { isLoading.value = true; await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -249,20 +314,32 @@ class OnDemandPaymentController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -308,7 +385,10 @@ class OnDemandPaymentController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -318,8 +398,14 @@ class OnDemandPaymentController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -332,12 +418,20 @@ class OnDemandPaymentController extends GetxController { }, ], "payer": {"email": Constant.userModel?.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, "auto_return": "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -420,15 +514,23 @@ class OnDemandPaymentController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -436,15 +538,24 @@ class OnDemandPaymentController extends GetxController { "currency": "NGN", "redirect_url": "${Constant.globalUrl}payment/success", "payment_options": "ussd, card, barter, payattitude", - "customer": {"email": Constant.userModel?.email.toString(), "phonenumber": Constant.userModel?.phoneNumber, "name": Constant.userModel?.fullName()}, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customer": { + "email": Constant.userModel?.email.toString(), + "phonenumber": Constant.userModel?.phoneNumber, + "name": Constant.userModel?.fullName(), + }, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -473,8 +584,14 @@ class OnDemandPaymentController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: Constant.userModel!).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: Constant.userModel!, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -494,26 +611,50 @@ class OnDemandPaymentController extends GetxController { final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString()}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + }, ); final data = jsonDecode(response.body); - await verifyCheckSum(checkSum: data["code"], amount: amount, orderId: orderId).then((value) { + await verifyCheckSum( + checkSum: data["code"], + amount: amount, + orderId: orderId, + ).then((value) { initiatePayment(amount: amount, orderId: orderId).then((value) { String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } GetPaymentTxtTokenModel result = value; - startTransaction(context, txnTokenBy: result.body.txnToken ?? '', orderId: orderId, amount: amount, callBackURL: callback, isStaging: paytmModel.value.isSandboxEnabled); + startTransaction( + context, + txnTokenBy: result.body.txnToken ?? '', + orderId: orderId, + amount: amount, + callBackURL: callback, + isStaging: paytmModel.value.isSandboxEnabled, + ); }); }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -549,24 +690,38 @@ class OnDemandPaymentController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), "checksum_value": checkSum}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } final response = await http.post( Uri.parse(initiateURL), @@ -584,9 +739,12 @@ class OnDemandPaymentController extends GetxController { ); log(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -604,7 +762,10 @@ class OnDemandPaymentController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': Constant.userModel?.phoneNumber, 'email': Constant.userModel?.email}, + 'prefill': { + 'contact': Constant.userModel?.phoneNumber, + 'email': Constant.userModel?.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -639,7 +800,10 @@ class OnDemandPaymentController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -657,15 +821,30 @@ class OnDemandPaymentController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -673,7 +852,9 @@ class OnDemandPaymentController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -692,16 +873,33 @@ class OnDemandPaymentController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString().isNotEmpty) { - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -712,13 +910,22 @@ class OnDemandPaymentController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth ?? ''}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth ?? ''}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -731,21 +938,36 @@ class OnDemandPaymentController extends GetxController { return ''; } - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; // ✅ Null-safe handling bool isSandbox = orangeMoneyModel.value.isSandbox ?? false; - String apiUrl = isSandbox ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + isSandbox + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', @@ -761,7 +983,11 @@ class OnDemandPaymentController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -774,7 +1000,9 @@ class OnDemandPaymentController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -888,7 +1116,13 @@ class OnDemandPaymentController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -905,7 +1139,9 @@ class OnDemandPaymentController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -918,7 +1154,11 @@ class OnDemandPaymentController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/Intercity_home_controller.dart b/lib/controllers/Intercity_home_controller.dart index 20fef19..ba768de 100644 --- a/lib/controllers/Intercity_home_controller.dart +++ b/lib/controllers/Intercity_home_controller.dart @@ -48,7 +48,7 @@ import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:http/http.dart' as http; import 'package:latlong2/latlong.dart' as latlong; @@ -65,10 +65,13 @@ class IntercityHomeController extends GetxController { late GoogleMapController mapController; final flutterMap.MapController mapOsmController = flutterMap.MapController(); - final Rx sourceTextEditController = TextEditingController().obs; - final Rx destinationTextEditController = TextEditingController().obs; + final Rx sourceTextEditController = + TextEditingController().obs; + final Rx destinationTextEditController = + TextEditingController().obs; - final Rx couponCodeTextEditController = TextEditingController().obs; + final Rx couponCodeTextEditController = + TextEditingController().obs; final Rx currentLocation = Location().obs; @@ -142,64 +145,99 @@ class IntercityHomeController extends GetxController { await getPaymentSettings(); - FireStoreUtils.fireStore.collection(CollectionName.users).doc(FireStoreUtils.getCurrentUid()).snapshots().listen((userSnapshot) async { - if (!userSnapshot.exists) return; + FireStoreUtils.fireStore + .collection(CollectionName.users) + .doc(FireStoreUtils.getCurrentUid()) + .snapshots() + .listen((userSnapshot) async { + if (!userSnapshot.exists) return; - userModel.value = UserModel.fromJson(userSnapshot.data()!); + userModel.value = UserModel.fromJson(userSnapshot.data()!); - if (userModel.value.inProgressOrderID != null && userModel.value.inProgressOrderID!.isNotEmpty) { - String? validRideId; + if (userModel.value.inProgressOrderID != null && + userModel.value.inProgressOrderID!.isNotEmpty) { + String? validRideId; - for (String id in userModel.value.inProgressOrderID!) { - final rideDoc = await FireStoreUtils.fireStore.collection(CollectionName.rides).doc(id).get(); + for (String id in userModel.value.inProgressOrderID!) { + final rideDoc = + await FireStoreUtils.fireStore + .collection(CollectionName.rides) + .doc(id) + .get(); - if (rideDoc.exists && (rideDoc.data()?['rideType'] ?? '').toString().toLowerCase() == "intercity") { - validRideId = userModel.value.inProgressOrderID!.first!; - break; - } - } - - FireStoreUtils.fireStore.collection(CollectionName.rides).doc(validRideId).snapshots().listen((rideSnapshot) async { - if (!rideSnapshot.exists) return; - - final rideData = rideSnapshot.data()!; - currentOrder.value = CabOrderModel.fromJson(rideData); - final status = currentOrder.value.status; - - if (status == Constant.driverAccepted || status == Constant.orderInTransit) { - FireStoreUtils.fireStore.collection(CollectionName.users).doc(currentOrder.value.driverId).snapshots().listen((event) async { - if (event.exists && event.data() != null) { - UserModel driverModel0 = UserModel.fromJson(event.data()!); - driverModel.value = driverModel0; - await updateDriverRoute(driverModel0); + if (rideDoc.exists && + (rideDoc.data()?['rideType'] ?? '') + .toString() + .toLowerCase() == + "intercity") { + validRideId = userModel.value.inProgressOrderID!.first!; + break; } - }); - } + } - print("Current Ride Status: $status"); - if (status == Constant.orderPlaced || status == Constant.driverPending || status == Constant.driverRejected || (status == Constant.orderAccepted && currentOrder.value.driverId == null)) { - bottomSheetType.value = 'waitingForDriver'; - } else if (status == Constant.driverAccepted || status == Constant.orderInTransit) { - bottomSheetType.value = 'driverDetails'; - sourceTextEditController.value.text = currentOrder.value.sourceLocationName ?? ''; - destinationTextEditController.value.text = currentOrder.value.destinationLocationName ?? ''; - selectedPaymentMethod.value = currentOrder.value.paymentMethod ?? ''; - calculateTotalAmountAfterAccept(); - } else if (status == Constant.orderCompleted) { - userModel.value.inProgressOrderID!.remove(validRideId); - await FireStoreUtils.updateUser(userModel.value); + FireStoreUtils.fireStore + .collection(CollectionName.rides) + .doc(validRideId) + .snapshots() + .listen((rideSnapshot) async { + if (!rideSnapshot.exists) return; + + final rideData = rideSnapshot.data()!; + currentOrder.value = CabOrderModel.fromJson(rideData); + final status = currentOrder.value.status; + + if (status == Constant.driverAccepted || + status == Constant.orderInTransit) { + FireStoreUtils.fireStore + .collection(CollectionName.users) + .doc(currentOrder.value.driverId) + .snapshots() + .listen((event) async { + if (event.exists && event.data() != null) { + UserModel driverModel0 = UserModel.fromJson( + event.data()!, + ); + driverModel.value = driverModel0; + await updateDriverRoute(driverModel0); + } + }); + } + + print("Current Ride Status: $status"); + if (status == Constant.orderPlaced || + status == Constant.driverPending || + status == Constant.driverRejected || + (status == Constant.orderAccepted && + currentOrder.value.driverId == null)) { + bottomSheetType.value = 'waitingForDriver'; + } else if (status == Constant.driverAccepted || + status == Constant.orderInTransit) { + bottomSheetType.value = 'driverDetails'; + sourceTextEditController.value.text = + currentOrder.value.sourceLocationName ?? ''; + destinationTextEditController.value.text = + currentOrder.value.destinationLocationName ?? ''; + selectedPaymentMethod.value = + currentOrder.value.paymentMethod ?? ''; + calculateTotalAmountAfterAccept(); + } else if (status == Constant.orderCompleted) { + userModel.value.inProgressOrderID!.remove(validRideId); + await FireStoreUtils.updateUser(userModel.value); + bottomSheetType.value = 'location'; + Get.back(); + } + }); + } else { bottomSheetType.value = 'location'; - Get.back(); + if (Constant.currentLocation != null) { + setDepartureMarker( + Constant.currentLocation!.latitude, + Constant.currentLocation!.longitude, + ); + searchPlaceNameOSM(); + } } }); - } else { - bottomSheetType.value = 'location'; - if (Constant.currentLocation != null) { - setDepartureMarker(Constant.currentLocation!.latitude, Constant.currentLocation!.longitude); - searchPlaceNameOSM(); - } - } - }); final coupons = await FireStoreUtils.getCabCoupon(); cabCouponList.value = coupons; @@ -226,18 +264,30 @@ class IntercityHomeController extends GetxController { if (order.status == Constant.driverAccepted) { // DRIVER → PICKUP - await fetchRouteWithWaypoints([latlong.LatLng(driverLat, driverLng), latlong.LatLng(pickupLat, pickupLng)]); + await fetchRouteWithWaypoints([ + latlong.LatLng(driverLat, driverLng), + latlong.LatLng(pickupLat, pickupLng), + ]); } else if (order.status == Constant.orderInTransit) { // PICKUP → DESTINATION - await fetchRouteWithWaypoints([latlong.LatLng(pickupLat, pickupLng), latlong.LatLng(destLat, destLng)]); + await fetchRouteWithWaypoints([ + latlong.LatLng(pickupLat, pickupLng), + latlong.LatLng(destLat, destLng), + ]); } updateRouteMarkers(driverModel); } else { /// For Google Maps if (order.status == Constant.driverAccepted) { - await fetchGoogleRouteBetween(LatLng(driverLat, driverLng), LatLng(pickupLat, pickupLng)); + await fetchGoogleRouteBetween( + LatLng(driverLat, driverLng), + LatLng(pickupLat, pickupLng), + ); } else if (order.status == Constant.orderInTransit) { - await fetchGoogleRouteBetween(LatLng(pickupLat, pickupLng), LatLng(destLat, destLng)); + await fetchGoogleRouteBetween( + LatLng(pickupLat, pickupLng), + LatLng(destLat, destLng), + ); } updateRouteMarkers(driverModel); } @@ -261,12 +311,24 @@ class IntercityHomeController extends GetxController { markers.clear(); osmMarker.clear(); - final departureBytes = await Constant().getBytesFromAsset('assets/images/location_black3x.png', 50); - final destinationBytes = await Constant().getBytesFromAsset('assets/images/location_orange3x.png', 50); + final departureBytes = await Constant().getBytesFromAsset( + 'assets/images/location_black3x.png', + 50, + ); + final destinationBytes = await Constant().getBytesFromAsset( + 'assets/images/location_orange3x.png', + 50, + ); final driverBytesRaw = (Constant.sectionConstantModel?.markerIcon?.isNotEmpty ?? false) - ? await Constant().getBytesFromUrl(Constant.sectionConstantModel!.markerIcon!, width: 120) - : await Constant().getBytesFromAsset('assets/images/ic_cab.png', 50); + ? await Constant().getBytesFromUrl( + Constant.sectionConstantModel!.markerIcon!, + width: 120, + ) + : await Constant().getBytesFromAsset( + 'assets/images/ic_cab.png', + 50, + ); departureIcon = BitmapDescriptor.fromBytes(departureBytes); destinationIcon = BitmapDescriptor.fromBytes(destinationBytes); @@ -275,7 +337,15 @@ class IntercityHomeController extends GetxController { if (Constant.selectedMapType == 'osm') { if (order.status == Constant.driverAccepted) { osmMarker.addAll([ - flutterMap.Marker(point: latlong.LatLng(pickupLat, pickupLng), width: 40, height: 40, child: Image.asset('assets/images/location_black3x.png', width: 40)), + flutterMap.Marker( + point: latlong.LatLng(pickupLat, pickupLng), + width: 40, + height: 40, + child: Image.asset( + 'assets/images/location_black3x.png', + width: 40, + ), + ), flutterMap.Marker( point: latlong.LatLng(driverLat, driverLng), width: 45, @@ -286,13 +356,26 @@ class IntercityHomeController extends GetxController { height: 50, imageUrl: Constant.sectionConstantModel!.markerIcon.toString(), placeholder: (context, url) => Constant.loader(), - errorWidget: (context, url, error) => SizedBox(width: 30, height: 30, child: CircularProgressIndicator(strokeWidth: 2)), + errorWidget: + (context, url, error) => SizedBox( + width: 30, + height: 30, + child: CircularProgressIndicator(strokeWidth: 2), + ), ), ), ]); } else if (order.status == Constant.orderInTransit) { osmMarker.addAll([ - flutterMap.Marker(point: latlong.LatLng(destLat, destLng), width: 40, height: 40, child: Image.asset('assets/images/location_orange3x.png', width: 40)), + flutterMap.Marker( + point: latlong.LatLng(destLat, destLng), + width: 40, + height: 40, + child: Image.asset( + 'assets/images/location_orange3x.png', + width: 40, + ), + ), flutterMap.Marker( point: latlong.LatLng(driverLat, driverLng), width: 45, @@ -303,7 +386,12 @@ class IntercityHomeController extends GetxController { height: 50, imageUrl: Constant.sectionConstantModel!.markerIcon.toString(), placeholder: (context, url) => Constant.loader(), - errorWidget: (context, url, error) => SizedBox(width: 30, height: 30, child: CircularProgressIndicator(strokeWidth: 2)), + errorWidget: + (context, url, error) => SizedBox( + width: 30, + height: 30, + child: CircularProgressIndicator(strokeWidth: 2), + ), ), ), ]); @@ -315,9 +403,18 @@ class IntercityHomeController extends GetxController { markerId: const MarkerId("pickup"), position: LatLng(pickupLat, pickupLng), infoWindow: InfoWindow(title: "Pickup Location".tr()), - icon: departureIcon ?? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen), + icon: + departureIcon ?? + BitmapDescriptor.defaultMarkerWithHue( + BitmapDescriptor.hueGreen, + ), + ), + Marker( + markerId: const MarkerId("driver"), + position: LatLng(driverLat, driverLng), + infoWindow: InfoWindow(title: "Driver at Pickup".tr()), + icon: taxiIcon ?? BitmapDescriptor.defaultMarker, ), - Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver at Pickup".tr()), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), ]); } else if (order.status == Constant.orderInTransit) { markers.addAll([ @@ -325,9 +422,18 @@ class IntercityHomeController extends GetxController { markerId: const MarkerId("destination"), position: LatLng(destLat, destLng), infoWindow: InfoWindow(title: "Destination Location".tr()), - icon: destinationIcon ?? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed), + icon: + destinationIcon ?? + BitmapDescriptor.defaultMarkerWithHue( + BitmapDescriptor.hueRed, + ), + ), + Marker( + markerId: const MarkerId("driver"), + position: LatLng(driverLat, driverLng), + infoWindow: InfoWindow(title: "Driver Location".tr()), + icon: taxiIcon ?? BitmapDescriptor.defaultMarker, ), - Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver Location".tr()), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), ]); } } @@ -338,7 +444,10 @@ class IntercityHomeController extends GetxController { } } - Future fetchGoogleRouteBetween(LatLng originPoint, LatLng destPoint) async { + Future fetchGoogleRouteBetween( + LatLng originPoint, + LatLng destPoint, + ) async { final origin = '${originPoint.latitude},${originPoint.longitude}'; final destination = '${destPoint.latitude},${destPoint.longitude}'; final url = Uri.parse( @@ -355,7 +464,8 @@ class IntercityHomeController extends GetxController { final route = data['routes'][0]; final encodedPolyline = route['overview_polyline']['points']; final decodedPoints = PolylinePoints.decodePolyline(encodedPolyline); - final coordinates = decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); + final coordinates = + decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); addPolyLine(coordinates); @@ -382,7 +492,12 @@ class IntercityHomeController extends GetxController { if (currentOrder.value.taxSetting != null) { for (var element in currentOrder.value.taxSetting!) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } } @@ -398,11 +513,19 @@ class IntercityHomeController extends GetxController { subTotal.value = getAmount(selectedVehicleType.value); if (selectedCouponModel.value.id != null) { - discount.value = Constant.calculateDiscount(amount: subTotal.value.toString(), offerModel: selectedCouponModel.value); + discount.value = Constant.calculateDiscount( + amount: subTotal.value.toString(), + offerModel: selectedCouponModel.value, + ); } for (var element in Constant.taxList) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } totalAmount.value = (subTotal.value - discount.value) + taxAmount.value; @@ -439,9 +562,14 @@ class IntercityHomeController extends GetxController { serviceType: Constant.parcelServiceType, ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ); } }); } @@ -455,13 +583,25 @@ class IntercityHomeController extends GetxController { Future placeOrder() async { DestinationLocation sourceLocation = DestinationLocation( - latitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.latitude : departureLatLong.value.latitude, - longitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.longitude : departureLatLong.value.longitude, + latitude: + Constant.selectedMapType == 'osm' + ? departureLatLongOsm.value.latitude + : departureLatLong.value.latitude, + longitude: + Constant.selectedMapType == 'osm' + ? departureLatLongOsm.value.longitude + : departureLatLong.value.longitude, ); DestinationLocation destinationLocation = DestinationLocation( - latitude: Constant.selectedMapType == 'osm' ? destinationLatLongOsm.value.latitude : destinationLatLong.value.latitude, - longitude: Constant.selectedMapType == 'osm' ? destinationLatLongOsm.value.longitude : destinationLatLong.value.longitude, + latitude: + Constant.selectedMapType == 'osm' + ? destinationLatLongOsm.value.latitude + : destinationLatLong.value.latitude, + longitude: + Constant.selectedMapType == 'osm' + ? destinationLatLongOsm.value.longitude + : destinationLatLong.value.longitude, ); CabOrderModel orderModel = CabOrderModel(); @@ -472,7 +612,8 @@ class IntercityHomeController extends GetxController { orderModel.vehicleType = selectedVehicleType.value; orderModel.authorID = FireStoreUtils.getCurrentUid(); orderModel.sourceLocationName = sourceTextEditController.value.text; - orderModel.destinationLocationName = destinationTextEditController.value.text; + orderModel.destinationLocationName = + destinationTextEditController.value.text; orderModel.sourceLocation = sourceLocation; orderModel.destinationLocation = destinationLocation; @@ -484,11 +625,14 @@ class IntercityHomeController extends GetxController { orderModel.taxSetting = Constant.taxList; orderModel.adminCommissionType = - Constant.sectionConstantModel!.adminCommision != null && Constant.sectionConstantModel!.adminCommision!.isEnabled == true - ? Constant.sectionConstantModel!.adminCommision!.commissionType.toString() + Constant.sectionConstantModel!.adminCommision != null && + Constant.sectionConstantModel!.adminCommision!.isEnabled == true + ? Constant.sectionConstantModel!.adminCommision!.commissionType + .toString() : null; orderModel.adminCommission = - Constant.sectionConstantModel!.adminCommision != null && Constant.sectionConstantModel!.adminCommision!.isEnabled == true + Constant.sectionConstantModel!.adminCommision != null && + Constant.sectionConstantModel!.adminCommision!.isEnabled == true ? Constant.sectionConstantModel!.adminCommision!.amount.toString() : null; orderModel.couponCode = couponCodeTextEditController.value.text; @@ -501,7 +645,9 @@ class IntercityHomeController extends GetxController { orderModel.roundTrip = false; orderModel.sectionId = Constant.sectionConstantModel!.id; orderModel.createdAt = Timestamp.now(); - orderModel.otpCode = (maths.Random().nextInt(9000) + 1000).toString(); // Generate a 4-digit OTP + orderModel.otpCode = + (maths.Random().nextInt(9000) + 1000) + .toString(); // Generate a 4-digit OTP orderModel.status = Constant.orderPlaced; orderModel.scheduleDateTime = Timestamp.now(); log("Order Model : ${orderModel.toJson()}"); @@ -516,8 +662,10 @@ class IntercityHomeController extends GetxController { double getAmount(VehicleType vehicleType) { final double currentDistance = distance.value; - if (currentDistance <= (vehicleType.minimum_delivery_charges_within_km ?? 0)) { - return double.tryParse(vehicleType.minimum_delivery_charges.toString()) ?? 0.0; + if (currentDistance <= + (vehicleType.minimum_delivery_charges_within_km ?? 0)) { + return double.tryParse(vehicleType.minimum_delivery_charges.toString()) ?? + 0.0; } else { return (vehicleType.delivery_charges_per_km ?? 0.0) * currentDistance; } @@ -542,28 +690,50 @@ class IntercityHomeController extends GetxController { void setStopMarker(double lat, double lng, int index) { if (Constant.selectedMapType == 'osm') { // Add new stop marker without clearing - osmMarker.add(flutterMap.Marker(point: latlong.LatLng(lat, lng), width: 40, height: 40, child: stopIconOsm!)); + osmMarker.add( + flutterMap.Marker( + point: latlong.LatLng(lat, lng), + width: 40, + height: 40, + child: stopIconOsm!, + ), + ); getDirections(isStopMarker: true); } else { final markerId = MarkerId('Stop $index'); markers.removeWhere((marker) => marker.markerId == markerId); - markers.add(Marker(markerId: markerId, infoWindow: InfoWindow(title: 'Stop ${String.fromCharCode(index + 65)}'), position: LatLng(lat, lng), icon: stopIcon!)); + markers.add( + Marker( + markerId: markerId, + infoWindow: InfoWindow( + title: 'Stop ${String.fromCharCode(index + 65)}', + ), + position: LatLng(lat, lng), + icon: stopIcon!, + ), + ); getDirections(); } } void _setOsmMarker(double lat, double lng, {required bool isDeparture}) { - final marker = flutterMap.Marker(point: latlong.LatLng(lat, lng), width: 40, height: 40, child: isDeparture ? departureIconOsm! : destinationIconOsm!); + final marker = flutterMap.Marker( + point: latlong.LatLng(lat, lng), + width: 40, + height: 40, + child: isDeparture ? departureIconOsm! : destinationIconOsm!, + ); if (isDeparture) { departureLatLongOsm.value = latlong.LatLng(lat, lng); } else { destinationLatLongOsm.value = latlong.LatLng(lat, lng); } osmMarker.add(marker); - if (departureLatLongOsm.value.latitude != 0 && destinationLatLongOsm.value.latitude != 0) { + if (departureLatLongOsm.value.latitude != 0 && + destinationLatLongOsm.value.latitude != 0) { getDirections(); animateToSource(lat, lng); } @@ -585,14 +755,26 @@ class IntercityHomeController extends GetxController { markers.removeWhere((marker) => marker.markerId == markerId); // Add new marker - markers.add(Marker(markerId: markerId, position: pos, icon: icon, infoWindow: InfoWindow(title: title))); + markers.add( + Marker( + markerId: markerId, + position: pos, + icon: icon, + infoWindow: InfoWindow(title: title), + ), + ); mapController.animateCamera(CameraUpdate.newLatLngZoom(pos, 14)); - if (departureLatLong.value.latitude != 0 && destinationLatLong.value.latitude != 0) { + if (departureLatLong.value.latitude != 0 && + destinationLatLong.value.latitude != 0) { getDirections(); } else { - mapController.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(target: LatLng(lat, lng), zoom: 14))); + mapController.animateCamera( + CameraUpdate.newCameraPosition( + CameraPosition(target: LatLng(lat, lng), zoom: 14), + ), + ); } } @@ -601,25 +783,43 @@ class IntercityHomeController extends GetxController { final wayPoints = []; // Only add valid source - if (departureLatLongOsm.value.latitude != 0.0 && departureLatLongOsm.value.longitude != 0.0) { + if (departureLatLongOsm.value.latitude != 0.0 && + departureLatLongOsm.value.longitude != 0.0) { wayPoints.add(departureLatLongOsm.value); } // Only add valid destination - if (destinationLatLongOsm.value.latitude != 0.0 && destinationLatLongOsm.value.longitude != 0.0) { + if (destinationLatLongOsm.value.latitude != 0.0 && + destinationLatLongOsm.value.longitude != 0.0) { wayPoints.add(destinationLatLongOsm.value); } if (!isStopMarker) osmMarker.clear(); // Add source marker - if (departureLatLongOsm.value.latitude != 0.0 && departureLatLongOsm.value.longitude != 0.0) { - osmMarker.add(flutterMap.Marker(point: departureLatLongOsm.value, width: 40, height: 40, child: departureIconOsm!)); + if (departureLatLongOsm.value.latitude != 0.0 && + departureLatLongOsm.value.longitude != 0.0) { + osmMarker.add( + flutterMap.Marker( + point: departureLatLongOsm.value, + width: 40, + height: 40, + child: departureIconOsm!, + ), + ); } // Add destination marker - if (destinationLatLongOsm.value.latitude != 0.0 && destinationLatLongOsm.value.longitude != 0.0) { - osmMarker.add(flutterMap.Marker(point: destinationLatLongOsm.value, width: 40, height: 40, child: destinationIconOsm!)); + if (destinationLatLongOsm.value.latitude != 0.0 && + destinationLatLongOsm.value.longitude != 0.0) { + osmMarker.add( + flutterMap.Marker( + point: destinationLatLongOsm.value, + width: 40, + height: 40, + child: destinationIconOsm!, + ), + ); } if (wayPoints.length >= 2) { @@ -632,10 +832,14 @@ class IntercityHomeController extends GetxController { } Future fetchGoogleRouteWithWaypoints() async { - if (departureLatLong.value.latitude == 0.0 || destinationLatLong.value.latitude == 0.0) return; + if (departureLatLong.value.latitude == 0.0 || + destinationLatLong.value.latitude == 0.0) + return; - final origin = '${departureLatLong.value.latitude},${departureLatLong.value.longitude}'; - final destination = '${destinationLatLong.value.latitude},${destinationLatLong.value.longitude}'; + final origin = + '${departureLatLong.value.latitude},${departureLatLong.value.longitude}'; + final destination = + '${destinationLatLong.value.latitude},${destinationLatLong.value.longitude}'; final url = Uri.parse( 'https://maps.googleapis.com/maps/api/directions/json' @@ -654,7 +858,8 @@ class IntercityHomeController extends GetxController { // Polyline final encodedPolyline = route['overview_polyline']['points']; final decodedPoints = PolylinePoints.decodePolyline(encodedPolyline); - final coordinates = decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); + final coordinates = + decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); addPolyLine(coordinates); @@ -686,19 +891,26 @@ class IntercityHomeController extends GetxController { } Future fetchRouteWithWaypoints(List points) async { - final coordinates = points.map((p) => '${p.longitude},${p.latitude}').join(';'); - final url = Uri.parse('https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson'); + final coordinates = points + .map((p) => '${p.longitude},${p.latitude}') + .join(';'); + final url = Uri.parse( + 'https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson', + ); try { final response = await http.get(url); if (response.statusCode == 200) { final decoded = json.decode(response.body); - final geometry = decoded['routes'][0]['geometry']['coordinates'] as List; + final geometry = + decoded['routes'][0]['geometry']['coordinates'] as List; final dist = decoded['routes'][0]['distance']; final dur = decoded['routes'][0]['duration']; routePoints.clear(); - routePoints.addAll(geometry.map((coord) => latlong.LatLng(coord[1], coord[0]))); + routePoints.addAll( + geometry.map((coord) => latlong.LatLng(coord[1], coord[0])), + ); if (Constant.distanceType.toLowerCase() == "KM".toLowerCase()) { distance.value = dist / 1000.00; @@ -723,7 +935,10 @@ class IntercityHomeController extends GetxController { void zoomToPolylineOSM() { if (routePoints.isEmpty) return; // LatLngBounds requires at least two points - final bounds = flutterMap.LatLngBounds(routePoints.first, routePoints.first); + final bounds = flutterMap.LatLngBounds( + routePoints.first, + routePoints.first, + ); for (final point in routePoints) { bounds.extend(point); } @@ -735,8 +950,10 @@ class IntercityHomeController extends GetxController { double getBoundsZoomLevel(flutterMap.LatLngBounds bounds) { // Simple heuristic: zoom out for larger bounds - final latDiff = (bounds.northEast.latitude - bounds.southWest.latitude).abs(); - final lngDiff = (bounds.northEast.longitude - bounds.southWest.longitude).abs(); + final latDiff = + (bounds.northEast.latitude - bounds.southWest.latitude).abs(); + final lngDiff = + (bounds.northEast.longitude - bounds.southWest.longitude).abs(); double maxDiff = math.max(latDiff, lngDiff); if (maxDiff < 0.005) return 18.0; if (maxDiff < 0.01) return 16.0; @@ -748,7 +965,13 @@ class IntercityHomeController extends GetxController { void addPolyLine(List points) { final id = const PolylineId("poly"); - final polyline = Polyline(polylineId: id, color: AppThemeData.primary300, points: points, width: 6, geodesic: true); + final polyline = Polyline( + polylineId: id, + color: AppThemeData.primary300, + points: points, + width: 6, + geodesic: true, + ); polyLines[id] = polyline; if (points.length >= 2) { @@ -757,7 +980,10 @@ class IntercityHomeController extends GetxController { } } - Future updateCameraLocationToFitPolyline(List points, GoogleMapController? mapController) async { + Future updateCameraLocationToFitPolyline( + List points, + GoogleMapController? mapController, + ) async { if (mapController == null || points.isEmpty) return; double minLat = points.first.latitude, maxLat = points.first.latitude; double minLng = points.first.longitude, maxLng = points.first.longitude; @@ -767,16 +993,24 @@ class IntercityHomeController extends GetxController { if (p.longitude < minLng) minLng = p.longitude; if (p.longitude > maxLng) maxLng = p.longitude; } - final bounds = LatLngBounds(southwest: LatLng(minLat, minLng), northeast: LatLng(maxLat, maxLng)); + final bounds = LatLngBounds( + southwest: LatLng(minLat, minLng), + northeast: LatLng(maxLat, maxLng), + ); final cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 50); await checkCameraLocation(cameraUpdate, mapController); } Future animateToSource(double lat, double long) async { - final hasBothCoords = departureLatLongOsm.value.latitude != 0.0 && destinationLatLongOsm.value.latitude != 0.0; + final hasBothCoords = + departureLatLongOsm.value.latitude != 0.0 && + destinationLatLongOsm.value.latitude != 0.0; if (hasBothCoords) { - await calculateZoomLevel(source: departureLatLongOsm.value, destination: destinationLatLongOsm.value); + await calculateZoomLevel( + source: departureLatLongOsm.value, + destination: destinationLatLongOsm.value, + ); } else { mapOsmController.move(latlong.LatLng(lat, long), 10); } @@ -784,15 +1018,25 @@ class IntercityHomeController extends GetxController { RxMap polyLines = {}.obs; - Future calculateZoomLevel({required latlong.LatLng source, required latlong.LatLng destination, double paddingFraction = 0.001}) async { + Future calculateZoomLevel({ + required latlong.LatLng source, + required latlong.LatLng destination, + double paddingFraction = 0.001, + }) async { final bounds = flutterMap.LatLngBounds.fromPoints([source, destination]); final screenSize = Size(Get.width, Get.height * 0.5); const double worldDimension = 256.0; const double maxZoom = 10.0; - double latToRad(double lat) => math.log((1 + math.sin(lat * math.pi / 180)) / (1 - math.sin(lat * math.pi / 180))) / 2; + double latToRad(double lat) => + math.log( + (1 + math.sin(lat * math.pi / 180)) / + (1 - math.sin(lat * math.pi / 180)), + ) / + 2; - double computeZoom(double screenPx, double worldPx, double fraction) => math.log(screenPx / worldPx / fraction) / math.ln2; + double computeZoom(double screenPx, double worldPx, double fraction) => + math.log(screenPx / worldPx / fraction) / math.ln2; final north = bounds.northEast.latitude; final south = bounds.southWest.latitude; @@ -810,27 +1054,48 @@ class IntercityHomeController extends GetxController { final latFraction = (latToRad(north) - latToRad(south)) / math.pi; final lngFraction = ((east - west + 360) % 360) / 360; - final latZoom = computeZoom(screenSize.height, worldDimension, latFraction + paddingFraction); - final lngZoom = computeZoom(screenSize.width, worldDimension, lngFraction + paddingFraction); + final latZoom = computeZoom( + screenSize.height, + worldDimension, + latFraction + paddingFraction, + ); + final lngZoom = computeZoom( + screenSize.width, + worldDimension, + lngFraction + paddingFraction, + ); final zoomLevel = math.min(latZoom, lngZoom).clamp(0.0, maxZoom); mapOsmController.move(center, zoomLevel); } } - Future updateCameraLocation(LatLng source, LatLng destination, GoogleMapController? mapController) async { + Future updateCameraLocation( + LatLng source, + LatLng destination, + GoogleMapController? mapController, + ) async { if (mapController == null) return; final bounds = LatLngBounds( - southwest: LatLng(math.min(source.latitude, destination.latitude), math.min(source.longitude, destination.longitude)), - northeast: LatLng(math.max(source.latitude, destination.latitude), math.max(source.longitude, destination.longitude)), + southwest: LatLng( + math.min(source.latitude, destination.latitude), + math.min(source.longitude, destination.longitude), + ), + northeast: LatLng( + math.max(source.latitude, destination.latitude), + math.max(source.longitude, destination.longitude), + ), ); final cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 90); await checkCameraLocation(cameraUpdate, mapController); } - Future checkCameraLocation(CameraUpdate cameraUpdate, GoogleMapController mapController) async { + Future checkCameraLocation( + CameraUpdate cameraUpdate, + GoogleMapController mapController, + ) async { await mapController.animateCamera(cameraUpdate); final l1 = await mapController.getVisibleRegion(); final l2 = await mapController.getVisibleRegion(); @@ -843,16 +1108,44 @@ class IntercityHomeController extends GetxController { Future setIcons() async { try { if (Constant.selectedMapType == 'osm') { - departureIconOsm = Image.asset("assets/icons/pickup.png", width: 30, height: 30); - destinationIconOsm = Image.asset("assets/icons/dropoff.png", width: 30, height: 30); - taxiIconOsm = Image.asset("assets/icons/ic_taxi.png", width: 30, height: 30); - stopIconOsm = Image.asset("assets/icons/location.png", width: 26, height: 26); + departureIconOsm = Image.asset( + "assets/icons/pickup.png", + width: 30, + height: 30, + ); + destinationIconOsm = Image.asset( + "assets/icons/dropoff.png", + width: 30, + height: 30, + ); + taxiIconOsm = Image.asset( + "assets/icons/ic_taxi.png", + width: 30, + height: 30, + ); + stopIconOsm = Image.asset( + "assets/icons/location.png", + width: 26, + height: 26, + ); } else { const config = ImageConfiguration(size: Size(48, 48)); - departureIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/pickup.png"); - destinationIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/dropoff.png"); - taxiIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/ic_taxi.png"); - stopIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/location.png"); + departureIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/pickup.png", + ); + destinationIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/dropoff.png", + ); + taxiIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/ic_taxi.png", + ); + stopIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/location.png", + ); } } catch (e) { print('Error loading icons: $e'); @@ -860,8 +1153,12 @@ class IntercityHomeController extends GetxController { } void clearMapDataIfLocationsRemoved() { - final isSourceEmpty = departureLatLongOsm.value.latitude == 0.0 && departureLatLongOsm.value.longitude == 0.0; - final isDestinationEmpty = destinationLatLongOsm.value.latitude == 0.0 && destinationLatLongOsm.value.longitude == 0.0; + final isSourceEmpty = + departureLatLongOsm.value.latitude == 0.0 && + departureLatLongOsm.value.longitude == 0.0; + final isDestinationEmpty = + destinationLatLongOsm.value.latitude == 0.0 && + destinationLatLongOsm.value.longitude == 0.0; if (isSourceEmpty || isDestinationEmpty) { // Clear polylines @@ -890,7 +1187,9 @@ class IntercityHomeController extends GetxController { // Remove marker if (Constant.selectedMapType == 'osm') { - osmMarker.removeWhere((marker) => marker.point == departureLatLongOsm.value); + osmMarker.removeWhere( + (marker) => marker.point == departureLatLongOsm.value, + ); } else { markers.removeWhere((marker) => marker.markerId.value == 'Departure'); } @@ -906,7 +1205,9 @@ class IntercityHomeController extends GetxController { destinationTextEditController.value.clear(); if (Constant.selectedMapType == 'osm') { - osmMarker.removeWhere((marker) => marker.point == destinationLatLongOsm.value); + osmMarker.removeWhere( + (marker) => marker.point == destinationLatLongOsm.value, + ); } else { markers.removeWhere((marker) => marker.markerId.value == 'Destination'); } @@ -916,9 +1217,16 @@ class IntercityHomeController extends GetxController { } Future searchPlaceNameOSM() async { - final url = Uri.parse('https://nominatim.openstreetmap.org/reverse?lat=${departureLatLongOsm.value.latitude}&lon=${departureLatLongOsm.value.longitude}&format=json'); + final url = Uri.parse( + 'https://nominatim.openstreetmap.org/reverse?lat=${departureLatLongOsm.value.latitude}&lon=${departureLatLongOsm.value.longitude}&format=json', + ); - final response = await http.get(url, headers: {'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)'}); + final response = await http.get( + url, + headers: { + 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', + }, + ); if (response.statusCode == 200) { log("response.body :: ${response.body}"); @@ -931,7 +1239,9 @@ class IntercityHomeController extends GetxController { final lat = departureLatLong.value.latitude; final lng = departureLatLong.value.longitude; - final url = Uri.parse('https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=${Constant.mapAPIKey}'); + final url = Uri.parse( + 'https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=${Constant.mapAPIKey}', + ); final response = await http.get(url); @@ -974,19 +1284,45 @@ class IntercityHomeController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -1028,20 +1364,32 @@ class IntercityHomeController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -1087,7 +1435,10 @@ class IntercityHomeController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -1097,8 +1448,14 @@ class IntercityHomeController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -1111,12 +1468,20 @@ class IntercityHomeController extends GetxController { }, ], "payer": {"email": userModel.value.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, "auto_return": "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -1174,9 +1539,12 @@ class IntercityHomeController extends GetxController { ///PayStack Payment Method Future payStackPayment(String totalAmount) async { - await PayStackURLGen.payStackURLGen(amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value).then(( - value, - ) async { + await PayStackURLGen.payStackURLGen( + amount: (double.parse(totalAmount) * 100).toString(), + currency: "ZAR", + secretKey: payStackModel.value.secretKey.toString(), + userModel: userModel.value, + ).then((value) async { if (value != null) { PayStackUrlModel payStackModel0 = value; Get.to( @@ -1196,15 +1564,23 @@ class IntercityHomeController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -1217,14 +1593,19 @@ class IntercityHomeController extends GetxController { "phonenumber": userModel.value.phoneNumber, // Add a real phone number "name": userModel.value.fullName(), // Add a real customer name }, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -1253,8 +1634,14 @@ class IntercityHomeController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: userModel.value, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -1293,7 +1680,14 @@ class IntercityHomeController extends GetxController { // }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -1329,24 +1723,38 @@ class IntercityHomeController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), "checksum_value": checkSum}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } final response = await http.post( Uri.parse(initiateURL), @@ -1364,9 +1772,12 @@ class IntercityHomeController extends GetxController { ); log(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -1384,7 +1795,10 @@ class IntercityHomeController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': userModel.value.phoneNumber, 'email': userModel.value.email}, + 'prefill': { + 'contact': userModel.value.phoneNumber, + 'email': userModel.value.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -1419,7 +1833,10 @@ class IntercityHomeController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -1437,15 +1854,30 @@ class IntercityHomeController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -1453,7 +1885,9 @@ class IntercityHomeController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -1470,13 +1904,30 @@ class IntercityHomeController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -1488,13 +1939,22 @@ class IntercityHomeController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -1505,17 +1965,32 @@ class IntercityHomeController extends GetxController { accessToken = responseData['access_token']; // ignore: use_build_context_synchronously - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; - String apiUrl = orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + orangeMoneyModel.value.isSandbox! == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, @@ -1530,7 +2005,11 @@ class IntercityHomeController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -1544,7 +2023,9 @@ class IntercityHomeController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -1561,7 +2042,13 @@ class IntercityHomeController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -1578,7 +2065,9 @@ class IntercityHomeController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -1591,7 +2080,11 @@ class IntercityHomeController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/address_list_controller.dart b/lib/controllers/address_list_controller.dart index 3a90915..ef1b6a2 100644 --- a/lib/controllers/address_list_controller.dart +++ b/lib/controllers/address_list_controller.dart @@ -1,6 +1,5 @@ import 'package:customer/models/user_model.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../constant/constant.dart'; import '../service/fire_store_utils.dart'; @@ -18,7 +17,9 @@ class AddressListController extends GetxController { } Future getUser() async { - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + value, + ) { if (value != null) { userModel.value = value; if (userModel.value.shippingAddress != null) { diff --git a/lib/controllers/advertisement_list_controller.dart b/lib/controllers/advertisement_list_controller.dart index 56ae63b..a8f0e65 100644 --- a/lib/controllers/advertisement_list_controller.dart +++ b/lib/controllers/advertisement_list_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/advertisement_model.dart'; import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class AdvertisementListController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/all_brand_product_controller.dart b/lib/controllers/all_brand_product_controller.dart index 5ffaec1..8a8867a 100644 --- a/lib/controllers/all_brand_product_controller.dart +++ b/lib/controllers/all_brand_product_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/brands_model.dart'; import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class AllBrandProductController extends GetxController { RxList productList = [].obs; @@ -27,19 +27,27 @@ class AllBrandProductController extends GetxController { } Future getProductByCategoryId() async { - List productDataList = await FireStoreUtils.getProductListByBrandId(brandModel.value.id.toString()); + List productDataList = + await FireStoreUtils.getProductListByBrandId( + brandModel.value.id.toString(), + ); List vendorList = await FireStoreUtils.getAllStoresFuture(); List allProduct = []; for (var vendor in vendorList) { await FireStoreUtils.getAllProducts(vendor.id.toString()).then((value) { - if (Constant.isSubscriptionModelApplied == true || vendor.adminCommission?.isEnabled == true) { - if (vendor.subscriptionPlan != null && Constant.isExpire(vendor) == false) { + if (Constant.isSubscriptionModelApplied == true || + vendor.adminCommission?.isEnabled == true) { + if (vendor.subscriptionPlan != null && + Constant.isExpire(vendor) == false) { if (vendor.subscriptionPlan?.itemLimit == '-1') { allProduct.addAll(value); } else { int selectedProduct = - value.length < int.parse(vendor.subscriptionPlan?.itemLimit ?? '0') ? (value.isEmpty ? 0 : (value.length)) : int.parse(vendor.subscriptionPlan?.itemLimit ?? '0'); + value.length < + int.parse(vendor.subscriptionPlan?.itemLimit ?? '0') + ? (value.isEmpty ? 0 : (value.length)) + : int.parse(vendor.subscriptionPlan?.itemLimit ?? '0'); allProduct.addAll(value.sublist(0, selectedProduct)); } } @@ -49,7 +57,9 @@ class AllBrandProductController extends GetxController { }); } for (var element in productDataList) { - final bool productIsInList = allProduct.any((product) => product.id == element.id); + final bool productIsInList = allProduct.any( + (product) => product.id == element.id, + ); if (productIsInList) { productList.add(element); } diff --git a/lib/controllers/all_category_product_controller.dart b/lib/controllers/all_category_product_controller.dart index d5454f6..d609ade 100644 --- a/lib/controllers/all_category_product_controller.dart +++ b/lib/controllers/all_category_product_controller.dart @@ -1,7 +1,7 @@ import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class AllCategoryProductController extends GetxController { RxBool isLoading = true.obs; @@ -25,6 +25,8 @@ class AllCategoryProductController extends GetxController { } Future getProductByCategoryId() async { - productList.value = await FireStoreUtils.getProductListByCategoryId(categoryModel.value.id.toString()); + productList.value = await FireStoreUtils.getProductListByCategoryId( + categoryModel.value.id.toString(), + ); } } diff --git a/lib/controllers/book_parcel_controller.dart b/lib/controllers/book_parcel_controller.dart index 825b239..e7d25e1 100644 --- a/lib/controllers/book_parcel_controller.dart +++ b/lib/controllers/book_parcel_controller.dart @@ -8,7 +8,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart' as latlong; import 'package:http/http.dart' as http; import 'package:image_picker/image_picker.dart'; @@ -23,26 +23,39 @@ import '../themes/show_toast_dialog.dart'; class BookParcelController extends GetxController { // Sender details - final Rx senderLocationController = TextEditingController().obs; - final Rx senderNameController = TextEditingController().obs; - final Rx senderMobileController = TextEditingController().obs; - final Rx senderWeightController = SingleValueDropDownController().obs; - final Rx senderNoteController = TextEditingController().obs; - final Rx senderCountryCodeController = TextEditingController(text: Constant.defaultCountryCode).obs; + final Rx senderLocationController = + TextEditingController().obs; + final Rx senderNameController = + TextEditingController().obs; + final Rx senderMobileController = + TextEditingController().obs; + final Rx senderWeightController = + SingleValueDropDownController().obs; + final Rx senderNoteController = + TextEditingController().obs; + final Rx senderCountryCodeController = + TextEditingController(text: Constant.defaultCountryCode).obs; // Receiver details - final Rx receiverLocationController = TextEditingController().obs; - final Rx receiverNameController = TextEditingController().obs; - final Rx receiverMobileController = TextEditingController().obs; - final Rx receiverNoteController = TextEditingController().obs; - final Rx receiverCountryCodeController = TextEditingController(text: Constant.defaultCountryCode).obs; + final Rx receiverLocationController = + TextEditingController().obs; + final Rx receiverNameController = + TextEditingController().obs; + final Rx receiverMobileController = + TextEditingController().obs; + final Rx receiverNoteController = + TextEditingController().obs; + final Rx receiverCountryCodeController = + TextEditingController(text: Constant.defaultCountryCode).obs; // Delivery type final RxString selectedDeliveryType = 'now'.obs; // Scheduled delivery fields - final Rx scheduledDateController = TextEditingController().obs; - final Rx scheduledTimeController = TextEditingController().obs; + final Rx scheduledDateController = + TextEditingController().obs; + final Rx scheduledTimeController = + TextEditingController().obs; final RxString scheduledDate = ''.obs; final RxString scheduledTime = ''.obs; @@ -83,7 +96,12 @@ class BookParcelController extends GetxController { } Future pickScheduledDate(BuildContext context) async { - final DateTime? picked = await showDatePicker(context: context, initialDate: DateTime.now(), firstDate: DateTime.now(), lastDate: DateTime.now().add(const Duration(days: 365))); + final DateTime? picked = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime.now(), + lastDate: DateTime.now().add(const Duration(days: 365)), + ); if (picked != null) { final formattedDate = "${picked.day}/${picked.month}/${picked.year}"; scheduledDate.value = formattedDate; @@ -92,7 +110,10 @@ class BookParcelController extends GetxController { } Future pickScheduledTime(BuildContext context) async { - final TimeOfDay? picked = await showTimePicker(context: context, initialTime: TimeOfDay.now()); + final TimeOfDay? picked = await showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ); if (picked != null) { final formattedTime = picked.format(context); scheduledTime.value = formattedTime; @@ -102,7 +123,10 @@ class BookParcelController extends GetxController { void onCameraClick(BuildContext context) { final action = CupertinoActionSheet( - message: Text('Add your parcel image.'.tr(), style: const TextStyle(fontSize: 15.0)), + message: Text( + 'Add your parcel image.'.tr(), + style: const TextStyle(fontSize: 15.0), + ), actions: [ CupertinoActionSheetAction( child: Text('Choose image from gallery'.tr()), @@ -118,14 +142,19 @@ class BookParcelController extends GetxController { child: Text('Take a picture'.tr()), onPressed: () async { Navigator.pop(context); - final XFile? photo = await _picker.pickImage(source: ImageSource.camera); + final XFile? photo = await _picker.pickImage( + source: ImageSource.camera, + ); if (photo != null) { images.add(photo); } }, ), ], - cancelButton: CupertinoActionSheetAction(child: Text('Cancel'.tr()), onPressed: () => Navigator.pop(context)), + cancelButton: CupertinoActionSheetAction( + child: Text('Cancel'.tr()), + onPressed: () => Navigator.pop(context), + ), ); showCupertinoModalPopup(context: context, builder: (context) => action); } @@ -134,11 +163,18 @@ class BookParcelController extends GetxController { try { await Geolocator.requestPermission(); final position = await Geolocator.getCurrentPosition(); - final placemarks = await placemarkFromCoordinates(position.latitude, position.longitude); + final placemarks = await placemarkFromCoordinates( + position.latitude, + position.longitude, + ); final place = placemarks.first; - final address = "${place.name}, ${place.subLocality}, ${place.locality}, ${place.administrativeArea}, ${place.postalCode}, ${place.country}"; + final address = + "${place.name}, ${place.subLocality}, ${place.locality}, ${place.administrativeArea}, ${place.postalCode}, ${place.country}"; - final userLocation = UserLocation(latitude: position.latitude, longitude: position.longitude); + final userLocation = UserLocation( + latitude: position.latitude, + longitude: position.longitude, + ); senderLocation.value = userLocation; senderLocationController.value.text = address; } catch (e) { @@ -179,7 +215,9 @@ class BookParcelController extends GetxController { ShowToastDialog.showToast("Please select parcel weight".tr()); return false; } else if (senderLocation.value == null || receiverLocation.value == null) { - ShowToastDialog.showToast("Please select both sender and receiver locations".tr()); + ShowToastDialog.showToast( + "Please select both sender and receiver locations".tr(), + ); return false; } return true; @@ -193,22 +231,37 @@ class BookParcelController extends GetxController { if (Constant.selectedMapType == 'osm') { print("Fetching route using OSM"); - print("Sender Location: ${senderLocation.value?.latitude}, ${senderLocation.value?.longitude}"); - print("Receiver Location: ${receiverLocation.value?.latitude}, ${receiverLocation.value?.longitude}"); + print( + "Sender Location: ${senderLocation.value?.latitude}, ${senderLocation.value?.longitude}", + ); + print( + "Receiver Location: ${receiverLocation.value?.latitude}, ${receiverLocation.value?.longitude}", + ); await fetchRouteWithWaypoints([ - latlong.LatLng(senderLocation.value?.latitude ?? 0.0, senderLocation.value?.longitude ?? 0.0), - latlong.LatLng(receiverLocation.value?.latitude ?? 0.0, receiverLocation.value?.longitude ?? 0.0), + latlong.LatLng( + senderLocation.value?.latitude ?? 0.0, + senderLocation.value?.longitude ?? 0.0, + ), + latlong.LatLng( + receiverLocation.value?.latitude ?? 0.0, + receiverLocation.value?.longitude ?? 0.0, + ), ]); } else { await fetchGoogleRouteWithWaypoints(); } if (distance.value < 0.5) { - ShowToastDialog.showToast("Sender's location to receiver's location should be more than 1 km.".tr()); + ShowToastDialog.showToast( + "Sender's location to receiver's location should be more than 1 km." + .tr(), + ); return; } - subTotal.value = (distance.value * double.parse(selectedWeight!.deliveryCharge.toString())); + subTotal.value = + (distance.value * + double.parse(selectedWeight!.deliveryCharge.toString())); goToCart(); } catch (e) { ShowToastDialog.showToast("Something went wrong while booking.".tr()); @@ -217,7 +270,10 @@ class BookParcelController extends GetxController { } void goToCart() { - DateTime senderPickup = isScheduled.value ? parseScheduledDateTime(scheduledDate.value, scheduledTime.value) : DateTime.now(); + DateTime senderPickup = + isScheduled.value + ? parseScheduledDateTime(scheduledDate.value, scheduledTime.value) + : DateTime.now(); print("Sender Pickup: $distance"); ParcelOrderModel order = ParcelOrderModel( @@ -236,22 +292,42 @@ class BookParcelController extends GetxController { taxSetting: Constant.taxList, isSchedule: isScheduled.value, sourcePoint: G( - geopoint: GeoPoint(senderLocation.value!.latitude ?? 0.0, senderLocation.value!.longitude ?? 0.0), - geohash: Geoflutterfire().point(latitude: senderLocation.value!.latitude ?? 0.0, longitude: senderLocation.value!.longitude ?? 0.0).hash, + geopoint: GeoPoint( + senderLocation.value!.latitude ?? 0.0, + senderLocation.value!.longitude ?? 0.0, + ), + geohash: + Geoflutterfire() + .point( + latitude: senderLocation.value!.latitude ?? 0.0, + longitude: senderLocation.value!.longitude ?? 0.0, + ) + .hash, ), destinationPoint: G( - geopoint: GeoPoint(receiverLocation.value!.latitude ?? 0.0, receiverLocation.value!.longitude ?? 0.0), - geohash: Geoflutterfire().point(latitude: receiverLocation.value!.latitude ?? 0.0, longitude: receiverLocation.value!.longitude ?? 0.0).hash, + geopoint: GeoPoint( + receiverLocation.value!.latitude ?? 0.0, + receiverLocation.value!.longitude ?? 0.0, + ), + geohash: + Geoflutterfire() + .point( + latitude: receiverLocation.value!.latitude ?? 0.0, + longitude: receiverLocation.value!.longitude ?? 0.0, + ) + .hash, ), sender: LocationInformation( address: senderLocationController.value.text, name: senderNameController.value.text, - phone: "(${senderCountryCodeController.value.text}) ${senderMobileController.value.text}", + phone: + "(${senderCountryCodeController.value.text}) ${senderMobileController.value.text}", ), receiver: LocationInformation( address: receiverLocationController.value.text, name: receiverNameController.value.text, - phone: "(${receiverCountryCodeController.value.text}) ${receiverMobileController.value.text}", + phone: + "(${receiverCountryCodeController.value.text}) ${receiverMobileController.value.text}", ), receiverLatLong: receiverLocation.value, senderLatLong: senderLocation.value, @@ -262,7 +338,10 @@ class BookParcelController extends GetxController { debugPrint("Subtotal: ${subTotal.value}"); debugPrint("Order JSON: ${order.toJson()}"); - Get.to(() => ParcelOrderConfirmationScreen(), arguments: {'parcelOrder': order, 'images': images}); + Get.to( + () => ParcelOrderConfirmationScreen(), + arguments: {'parcelOrder': order, 'images': images}, + ); } DateTime parseScheduledDateTime(String dateStr, String timeStr) { @@ -272,7 +351,10 @@ class BookParcelController extends GetxController { final month = int.parse(dateParts[1]); final year = int.parse(dateParts[2]); - final time = TimeOfDay(hour: int.parse(timeStr.split(':')[0]), minute: int.parse(timeStr.split(':')[1].split(' ')[0])); + final time = TimeOfDay( + hour: int.parse(timeStr.split(':')[0]), + minute: int.parse(timeStr.split(':')[1].split(' ')[0]), + ); final isPM = timeStr.toLowerCase().contains('pm'); final hour24 = isPM && time.hour < 12 ? time.hour + 12 : time.hour; @@ -284,9 +366,13 @@ class BookParcelController extends GetxController { } Future fetchGoogleRouteWithWaypoints() async { - final origin = '${senderLocation.value!.latitude},${senderLocation.value!.longitude}'; - final destination = '${receiverLocation.value!.latitude},${receiverLocation.value!.longitude}'; - final url = Uri.parse('https://maps.googleapis.com/maps/api/directions/json?origin=$origin&destination=$destination&mode=driving&key=${Constant.mapAPIKey}'); + final origin = + '${senderLocation.value!.latitude},${senderLocation.value!.longitude}'; + final destination = + '${receiverLocation.value!.latitude},${receiverLocation.value!.longitude}'; + final url = Uri.parse( + 'https://maps.googleapis.com/maps/api/directions/json?origin=$origin&destination=$destination&mode=driving&key=${Constant.mapAPIKey}', + ); try { final response = await http.get(url); @@ -315,8 +401,12 @@ class BookParcelController extends GetxController { } Future fetchRouteWithWaypoints(List points) async { - final coordinates = points.map((p) => '${p.longitude},${p.latitude}').join(';'); - final url = Uri.parse('https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson'); + final coordinates = points + .map((p) => '${p.longitude},${p.latitude}') + .join(';'); + final url = Uri.parse( + 'https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson', + ); try { final response = await http.get(url); diff --git a/lib/controllers/cab_booking_controller.dart b/lib/controllers/cab_booking_controller.dart index ce05319..ccd500c 100644 --- a/lib/controllers/cab_booking_controller.dart +++ b/lib/controllers/cab_booking_controller.dart @@ -46,7 +46,7 @@ import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:http/http.dart' as http; import 'package:latlong2/latlong.dart' as latlong; @@ -60,10 +60,13 @@ class CabBookingController extends GetxController { late GoogleMapController mapController; final flutterMap.MapController mapOsmController = flutterMap.MapController(); - final Rx sourceTextEditController = TextEditingController().obs; - final Rx destinationTextEditController = TextEditingController().obs; + final Rx sourceTextEditController = + TextEditingController().obs; + final Rx destinationTextEditController = + TextEditingController().obs; - final Rx couponCodeTextEditController = TextEditingController().obs; + final Rx couponCodeTextEditController = + TextEditingController().obs; final Rx currentLocation = Location().obs; @@ -133,64 +136,99 @@ class CabBookingController extends GetxController { await getPaymentSettings(); - FireStoreUtils.fireStore.collection(CollectionName.users).doc(FireStoreUtils.getCurrentUid()).snapshots().listen((userSnapshot) async { - if (!userSnapshot.exists) return; + FireStoreUtils.fireStore + .collection(CollectionName.users) + .doc(FireStoreUtils.getCurrentUid()) + .snapshots() + .listen((userSnapshot) async { + if (!userSnapshot.exists) return; - userModel.value = UserModel.fromJson(userSnapshot.data()!); + userModel.value = UserModel.fromJson(userSnapshot.data()!); - if (userModel.value.inProgressOrderID != null && userModel.value.inProgressOrderID!.isNotEmpty) { - String? validRideId; + if (userModel.value.inProgressOrderID != null && + userModel.value.inProgressOrderID!.isNotEmpty) { + String? validRideId; - for (String id in userModel.value.inProgressOrderID!) { - final rideDoc = await FireStoreUtils.fireStore.collection(CollectionName.rides).doc(id).get(); + for (String id in userModel.value.inProgressOrderID!) { + final rideDoc = + await FireStoreUtils.fireStore + .collection(CollectionName.rides) + .doc(id) + .get(); - if (rideDoc.exists && (rideDoc.data()?['rideType'] ?? '').toString().toLowerCase() == "ride") { - validRideId = userModel.value.inProgressOrderID!.first!; - break; - } - } - - FireStoreUtils.fireStore.collection(CollectionName.rides).doc(validRideId).snapshots().listen((rideSnapshot) async { - if (!rideSnapshot.exists) return; - - final rideData = rideSnapshot.data()!; - currentOrder.value = CabOrderModel.fromJson(rideData); - final status = currentOrder.value.status; - - if (status == Constant.driverAccepted || status == Constant.orderInTransit) { - FireStoreUtils.fireStore.collection(CollectionName.users).doc(currentOrder.value.driverId).snapshots().listen((event) async { - if (event.exists && event.data() != null) { - UserModel driverModel0 = UserModel.fromJson(event.data()!); - driverModel.value = driverModel0; - await updateDriverRoute(driverModel0); + if (rideDoc.exists && + (rideDoc.data()?['rideType'] ?? '') + .toString() + .toLowerCase() == + "ride") { + validRideId = userModel.value.inProgressOrderID!.first!; + break; } - }); - } + } - print("Current Ride Status: $status"); - if (status == Constant.orderPlaced || status == Constant.driverPending || status == Constant.driverRejected || (status == Constant.orderAccepted && currentOrder.value.driverId == null)) { - bottomSheetType.value = 'waitingForDriver'; - } else if (status == Constant.driverAccepted || status == Constant.orderInTransit) { - bottomSheetType.value = 'driverDetails'; - sourceTextEditController.value.text = currentOrder.value.sourceLocationName ?? ''; - destinationTextEditController.value.text = currentOrder.value.destinationLocationName ?? ''; - selectedPaymentMethod.value = currentOrder.value.paymentMethod ?? ''; - calculateTotalAmountAfterAccept(); - } else if (status == Constant.orderCompleted) { - userModel.value.inProgressOrderID!.remove(validRideId); - await FireStoreUtils.updateUser(userModel.value); + FireStoreUtils.fireStore + .collection(CollectionName.rides) + .doc(validRideId) + .snapshots() + .listen((rideSnapshot) async { + if (!rideSnapshot.exists) return; + + final rideData = rideSnapshot.data()!; + currentOrder.value = CabOrderModel.fromJson(rideData); + final status = currentOrder.value.status; + + if (status == Constant.driverAccepted || + status == Constant.orderInTransit) { + FireStoreUtils.fireStore + .collection(CollectionName.users) + .doc(currentOrder.value.driverId) + .snapshots() + .listen((event) async { + if (event.exists && event.data() != null) { + UserModel driverModel0 = UserModel.fromJson( + event.data()!, + ); + driverModel.value = driverModel0; + await updateDriverRoute(driverModel0); + } + }); + } + + print("Current Ride Status: $status"); + if (status == Constant.orderPlaced || + status == Constant.driverPending || + status == Constant.driverRejected || + (status == Constant.orderAccepted && + currentOrder.value.driverId == null)) { + bottomSheetType.value = 'waitingForDriver'; + } else if (status == Constant.driverAccepted || + status == Constant.orderInTransit) { + bottomSheetType.value = 'driverDetails'; + sourceTextEditController.value.text = + currentOrder.value.sourceLocationName ?? ''; + destinationTextEditController.value.text = + currentOrder.value.destinationLocationName ?? ''; + selectedPaymentMethod.value = + currentOrder.value.paymentMethod ?? ''; + calculateTotalAmountAfterAccept(); + } else if (status == Constant.orderCompleted) { + userModel.value.inProgressOrderID!.remove(validRideId); + await FireStoreUtils.updateUser(userModel.value); + bottomSheetType.value = 'location'; + Get.back(); + } + }); + } else { bottomSheetType.value = 'location'; - Get.back(); + if (Constant.currentLocation != null) { + setDepartureMarker( + Constant.currentLocation!.latitude, + Constant.currentLocation!.longitude, + ); + searchPlaceNameOSM(); + } } }); - } else { - bottomSheetType.value = 'location'; - if (Constant.currentLocation != null) { - setDepartureMarker(Constant.currentLocation!.latitude, Constant.currentLocation!.longitude); - searchPlaceNameOSM(); - } - } - }); final coupons = await FireStoreUtils.getCabCoupon(); cabCouponList.value = coupons; @@ -217,18 +255,30 @@ class CabBookingController extends GetxController { if (order.status == Constant.driverAccepted) { // DRIVER → PICKUP - await fetchRouteWithWaypoints([latlong.LatLng(driverLat, driverLng), latlong.LatLng(pickupLat, pickupLng)]); + await fetchRouteWithWaypoints([ + latlong.LatLng(driverLat, driverLng), + latlong.LatLng(pickupLat, pickupLng), + ]); } else if (order.status == Constant.orderInTransit) { // PICKUP → DESTINATION - await fetchRouteWithWaypoints([latlong.LatLng(driverLat, driverLng), latlong.LatLng(destLat, destLng)]); + await fetchRouteWithWaypoints([ + latlong.LatLng(driverLat, driverLng), + latlong.LatLng(destLat, destLng), + ]); } updateRouteMarkers(driverModel); } else { /// For Google Maps if (order.status == Constant.driverAccepted) { - await fetchGoogleRouteBetween(LatLng(driverLat, driverLng), LatLng(pickupLat, pickupLng)); + await fetchGoogleRouteBetween( + LatLng(driverLat, driverLng), + LatLng(pickupLat, pickupLng), + ); } else if (order.status == Constant.orderInTransit) { - await fetchGoogleRouteBetween(LatLng(driverLat, driverLng), LatLng(destLat, destLng)); + await fetchGoogleRouteBetween( + LatLng(driverLat, driverLng), + LatLng(destLat, destLng), + ); } updateRouteMarkers(driverModel); } @@ -252,12 +302,24 @@ class CabBookingController extends GetxController { markers.clear(); osmMarker.clear(); - final departureBytes = await Constant().getBytesFromAsset('assets/images/location_black3x.png', 50); - final destinationBytes = await Constant().getBytesFromAsset('assets/images/location_orange3x.png', 50); + final departureBytes = await Constant().getBytesFromAsset( + 'assets/images/location_black3x.png', + 50, + ); + final destinationBytes = await Constant().getBytesFromAsset( + 'assets/images/location_orange3x.png', + 50, + ); final driverBytesRaw = (Constant.sectionConstantModel?.markerIcon?.isNotEmpty ?? false) - ? await Constant().getBytesFromUrl(Constant.sectionConstantModel!.markerIcon!, width: 120) - : await Constant().getBytesFromAsset('assets/images/ic_cab.png', 50); + ? await Constant().getBytesFromUrl( + Constant.sectionConstantModel!.markerIcon!, + width: 120, + ) + : await Constant().getBytesFromAsset( + 'assets/images/ic_cab.png', + 50, + ); departureIcon = BitmapDescriptor.fromBytes(departureBytes); destinationIcon = BitmapDescriptor.fromBytes(destinationBytes); @@ -266,7 +328,15 @@ class CabBookingController extends GetxController { if (Constant.selectedMapType == 'osm') { if (order.status == Constant.driverAccepted) { osmMarker.addAll([ - flutterMap.Marker(point: latlong.LatLng(pickupLat, pickupLng), width: 40, height: 40, child: Image.asset('assets/images/location_black3x.png', width: 40)), + flutterMap.Marker( + point: latlong.LatLng(pickupLat, pickupLng), + width: 40, + height: 40, + child: Image.asset( + 'assets/images/location_black3x.png', + width: 40, + ), + ), flutterMap.Marker( point: latlong.LatLng(driverLat, driverLng), width: 45, @@ -277,13 +347,26 @@ class CabBookingController extends GetxController { height: 50, imageUrl: Constant.sectionConstantModel!.markerIcon.toString(), placeholder: (context, url) => Constant.loader(), - errorWidget: (context, url, error) => SizedBox(width: 30, height: 30, child: CircularProgressIndicator(strokeWidth: 2)), + errorWidget: + (context, url, error) => SizedBox( + width: 30, + height: 30, + child: CircularProgressIndicator(strokeWidth: 2), + ), ), ), ]); } else if (order.status == Constant.orderInTransit) { osmMarker.addAll([ - flutterMap.Marker(point: latlong.LatLng(destLat, destLng), width: 40, height: 40, child: Image.asset('assets/images/location_orange3x.png', width: 40)), + flutterMap.Marker( + point: latlong.LatLng(destLat, destLng), + width: 40, + height: 40, + child: Image.asset( + 'assets/images/location_orange3x.png', + width: 40, + ), + ), flutterMap.Marker( point: latlong.LatLng(driverLat, driverLng), width: 45, @@ -294,7 +377,12 @@ class CabBookingController extends GetxController { height: 50, imageUrl: Constant.sectionConstantModel!.markerIcon.toString(), placeholder: (context, url) => Constant.loader(), - errorWidget: (context, url, error) => SizedBox(width: 30, height: 30, child: CircularProgressIndicator(strokeWidth: 2)), + errorWidget: + (context, url, error) => SizedBox( + width: 30, + height: 30, + child: CircularProgressIndicator(strokeWidth: 2), + ), ), ), ]); @@ -306,9 +394,18 @@ class CabBookingController extends GetxController { markerId: const MarkerId("pickup"), position: LatLng(pickupLat, pickupLng), infoWindow: InfoWindow(title: "Pickup Location".tr()), - icon: departureIcon ?? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen), + icon: + departureIcon ?? + BitmapDescriptor.defaultMarkerWithHue( + BitmapDescriptor.hueGreen, + ), + ), + Marker( + markerId: const MarkerId("driver"), + position: LatLng(driverLat, driverLng), + infoWindow: InfoWindow(title: "Driver at Pickup".tr()), + icon: taxiIcon ?? BitmapDescriptor.defaultMarker, ), - Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver at Pickup".tr()), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), ]); } else if (order.status == Constant.orderInTransit) { markers.addAll([ @@ -316,9 +413,18 @@ class CabBookingController extends GetxController { markerId: const MarkerId("destination"), position: LatLng(destLat, destLng), infoWindow: InfoWindow(title: "Destination Location".tr()), - icon: destinationIcon ?? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed), + icon: + destinationIcon ?? + BitmapDescriptor.defaultMarkerWithHue( + BitmapDescriptor.hueRed, + ), + ), + Marker( + markerId: const MarkerId("driver"), + position: LatLng(driverLat, driverLng), + infoWindow: InfoWindow(title: "Driver Location".tr()), + icon: taxiIcon ?? BitmapDescriptor.defaultMarker, ), - Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver Location".tr()), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), ]); } } @@ -329,7 +435,10 @@ class CabBookingController extends GetxController { } } - Future fetchGoogleRouteBetween(LatLng originPoint, LatLng destPoint) async { + Future fetchGoogleRouteBetween( + LatLng originPoint, + LatLng destPoint, + ) async { final origin = '${originPoint.latitude},${originPoint.longitude}'; final destination = '${destPoint.latitude},${destPoint.longitude}'; final url = Uri.parse( @@ -346,7 +455,8 @@ class CabBookingController extends GetxController { final route = data['routes'][0]; final encodedPolyline = route['overview_polyline']['points']; final decodedPoints = PolylinePoints.decodePolyline(encodedPolyline); - final coordinates = decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); + final coordinates = + decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); addPolyLine(coordinates); @@ -373,7 +483,12 @@ class CabBookingController extends GetxController { if (currentOrder.value.taxSetting != null) { for (var element in currentOrder.value.taxSetting!) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } } @@ -389,11 +504,19 @@ class CabBookingController extends GetxController { subTotal.value = getAmount(selectedVehicleType.value); if (selectedCouponModel.value.id != null) { - discount.value = Constant.calculateDiscount(amount: subTotal.value.toString(), offerModel: selectedCouponModel.value); + discount.value = Constant.calculateDiscount( + amount: subTotal.value.toString(), + offerModel: selectedCouponModel.value, + ); } for (var element in Constant.taxList) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } totalAmount.value = (subTotal.value - discount.value) + taxAmount.value; @@ -430,9 +553,14 @@ class CabBookingController extends GetxController { serviceType: Constant.parcelServiceType, ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ); } }); } @@ -446,13 +574,25 @@ class CabBookingController extends GetxController { Future placeOrder() async { DestinationLocation sourceLocation = DestinationLocation( - latitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.latitude : departureLatLong.value.latitude, - longitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.longitude : departureLatLong.value.longitude, + latitude: + Constant.selectedMapType == 'osm' + ? departureLatLongOsm.value.latitude + : departureLatLong.value.latitude, + longitude: + Constant.selectedMapType == 'osm' + ? departureLatLongOsm.value.longitude + : departureLatLong.value.longitude, ); DestinationLocation destinationLocation = DestinationLocation( - latitude: Constant.selectedMapType == 'osm' ? destinationLatLongOsm.value.latitude : destinationLatLong.value.latitude, - longitude: Constant.selectedMapType == 'osm' ? destinationLatLongOsm.value.longitude : destinationLatLong.value.longitude, + latitude: + Constant.selectedMapType == 'osm' + ? destinationLatLongOsm.value.latitude + : destinationLatLong.value.latitude, + longitude: + Constant.selectedMapType == 'osm' + ? destinationLatLongOsm.value.longitude + : destinationLatLong.value.longitude, ); CabOrderModel orderModel = CabOrderModel(); @@ -463,7 +603,8 @@ class CabBookingController extends GetxController { orderModel.vehicleType = selectedVehicleType.value; orderModel.authorID = FireStoreUtils.getCurrentUid(); orderModel.sourceLocationName = sourceTextEditController.value.text; - orderModel.destinationLocationName = destinationTextEditController.value.text; + orderModel.destinationLocationName = + destinationTextEditController.value.text; orderModel.sourceLocation = sourceLocation; orderModel.destinationLocation = destinationLocation; @@ -475,11 +616,14 @@ class CabBookingController extends GetxController { orderModel.taxSetting = Constant.taxList; orderModel.adminCommissionType = - Constant.sectionConstantModel!.adminCommision != null && Constant.sectionConstantModel!.adminCommision!.isEnabled == true - ? Constant.sectionConstantModel!.adminCommision!.commissionType.toString() + Constant.sectionConstantModel!.adminCommision != null && + Constant.sectionConstantModel!.adminCommision!.isEnabled == true + ? Constant.sectionConstantModel!.adminCommision!.commissionType + .toString() : null; orderModel.adminCommission = - Constant.sectionConstantModel!.adminCommision != null && Constant.sectionConstantModel!.adminCommision!.isEnabled == true + Constant.sectionConstantModel!.adminCommision != null && + Constant.sectionConstantModel!.adminCommision!.isEnabled == true ? Constant.sectionConstantModel!.adminCommision!.amount.toString() : null; orderModel.couponCode = couponCodeTextEditController.value.text; @@ -492,7 +636,9 @@ class CabBookingController extends GetxController { orderModel.roundTrip = false; orderModel.sectionId = Constant.sectionConstantModel!.id; orderModel.createdAt = Timestamp.now(); - orderModel.otpCode = (maths.Random().nextInt(9000) + 1000).toString(); // Generate a 4-digit OTP + orderModel.otpCode = + (maths.Random().nextInt(9000) + 1000) + .toString(); // Generate a 4-digit OTP orderModel.status = Constant.orderPlaced; orderModel.scheduleDateTime = Timestamp.now(); log("Order Model : ${orderModel.toJson()}"); @@ -507,8 +653,10 @@ class CabBookingController extends GetxController { double getAmount(VehicleType vehicleType) { final double currentDistance = distance.value; - if (currentDistance <= (vehicleType.minimum_delivery_charges_within_km ?? 0)) { - return double.tryParse(vehicleType.minimum_delivery_charges.toString()) ?? 0.0; + if (currentDistance <= + (vehicleType.minimum_delivery_charges_within_km ?? 0)) { + return double.tryParse(vehicleType.minimum_delivery_charges.toString()) ?? + 0.0; } else { return (vehicleType.delivery_charges_per_km ?? 0.0) * currentDistance; } @@ -533,28 +681,50 @@ class CabBookingController extends GetxController { void setStopMarker(double lat, double lng, int index) { if (Constant.selectedMapType == 'osm') { // Add new stop marker without clearing - osmMarker.add(flutterMap.Marker(point: latlong.LatLng(lat, lng), width: 40, height: 40, child: stopIconOsm!)); + osmMarker.add( + flutterMap.Marker( + point: latlong.LatLng(lat, lng), + width: 40, + height: 40, + child: stopIconOsm!, + ), + ); getDirections(isStopMarker: true); } else { final markerId = MarkerId('Stop $index'); markers.removeWhere((marker) => marker.markerId == markerId); - markers.add(Marker(markerId: markerId, infoWindow: InfoWindow(title: '${'Stop'.tr()} ${String.fromCharCode(index + 65)}'), position: LatLng(lat, lng), icon: stopIcon!)); + markers.add( + Marker( + markerId: markerId, + infoWindow: InfoWindow( + title: '${'Stop'.tr()} ${String.fromCharCode(index + 65)}', + ), + position: LatLng(lat, lng), + icon: stopIcon!, + ), + ); getDirections(); } } void _setOsmMarker(double lat, double lng, {required bool isDeparture}) { - final marker = flutterMap.Marker(point: latlong.LatLng(lat, lng), width: 40, height: 40, child: isDeparture ? departureIconOsm! : destinationIconOsm!); + final marker = flutterMap.Marker( + point: latlong.LatLng(lat, lng), + width: 40, + height: 40, + child: isDeparture ? departureIconOsm! : destinationIconOsm!, + ); if (isDeparture) { departureLatLongOsm.value = latlong.LatLng(lat, lng); } else { destinationLatLongOsm.value = latlong.LatLng(lat, lng); } osmMarker.add(marker); - if (departureLatLongOsm.value.latitude != 0 && destinationLatLongOsm.value.latitude != 0) { + if (departureLatLongOsm.value.latitude != 0 && + destinationLatLongOsm.value.latitude != 0) { getDirections(); animateToSource(lat, lng); } @@ -576,14 +746,26 @@ class CabBookingController extends GetxController { markers.removeWhere((marker) => marker.markerId == markerId); // Add new marker - markers.add(Marker(markerId: markerId, position: pos, icon: icon, infoWindow: InfoWindow(title: title))); + markers.add( + Marker( + markerId: markerId, + position: pos, + icon: icon, + infoWindow: InfoWindow(title: title), + ), + ); mapController.animateCamera(CameraUpdate.newLatLngZoom(pos, 14)); - if (departureLatLong.value.latitude != 0 && destinationLatLong.value.latitude != 0) { + if (departureLatLong.value.latitude != 0 && + destinationLatLong.value.latitude != 0) { getDirections(); } else { - mapController.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(target: LatLng(lat, lng), zoom: 14))); + mapController.animateCamera( + CameraUpdate.newCameraPosition( + CameraPosition(target: LatLng(lat, lng), zoom: 14), + ), + ); } } @@ -592,25 +774,43 @@ class CabBookingController extends GetxController { final wayPoints = []; // Only add valid source - if (departureLatLongOsm.value.latitude != 0.0 && departureLatLongOsm.value.longitude != 0.0) { + if (departureLatLongOsm.value.latitude != 0.0 && + departureLatLongOsm.value.longitude != 0.0) { wayPoints.add(departureLatLongOsm.value); } // Only add valid destination - if (destinationLatLongOsm.value.latitude != 0.0 && destinationLatLongOsm.value.longitude != 0.0) { + if (destinationLatLongOsm.value.latitude != 0.0 && + destinationLatLongOsm.value.longitude != 0.0) { wayPoints.add(destinationLatLongOsm.value); } if (!isStopMarker) osmMarker.clear(); // Add source marker - if (departureLatLongOsm.value.latitude != 0.0 && departureLatLongOsm.value.longitude != 0.0) { - osmMarker.add(flutterMap.Marker(point: departureLatLongOsm.value, width: 40, height: 40, child: departureIconOsm!)); + if (departureLatLongOsm.value.latitude != 0.0 && + departureLatLongOsm.value.longitude != 0.0) { + osmMarker.add( + flutterMap.Marker( + point: departureLatLongOsm.value, + width: 40, + height: 40, + child: departureIconOsm!, + ), + ); } // Add destination marker - if (destinationLatLongOsm.value.latitude != 0.0 && destinationLatLongOsm.value.longitude != 0.0) { - osmMarker.add(flutterMap.Marker(point: destinationLatLongOsm.value, width: 40, height: 40, child: destinationIconOsm!)); + if (destinationLatLongOsm.value.latitude != 0.0 && + destinationLatLongOsm.value.longitude != 0.0) { + osmMarker.add( + flutterMap.Marker( + point: destinationLatLongOsm.value, + width: 40, + height: 40, + child: destinationIconOsm!, + ), + ); } if (wayPoints.length >= 2) { @@ -623,10 +823,14 @@ class CabBookingController extends GetxController { } Future fetchGoogleRouteWithWaypoints() async { - if (departureLatLong.value.latitude == 0.0 || destinationLatLong.value.latitude == 0.0) return; + if (departureLatLong.value.latitude == 0.0 || + destinationLatLong.value.latitude == 0.0) + return; - final origin = '${departureLatLong.value.latitude},${departureLatLong.value.longitude}'; - final destination = '${destinationLatLong.value.latitude},${destinationLatLong.value.longitude}'; + final origin = + '${departureLatLong.value.latitude},${departureLatLong.value.longitude}'; + final destination = + '${destinationLatLong.value.latitude},${destinationLatLong.value.longitude}'; final url = Uri.parse( 'https://maps.googleapis.com/maps/api/directions/json' @@ -645,7 +849,8 @@ class CabBookingController extends GetxController { // Polyline final encodedPolyline = route['overview_polyline']['points']; final decodedPoints = PolylinePoints.decodePolyline(encodedPolyline); - final coordinates = decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); + final coordinates = + decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); addPolyLine(coordinates); @@ -677,19 +882,26 @@ class CabBookingController extends GetxController { } Future fetchRouteWithWaypoints(List points) async { - final coordinates = points.map((p) => '${p.longitude},${p.latitude}').join(';'); - final url = Uri.parse('https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson'); + final coordinates = points + .map((p) => '${p.longitude},${p.latitude}') + .join(';'); + final url = Uri.parse( + 'https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson', + ); try { final response = await http.get(url); if (response.statusCode == 200) { final decoded = json.decode(response.body); - final geometry = decoded['routes'][0]['geometry']['coordinates'] as List; + final geometry = + decoded['routes'][0]['geometry']['coordinates'] as List; final dist = decoded['routes'][0]['distance']; final dur = decoded['routes'][0]['duration']; routePoints.clear(); - routePoints.addAll(geometry.map((coord) => latlong.LatLng(coord[1], coord[0]))); + routePoints.addAll( + geometry.map((coord) => latlong.LatLng(coord[1], coord[0])), + ); if (Constant.distanceType.toLowerCase() == "KM".toLowerCase()) { distance.value = dist / 1000.00; @@ -714,7 +926,10 @@ class CabBookingController extends GetxController { void zoomToPolylineOSM() { if (routePoints.isEmpty) return; // LatLngBounds requires at least two points - final bounds = flutterMap.LatLngBounds(routePoints.first, routePoints.first); + final bounds = flutterMap.LatLngBounds( + routePoints.first, + routePoints.first, + ); for (final point in routePoints) { bounds.extend(point); } @@ -726,8 +941,10 @@ class CabBookingController extends GetxController { double getBoundsZoomLevel(flutterMap.LatLngBounds bounds) { // Simple heuristic: zoom out for larger bounds - final latDiff = (bounds.northEast.latitude - bounds.southWest.latitude).abs(); - final lngDiff = (bounds.northEast.longitude - bounds.southWest.longitude).abs(); + final latDiff = + (bounds.northEast.latitude - bounds.southWest.latitude).abs(); + final lngDiff = + (bounds.northEast.longitude - bounds.southWest.longitude).abs(); double maxDiff = math.max(latDiff, lngDiff); if (maxDiff < 0.005) return 18.0; if (maxDiff < 0.01) return 16.0; @@ -739,7 +956,13 @@ class CabBookingController extends GetxController { void addPolyLine(List points) { final id = const PolylineId("poly"); - final polyline = Polyline(polylineId: id, color: AppThemeData.primary300, points: points, width: 6, geodesic: true); + final polyline = Polyline( + polylineId: id, + color: AppThemeData.primary300, + points: points, + width: 6, + geodesic: true, + ); polyLines[id] = polyline; if (points.length >= 2) { @@ -748,7 +971,10 @@ class CabBookingController extends GetxController { } } - Future updateCameraLocationToFitPolyline(List points, GoogleMapController? mapController) async { + Future updateCameraLocationToFitPolyline( + List points, + GoogleMapController? mapController, + ) async { if (mapController == null || points.isEmpty) return; double minLat = points.first.latitude, maxLat = points.first.latitude; double minLng = points.first.longitude, maxLng = points.first.longitude; @@ -758,16 +984,24 @@ class CabBookingController extends GetxController { if (p.longitude < minLng) minLng = p.longitude; if (p.longitude > maxLng) maxLng = p.longitude; } - final bounds = LatLngBounds(southwest: LatLng(minLat, minLng), northeast: LatLng(maxLat, maxLng)); + final bounds = LatLngBounds( + southwest: LatLng(minLat, minLng), + northeast: LatLng(maxLat, maxLng), + ); final cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 50); await checkCameraLocation(cameraUpdate, mapController); } Future animateToSource(double lat, double long) async { - final hasBothCoords = departureLatLongOsm.value.latitude != 0.0 && destinationLatLongOsm.value.latitude != 0.0; + final hasBothCoords = + departureLatLongOsm.value.latitude != 0.0 && + destinationLatLongOsm.value.latitude != 0.0; if (hasBothCoords) { - await calculateZoomLevel(source: departureLatLongOsm.value, destination: destinationLatLongOsm.value); + await calculateZoomLevel( + source: departureLatLongOsm.value, + destination: destinationLatLongOsm.value, + ); } else { mapOsmController.move(latlong.LatLng(lat, long), 10); } @@ -775,15 +1009,25 @@ class CabBookingController extends GetxController { RxMap polyLines = {}.obs; - Future calculateZoomLevel({required latlong.LatLng source, required latlong.LatLng destination, double paddingFraction = 0.001}) async { + Future calculateZoomLevel({ + required latlong.LatLng source, + required latlong.LatLng destination, + double paddingFraction = 0.001, + }) async { final bounds = flutterMap.LatLngBounds.fromPoints([source, destination]); final screenSize = Size(Get.width, Get.height * 0.5); const double worldDimension = 256.0; const double maxZoom = 10.0; - double latToRad(double lat) => math.log((1 + math.sin(lat * math.pi / 180)) / (1 - math.sin(lat * math.pi / 180))) / 2; + double latToRad(double lat) => + math.log( + (1 + math.sin(lat * math.pi / 180)) / + (1 - math.sin(lat * math.pi / 180)), + ) / + 2; - double computeZoom(double screenPx, double worldPx, double fraction) => math.log(screenPx / worldPx / fraction) / math.ln2; + double computeZoom(double screenPx, double worldPx, double fraction) => + math.log(screenPx / worldPx / fraction) / math.ln2; final north = bounds.northEast.latitude; final south = bounds.southWest.latitude; @@ -801,27 +1045,48 @@ class CabBookingController extends GetxController { final latFraction = (latToRad(north) - latToRad(south)) / math.pi; final lngFraction = ((east - west + 360) % 360) / 360; - final latZoom = computeZoom(screenSize.height, worldDimension, latFraction + paddingFraction); - final lngZoom = computeZoom(screenSize.width, worldDimension, lngFraction + paddingFraction); + final latZoom = computeZoom( + screenSize.height, + worldDimension, + latFraction + paddingFraction, + ); + final lngZoom = computeZoom( + screenSize.width, + worldDimension, + lngFraction + paddingFraction, + ); final zoomLevel = math.min(latZoom, lngZoom).clamp(0.0, maxZoom); mapOsmController.move(center, zoomLevel); } } - Future updateCameraLocation(LatLng source, LatLng destination, GoogleMapController? mapController) async { + Future updateCameraLocation( + LatLng source, + LatLng destination, + GoogleMapController? mapController, + ) async { if (mapController == null) return; final bounds = LatLngBounds( - southwest: LatLng(math.min(source.latitude, destination.latitude), math.min(source.longitude, destination.longitude)), - northeast: LatLng(math.max(source.latitude, destination.latitude), math.max(source.longitude, destination.longitude)), + southwest: LatLng( + math.min(source.latitude, destination.latitude), + math.min(source.longitude, destination.longitude), + ), + northeast: LatLng( + math.max(source.latitude, destination.latitude), + math.max(source.longitude, destination.longitude), + ), ); final cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 90); await checkCameraLocation(cameraUpdate, mapController); } - Future checkCameraLocation(CameraUpdate cameraUpdate, GoogleMapController mapController) async { + Future checkCameraLocation( + CameraUpdate cameraUpdate, + GoogleMapController mapController, + ) async { await mapController.animateCamera(cameraUpdate); final l1 = await mapController.getVisibleRegion(); final l2 = await mapController.getVisibleRegion(); @@ -834,16 +1099,44 @@ class CabBookingController extends GetxController { Future setIcons() async { try { if (Constant.selectedMapType == 'osm') { - departureIconOsm = Image.asset("assets/icons/pickup.png", width: 30, height: 30); - destinationIconOsm = Image.asset("assets/icons/dropoff.png", width: 30, height: 30); - taxiIconOsm = Image.asset("assets/icons/ic_taxi.png", width: 30, height: 30); - stopIconOsm = Image.asset("assets/icons/location.png", width: 26, height: 26); + departureIconOsm = Image.asset( + "assets/icons/pickup.png", + width: 30, + height: 30, + ); + destinationIconOsm = Image.asset( + "assets/icons/dropoff.png", + width: 30, + height: 30, + ); + taxiIconOsm = Image.asset( + "assets/icons/ic_taxi.png", + width: 30, + height: 30, + ); + stopIconOsm = Image.asset( + "assets/icons/location.png", + width: 26, + height: 26, + ); } else { const config = ImageConfiguration(size: Size(48, 48)); - departureIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/pickup.png"); - destinationIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/dropoff.png"); - taxiIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/ic_taxi.png"); - stopIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/location.png"); + departureIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/pickup.png", + ); + destinationIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/dropoff.png", + ); + taxiIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/ic_taxi.png", + ); + stopIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/location.png", + ); } } catch (e) { print('Error loading icons: $e'); @@ -851,8 +1144,12 @@ class CabBookingController extends GetxController { } void clearMapDataIfLocationsRemoved() { - final isSourceEmpty = departureLatLongOsm.value.latitude == 0.0 && departureLatLongOsm.value.longitude == 0.0; - final isDestinationEmpty = destinationLatLongOsm.value.latitude == 0.0 && destinationLatLongOsm.value.longitude == 0.0; + final isSourceEmpty = + departureLatLongOsm.value.latitude == 0.0 && + departureLatLongOsm.value.longitude == 0.0; + final isDestinationEmpty = + destinationLatLongOsm.value.latitude == 0.0 && + destinationLatLongOsm.value.longitude == 0.0; if (isSourceEmpty || isDestinationEmpty) { // Clear polylines @@ -881,7 +1178,9 @@ class CabBookingController extends GetxController { // Remove marker if (Constant.selectedMapType == 'osm') { - osmMarker.removeWhere((marker) => marker.point == departureLatLongOsm.value); + osmMarker.removeWhere( + (marker) => marker.point == departureLatLongOsm.value, + ); } else { markers.removeWhere((marker) => marker.markerId.value == 'Departure'); } @@ -897,7 +1196,9 @@ class CabBookingController extends GetxController { destinationTextEditController.value.clear(); if (Constant.selectedMapType == 'osm') { - osmMarker.removeWhere((marker) => marker.point == destinationLatLongOsm.value); + osmMarker.removeWhere( + (marker) => marker.point == destinationLatLongOsm.value, + ); } else { markers.removeWhere((marker) => marker.markerId.value == 'Destination'); } @@ -907,9 +1208,16 @@ class CabBookingController extends GetxController { } Future searchPlaceNameOSM() async { - final url = Uri.parse('https://nominatim.openstreetmap.org/reverse?lat=${departureLatLongOsm.value.latitude}&lon=${departureLatLongOsm.value.longitude}&format=json'); + final url = Uri.parse( + 'https://nominatim.openstreetmap.org/reverse?lat=${departureLatLongOsm.value.latitude}&lon=${departureLatLongOsm.value.longitude}&format=json', + ); - final response = await http.get(url, headers: {'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)'}); + final response = await http.get( + url, + headers: { + 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', + }, + ); if (response.statusCode == 200) { log("response.body :: ${response.body}"); @@ -922,7 +1230,9 @@ class CabBookingController extends GetxController { final lat = departureLatLong.value.latitude; final lng = departureLatLong.value.longitude; - final url = Uri.parse('https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=${Constant.mapAPIKey}'); + final url = Uri.parse( + 'https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=${Constant.mapAPIKey}', + ); final response = await http.get(url); @@ -965,19 +1275,45 @@ class CabBookingController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -1019,20 +1355,32 @@ class CabBookingController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -1078,7 +1426,10 @@ class CabBookingController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -1088,8 +1439,14 @@ class CabBookingController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -1102,12 +1459,20 @@ class CabBookingController extends GetxController { }, ], "payer": {"email": userModel.value.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, "auto_return": "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -1165,9 +1530,12 @@ class CabBookingController extends GetxController { ///PayStack Payment Method Future payStackPayment(String totalAmount) async { - await PayStackURLGen.payStackURLGen(amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value).then(( - value, - ) async { + await PayStackURLGen.payStackURLGen( + amount: (double.parse(totalAmount) * 100).toString(), + currency: "ZAR", + secretKey: payStackModel.value.secretKey.toString(), + userModel: userModel.value, + ).then((value) async { if (value != null) { PayStackUrlModel payStackModel0 = value; Get.to( @@ -1187,15 +1555,23 @@ class CabBookingController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -1208,14 +1584,19 @@ class CabBookingController extends GetxController { "phonenumber": userModel.value.phoneNumber, // Add a real phone number "name": userModel.value.fullName(), // Add a real customer name }, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -1244,8 +1625,14 @@ class CabBookingController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: userModel.value, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -1284,7 +1671,14 @@ class CabBookingController extends GetxController { // }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -1320,24 +1714,38 @@ class CabBookingController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), "checksum_value": checkSum}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } final response = await http.post( Uri.parse(initiateURL), @@ -1355,9 +1763,12 @@ class CabBookingController extends GetxController { ); log(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -1375,7 +1786,10 @@ class CabBookingController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': userModel.value.phoneNumber, 'email': userModel.value.email}, + 'prefill': { + 'contact': userModel.value.phoneNumber, + 'email': userModel.value.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -1410,7 +1824,10 @@ class CabBookingController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -1428,15 +1845,30 @@ class CabBookingController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -1444,7 +1876,9 @@ class CabBookingController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -1461,13 +1895,30 @@ class CabBookingController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -1479,13 +1930,22 @@ class CabBookingController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -1496,17 +1956,32 @@ class CabBookingController extends GetxController { accessToken = responseData['access_token']; // ignore: use_build_context_synchronously - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; - String apiUrl = orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + orangeMoneyModel.value.isSandbox! == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, @@ -1521,7 +1996,11 @@ class CabBookingController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -1535,7 +2014,9 @@ class CabBookingController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -1552,7 +2033,13 @@ class CabBookingController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -1569,7 +2056,9 @@ class CabBookingController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -1582,7 +2071,11 @@ class CabBookingController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/cab_coupon_code_controller.dart b/lib/controllers/cab_coupon_code_controller.dart index 8d57707..2da0007 100644 --- a/lib/controllers/cab_coupon_code_controller.dart +++ b/lib/controllers/cab_coupon_code_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class CabCouponCodeController extends GetxController { // Add your methods and properties here @@ -12,10 +12,10 @@ class CabCouponCodeController extends GetxController { super.onInit(); } - - void getData(){ + void getData() { getCouponCode(); } + RxBool isLoading = true.obs; RxList cabCouponList = [].obs; diff --git a/lib/controllers/cab_dashboard_controller.dart b/lib/controllers/cab_dashboard_controller.dart index 2bd4e9b..24e33cf 100644 --- a/lib/controllers/cab_dashboard_controller.dart +++ b/lib/controllers/cab_dashboard_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/cab_service_screens/cab_home_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../screen_ui/cab_service_screens/my_cab_booking_screen.dart'; class CabDashboardController extends GetxController { @@ -15,15 +15,26 @@ class CabDashboardController extends GetxController { void onInit() { getTaxList(); if (Constant.walletSetting == false) { - pageList.value = [CabHomeScreen(), const MyCabBookingScreen(), const ProfileScreen()]; + pageList.value = [ + CabHomeScreen(), + const MyCabBookingScreen(), + const ProfileScreen(), + ]; } else { - pageList.value = [CabHomeScreen(), const MyCabBookingScreen(), const WalletScreen(), const ProfileScreen()]; + pageList.value = [ + CabHomeScreen(), + const MyCabBookingScreen(), + const WalletScreen(), + const ProfileScreen(), + ]; } super.onInit(); } Future getTaxList() async { - await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) { + await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then(( + value, + ) { if (value != null) { Constant.taxList = value; } diff --git a/lib/controllers/cab_home_controller.dart b/lib/controllers/cab_home_controller.dart index ba4361c..8ece16f 100644 --- a/lib/controllers/cab_home_controller.dart +++ b/lib/controllers/cab_home_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/banner_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class CabHomeController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/cab_order_details_controller.dart b/lib/controllers/cab_order_details_controller.dart index 0106e98..e2f5e3b 100644 --- a/lib/controllers/cab_order_details_controller.dart +++ b/lib/controllers/cab_order_details_controller.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/rating_model.dart'; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:google_maps_flutter/google_maps_flutter.dart' as gmap; import 'package:latlong2/latlong.dart' as osm; @@ -56,14 +56,18 @@ class CabOrderDetailsController extends GetxController { Future fetchDriverDetails() async { if (cabOrder.value.driverId != null) { - await FireStoreUtils.getUserProfile(cabOrder.value.driverId ?? '').then((value) { + await FireStoreUtils.getUserProfile(cabOrder.value.driverId ?? '').then(( + value, + ) { if (value != null) { driverUser.value = value; } }); print(driverUser.value.toJson()); - await FireStoreUtils.getReviewsbyID(cabOrder.value.id.toString()).then((value) { + await FireStoreUtils.getReviewsbyID(cabOrder.value.id.toString()).then(( + value, + ) { if (value != null) { ratingModel.value = value; } @@ -79,7 +83,12 @@ class CabOrderDetailsController extends GetxController { if (cabOrder.value.taxSetting != null) { for (var element in cabOrder.value.taxSetting!) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } } @@ -94,8 +103,20 @@ class CabOrderDetailsController extends GetxController { final destLng = cabOrder.value.destinationLocation!.longitude; googleMarkers.value = { - gmap.Marker(markerId: const gmap.MarkerId('source'), position: gmap.LatLng(sourceLat!, sourceLng!), icon: gmap.BitmapDescriptor.defaultMarkerWithHue(gmap.BitmapDescriptor.hueGreen)), - gmap.Marker(markerId: const gmap.MarkerId('destination'), position: gmap.LatLng(destLat!, destLng!), icon: gmap.BitmapDescriptor.defaultMarkerWithHue(gmap.BitmapDescriptor.hueRed)), + gmap.Marker( + markerId: const gmap.MarkerId('source'), + position: gmap.LatLng(sourceLat!, sourceLng!), + icon: gmap.BitmapDescriptor.defaultMarkerWithHue( + gmap.BitmapDescriptor.hueGreen, + ), + ), + gmap.Marker( + markerId: const gmap.MarkerId('destination'), + position: gmap.LatLng(destLat!, destLng!), + icon: gmap.BitmapDescriptor.defaultMarkerWithHue( + gmap.BitmapDescriptor.hueRed, + ), + ), }; } @@ -104,7 +125,8 @@ class CabOrderDetailsController extends GetxController { final src = cabOrder.value.sourceLocation; final dest = cabOrder.value.destinationLocation; - final url = "https://maps.googleapis.com/maps/api/directions/json?origin=${src!.latitude},${src.longitude}&destination=${dest!.latitude},${dest.longitude}&key=$googleApiKey"; + final url = + "https://maps.googleapis.com/maps/api/directions/json?origin=${src!.latitude},${src.longitude}&destination=${dest!.latitude},${dest.longitude}&key=$googleApiKey"; final response = await http.get(Uri.parse(url)); final data = jsonDecode(response.body); @@ -113,9 +135,19 @@ class CabOrderDetailsController extends GetxController { final points = data["routes"][0]["overview_polyline"]["points"]; final polylinePoints = PolylinePoints.decodePolyline(points); - final polylineCoords = polylinePoints.map((p) => gmap.LatLng(p.latitude, p.longitude)).toList(); + final polylineCoords = + polylinePoints + .map((p) => gmap.LatLng(p.latitude, p.longitude)) + .toList(); - googlePolylines.value = {gmap.Polyline(polylineId: const gmap.PolylineId("google_route"), color: AppThemeData.onDemandDark100, width: 5, points: polylineCoords)}; + googlePolylines.value = { + gmap.Polyline( + polylineId: const gmap.PolylineId("google_route"), + color: AppThemeData.onDemandDark100, + width: 5, + points: polylineCoords, + ), + }; } } @@ -124,15 +156,20 @@ class CabOrderDetailsController extends GetxController { final src = cabOrder.value.sourceLocation; final dest = cabOrder.value.destinationLocation; - final url = "http://router.project-osrm.org/route/v1/driving/${src!.longitude},${src.latitude};${dest!.longitude},${dest.latitude}?overview=full&geometries=geojson"; + final url = + "http://router.project-osrm.org/route/v1/driving/${src!.longitude},${src.latitude};${dest!.longitude},${dest.latitude}?overview=full&geometries=geojson"; final response = await http.get(Uri.parse(url)); final data = jsonDecode(response.body); if (data["routes"].isNotEmpty) { - final coords = data["routes"][0]["geometry"]["coordinates"] as List; + final coords = + data["routes"][0]["geometry"]["coordinates"] as List; - osmPolyline.value = coords.map((c) => osm.LatLng(c[1].toDouble(), c[0].toDouble())).toList(); + osmPolyline.value = + coords + .map((c) => osm.LatLng(c[1].toDouble(), c[0].toDouble())) + .toList(); } } } diff --git a/lib/controllers/cab_rental_dashboard_controllers.dart b/lib/controllers/cab_rental_dashboard_controllers.dart index add5017..1e0eda6 100644 --- a/lib/controllers/cab_rental_dashboard_controllers.dart +++ b/lib/controllers/cab_rental_dashboard_controllers.dart @@ -3,8 +3,7 @@ import 'package:customer/screen_ui/multi_vendor_service/profile_screen/profile_s import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/screen_ui/rental_service/rental_home_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../screen_ui/rental_service/my_rental_booking_screen.dart'; class CabRentalDashboardControllers extends GetxController { @@ -17,15 +16,26 @@ class CabRentalDashboardControllers extends GetxController { // TODO: implement onInit getTaxList(); if (Constant.walletSetting == false) { - pageList.value = [RentalHomeScreen(), MyRentalBookingScreen(), const ProfileScreen()]; + pageList.value = [ + RentalHomeScreen(), + MyRentalBookingScreen(), + const ProfileScreen(), + ]; } else { - pageList.value = [RentalHomeScreen(), MyRentalBookingScreen(), const WalletScreen(), const ProfileScreen()]; + pageList.value = [ + RentalHomeScreen(), + MyRentalBookingScreen(), + const WalletScreen(), + const ProfileScreen(), + ]; } super.onInit(); } Future getTaxList() async { - await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) { + await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then(( + value, + ) { if (value != null) { Constant.taxList = value; } diff --git a/lib/controllers/cab_review_controller.dart b/lib/controllers/cab_review_controller.dart index bbd1b20..e5218bb 100644 --- a/lib/controllers/cab_review_controller.dart +++ b/lib/controllers/cab_review_controller.dart @@ -2,7 +2,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/cab_order_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../constant/collection_name.dart'; import '../models/rating_model.dart'; import '../models/user_model.dart'; @@ -44,12 +44,17 @@ class CabReviewController extends GetxController { } }); - await FireStoreUtils.getUserProfile(order.value?.driverId ?? '').then((value) { + await FireStoreUtils.getUserProfile(order.value?.driverId ?? '').then(( + value, + ) { if (value != null) { driverUser.value = value; - final int userReviewsCount = int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? 0; - final int userReviewsSum = int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0; + final int userReviewsCount = + int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? + 0; + final int userReviewsSum = + int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0; if (ratingModel.value != null) { final int oldRating = ratingModel.value?.rating?.toInt() ?? 0; @@ -74,7 +79,9 @@ class CabReviewController extends GetxController { ShowToastDialog.showLoader("Submit in...".tr()); - final user = await FireStoreUtils.getUserProfile(order.value?.driverId ?? ''); + final user = await FireStoreUtils.getUserProfile( + order.value?.driverId ?? '', + ); if (user != null) { user.reviewsCount = (futureCount.value + 1).toString(); @@ -91,7 +98,8 @@ class CabReviewController extends GetxController { driverId: ratingModel.value!.driverId, customerId: ratingModel.value!.customerId, vendorId: ratingModel.value?.vendorId, - uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", + uname: + "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); @@ -102,7 +110,8 @@ class CabReviewController extends GetxController { } } else { /// New review - final docRef = FireStoreUtils.fireStore.collection(CollectionName.itemsReview).doc(); + final docRef = + FireStoreUtils.fireStore.collection(CollectionName.itemsReview).doc(); final newRating = RatingModel( id: docRef.id, comment: comment.value.text, @@ -111,7 +120,8 @@ class CabReviewController extends GetxController { orderId: order.value?.id, driverId: order.value?.driverId.toString(), customerId: Constant.userModel?.id, - uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", + uname: + "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); diff --git a/lib/controllers/cart_controller.dart b/lib/controllers/cart_controller.dart index 8998fa7..5dc45ff 100644 --- a/lib/controllers/cart_controller.dart +++ b/lib/controllers/cart_controller.dart @@ -17,7 +17,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:intl/intl.dart'; import 'package:razorpay_flutter/razorpay_flutter.dart'; @@ -108,7 +108,9 @@ class CartController extends GetxController { cartItem.addAll(event); if (cartItem.isNotEmpty) { - await FireStoreUtils.getVendorById(cartItem.first.vendorID.toString()).then((value) { + await FireStoreUtils.getVendorById( + cartItem.first.vendorID.toString(), + ).then((value) { if (value != null) { vendorModel.value = value; } @@ -116,9 +118,14 @@ class CartController extends GetxController { } calculatePrice(); }); - selectedFoodType.value = Preferences.getString(Preferences.foodDeliveryType, defaultValue: "Delivery"); + selectedFoodType.value = Preferences.getString( + Preferences.foodDeliveryType, + defaultValue: "Delivery", + ); - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + value, + ) { if (value != null) { userModel.value = value; } @@ -127,16 +134,22 @@ class CartController extends GetxController { await FireStoreUtils.getDeliveryCharge().then((value) { if (value != null) { deliveryChargeModel.value = value; - print("===> Delivery Charge Model: ${deliveryChargeModel.value.toJson()}"); + print( + "===> Delivery Charge Model: ${deliveryChargeModel.value.toJson()}", + ); calculatePrice(); } }); - await FireStoreUtils.getAllVendorPublicCoupons(vendorModel.value.id.toString()).then((value) { + await FireStoreUtils.getAllVendorPublicCoupons( + vendorModel.value.id.toString(), + ).then((value) { couponList.value = value; }); - await FireStoreUtils.getAllVendorCoupons(vendorModel.value.id.toString()).then((value) { + await FireStoreUtils.getAllVendorCoupons( + vendorModel.value.id.toString(), + ).then((value) { allCouponList.value = value; }); } @@ -150,8 +163,11 @@ class CartController extends GetxController { totalAmount.value = 0.0; if (cartItem.isNotEmpty) { - if (Constant.sectionConstantModel!.serviceTypeFlag == "ecommerce-service") { - deliveryCharges.value = double.parse(Constant.sectionConstantModel!.delivery_charge ?? "0"); + if (Constant.sectionConstantModel!.serviceTypeFlag == + "ecommerce-service") { + deliveryCharges.value = double.parse( + Constant.sectionConstantModel!.delivery_charge ?? "0", + ); } else { if (selectedFoodType.value == "Delivery") { totalDistance.value = double.parse( @@ -162,26 +178,50 @@ class CartController extends GetxController { lng2: vendorModel.value.longitude.toString(), ), ); - if (vendorModel.value.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true) { + if (vendorModel.value.isSelfDelivery == true && + Constant.isSelfDeliveryFeature == true) { deliveryCharges.value = 0.0; } else if (deliveryChargeModel.value.vendorCanModify == false) { - if (totalDistance.value > deliveryChargeModel.value.minimumDeliveryChargesWithinKm!) { - deliveryCharges.value = totalDistance.value * deliveryChargeModel.value.deliveryChargesPerKm!; + if (totalDistance.value > + deliveryChargeModel.value.minimumDeliveryChargesWithinKm!) { + deliveryCharges.value = + totalDistance.value * + deliveryChargeModel.value.deliveryChargesPerKm!; } else { - deliveryCharges.value = (deliveryChargeModel.value.minimumDeliveryCharges)!.toDouble(); + deliveryCharges.value = + (deliveryChargeModel.value.minimumDeliveryCharges)! + .toDouble(); } } else { if (vendorModel.value.deliveryCharge != null) { - if (totalDistance.value > vendorModel.value.deliveryCharge!.minimumDeliveryChargesWithinKm!) { - deliveryCharges.value = (totalDistance.value * vendorModel.value.deliveryCharge!.deliveryChargesPerKm!).toDouble(); + if (totalDistance.value > + vendorModel + .value + .deliveryCharge! + .minimumDeliveryChargesWithinKm!) { + deliveryCharges.value = + (totalDistance.value * + vendorModel + .value + .deliveryCharge! + .deliveryChargesPerKm!) + .toDouble(); } else { - deliveryCharges.value = vendorModel.value.deliveryCharge!.minimumDeliveryCharges!.toDouble(); + deliveryCharges.value = + vendorModel.value.deliveryCharge!.minimumDeliveryCharges! + .toDouble(); } } else { - if (totalDistance.value > deliveryChargeModel.value.minimumDeliveryChargesWithinKm!) { - deliveryCharges.value = (totalDistance.value * deliveryChargeModel.value.deliveryChargesPerKm!).toDouble(); + if (totalDistance.value > + deliveryChargeModel.value.minimumDeliveryChargesWithinKm!) { + deliveryCharges.value = + (totalDistance.value * + deliveryChargeModel.value.deliveryChargesPerKm!) + .toDouble(); } else { - deliveryCharges.value = deliveryChargeModel.value.minimumDeliveryCharges!.toDouble(); + deliveryCharges.value = + deliveryChargeModel.value.minimumDeliveryCharges! + .toDouble(); } } } @@ -195,21 +235,29 @@ class CartController extends GetxController { if (double.parse(element.discountPrice.toString()) <= 0) { subTotal.value = subTotal.value + - double.parse(element.price.toString()) * double.parse(element.quantity.toString()) + - (double.parse(element.extrasPrice.toString()) * double.parse(element.quantity.toString())); + double.parse(element.price.toString()) * + double.parse(element.quantity.toString()) + + (double.parse(element.extrasPrice.toString()) * + double.parse(element.quantity.toString())); } else { subTotal.value = subTotal.value + - double.parse(element.discountPrice.toString()) * double.parse(element.quantity.toString()) + - (double.parse(element.extrasPrice.toString()) * double.parse(element.quantity.toString())); + double.parse(element.discountPrice.toString()) * + double.parse(element.quantity.toString()) + + (double.parse(element.extrasPrice.toString()) * + double.parse(element.quantity.toString())); } } if (selectedCouponModel.value.id != null) { - couponAmount.value = Constant.calculateDiscount(amount: subTotal.value.toString(), offerModel: selectedCouponModel.value); + couponAmount.value = Constant.calculateDiscount( + amount: subTotal.value.toString(), + offerModel: selectedCouponModel.value, + ); } - if (vendorModel.value.specialDiscountEnable == true && Constant.specialDiscountOffer == true) { + if (vendorModel.value.specialDiscountEnable == true && + Constant.specialDiscountOffer == true) { final now = DateTime.now(); var day = DateFormat('EEEE', 'en_US').format(now); var date = DateFormat('dd-MM-yyyy').format(now); @@ -218,13 +266,20 @@ class CartController extends GetxController { if (element.timeslot!.isNotEmpty) { for (var element in element.timeslot!) { if (element.discountType == "delivery") { - var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}"); - var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}"); + var start = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.from}"); + var end = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.to}"); if (isCurrentDateInRange(start, end)) { - specialDiscount.value = double.parse(element.discount.toString()); + specialDiscount.value = double.parse( + element.discount.toString(), + ); specialType.value = element.type.toString(); if (element.type == "percentage") { - specialDiscountAmount.value = subTotal * specialDiscount.value / 100; + specialDiscountAmount.value = + subTotal * specialDiscount.value / 100; } else { specialDiscountAmount.value = specialDiscount.value; } @@ -240,10 +295,23 @@ class CartController extends GetxController { } for (var element in Constant.taxList) { - taxAmount.value = taxAmount.value + Constant.calculateTax(amount: (subTotal.value - couponAmount.value - specialDiscountAmount.value).toString(), taxModel: element); + taxAmount.value = + taxAmount.value + + Constant.calculateTax( + amount: + (subTotal.value - + couponAmount.value - + specialDiscountAmount.value) + .toString(), + taxModel: element, + ); } - totalAmount.value = (subTotal.value - couponAmount.value - specialDiscountAmount.value) + taxAmount.value + deliveryCharges.value + deliveryTips.value; + totalAmount.value = + (subTotal.value - couponAmount.value - specialDiscountAmount.value) + + taxAmount.value + + deliveryCharges.value + + deliveryTips.value; getCashback(); } @@ -264,17 +332,31 @@ class CartController extends GetxController { if (startDate == null || endDate == null) continue; - final withinDateRange = startDate.toDate().isBefore(now) && endDate.toDate().isAfter(now); - final meetsMinAmount = orderTotal >= (cashback.minimumPurchaseAmount ?? 0); + final withinDateRange = + startDate.toDate().isBefore(now) && endDate.toDate().isAfter(now); + final meetsMinAmount = + orderTotal >= (cashback.minimumPurchaseAmount ?? 0); final allPayment = cashback.allPayment ?? false; - final paymentMatch = allPayment || (cashback.paymentMethods ?? []).contains(paymentMethod); + final paymentMatch = + allPayment || + (cashback.paymentMethods ?? []).contains(paymentMethod); final allCustomer = cashback.allCustomer ?? false; - final customerMatch = allCustomer || (cashback.customerIds ?? []).contains(FireStoreUtils.getCurrentUid()); + final customerMatch = + allCustomer || + (cashback.customerIds ?? []).contains( + FireStoreUtils.getCurrentUid(), + ); - final redeemData = await FireStoreUtils.getRedeemedCashbacks(cashback.id ?? ''); + final redeemData = await FireStoreUtils.getRedeemedCashbacks( + cashback.id ?? '', + ); final underLimit = redeemData.length < (cashback.redeemLimit ?? 0); - if (withinDateRange && meetsMinAmount && paymentMatch && customerMatch && underLimit) { + if (withinDateRange && + meetsMinAmount && + paymentMatch && + customerMatch && + underLimit) { eligibleCashbacks.add(cashback); } } @@ -312,7 +394,11 @@ class CartController extends GetxController { } } - Future addToCart({required CartProductModel cartProductModel, required bool isIncrement, required int quantity}) async { + Future addToCart({ + required CartProductModel cartProductModel, + required bool isIncrement, + required int quantity, + }) async { if (isIncrement) { cartProvider.addToCart(Get.context!, cartProductModel, quantity); } else { @@ -325,10 +411,13 @@ class CartController extends GetxController { Future placeOrder() async { if (selectedPaymentMethod.value == PaymentGateway.wallet.name) { - if (double.parse(userModel.value.walletAmount.toString()) >= totalAmount.value) { + if (double.parse(userModel.value.walletAmount.toString()) >= + totalAmount.value) { setOrder(); } else { - ShowToastDialog.showToast("You don't have sufficient wallet balance to place order".tr()); + ShowToastDialog.showToast( + "You don't have sufficient wallet balance to place order".tr(), + ); } } else { setOrder(); @@ -338,11 +427,19 @@ class CartController extends GetxController { Future setOrder() async { ShowToastDialog.showLoader("Please wait...".tr()); - if ((Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) && vendorModel.value.subscriptionPlan != null) { - await FireStoreUtils.getVendorById(vendorModel.value.id!).then((vender) async { - if (vender?.subscriptionTotalOrders == '0' || vender?.subscriptionTotalOrders == null) { + if ((Constant.isSubscriptionModelApplied == true || + Constant.sectionConstantModel?.adminCommision?.isEnabled == true) && + vendorModel.value.subscriptionPlan != null) { + await FireStoreUtils.getVendorById(vendorModel.value.id!).then(( + vender, + ) async { + if (vender?.subscriptionTotalOrders == '0' || + vender?.subscriptionTotalOrders == null) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("This vendor has reached their maximum order capacity. Please select a different vendor or try again later.".tr()); + ShowToastDialog.showToast( + "This vendor has reached their maximum order capacity. Please select a different vendor or try again later." + .tr(), + ); return; } }); @@ -356,7 +453,11 @@ class CartController extends GetxController { tempProduc.add(tempCart); } - Map specialDiscountMap = {'special_discount': specialDiscountAmount.value, 'special_discount_label': specialDiscount.value, 'specialType': specialType.value}; + Map specialDiscountMap = { + 'special_discount': specialDiscountAmount.value, + 'special_discount_label': specialDiscount.value, + 'specialType': specialType.value, + }; OrderModel orderModel = OrderModel(); orderModel.id = Constant.getUuid(); @@ -391,8 +492,12 @@ class CartController extends GetxController { orderModel.notes = reMarkController.value.text; orderModel.takeAway = selectedFoodType.value == "Delivery" ? false : true; orderModel.createdAt = Timestamp.now(); - orderModel.scheduleTime = deliveryType.value == "schedule" ? Timestamp.fromDate(scheduleDateTime.value) : null; - orderModel.cashback = bestCashback.value.id == null ? null : bestCashback.value; + orderModel.scheduleTime = + deliveryType.value == "schedule" + ? Timestamp.fromDate(scheduleDateTime.value) + : null; + orderModel.cashback = + bestCashback.value.id == null ? null : bestCashback.value; if (selectedPaymentMethod.value == PaymentGateway.wallet.name) { WalletTransactionModel transactionModel = WalletTransactionModel( id: Constant.getUuid(), @@ -407,33 +512,57 @@ class CartController extends GetxController { paymentStatus: "success".tr(), ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()).then((value) {}); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ).then((value) {}); } }); } for (int i = 0; i < tempProduc.length; i++) { - await FireStoreUtils.getProductById(tempProduc[i].id!.split('~').first).then((value) async { + await FireStoreUtils.getProductById( + tempProduc[i].id!.split('~').first, + ).then((value) async { ProductModel? productModel = value; if (tempProduc[i].variantInfo != null) { if (productModel!.itemAttribute != null) { - for (int j = 0; j < productModel.itemAttribute!.variants!.length; j++) { - if (productModel.itemAttribute!.variants![j].variantId == tempProduc[i].id!.split('~').last) { - if (productModel.itemAttribute!.variants![j].variantQuantity != "-1") { - productModel.itemAttribute!.variants![j].variantQuantity = (int.parse(productModel.itemAttribute!.variants![j].variantQuantity.toString()) - tempProduc[i].quantity!).toString(); + for ( + int j = 0; + j < productModel.itemAttribute!.variants!.length; + j++ + ) { + if (productModel.itemAttribute!.variants![j].variantId == + tempProduc[i].id!.split('~').last) { + if (productModel.itemAttribute!.variants![j].variantQuantity != + "-1") { + productModel.itemAttribute!.variants![j].variantQuantity = + (int.parse( + productModel + .itemAttribute! + .variants![j] + .variantQuantity + .toString(), + ) - + tempProduc[i].quantity!) + .toString(); } } } } else { if (productModel.quantity != -1) { - productModel.quantity = (productModel.quantity! - tempProduc[i].quantity!); + productModel.quantity = + (productModel.quantity! - tempProduc[i].quantity!); } } } else { if (productModel!.quantity != -1) { - productModel.quantity = (productModel.quantity! - tempProduc[i].quantity!); + productModel.quantity = + (productModel.quantity! - tempProduc[i].quantity!); } } @@ -451,18 +580,31 @@ class CartController extends GetxController { await FireStoreUtils.setCashbackRedeemModel(cashbackRedeemModel); } await FireStoreUtils.setOrder(orderModel).then((value) async { - await FireStoreUtils.getUserProfile(orderModel.vendor!.author.toString()).then((value) async { + await FireStoreUtils.getUserProfile( + orderModel.vendor!.author.toString(), + ).then((value) async { if (value != null) { if (orderModel.scheduleTime != null) { - await SendNotification.sendFcmMessage(Constant.scheduleOrder, value.fcmToken ?? '', {}); + await SendNotification.sendFcmMessage( + Constant.scheduleOrder, + value.fcmToken ?? '', + {}, + ); } else { - await SendNotification.sendFcmMessage(Constant.newOrderPlaced, value.fcmToken ?? '', {}); + await SendNotification.sendFcmMessage( + Constant.newOrderPlaced, + value.fcmToken ?? '', + {}, + ); } } }); await Constant.sendOrderEmail(orderModel: orderModel); ShowToastDialog.closeLoader(); - Get.off(const OrderPlacingScreen(), arguments: {"orderModel": orderModel}); + Get.off( + const OrderPlacingScreen(), + arguments: {"orderModel": orderModel}, + ); }); } @@ -483,19 +625,45 @@ class CartController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -537,20 +705,32 @@ class CartController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -596,7 +776,10 @@ class CartController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -606,8 +789,14 @@ class CartController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -620,12 +809,20 @@ class CartController extends GetxController { }, ], "payer": {"email": userModel.value.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, "auto_return": "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -683,9 +880,12 @@ class CartController extends GetxController { ///PayStack Payment Method Future payStackPayment(String totalAmount) async { - await PayStackURLGen.payStackURLGen(amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value).then(( - value, - ) async { + await PayStackURLGen.payStackURLGen( + amount: (double.parse(totalAmount) * 100).toString(), + currency: "ZAR", + secretKey: payStackModel.value.secretKey.toString(), + userModel: userModel.value, + ).then((value) async { if (value != null) { PayStackUrlModel payStackModel0 = value; Get.to( @@ -705,15 +905,23 @@ class CartController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -726,14 +934,19 @@ class CartController extends GetxController { "phonenumber": userModel.value.phoneNumber, // Add a real phone number "name": userModel.value.fullName(), // Add a real customer name }, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -762,8 +975,14 @@ class CartController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: userModel.value, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -783,26 +1002,50 @@ class CartController extends GetxController { final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString()}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + }, ); final data = jsonDecode(response.body); - await verifyCheckSum(checkSum: data["code"], amount: amount, orderId: orderId).then((value) { + await verifyCheckSum( + checkSum: data["code"], + amount: amount, + orderId: orderId, + ).then((value) { initiatePayment(amount: amount, orderId: orderId).then((value) { String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } GetPaymentTxtTokenModel result = value; - startTransaction(context, txnTokenBy: result.body.txnToken ?? '', orderId: orderId, amount: amount, callBackURL: callback, isStaging: paytmModel.value.isSandboxEnabled); + startTransaction( + context, + txnTokenBy: result.body.txnToken ?? '', + orderId: orderId, + amount: amount, + callBackURL: callback, + isStaging: paytmModel.value.isSandboxEnabled, + ); }); }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -838,24 +1081,38 @@ class CartController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), "checksum_value": checkSum}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } final response = await http.post( Uri.parse(initiateURL), @@ -873,9 +1130,12 @@ class CartController extends GetxController { ); log(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -893,7 +1153,10 @@ class CartController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': userModel.value.phoneNumber, 'email': userModel.value.email}, + 'prefill': { + 'contact': userModel.value.phoneNumber, + 'email': userModel.value.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -927,7 +1190,10 @@ class CartController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -945,15 +1211,30 @@ class CartController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -961,7 +1242,9 @@ class CartController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -978,13 +1261,30 @@ class CartController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -996,13 +1296,22 @@ class CartController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -1013,17 +1322,32 @@ class CartController extends GetxController { accessToken = responseData['access_token']; // ignore: use_build_context_synchronously - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; - String apiUrl = orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + orangeMoneyModel.value.isSandbox! == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, @@ -1038,7 +1362,11 @@ class CartController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -1052,7 +1380,9 @@ class CartController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -1069,7 +1399,13 @@ class CartController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -1086,7 +1422,9 @@ class CartController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -1099,7 +1437,11 @@ class CartController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/cashback_controller.dart b/lib/controllers/cashback_controller.dart index 43aa518..786fa55 100644 --- a/lib/controllers/cashback_controller.dart +++ b/lib/controllers/cashback_controller.dart @@ -1,5 +1,5 @@ import '../models/cashback_model.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../service/fire_store_utils.dart'; class CashbackController extends GetxController { diff --git a/lib/controllers/category_restaurant_controller.dart b/lib/controllers/category_restaurant_controller.dart index bd8e41a..a80b92b 100644 --- a/lib/controllers/category_restaurant_controller.dart +++ b/lib/controllers/category_restaurant_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../models/vendor_category_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class CategoryRestaurantController extends GetxController { RxBool isLoading = true.obs; @@ -33,9 +33,10 @@ class CategoryRestaurantController extends GetxController { } Future getRestaurant() async { - FireStoreUtils.getAllNearestRestaurantByCategoryId(categoryId: vendorCategoryModel.value.id.toString(), isDining: dineIn.value).listen(( - event, - ) async { + FireStoreUtils.getAllNearestRestaurantByCategoryId( + categoryId: vendorCategoryModel.value.id.toString(), + isDining: dineIn.value, + ).listen((event) async { allNearestRestaurant.clear(); allNearestRestaurant.addAll(event); }); @@ -46,7 +47,10 @@ class CategoryRestaurantController extends GetxController { if (value != null) { for (int i = 0; i < value.length; i++) { if (Constant.isPointInPolygon( - LatLng(Constant.selectedLocation.location!.latitude ?? 0.0, Constant.selectedLocation.location!.longitude ?? 0.0), + LatLng( + Constant.selectedLocation.location!.latitude ?? 0.0, + Constant.selectedLocation.location!.longitude ?? 0.0, + ), value[i].area!, )) { Constant.selectedZone = value[i]; diff --git a/lib/controllers/change_language_controller.dart b/lib/controllers/change_language_controller.dart index aad7891..82be122 100644 --- a/lib/controllers/change_language_controller.dart +++ b/lib/controllers/change_language_controller.dart @@ -2,8 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/language_model.dart'; import '../service/fire_store_utils.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../constant/collection_name.dart'; class ChangeLanguageController extends GetxController { @@ -20,24 +19,30 @@ class ChangeLanguageController extends GetxController { } Future getLanguage() async { - await FireStoreUtils.fireStore.collection(CollectionName.settings).doc("languages").get().then((event) { - if (event.exists) { - List languageListTemp = event.data()!["list"]; - for (var element in languageListTemp) { - LanguageModel languageModel = LanguageModel.fromJson(element); - languageList.add(languageModel); - } + await FireStoreUtils.fireStore + .collection(CollectionName.settings) + .doc("languages") + .get() + .then((event) { + if (event.exists) { + List languageListTemp = event.data()!["list"]; + for (var element in languageListTemp) { + LanguageModel languageModel = LanguageModel.fromJson(element); + languageList.add(languageModel); + } - if (Preferences.getString(Preferences.languageCodeKey).toString().isNotEmpty) { - LanguageModel pref = Constant.getLanguage(); - for (var element in languageList) { - if (element.slug == pref.slug) { - selectedLanguage.value = element; + if (Preferences.getString( + Preferences.languageCodeKey, + ).toString().isNotEmpty) { + LanguageModel pref = Constant.getLanguage(); + for (var element in languageList) { + if (element.slug == pref.slug) { + selectedLanguage.value = element; + } + } } } - } - } - }); + }); isLoading.value = false; } diff --git a/lib/controllers/chat_controller.dart b/lib/controllers/chat_controller.dart index bce8cf5..c0e2925 100644 --- a/lib/controllers/chat_controller.dart +++ b/lib/controllers/chat_controller.dart @@ -7,7 +7,7 @@ import '../models/conversation_model.dart'; import '../models/inbox_model.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:uuid/uuid.dart'; import '../service/send_notification.dart'; @@ -21,7 +21,11 @@ class ChatController extends GetxController { void onInit() { // TODO: implement onInit if (scrollController.hasClients) { - Timer(const Duration(milliseconds: 500), () => scrollController.jumpTo(scrollController.position.maxScrollExtent)); + Timer( + const Duration(milliseconds: 500), + () => + scrollController.jumpTo(scrollController.position.maxScrollExtent), + ); } getArgument(); super.onInit(); @@ -47,14 +51,20 @@ class ChatController extends GetxController { customerProfileImage.value = argumentData['customerProfileImage'] ?? ""; restaurantId.value = argumentData['restaurantId']; restaurantName.value = argumentData['restaurantName']; - restaurantProfileImage.value = argumentData['restaurantProfileImage'] ?? ""; + restaurantProfileImage.value = + argumentData['restaurantProfileImage'] ?? ""; token.value = argumentData['token'] ?? ""; chatType.value = argumentData['chatType']; } isLoading.value = false; } - Future sendMessage(String message, Url? url, String videoThumbnail, String messageType) async { + Future sendMessage( + String message, + Url? url, + String videoThumbnail, + String messageType, + ) async { InboxModel inboxModel = InboxModel( lastSenderId: customerId.value, customerId: customerId.value, @@ -113,18 +123,23 @@ class ChatController extends GetxController { } //await SendNotification.sendChatFcmMessage(customerName.value, conversationModel.message.toString(), token.value, {}); - await SendNotification.sendChatFcmMessage(customerName.value, conversationModel.message.toString(), token.value, { - "type": "chat", - "chatType": chatType.value, - "orderId": orderId.value, - "customerId": customerId.value, - "customerName": customerName.value, - "customerProfileImage": customerProfileImage.value, - "restaurantId": restaurantId.value, - "restaurantName": restaurantName.value, - "restaurantProfileImage": restaurantProfileImage.value, - "token": token.value, - }); + await SendNotification.sendChatFcmMessage( + customerName.value, + conversationModel.message.toString(), + token.value, + { + "type": "chat", + "chatType": chatType.value, + "orderId": orderId.value, + "customerId": customerId.value, + "customerName": customerName.value, + "customerProfileImage": customerProfileImage.value, + "restaurantId": restaurantId.value, + "restaurantName": restaurantName.value, + "restaurantProfileImage": restaurantProfileImage.value, + "token": token.value, + }, + ); } final ImagePicker imagePicker = ImagePicker(); diff --git a/lib/controllers/complain_controller.dart b/lib/controllers/complain_controller.dart index a76d011..45367eb 100644 --- a/lib/controllers/complain_controller.dart +++ b/lib/controllers/complain_controller.dart @@ -1,6 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/cab_order_model.dart'; import '../service/fire_store_utils.dart'; import '../themes/show_toast_dialog.dart'; @@ -30,7 +30,9 @@ class ComplainController extends GetxController { Future getComplain() async { isLoading.value = true; try { - final data = await FireStoreUtils.getRideComplainData(order.value.id ?? ''); + final data = await FireStoreUtils.getRideComplainData( + order.value.id ?? '', + ); if (data != null) { title.value.text = data['title'] ?? ''; comment.value.text = data['description'] ?? ''; @@ -59,7 +61,9 @@ class ComplainController extends GetxController { try { // Check if complaint already exists - bool exists = await FireStoreUtils.isRideComplainAdded(order.value.id ?? ''); + bool exists = await FireStoreUtils.isRideComplainAdded( + order.value.id ?? '', + ); if (!exists) { await FireStoreUtils.setRideComplain( @@ -67,13 +71,19 @@ class ComplainController extends GetxController { title: title.value.text.trim(), description: comment.value.text.trim(), customerID: order.value.authorID ?? '', - customerName: "${order.value.author?.firstName ?? ''} ${order.value.author?.lastName ?? ''}".trim(), + customerName: + "${order.value.author?.firstName ?? ''} ${order.value.author?.lastName ?? ''}" + .trim(), driverID: order.value.driverId ?? '', - driverName: "${order.value.driver?.firstName ?? ''} ${order.value.driver?.lastName ?? ''}".trim(), + driverName: + "${order.value.driver?.firstName ?? ''} ${order.value.driver?.lastName ?? ''}" + .trim(), ); ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Your complaint has been submitted to admin".tr()); + ShowToastDialog.showToast( + "Your complaint has been submitted to admin".tr(), + ); Get.back(); } else { ShowToastDialog.closeLoader(); diff --git a/lib/controllers/dash_board_controller.dart b/lib/controllers/dash_board_controller.dart index ae6445f..405df62 100644 --- a/lib/controllers/dash_board_controller.dart +++ b/lib/controllers/dash_board_controller.dart @@ -6,7 +6,7 @@ import '../screen_ui/multi_vendor_service/order_list_screen/order_screen.dart'; import '../screen_ui/multi_vendor_service/profile_screen/profile_screen.dart'; import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class DashBoardController extends GetxController { RxInt selectedIndex = 0.obs; @@ -19,22 +19,46 @@ class DashBoardController extends GetxController { getTaxList(); if (Constant.sectionConstantModel!.theme == "theme_2") { if (Constant.walletSetting == false) { - pageList.value = [const HomeScreen(), const FavouriteScreen(), const OrderScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeScreen(), + const FavouriteScreen(), + const OrderScreen(), + const ProfileScreen(), + ]; } else { - pageList.value = [const HomeScreen(), const FavouriteScreen(), const WalletScreen(), const OrderScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeScreen(), + const FavouriteScreen(), + const WalletScreen(), + const OrderScreen(), + const ProfileScreen(), + ]; } } else { if (Constant.walletSetting == false) { - pageList.value = [const HomeScreenTwo(), const FavouriteScreen(), const OrderScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeScreenTwo(), + const FavouriteScreen(), + const OrderScreen(), + const ProfileScreen(), + ]; } else { - pageList.value = [const HomeScreenTwo(), const FavouriteScreen(), const WalletScreen(), const OrderScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeScreenTwo(), + const FavouriteScreen(), + const WalletScreen(), + const OrderScreen(), + const ProfileScreen(), + ]; } } super.onInit(); } Future getTaxList() async { - await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) { + await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then(( + value, + ) { if (value != null) { Constant.taxList = value; } diff --git a/lib/controllers/dash_board_ecommarce_controller.dart b/lib/controllers/dash_board_ecommarce_controller.dart index 02bb9ce..647f120 100644 --- a/lib/controllers/dash_board_ecommarce_controller.dart +++ b/lib/controllers/dash_board_ecommarce_controller.dart @@ -5,7 +5,7 @@ import '../screen_ui/multi_vendor_service/order_list_screen/order_screen.dart'; import '../screen_ui/multi_vendor_service/profile_screen/profile_screen.dart'; import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class DashBoardEcommerceController extends GetxController { RxInt selectedIndex = 0.obs; @@ -17,15 +17,28 @@ class DashBoardEcommerceController extends GetxController { // TODO: implement onInit getTaxList(); if (Constant.walletSetting == false) { - pageList.value = [const HomeECommerceScreen(), const FavouriteScreen(), const OrderScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeECommerceScreen(), + const FavouriteScreen(), + const OrderScreen(), + const ProfileScreen(), + ]; } else { - pageList.value = [const HomeECommerceScreen(), const FavouriteScreen(), const WalletScreen(), const OrderScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeECommerceScreen(), + const FavouriteScreen(), + const WalletScreen(), + const OrderScreen(), + const ProfileScreen(), + ]; } super.onInit(); } Future getTaxList() async { - await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) { + await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then(( + value, + ) { if (value != null) { Constant.taxList = value; } diff --git a/lib/controllers/dine_in_booking_controller.dart b/lib/controllers/dine_in_booking_controller.dart index e273284..4f31c69 100644 --- a/lib/controllers/dine_in_booking_controller.dart +++ b/lib/controllers/dine_in_booking_controller.dart @@ -1,6 +1,6 @@ import '../models/dine_in_booking_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class DineInBookingController extends GetxController { RxBool isLoading = true.obs; @@ -18,16 +18,12 @@ class DineInBookingController extends GetxController { } Future getDineInBooking() async { - await FireStoreUtils.getDineInBooking(true).then( - (value) { - featureList.value = value; - }, - ); - await FireStoreUtils.getDineInBooking(false).then( - (value) { - historyList.value = value; - }, - ); + await FireStoreUtils.getDineInBooking(true).then((value) { + featureList.value = value; + }); + await FireStoreUtils.getDineInBooking(false).then((value) { + historyList.value = value; + }); isLoading.value = false; } diff --git a/lib/controllers/dine_in_booking_details_controller.dart b/lib/controllers/dine_in_booking_details_controller.dart index 994420c..9332e76 100644 --- a/lib/controllers/dine_in_booking_details_controller.dart +++ b/lib/controllers/dine_in_booking_details_controller.dart @@ -1,5 +1,5 @@ import 'package:customer/models/dine_in_booking_model.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class DineInBookingDetailsController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/dine_in_controller.dart b/lib/controllers/dine_in_controller.dart index b582900..57c6524 100644 --- a/lib/controllers/dine_in_controller.dart +++ b/lib/controllers/dine_in_controller.dart @@ -7,7 +7,7 @@ import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../models/banner_model.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class DineInController extends GetxController { RxBool isLoading = true.obs; @@ -28,7 +28,8 @@ class DineInController extends GetxController { RxList popularRestaurantList = [].obs; RxList bannerBottomModel = [].obs; - Rx pageBottomController = PageController(viewportFraction: 0.877).obs; + Rx pageBottomController = + PageController(viewportFraction: 0.877).obs; RxInt currentBottomPage = 0.obs; RxList favouriteList = [].obs; @@ -37,7 +38,9 @@ class DineInController extends GetxController { isLoading.value = true; await getZone(); - FireStoreUtils.getAllNearestRestaurant(isDining: true).listen((event) async { + FireStoreUtils.getAllNearestRestaurant(isDining: true).listen(( + event, + ) async { newArrivalRestaurantList.clear(); allNearestRestaurant.clear(); popularRestaurantList.clear(); @@ -47,12 +50,21 @@ class DineInController extends GetxController { popularRestaurantList.addAll(event); popularRestaurantList.sort( - (a, b) => Constant.calculateReview(reviewCount: b.reviewsCount.toString(), reviewSum: b.reviewsSum.toString()) - .compareTo(Constant.calculateReview(reviewCount: a.reviewsCount.toString(), reviewSum: a.reviewsSum.toString())), + (a, b) => Constant.calculateReview( + reviewCount: b.reviewsCount.toString(), + reviewSum: b.reviewsSum.toString(), + ).compareTo( + Constant.calculateReview( + reviewCount: a.reviewsCount.toString(), + reviewSum: a.reviewsSum.toString(), + ), + ), ); newArrivalRestaurantList.sort( - (a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo((a.createdAt ?? Timestamp.now()).toDate()), + (a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo( + (a.createdAt ?? Timestamp.now()).toDate(), + ), ); }); @@ -61,23 +73,17 @@ class DineInController extends GetxController { } Future getCategory() async { - await FireStoreUtils.getHomeVendorCategory().then( - (value) { - vendorCategoryModel.value = value; - }, - ); + await FireStoreUtils.getHomeVendorCategory().then((value) { + vendorCategoryModel.value = value; + }); - await FireStoreUtils.getHomeBottomBanner().then( - (value) { - bannerBottomModel.value = value; - }, - ); + await FireStoreUtils.getHomeBottomBanner().then((value) { + bannerBottomModel.value = value; + }); if (Constant.userModel != null) { - await FireStoreUtils.getFavouriteRestaurant().then( - (value) { - favouriteList.value = value; - }, - ); + await FireStoreUtils.getFavouriteRestaurant().then((value) { + favouriteList.value = value; + }); } } @@ -85,7 +91,13 @@ class DineInController extends GetxController { await FireStoreUtils.getZone().then((value) { if (value != null) { for (int i = 0; i < value.length; i++) { - if (Constant.isPointInPolygon(LatLng(Constant.selectedLocation.location!.latitude ?? 0.0, Constant.selectedLocation.location!.longitude ?? 0.0), value[i].area!)) { + if (Constant.isPointInPolygon( + LatLng( + Constant.selectedLocation.location!.latitude ?? 0.0, + Constant.selectedLocation.location!.longitude ?? 0.0, + ), + value[i].area!, + )) { Constant.selectedZone = value[i]; Constant.isZoneAvailable = true; break; @@ -96,5 +108,4 @@ class DineInController extends GetxController { } }); } - } diff --git a/lib/controllers/dine_in_restaurant_details_controller.dart b/lib/controllers/dine_in_restaurant_details_controller.dart index 8d2105c..5436203 100644 --- a/lib/controllers/dine_in_restaurant_details_controller.dart +++ b/lib/controllers/dine_in_restaurant_details_controller.dart @@ -8,16 +8,18 @@ import 'package:easy_localization/easy_localization.dart'; import '../screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../service/send_notification.dart'; import '../themes/show_toast_dialog.dart'; class DineInRestaurantDetailsController extends GetxController { - Rx searchEditingController = TextEditingController().obs; + Rx searchEditingController = + TextEditingController().obs; - Rx additionRequestController = TextEditingController().obs; + Rx additionRequestController = + TextEditingController().obs; RxBool isLoading = true.obs; RxBool firstVisit = false.obs; @@ -42,6 +44,7 @@ class DineInRestaurantDetailsController extends GetxController { return key; } } + RxString selectedOccasion = "".obs; RxList dateList = [].obs; @@ -65,30 +68,53 @@ class DineInRestaurantDetailsController extends GetxController { ShowToastDialog.showLoader("Please wait...".tr()); DateTime dt = selectedDate.value.toDate(); - String hour = DateFormat("kk:mm").format(DateFormat('hh:mm a').parse((Intl.getCurrentLocale() == "en_US") ? selectedTimeSlot.value : selectedTimeSlot.value.toLowerCase())); - dt = DateTime(dt.year, dt.month, dt.day, int.parse(hour.split(":")[0]), int.parse(hour.split(":")[1]), dt.second, dt.millisecond, dt.microsecond); + String hour = DateFormat("kk:mm").format( + DateFormat('hh:mm a').parse( + (Intl.getCurrentLocale() == "en_US") + ? selectedTimeSlot.value + : selectedTimeSlot.value.toLowerCase(), + ), + ); + dt = DateTime( + dt.year, + dt.month, + dt.day, + int.parse(hour.split(":")[0]), + int.parse(hour.split(":")[1]), + dt.second, + dt.millisecond, + dt.microsecond, + ); selectedDate.value = Timestamp.fromDate(dt); DineInBookingModel dineInBookingModel = DineInBookingModel( - id: Constant.getUuid(), - author: Constant.userModel, - authorID: FireStoreUtils.getCurrentUid(), - createdAt: Timestamp.now(), - date: selectedDate.value, - status: Constant.orderPlaced, - vendor: vendorModel.value, - specialRequest: additionRequestController.value.text.isEmpty ? "" : additionRequestController.value.text, - vendorID: vendorModel.value.id, - guestEmail: Constant.userModel!.email, - guestFirstName: Constant.userModel!.firstName, - guestLastName: Constant.userModel!.lastName, - guestPhone: Constant.userModel!.phoneNumber, - occasion: selectedOccasion.value, - discount: selectedTimeDiscount.value, - discountType: selectedTimeDiscountType.value, - totalGuest: noOfQuantity.value.toString(), - firstVisit: firstVisit.value); + id: Constant.getUuid(), + author: Constant.userModel, + authorID: FireStoreUtils.getCurrentUid(), + createdAt: Timestamp.now(), + date: selectedDate.value, + status: Constant.orderPlaced, + vendor: vendorModel.value, + specialRequest: + additionRequestController.value.text.isEmpty + ? "" + : additionRequestController.value.text, + vendorID: vendorModel.value.id, + guestEmail: Constant.userModel!.email, + guestFirstName: Constant.userModel!.firstName, + guestLastName: Constant.userModel!.lastName, + guestPhone: Constant.userModel!.phoneNumber, + occasion: selectedOccasion.value, + discount: selectedTimeDiscount.value, + discountType: selectedTimeDiscountType.value, + totalGuest: noOfQuantity.value.toString(), + firstVisit: firstVisit.value, + ); await FireStoreUtils.setBookedOrder(dineInBookingModel); - await SendNotification.sendFcmMessage(Constant.dineInPlaced, vendorModel.value.fcmToken.toString(), {}); + await SendNotification.sendFcmMessage( + Constant.dineInPlaced, + vendorModel.value.fcmToken.toString(), + {}, + ); ShowToastDialog.closeLoader(); Get.back(); Get.to(const DineInBookingScreen()); @@ -99,27 +125,46 @@ class DineInRestaurantDetailsController extends GetxController { for (int i = 0; i < 7; i++) { final now = DateTime.now().add(Duration(days: i)); var day = DateFormat('EEEE').format(now); - if (vendorModel.value.specialDiscount?.isNotEmpty == true && vendorModel.value.specialDiscountEnable == true) { + if (vendorModel.value.specialDiscount?.isNotEmpty == true && + vendorModel.value.specialDiscountEnable == true) { for (var element in vendorModel.value.specialDiscount!) { if (day == element.day.toString()) { if (element.timeslot!.isNotEmpty) { - SpecialDiscountTimeslot employeeWithMaxSalary = - element.timeslot!.reduce((item1, item2) => double.parse(item1.discount.toString()) > double.parse(item2.discount.toString()) ? item1 : item2); + SpecialDiscountTimeslot employeeWithMaxSalary = element.timeslot! + .reduce( + (item1, item2) => + double.parse(item1.discount.toString()) > + double.parse(item2.discount.toString()) + ? item1 + : item2, + ); if (employeeWithMaxSalary.discountType == "dinein") { - DateModel model = DateModel(date: Timestamp.fromDate(now), discountPer: employeeWithMaxSalary.discount.toString()); + DateModel model = DateModel( + date: Timestamp.fromDate(now), + discountPer: employeeWithMaxSalary.discount.toString(), + ); dateList.add(model); } else { - DateModel model = DateModel(date: Timestamp.fromDate(now), discountPer: "0"); + DateModel model = DateModel( + date: Timestamp.fromDate(now), + discountPer: "0", + ); dateList.add(model); } } else { - DateModel model = DateModel(date: Timestamp.fromDate(now), discountPer: "0"); + DateModel model = DateModel( + date: Timestamp.fromDate(now), + discountPer: "0", + ); dateList.add(model); } } } } else { - DateModel model = DateModel(date: Timestamp.fromDate(now), discountPer: "0"); + DateModel model = DateModel( + date: Timestamp.fromDate(now), + discountPer: "0", + ); dateList.add(model); } } @@ -127,70 +172,116 @@ class DineInRestaurantDetailsController extends GetxController { timeSet(selectedDate.value); if (timeSlotList.isNotEmpty) { - selectedTimeSlot.value = DateFormat('hh:mm a').format(timeSlotList[0].time!); + selectedTimeSlot.value = DateFormat( + 'hh:mm a', + ).format(timeSlotList[0].time!); } } void timeSet(Timestamp selectedDate) { timeSlotList.clear(); - for (DateTime time = Constant.stringToDate(vendorModel.value.openDineTime.toString()); - time.isBefore(Constant.stringToDate(vendorModel.value.closeDineTime.toString())); - time = time.add(const Duration(minutes: 30))) { + for ( + DateTime time = Constant.stringToDate( + vendorModel.value.openDineTime.toString(), + ); + time.isBefore( + Constant.stringToDate(vendorModel.value.closeDineTime.toString()), + ); + time = time.add(const Duration(minutes: 30)) + ) { final now = DateTime.parse(selectedDate.toDate().toString()); var day = DateFormat('EEEE').format(now); var date = DateFormat('dd-MM-yyyy').format(now); - if (vendorModel.value.specialDiscount?.isNotEmpty == true && vendorModel.value.specialDiscountEnable == true) { + if (vendorModel.value.specialDiscount?.isNotEmpty == true && + vendorModel.value.specialDiscountEnable == true) { for (var element in vendorModel.value.specialDiscount!) { if (day == element.day.toString()) { if (element.timeslot!.isNotEmpty) { for (var element in element.timeslot!) { if (element.discountType == "dinein") { - var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}"); - var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}"); - var selected = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${DateFormat.Hm().format(time)}"); + var start = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.from}"); + var end = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.to}"); + var selected = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${DateFormat.Hm().format(time)}"); if (isCurrentDateInRangeDineIn(start, end, selected)) { - var contains = timeSlotList.where((element) => element.time == time); + var contains = timeSlotList.where( + (element) => element.time == time, + ); if (contains.isNotEmpty) { - var index = timeSlotList.indexWhere((element) => element.time == time); + var index = timeSlotList.indexWhere( + (element) => element.time == time, + ); if (timeSlotList[index].discountPer == "0") { timeSlotList.removeAt(index); - TimeModel model = TimeModel(time: time, discountPer: element.discount, discountType: element.type); + TimeModel model = TimeModel( + time: time, + discountPer: element.discount, + discountType: element.type, + ); timeSlotList.insert(index == 0 ? 0 : index, model); } } else { - TimeModel model = TimeModel(time: time, discountPer: element.discount, discountType: element.type); + TimeModel model = TimeModel( + time: time, + discountPer: element.discount, + discountType: element.type, + ); timeSlotList.add(model); } } else { - var contains = timeSlotList.where((element) => element.time == time); + var contains = timeSlotList.where( + (element) => element.time == time, + ); if (contains.isEmpty) { - TimeModel model = TimeModel(time: time, discountPer: "0", discountType: "amount"); + TimeModel model = TimeModel( + time: time, + discountPer: "0", + discountType: "amount", + ); timeSlotList.add(model); } } } else { - TimeModel model = TimeModel(time: time, discountPer: "0", discountType: "amount"); + TimeModel model = TimeModel( + time: time, + discountPer: "0", + discountType: "amount", + ); timeSlotList.add(model); } } } else { - TimeModel model = TimeModel(time: time, discountPer: "0", discountType: "amount"); + TimeModel model = TimeModel( + time: time, + discountPer: "0", + discountType: "amount", + ); timeSlotList.add(model); } } } } else { - TimeModel model = TimeModel(time: time, discountPer: "0", discountType: "amount"); + TimeModel model = TimeModel( + time: time, + discountPer: "0", + discountType: "amount", + ); timeSlotList.add(model); } } } void animateSlider() { - if (vendorModel.value.photos != null && vendorModel.value.photos!.isNotEmpty) { + if (vendorModel.value.photos != null && + vendorModel.value.photos!.isNotEmpty) { Timer.periodic(const Duration(seconds: 2), (Timer timer) { if (currentPage < vendorModel.value.photos!.length) { currentPage++; @@ -226,18 +317,16 @@ class DineInRestaurantDetailsController extends GetxController { Future getFavouriteList() async { if (Constant.userModel != null) { - await FireStoreUtils.getFavouriteRestaurant().then( - (value) { - favouriteList.value = value; - }, - ); + await FireStoreUtils.getFavouriteRestaurant().then((value) { + favouriteList.value = value; + }); } - await FireStoreUtils.getVendorCuisines(vendorModel.value.id.toString()).then( - (value) { - tags.value = value; - }, - ); + await FireStoreUtils.getVendorCuisines( + vendorModel.value.id.toString(), + ).then((value) { + tags.value = value; + }); update(); } @@ -251,8 +340,12 @@ class DineInRestaurantDetailsController extends GetxController { if (day == element.day.toString()) { if (element.timeslot!.isNotEmpty) { for (var element in element.timeslot!) { - var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}"); - var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}"); + var start = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.from}"); + var end = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.to}"); if (isCurrentDateInRange(start, end)) { isOpen.value = true; } @@ -262,8 +355,14 @@ class DineInRestaurantDetailsController extends GetxController { } } - bool isCurrentDateInRangeDineIn(DateTime startDate, DateTime endDate, DateTime selected) { - return selected.isAtSameMomentAs(startDate) || selected.isAtSameMomentAs(endDate) || selected.isAfter(startDate) && selected.isBefore(endDate); + bool isCurrentDateInRangeDineIn( + DateTime startDate, + DateTime endDate, + DateTime selected, + ) { + return selected.isAtSameMomentAs(startDate) || + selected.isAtSameMomentAs(endDate) || + selected.isAfter(startDate) && selected.isBefore(endDate); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -284,5 +383,9 @@ class TimeModel { String? discountPer; String? discountType; - TimeModel({required this.time, required this.discountPer, required this.discountType}); + TimeModel({ + required this.time, + required this.discountPer, + required this.discountType, + }); } diff --git a/lib/controllers/discount_restaurant_list_controller.dart b/lib/controllers/discount_restaurant_list_controller.dart index 4b01083..bc5b12e 100644 --- a/lib/controllers/discount_restaurant_list_controller.dart +++ b/lib/controllers/discount_restaurant_list_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/vendor_model.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class DiscountRestaurantListController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/edit_profile_controller.dart b/lib/controllers/edit_profile_controller.dart index 47537b4..6fc4203 100644 --- a/lib/controllers/edit_profile_controller.dart +++ b/lib/controllers/edit_profile_controller.dart @@ -5,7 +5,7 @@ import 'package:easy_localization/easy_localization.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:image_picker/image_picker.dart'; import '../themes/show_toast_dialog.dart'; @@ -18,7 +18,8 @@ class EditProfileController extends GetxController { Rx lastNameController = TextEditingController().obs; Rx emailController = TextEditingController().obs; Rx phoneNumberController = TextEditingController().obs; - Rx countryCodeController = TextEditingController(text: "+91").obs; + Rx countryCodeController = + TextEditingController(text: "+91").obs; @override void onInit() { @@ -27,14 +28,18 @@ class EditProfileController extends GetxController { } Future getData() async { - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + value, + ) { if (value != null) { userModel.value = value; firstNameController.value.text = userModel.value.firstName.toString(); lastNameController.value.text = userModel.value.lastName.toString(); emailController.value.text = userModel.value.email.toString(); - phoneNumberController.value.text = userModel.value.phoneNumber.toString(); - countryCodeController.value.text = userModel.value.countryCode.toString(); + phoneNumberController.value.text = + userModel.value.phoneNumber.toString(); + countryCodeController.value.text = + userModel.value.countryCode.toString(); profileImage.value = userModel.value.profilePictureURL ?? ""; } }); @@ -44,7 +49,8 @@ class EditProfileController extends GetxController { Future saveData() async { ShowToastDialog.showLoader("Please wait...".tr()); - if (Constant().hasValidUrl(profileImage.value) == false && profileImage.value.isNotEmpty) { + if (Constant().hasValidUrl(profileImage.value) == false && + profileImage.value.isNotEmpty) { profileImage.value = await Constant.uploadUserImageToFireStorage( File(profileImage.value), "profileImage/${FireStoreUtils.getCurrentUid()}", diff --git a/lib/controllers/enter_manually_location_controller.dart b/lib/controllers/enter_manually_location_controller.dart index a3962f1..6a7382d 100644 --- a/lib/controllers/enter_manually_location_controller.dart +++ b/lib/controllers/enter_manually_location_controller.dart @@ -1,8 +1,7 @@ import 'package:customer/service/fire_store_utils.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../models/user_model.dart'; class EnterManuallyLocationController extends GetxController { @@ -13,9 +12,12 @@ class EnterManuallyLocationController extends GetxController { List saveAsList = ['Home', 'Work', 'Hotel', 'other'].obs; RxString selectedSaveAs = "Home".obs; - Rx houseBuildingTextEditingController = TextEditingController().obs; - Rx localityEditingController = TextEditingController().obs; - Rx landmarkEditingController = TextEditingController().obs; + Rx houseBuildingTextEditingController = + TextEditingController().obs; + Rx localityEditingController = + TextEditingController().obs; + Rx landmarkEditingController = + TextEditingController().obs; Rx location = UserLocation().obs; Rx shippingModel = ShippingAddress().obs; RxBool isLoading = false.obs; @@ -36,7 +38,8 @@ class EnterManuallyLocationController extends GetxController { mode.value = argumentData['mode'] ?? "Add"; //check address - if (argumentData['address'] != null && argumentData['address'] is ShippingAddress) { + if (argumentData['address'] != null && + argumentData['address'] is ShippingAddress) { shippingModel.value = argumentData['address']; setData(shippingModel.value); } @@ -49,7 +52,8 @@ class EnterManuallyLocationController extends GetxController { void setData(ShippingAddress shippingAddress) { shippingModel.value = shippingAddress; - houseBuildingTextEditingController.value.text = shippingAddress.address.toString(); + houseBuildingTextEditingController.value.text = + shippingAddress.address.toString(); localityEditingController.value.text = shippingAddress.locality.toString(); landmarkEditingController.value.text = shippingAddress.landmark.toString(); selectedSaveAs.value = shippingAddress.addressAs.toString(); @@ -57,7 +61,9 @@ class EnterManuallyLocationController extends GetxController { } Future getUser() async { - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + value, + ) { if (value != null) { userModel.value = value; if (userModel.value.shippingAddress != null) { diff --git a/lib/controllers/favourite_controller.dart b/lib/controllers/favourite_controller.dart index 149265e..b150298 100644 --- a/lib/controllers/favourite_controller.dart +++ b/lib/controllers/favourite_controller.dart @@ -5,7 +5,7 @@ import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class FavouriteController extends GetxController { RxBool favouriteRestaurant = true.obs; @@ -35,14 +35,22 @@ class FavouriteController extends GetxController { }); for (var element in favouriteList) { - await FireStoreUtils.getVendorById(element.restaurantId.toString()).then((value) async { + await FireStoreUtils.getVendorById( + element.restaurantId.toString(), + ).then((value) async { if (value != null) { - if ((Constant.isSubscriptionModelApplied == true || value.adminCommission?.isEnabled == true) && value.subscriptionPlan != null) { + if ((Constant.isSubscriptionModelApplied == true || + value.adminCommission?.isEnabled == true) && + value.subscriptionPlan != null) { if (value.subscriptionTotalOrders == "-1") { favouriteVendorList.add(value); } else { print("Restaurant :: ${value.title.toString()}"); - if ((value.subscriptionExpiryDate != null && value.subscriptionExpiryDate!.toDate().isBefore(DateTime.now()) == false) || + if ((value.subscriptionExpiryDate != null && + value.subscriptionExpiryDate!.toDate().isBefore( + DateTime.now(), + ) == + false) || value.subscriptionPlan?.expiryDay == '-1') { if (value.subscriptionTotalOrders != '0') { favouriteVendorList.add(value); @@ -57,32 +65,45 @@ class FavouriteController extends GetxController { } for (var element in favouriteItemList) { - await FireStoreUtils.getProductById(element.productId.toString()).then((value) async { + await FireStoreUtils.getProductById(element.productId.toString()).then(( + value, + ) async { if (value != null) { - await FireStoreUtils.fireStore.collection(CollectionName.vendors).doc(value.vendorID.toString()).get().then((value1) async { - if (value1.exists) { - VendorModel vendorModel = VendorModel.fromJson(value1.data()!); - if(value.publish == true){ - if (Constant.isSubscriptionModelApplied == true || vendorModel.adminCommission?.isEnabled == true) { - if (vendorModel.subscriptionPlan != null) { - if (vendorModel.subscriptionTotalOrders == "-1") { - favouriteFoodList.add(value); - } else { - if ((vendorModel.subscriptionExpiryDate != null && vendorModel.subscriptionExpiryDate!.toDate().isBefore(DateTime.now()) == false) || - vendorModel.subscriptionPlan?.expiryDay == "-1") { - if (vendorModel.subscriptionTotalOrders != '0') { + await FireStoreUtils.fireStore + .collection(CollectionName.vendors) + .doc(value.vendorID.toString()) + .get() + .then((value1) async { + if (value1.exists) { + VendorModel vendorModel = VendorModel.fromJson( + value1.data()!, + ); + if (value.publish == true) { + if (Constant.isSubscriptionModelApplied == true || + vendorModel.adminCommission?.isEnabled == true) { + if (vendorModel.subscriptionPlan != null) { + if (vendorModel.subscriptionTotalOrders == "-1") { favouriteFoodList.add(value); + } else { + if ((vendorModel.subscriptionExpiryDate != null && + vendorModel.subscriptionExpiryDate! + .toDate() + .isBefore(DateTime.now()) == + false) || + vendorModel.subscriptionPlan?.expiryDay == + "-1") { + if (vendorModel.subscriptionTotalOrders != '0') { + favouriteFoodList.add(value); + } + } } } + } else { + favouriteFoodList.add(value); } } - } else { - favouriteFoodList.add(value); } - } - - } - }); + }); } }); } diff --git a/lib/controllers/favourite_ondemmand_controller.dart b/lib/controllers/favourite_ondemmand_controller.dart index 0ed8f26..19174cf 100644 --- a/lib/controllers/favourite_ondemmand_controller.dart +++ b/lib/controllers/favourite_ondemmand_controller.dart @@ -4,13 +4,14 @@ import 'package:customer/models/favorite_ondemand_service_model.dart'; import 'package:customer/models/provider_serivce_model.dart'; import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class FavouriteOndemmandController extends GetxController { // Add your controller logic here Rx isLoading = false.obs; - RxList lstFav = [].obs; + RxList lstFav = + [].obs; RxList categories = [].obs; @override @@ -25,7 +26,9 @@ class FavouriteOndemmandController extends GetxController { await FireStoreUtils.getOnDemandCategory().then((catValue) { categories.value = catValue; }); - await FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()).then((favList) { + await FireStoreUtils.getFavouritesServiceList( + FireStoreUtils.getCurrentUid(), + ).then((favList) { lstFav.value = favList; }); isLoading.value = false; @@ -35,23 +38,27 @@ class FavouriteOndemmandController extends GetxController { if (Constant.userModel == null) { Get.to(LoginScreen()); } else { - var contain = lstFav.where((element) => element.service_id == provider.id); + var contain = lstFav.where( + (element) => element.service_id == provider.id, + ); if (contain.isNotEmpty) { - FavouriteOndemandServiceModel favouriteModel = FavouriteOndemandServiceModel( - section_id: provider.sectionId, - service_id: provider.id, - user_id: FireStoreUtils.getCurrentUid(), - serviceAuthorId: provider.author, - ); + FavouriteOndemandServiceModel favouriteModel = + FavouriteOndemandServiceModel( + section_id: provider.sectionId, + service_id: provider.id, + user_id: FireStoreUtils.getCurrentUid(), + serviceAuthorId: provider.author, + ); FireStoreUtils.removeFavouriteOndemandService(favouriteModel); lstFav.removeWhere((item) => item.service_id == provider.id); } else { - FavouriteOndemandServiceModel favouriteModel = FavouriteOndemandServiceModel( - section_id: provider.sectionId, - service_id: provider.id, - user_id: FireStoreUtils.getCurrentUid(), - serviceAuthorId: provider.author, - ); + FavouriteOndemandServiceModel favouriteModel = + FavouriteOndemandServiceModel( + section_id: provider.sectionId, + service_id: provider.id, + user_id: FireStoreUtils.getCurrentUid(), + serviceAuthorId: provider.author, + ); FireStoreUtils.setFavouriteOndemandSection(favouriteModel); lstFav.add(favouriteModel); } @@ -63,7 +70,9 @@ class FavouriteOndemmandController extends GetxController { if (categoryId == null || categoryId.isEmpty) return null; // Try to find category from cached list - CategoryModel? cat = categories.firstWhereOrNull((element) => element.id == categoryId); + CategoryModel? cat = categories.firstWhereOrNull( + (element) => element.id == categoryId, + ); // If not found, fetch from Firestore cat ??= await FireStoreUtils.getCategoryById(categoryId); diff --git a/lib/controllers/food_home_controller.dart b/lib/controllers/food_home_controller.dart index 3e1a300..2ffdf08 100644 --- a/lib/controllers/food_home_controller.dart +++ b/lib/controllers/food_home_controller.dart @@ -11,7 +11,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/utils/preferences.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../models/banner_model.dart'; import '../models/story_model.dart'; @@ -35,8 +35,10 @@ class FoodHomeController extends GetxController { RxBool isPopular = true.obs; RxString selectedOrderTypeValue = "Delivery".tr().obs; - Rx pageController = PageController(viewportFraction: 0.877).obs; - Rx pageBottomController = PageController(viewportFraction: 0.877).obs; + Rx pageController = + PageController(viewportFraction: 0.877).obs; + Rx pageBottomController = + PageController(viewportFraction: 0.877).obs; RxInt currentPage = 0.obs; RxInt currentBottomPage = 0.obs; @@ -66,7 +68,10 @@ class FoodHomeController extends GetxController { Future getData() async { isLoading.value = true; getCartData(); - selectedOrderTypeValue.value = Preferences.getString(Preferences.foodDeliveryType, defaultValue: "Delivery"); + selectedOrderTypeValue.value = Preferences.getString( + Preferences.foodDeliveryType, + defaultValue: "Delivery", + ); await getZone(); FireStoreUtils.getAllNearestRestaurant().listen((event) async { popularRestaurantList.clear(); @@ -82,17 +87,27 @@ class FoodHomeController extends GetxController { (a, b) => Constant.calculateReview( reviewCount: b.reviewsCount.toString(), reviewSum: b.reviewsSum.toString(), - ).compareTo(Constant.calculateReview(reviewCount: a.reviewsCount.toString(), reviewSum: a.reviewsSum.toString())), + ).compareTo( + Constant.calculateReview( + reviewCount: a.reviewsCount.toString(), + reviewSum: a.reviewsSum.toString(), + ), + ), ); - newArrivalRestaurantList.sort((a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo((a.createdAt ?? Timestamp.now()).toDate())); + newArrivalRestaurantList.sort( + (a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo( + (a.createdAt ?? Timestamp.now()).toDate(), + ), + ); await getVendorCategory(); await FireStoreUtils.getHomeCoupon().then((value) { couponRestaurantList.clear(); couponList.clear(); for (var element1 in value) { for (var element in allNearestRestaurant) { - if (element1.vendorID == element.id && element1.expiresAt!.toDate().isAfter(DateTime.now())) { + if (element1.vendorID == element.id && + element1.expiresAt!.toDate().isAfter(DateTime.now())) { couponList.add(element1); couponRestaurantList.add(element); } @@ -110,7 +125,7 @@ class FoodHomeController extends GetxController { print("nearestIds: $nearestIds"); // Filter stories whose vendorID exists in nearestIds storyList.addAll( - stories.where((story) => nearestIds.contains(story.vendorID)) + stories.where((story) => nearestIds.contains(story.vendorID)), ); print("Filtered storyList length: ${storyList.length}"); }); @@ -148,8 +163,16 @@ class FoodHomeController extends GetxController { await FireStoreUtils.getHomeVendorCategory().then((value) { vendorCategoryModel.value = value; if (Constant.restaurantList != null) { - List usedCategoryIds = Constant.restaurantList!.expand((vendor) => vendor.categoryID ?? []).whereType().toSet().toList(); - vendorCategoryModel.value = vendorCategoryModel.where((category) => usedCategoryIds.contains(category.id)).toList(); + List usedCategoryIds = + Constant.restaurantList! + .expand((vendor) => vendor.categoryID ?? []) + .whereType() + .toSet() + .toList(); + vendorCategoryModel.value = + vendorCategoryModel + .where((category) => usedCategoryIds.contains(category.id)) + .toList(); } }); @@ -177,7 +200,13 @@ class FoodHomeController extends GetxController { await FireStoreUtils.getZone().then((value) { if (value != null) { for (int i = 0; i < value.length; i++) { - if (Constant.isPointInPolygon(LatLng(Constant.selectedLocation.location?.latitude ?? 0.0, Constant.selectedLocation.location?.longitude ?? 0.0), value[i].area!)) { + if (Constant.isPointInPolygon( + LatLng( + Constant.selectedLocation.location?.latitude ?? 0.0, + Constant.selectedLocation.location?.longitude ?? 0.0, + ), + value[i].area!, + )) { Constant.selectedZone = value[i]; Constant.isZoneAvailable = true; break; diff --git a/lib/controllers/forgot_password_controller.dart b/lib/controllers/forgot_password_controller.dart index 0ea2da8..4b84ad8 100644 --- a/lib/controllers/forgot_password_controller.dart +++ b/lib/controllers/forgot_password_controller.dart @@ -1,7 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../themes/show_toast_dialog.dart'; class ForgotPasswordController extends GetxController { @@ -26,7 +26,8 @@ class ForgotPasswordController extends GetxController { await FirebaseAuth.instance.sendPasswordResetEmail(email: email); ShowToastDialog.closeLoader(); ShowToastDialog.showToast( - 'reset_password_link_sent'.trParams({'email': email}), + 'reset_password_link_sent'.tr(namedArgs: {'email': email}) + ); Get.back(); } on FirebaseAuthException catch (e) { @@ -34,7 +35,9 @@ class ForgotPasswordController extends GetxController { if (e.code == 'user-not-found') { ShowToastDialog.showToast('No user found for that email.'.tr()); } else { - ShowToastDialog.showToast(e.message?.tr() ?? "something_went_wrong".tr()); + ShowToastDialog.showToast( + e.message?.tr() ?? "something_went_wrong".tr(), + ); } } } diff --git a/lib/controllers/gift_card_controller.dart b/lib/controllers/gift_card_controller.dart index 3476e93..0acedfe 100644 --- a/lib/controllers/gift_card_controller.dart +++ b/lib/controllers/gift_card_controller.dart @@ -42,7 +42,7 @@ import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import '../service/fire_store_utils.dart'; import 'package:customer/utils/preferences.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:uuid/uuid.dart'; @@ -76,27 +76,31 @@ class GiftCardController extends GetxController { giftCardList = value; if (giftCardList.isNotEmpty) { selectedGiftCard.value = giftCardList.first; - messageController.value.text = selectedGiftCard.value.message.toString(); + messageController.value.text = + selectedGiftCard.value.message.toString(); } }); isLoading.value = false; - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then( - (value) { - if (value != null) { - userModel.value = value; - } - }, - ); + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + value, + ) { + if (value != null) { + userModel.value = value; + } + }); await getPaymentSettings(); } Future placeOrder() async { if (selectedPaymentMethod.value == PaymentGateway.wallet.name) { - if (double.parse(userModel.value.walletAmount.toString()) >= double.parse(amountController.value.text)) { + if (double.parse(userModel.value.walletAmount.toString()) >= + double.parse(amountController.value.text)) { setOrder(); } else { - ShowToastDialog.showToast("You don't have sufficient wallet balance to purchase gift card".tr()); + ShowToastDialog.showToast( + "You don't have sufficient wallet balance to purchase gift card".tr(), + ); } } else { setOrder(); @@ -116,26 +120,34 @@ class GiftCardController extends GetxController { giftCardsOrderModel.giftCode = generateGiftCode(); giftCardsOrderModel.paymentType = selectedPaymentMethod.value; giftCardsOrderModel.createdDate = Timestamp.now(); - DateTime dateTime = DateTime.now().add(Duration(days: int.parse(selectedGiftCard.value.expiryDay ?? "2"))); + DateTime dateTime = DateTime.now().add( + Duration(days: int.parse(selectedGiftCard.value.expiryDay ?? "2")), + ); giftCardsOrderModel.expireDate = Timestamp.fromDate(dateTime); giftCardsOrderModel.userid = FireStoreUtils.getCurrentUid(); if (selectedPaymentMethod.value == PaymentGateway.wallet.name) { WalletTransactionModel transactionModel = WalletTransactionModel( - id: Constant.getUuid(), - amount: double.parse(amountController.value.text), - date: Timestamp.now(), - paymentMethod: PaymentGateway.wallet.name, - transactionUser: "user", - userId: FireStoreUtils.getCurrentUid(), - isTopup: false, - orderId: giftCardsOrderModel.id, - note: "Gift card purchase amount debited".tr(), - paymentStatus: "success".tr()); + id: Constant.getUuid(), + amount: double.parse(amountController.value.text), + date: Timestamp.now(), + paymentMethod: PaymentGateway.wallet.name, + transactionUser: "user", + userId: FireStoreUtils.getCurrentUid(), + isTopup: false, + orderId: giftCardsOrderModel.id, + note: "Gift card purchase amount debited".tr(), + paymentStatus: "success".tr(), + ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${amountController.value.text.toString()}", userId: FireStoreUtils.getCurrentUid()).then((value) {}); + await FireStoreUtils.updateUserWallet( + amount: "-${amountController.value.text.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ).then((value) {}); } }); } @@ -179,54 +191,78 @@ class GiftCardController extends GetxController { Rx xenditModel = Xendit().obs; Future getPaymentSettings() async { - await FireStoreUtils.getPaymentSettingsData().then( - (value) { - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - if (walletSettingModel.value.isEnabled == true) { - selectedPaymentMethod.value = PaymentGateway.wallet.name; - } else if (stripeModel.value.isEnabled == true) { - selectedPaymentMethod.value = PaymentGateway.stripe.name; - } else if (payPalModel.value.isEnabled == true) { - selectedPaymentMethod.value = PaymentGateway.paypal.name; - } else if (payStackModel.value.isEnable == true) { - selectedPaymentMethod.value = PaymentGateway.payStack.name; - } else if (mercadoPagoModel.value.isEnabled == true) { - selectedPaymentMethod.value = PaymentGateway.mercadoPago.name; - } else if (flutterWaveModel.value.isEnable == true) { - selectedPaymentMethod.value = PaymentGateway.flutterWave.name; - }else if (payFastModel.value.isEnable == true) { - selectedPaymentMethod.value = PaymentGateway.payFast.name; - } else if (razorPayModel.value.isEnabled == true) { - selectedPaymentMethod.value = PaymentGateway.razorpay.name; - } else if (midTransModel.value.enable == true) { - selectedPaymentMethod.value = PaymentGateway.midTrans.name; - } else if (orangeMoneyModel.value.enable == true) { - selectedPaymentMethod.value = PaymentGateway.orangeMoney.name; - } else if (xenditModel.value.enable == true) { - selectedPaymentMethod.value = PaymentGateway.xendit.name; - } - Stripe.publishableKey = stripeModel.value.clientpublishableKey.toString(); - Stripe.merchantIdentifier = 'GoRide'; - Stripe.instance.applySettings(); - setRef(); + await FireStoreUtils.getPaymentSettingsData().then((value) { + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + if (walletSettingModel.value.isEnabled == true) { + selectedPaymentMethod.value = PaymentGateway.wallet.name; + } else if (stripeModel.value.isEnabled == true) { + selectedPaymentMethod.value = PaymentGateway.stripe.name; + } else if (payPalModel.value.isEnabled == true) { + selectedPaymentMethod.value = PaymentGateway.paypal.name; + } else if (payStackModel.value.isEnable == true) { + selectedPaymentMethod.value = PaymentGateway.payStack.name; + } else if (mercadoPagoModel.value.isEnabled == true) { + selectedPaymentMethod.value = PaymentGateway.mercadoPago.name; + } else if (flutterWaveModel.value.isEnable == true) { + selectedPaymentMethod.value = PaymentGateway.flutterWave.name; + } else if (payFastModel.value.isEnable == true) { + selectedPaymentMethod.value = PaymentGateway.payFast.name; + } else if (razorPayModel.value.isEnabled == true) { + selectedPaymentMethod.value = PaymentGateway.razorpay.name; + } else if (midTransModel.value.enable == true) { + selectedPaymentMethod.value = PaymentGateway.midTrans.name; + } else if (orangeMoneyModel.value.enable == true) { + selectedPaymentMethod.value = PaymentGateway.orangeMoney.name; + } else if (xenditModel.value.enable == true) { + selectedPaymentMethod.value = PaymentGateway.xendit.name; + } + Stripe.publishableKey = stripeModel.value.clientpublishableKey.toString(); + Stripe.merchantIdentifier = 'GoRide'; + Stripe.instance.applySettings(); + setRef(); - razorPay.on(Razorpay.EVENT_PAYMENT_SUCCESS, handlePaymentSuccess); - razorPay.on(Razorpay.EVENT_EXTERNAL_WALLET, handleExternalWaller); - razorPay.on(Razorpay.EVENT_PAYMENT_ERROR, handlePaymentError); - }, - ); + razorPay.on(Razorpay.EVENT_PAYMENT_SUCCESS, handlePaymentSuccess); + razorPay.on(Razorpay.EVENT_EXTERNAL_WALLET, handleExternalWaller); + razorPay.on(Razorpay.EVENT_PAYMENT_ERROR, handlePaymentError); + }); } // final _flutterPaypalNativePlugin = FlutterPaypalNative.instance; @@ -297,28 +333,34 @@ class GiftCardController extends GetxController { // Strip Future stripeMakePayment({required String amount}) async { try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin."); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.", + ); } else { await Stripe.instance.initPaymentSheet( - paymentSheetParameters: SetupPaymentSheetParameters( - paymentIntentClientSecret: paymentIntentData['client_secret'], - allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay( - merchantCountryCode: 'US', - testEnv: true, - currencyCode: "USD", - ), - customFlow: true, - style: ThemeMode.system, - appearance: PaymentSheetAppearance( - colors: PaymentSheetAppearanceColors( - primary: AppThemeData.primary300, - ), - ), - merchantDisplayName: 'GoRide')); + paymentSheetParameters: SetupPaymentSheetParameters( + paymentIntentClientSecret: paymentIntentData['client_secret'], + allowsDelayedPaymentMethods: false, + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), + customFlow: true, + style: ThemeMode.system, + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), + merchantDisplayName: 'GoRide', + ), + ); displayStripePaymentSheet(amount: amount); } } catch (e, s) { @@ -357,8 +399,14 @@ class GiftCardController extends GetxController { "shipping[address][country]": "US", }; var stripeSecret = stripeModel.value.stripeSecret; - var response = await http.post(Uri.parse('https://api.stripe.com/v1/payment_intents'), - body: body, headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}); + var response = await http.post( + Uri.parse('https://api.stripe.com/v1/payment_intents'), + body: body, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + ); return jsonDecode(response.body); } catch (e) { @@ -367,7 +415,10 @@ class GiftCardController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { final headers = { 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json', @@ -381,7 +432,7 @@ class GiftCardController extends GetxController { "quantity": 1, "currency_id": "BRL", // or your preferred currency "unit_price": double.parse(amount), - } + }, ], "payer": {"email": userModel.value.email}, "back_urls": { @@ -389,7 +440,8 @@ class GiftCardController extends GetxController { "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success", }, - "auto_return": "approved" // Automatically return after payment is approved + "auto_return": + "approved", // Automatically return after payment is approved }); final response = await http.post( @@ -417,18 +469,22 @@ class GiftCardController extends GetxController { ///PayStack Payment Method Future payStackPayment(String totalAmount) async { await PayStackURLGen.payStackURLGen( - amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value) - .then((value) async { + amount: (double.parse(totalAmount) * 100).toString(), + currency: "ZAR", + secretKey: payStackModel.value.secretKey.toString(), + userModel: userModel.value, + ).then((value) async { if (value != null) { PayStackUrlModel payStackModel0 = value; - Get.to(PayStackScreen( - secretKey: payStackModel.value.secretKey.toString(), - callBackUrl: payStackModel.value.callbackURL.toString(), - initialURl: payStackModel0.data.authorizationUrl, - amount: totalAmount, - reference: payStackModel0.data.reference, - ))! - .then((value) { + Get.to( + PayStackScreen( + secretKey: payStackModel.value.secretKey.toString(), + callBackUrl: payStackModel.value.callbackURL.toString(), + initialURl: payStackModel0.data.authorizationUrl, + amount: totalAmount, + reference: payStackModel0.data.reference, + ), + )!.then((value) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -437,13 +493,18 @@ class GiftCardController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); final headers = { 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', @@ -464,14 +525,16 @@ class GiftCardController extends GetxController { "customizations": { "title": "Payment for Services", "description": "Payment for XYZ services", - } + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -500,8 +563,14 @@ class GiftCardController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: userModel.value, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -513,38 +582,40 @@ class GiftCardController extends GetxController { }); } -//PayPal + //PayPal void paypalPaymentSheet(String amount, context) { Navigator.of(context).push( MaterialPageRoute( - builder: (BuildContext context) => UsePaypal( - sandboxMode: payPalModel.value.isLive == true ? false : true, - clientId: payPalModel.value.paypalClient ?? '', - secretKey: payPalModel.value.paypalSecret ?? '', - returnURL: "com.parkme://paypalpay", - cancelURL: "com.parkme://paypalpay", - transactions: [ - { - "amount": { - "total": amount, - "currency": "USD", - "details": {"subtotal": amount} + builder: + (BuildContext context) => UsePaypal( + sandboxMode: payPalModel.value.isLive == true ? false : true, + clientId: payPalModel.value.paypalClient ?? '', + secretKey: payPalModel.value.paypalSecret ?? '', + returnURL: "com.parkme://paypalpay", + cancelURL: "com.parkme://paypalpay", + transactions: [ + { + "amount": { + "total": amount, + "currency": "USD", + "details": {"subtotal": amount}, + }, }, - } - ], - note: "Contact us for any questions on your order.", - onSuccess: (Map params) async { - placeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr()); - }, - onError: (error) { - Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); - }, - onCancel: (params) { - Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); - }), + ], + note: "Contact us for any questions on your order.", + onSuccess: (Map params) async { + placeOrder(); + ShowToastDialog.showToast("Payment Successful!!".tr()); + }, + onError: (error) { + Get.back(); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + }, + onCancel: (params) { + Get.back(); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + }, + ), ), ); } @@ -555,33 +626,52 @@ class GiftCardController extends GetxController { String getChecksum = "${Constant.globalUrl}payments/getpaytmchecksum"; final response = await http.post( - Uri.parse( - getChecksum, - ), - headers: {}, - body: { - "mid": paytmModel.value.paytmMID.toString(), - "order_id": orderId, - "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), - }); + Uri.parse(getChecksum), + headers: {}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + }, + ); final data = jsonDecode(response.body); - await verifyCheckSum(checkSum: data["code"], amount: amount, orderId: orderId).then((value) { + await verifyCheckSum( + checkSum: data["code"], + amount: amount, + orderId: orderId, + ).then((value) { initiatePayment(amount: amount, orderId: orderId).then((value) { String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } GetPaymentTxtTokenModel result = value; - startTransaction(context, txnTokenBy: result.body.txnToken ?? '', orderId: orderId, amount: amount, callBackURL: callback, isStaging: paytmModel.value.isSandboxEnabled); + startTransaction( + context, + txnTokenBy: result.body.txnToken ?? '', + orderId: orderId, + amount: amount, + callBackURL: callback, + isStaging: paytmModel.value.isSandboxEnabled, + ); }); }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -616,46 +706,61 @@ class GiftCardController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( - Uri.parse( - getChecksum, - ), - headers: {}, - body: { - "mid": paytmModel.value.paytmMID.toString(), - "order_id": orderId, - "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), - "checksum_value": checkSum, - }); + Uri.parse(getChecksum), + headers: {}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, + ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } - final response = await http.post(Uri.parse(initiateURL), headers: {}, body: { - "mid": paytmModel.value.paytmMID, - "order_id": orderId, - "key_secret": paytmModel.value.pAYTMMERCHANTKEY, - "amount": amount.toString(), - "currency": "INR", - "callback_url": callback, - "custId": FireStoreUtils.getCurrentUid(), - "issandbox": paytmModel.value.isSandboxEnabled == true ? "1" : "2", - }); + final response = await http.post( + Uri.parse(initiateURL), + headers: {}, + body: { + "mid": paytmModel.value.paytmMID, + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY, + "amount": amount.toString(), + "currency": "INR", + "callback_url": callback, + "custId": FireStoreUtils.getCurrentUid(), + "issandbox": paytmModel.value.isSandboxEnabled == true ? "1" : "2", + }, + ); print(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -678,8 +783,8 @@ class GiftCardController extends GetxController { 'email': userModel.value.email, }, 'external': { - 'wallets': ['paytm'] - } + 'wallets': ['paytm'], + }, }; try { @@ -706,14 +811,14 @@ class GiftCardController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { - Get.to(() => MidtransScreen( - initialURl: url, - ))! - .then((value) { + Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -727,14 +832,20 @@ class GiftCardController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!), + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), }, body: jsonEncode({ 'transaction_details': { @@ -742,7 +853,9 @@ class GiftCardController extends GetxController { 'gross_amount': double.parse(amount.toString()).toInt(), }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -750,7 +863,9 @@ class GiftCardController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -767,21 +882,30 @@ class GiftCardController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { - Get.to(() => OrangeMoneyScreen( - initialURl: paymentURL, - accessToken: accessToken, - amount: amount, - orangePay: orangeMoneyModel.value, - orderId: orderId, - payToken: payToken, - ))! - .then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -793,19 +917,24 @@ class GiftCardController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; - Map requestBody = { - 'grant_type': 'client_credentials', - }; + Map requestBody = {'grant_type': 'client_credentials'}; - var response = await http.post(Uri.parse(apiUrl), - headers: { - 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'application/json', - }, - body: requestBody); + var response = await http.post( + Uri.parse(apiUrl), + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, + body: requestBody, + ); // Handle the response @@ -814,18 +943,32 @@ class GiftCardController extends GetxController { accessToken = responseData['access_token']; // ignore: use_build_context_synchronously - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; String apiUrl = - orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + orangeMoneyModel.value.isSandbox! == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, @@ -840,7 +983,11 @@ class GiftCardController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -854,7 +1001,9 @@ class GiftCardController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -871,12 +1020,13 @@ class GiftCardController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen( - initialURl: model.invoiceUrl ?? '', - transId: model.id ?? '', - apiKey: xenditModel.value.apiKey!.toString(), - ))! - .then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -893,7 +1043,9 @@ class GiftCardController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -906,7 +1058,11 @@ class GiftCardController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/global_setting_controller.dart b/lib/controllers/global_setting_controller.dart index 1bcf70e..0eba1f1 100644 --- a/lib/controllers/global_setting_controller.dart +++ b/lib/controllers/global_setting_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/currency_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/utils/notification_service.dart'; import 'package:firebase_auth/firebase_auth.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../constant/collection_name.dart'; import '../service/fire_store_utils.dart'; @@ -18,13 +18,27 @@ class GlobalSettingController extends GetxController { } Future getCurrentCurrency() async { - FireStoreUtils.fireStore.collection(CollectionName.currencies).where("isActive", isEqualTo: true).snapshots().listen((event) { - if (event.docs.isNotEmpty) { - Constant.currencyModel = CurrencyModel.fromJson(event.docs.first.data()); - } else { - Constant.currencyModel = CurrencyModel(id: "", code: "USD", decimal: 2, isactive: true, name: "US Dollar", symbol: "\$", symbolatright: false); - } - }); + FireStoreUtils.fireStore + .collection(CollectionName.currencies) + .where("isActive", isEqualTo: true) + .snapshots() + .listen((event) { + if (event.docs.isNotEmpty) { + Constant.currencyModel = CurrencyModel.fromJson( + event.docs.first.data(), + ); + } else { + Constant.currencyModel = CurrencyModel( + id: "", + code: "USD", + decimal: 2, + isactive: true, + name: "US Dollar", + symbol: "\$", + symbolatright: false, + ); + } + }); await FireStoreUtils.getSettings(); } @@ -35,7 +49,9 @@ class GlobalSettingController extends GetxController { String token = await NotificationService.getToken(); log(":::::::TOKEN:::::: $token"); if (FirebaseAuth.instance.currentUser != null) { - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getUserProfile( + FireStoreUtils.getCurrentUid(), + ).then((value) { if (value != null) { UserModel driverUserModel = value; driverUserModel.fcmToken = token; diff --git a/lib/controllers/history_gift_card_controller.dart b/lib/controllers/history_gift_card_controller.dart index 138b313..d11c857 100644 --- a/lib/controllers/history_gift_card_controller.dart +++ b/lib/controllers/history_gift_card_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/gift_cards_order_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:share_plus/share_plus.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class HistoryGiftCardController extends GetxController { RxList giftCardsOrderList = [].obs; @@ -25,13 +25,20 @@ class HistoryGiftCardController extends GetxController { void updateList(int index) { GiftCardsOrderModel giftCardsOrderModel = giftCardsOrderList[index]; - giftCardsOrderModel.isPasswordShow = giftCardsOrderModel.isPasswordShow == true ? false : true; + giftCardsOrderModel.isPasswordShow = + giftCardsOrderModel.isPasswordShow == true ? false : true; giftCardsOrderList.removeAt(index); giftCardsOrderList.insert(index, giftCardsOrderModel); } - Future share(String giftCode, String giftPin, String msg, String amount, Timestamp date) async { + Future share( + String giftCode, + String giftPin, + String msg, + String amount, + Timestamp date, + ) async { await Share.share( "${'Gift Code :'.tr()} $giftCode\n${'Gift Pin :'.tr()} $giftPin\n${'Price :'.tr()} ${Constant.amountShow(amount: amount)}\n${'Expire Date :'.tr()} ${date.toDate()}\n\n${'Message'.tr()} : $msg", ); diff --git a/lib/controllers/home_e_commerce_controller.dart b/lib/controllers/home_e_commerce_controller.dart index d92daa0..95adb18 100644 --- a/lib/controllers/home_e_commerce_controller.dart +++ b/lib/controllers/home_e_commerce_controller.dart @@ -8,8 +8,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/service/cart_provider.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../constant/constant.dart'; class HomeECommerceController extends GetxController { @@ -27,8 +26,10 @@ class HomeECommerceController extends GetxController { RxBool isListView = true.obs; RxBool isPopular = true.obs; - Rx pageController = PageController(viewportFraction: 0.877).obs; - Rx pageBottomController = PageController(viewportFraction: 0.877).obs; + Rx pageController = + PageController(viewportFraction: 0.877).obs; + Rx pageBottomController = + PageController(viewportFraction: 0.877).obs; RxInt currentPage = 0.obs; RxInt currentBottomPage = 0.obs; @@ -41,7 +42,8 @@ class HomeECommerceController extends GetxController { } RxList vendorCategoryModel = [].obs; - RxList categoryWiseProductList = [].obs; + RxList categoryWiseProductList = + [].obs; RxList allNearestRestaurant = [].obs; RxList newArrivalRestaurantList = [].obs; @@ -64,10 +66,22 @@ class HomeECommerceController extends GetxController { allNearestRestaurant.addAll(event); newArrivalRestaurantList.addAll(event); Constant.restaurantList = allNearestRestaurant; - List usedCategoryIds = allNearestRestaurant.expand((vendor) => vendor.categoryID ?? []).whereType().toSet().toList(); - vendorCategoryModel.value = vendorCategoryModel.where((category) => usedCategoryIds.contains(category.id)).toList(); + List usedCategoryIds = + allNearestRestaurant + .expand((vendor) => vendor.categoryID ?? []) + .whereType() + .toSet() + .toList(); + vendorCategoryModel.value = + vendorCategoryModel + .where((category) => usedCategoryIds.contains(category.id)) + .toList(); - newArrivalRestaurantList.sort((a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo((a.createdAt ?? Timestamp.now()).toDate())); + newArrivalRestaurantList.sort( + (a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo( + (a.createdAt ?? Timestamp.now()).toDate(), + ), + ); if (Constant.isEnableAdsFeature == true) { await FireStoreUtils.getAllAdvertisement().then((value) { diff --git a/lib/controllers/home_parcel_controller.dart b/lib/controllers/home_parcel_controller.dart index aaccf75..f3e112f 100644 --- a/lib/controllers/home_parcel_controller.dart +++ b/lib/controllers/home_parcel_controller.dart @@ -1,6 +1,6 @@ import 'dart:developer'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/banner_model.dart'; import '../models/parcel_category.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/live_tracking_controller.dart b/lib/controllers/live_tracking_controller.dart index dbc245c..9ec6f71 100644 --- a/lib/controllers/live_tracking_controller.dart +++ b/lib/controllers/live_tracking_controller.dart @@ -6,7 +6,7 @@ import 'package:customer/models/order_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:latlong2/latlong.dart' as location; import 'package:flutter_map/flutter_map.dart' as flutterMap; @@ -59,37 +59,58 @@ class LiveTrackingController extends GetxController { orderModel.value = args['orderModel']; - orderSub = FireStoreUtils.fireStore.collection(CollectionName.vendorOrders).doc(orderModel.value.id).snapshots().listen((orderSnap) { - if (orderSnap.data() == null) return; - orderModel.value = OrderModel.fromJson(orderSnap.data()!); + orderSub = FireStoreUtils.fireStore + .collection(CollectionName.vendorOrders) + .doc(orderModel.value.id) + .snapshots() + .listen((orderSnap) { + if (orderSnap.data() == null) return; + orderModel.value = OrderModel.fromJson(orderSnap.data()!); - if (orderModel.value.driverID != null) { - driverSub?.cancel(); - driverSub = FireStoreUtils.fireStore.collection(CollectionName.users).doc(orderModel.value.driverID).snapshots().listen((driverSnap) async { - if (driverSnap.data() == null) return; - driverUserModel.value = UserModel.fromJson(driverSnap.data()!); - await updateLiveTracking(); + if (orderModel.value.driverID != null) { + driverSub?.cancel(); + driverSub = FireStoreUtils.fireStore + .collection(CollectionName.users) + .doc(orderModel.value.driverID) + .snapshots() + .listen((driverSnap) async { + if (driverSnap.data() == null) return; + driverUserModel.value = UserModel.fromJson( + driverSnap.data()!, + ); + await updateLiveTracking(); + }); + } + + if (orderModel.value.status == Constant.orderCompleted) { + Get.back(); + } }); - } - - if (orderModel.value.status == Constant.orderCompleted) { - Get.back(); - } - }); isLoading.value = false; } Future updateLiveTracking() async { - driverCurrent.value = location.LatLng(driverUserModel.value.location?.latitude ?? 0.0, driverUserModel.value.location?.longitude ?? 0.0); + driverCurrent.value = location.LatLng( + driverUserModel.value.location?.latitude ?? 0.0, + driverUserModel.value.location?.longitude ?? 0.0, + ); - source.value = location.LatLng(orderModel.value.vendor?.latitude ?? 0.0, orderModel.value.vendor?.longitude ?? 0.0); + source.value = location.LatLng( + orderModel.value.vendor?.latitude ?? 0.0, + orderModel.value.vendor?.longitude ?? 0.0, + ); - destination.value = location.LatLng(orderModel.value.address?.location?.latitude ?? 0.0, orderModel.value.address?.location?.longitude ?? 0.0); + destination.value = location.LatLng( + orderModel.value.address?.location?.latitude ?? 0.0, + orderModel.value.address?.location?.longitude ?? 0.0, + ); - if (orderModel.value.status == Constant.orderPlaced || orderModel.value.status == Constant.orderAccepted) { + if (orderModel.value.status == Constant.orderPlaced || + orderModel.value.status == Constant.orderAccepted) { await showDriverToRestaurantRoute(); - } else if (orderModel.value.status == Constant.orderShipped || orderModel.value.status == Constant.orderInTransit) { + } else if (orderModel.value.status == Constant.orderShipped || + orderModel.value.status == Constant.orderInTransit) { await showDriverToCustomerRoute(); } } @@ -136,7 +157,10 @@ class LiveTrackingController extends GetxController { routePoints.clear(); } - Future fetchRoute(location.LatLng source, location.LatLng destination) async { + Future fetchRoute( + location.LatLng source, + location.LatLng destination, + ) async { final url = Uri.parse( 'https://router.project-osrm.org/route/v1/driving/${source.longitude},${source.latitude};${destination.longitude},${destination.latitude}?overview=full&geometries=geojson', ); @@ -144,7 +168,12 @@ class LiveTrackingController extends GetxController { if (response.statusCode == 200) { final data = json.decode(response.body); final coords = data['routes'][0]['geometry']['coordinates']; - routePoints.value = coords.map((c) => location.LatLng(c[1].toDouble(), c[0].toDouble())).toList(); + routePoints.value = + coords + .map( + (c) => location.LatLng(c[1].toDouble(), c[0].toDouble()), + ) + .toList(); } } @@ -155,15 +184,34 @@ class LiveTrackingController extends GetxController { void addOsmMarkers({bool showPickup = false, bool showDrop = false}) { final List tempMarkers = [ // Driver Marker - flutterMap.Marker(point: driverCurrent.value, width: 40, height: 40, child: Image.asset('assets/images/food_delivery.png')), + flutterMap.Marker( + point: driverCurrent.value, + width: 40, + height: 40, + child: Image.asset('assets/images/food_delivery.png'), + ), ]; if (showPickup) { - tempMarkers.add(flutterMap.Marker(point: source.value, width: 40, height: 40, child: Image.asset('assets/images/pickup.png'))); + tempMarkers.add( + flutterMap.Marker( + point: source.value, + width: 40, + height: 40, + child: Image.asset('assets/images/pickup.png'), + ), + ); } if (showDrop) { - tempMarkers.add(flutterMap.Marker(point: destination.value, width: 40, height: 40, child: Image.asset('assets/images/dropoff.png'))); + tempMarkers.add( + flutterMap.Marker( + point: destination.value, + width: 40, + height: 40, + child: Image.asset('assets/images/dropoff.png'), + ), + ); } osmMarkers.value = tempMarkers; @@ -180,11 +228,16 @@ class LiveTrackingController extends GetxController { List polylineCoordinates = []; PolylineResult result = await polylinePoints.getRouteBetweenCoordinates( - request: PolylineRequest(origin: PointLatLng(sourceLatitude, sourceLongitude), destination: PointLatLng(destinationLatitude, destinationLongitude), mode: TravelMode.driving), + request: PolylineRequest( + origin: PointLatLng(sourceLatitude, sourceLongitude), + destination: PointLatLng(destinationLatitude, destinationLongitude), + mode: TravelMode.driving, + ), ); if (result.points.isNotEmpty) { - polylineCoordinates = result.points.map((e) => LatLng(e.latitude, e.longitude)).toList(); + polylineCoordinates = + result.points.map((e) => LatLng(e.latitude, e.longitude)).toList(); } addGoogleMarkers(showPickup: showPickup, showDrop: showDrop); @@ -205,9 +258,19 @@ class LiveTrackingController extends GetxController { ); } - if (showPickup && orderModel.value.vendor?.latitude != null && pickupIcon != null) { - addMarker(id: "Pickup", latitude: orderModel.value.vendor!.latitude ?? 0.0, longitude: orderModel.value.vendor!.longitude ?? 0.0, descriptor: pickupIcon!, rotation: 0.0); - } else if (showDrop && orderModel.value.address?.location?.latitude != null && dropoffIcon != null) { + if (showPickup && + orderModel.value.vendor?.latitude != null && + pickupIcon != null) { + addMarker( + id: "Pickup", + latitude: orderModel.value.vendor!.latitude ?? 0.0, + longitude: orderModel.value.vendor!.longitude ?? 0.0, + descriptor: pickupIcon!, + rotation: 0.0, + ); + } else if (showDrop && + orderModel.value.address?.location?.latitude != null && + dropoffIcon != null) { addMarker( id: "Drop", latitude: orderModel.value.address!.location!.latitude ?? 0.0, @@ -218,24 +281,50 @@ class LiveTrackingController extends GetxController { } } - void addMarker({required String id, required double latitude, required double longitude, required BitmapDescriptor descriptor, required double rotation}) { + void addMarker({ + required String id, + required double latitude, + required double longitude, + required BitmapDescriptor descriptor, + required double rotation, + }) { MarkerId markerId = MarkerId(id); - markers[markerId] = Marker(markerId: markerId, icon: descriptor, position: LatLng(latitude, longitude), rotation: rotation, anchor: const Offset(0.5, 0.5)); + markers[markerId] = Marker( + markerId: markerId, + icon: descriptor, + position: LatLng(latitude, longitude), + rotation: rotation, + anchor: const Offset(0.5, 0.5), + ); } Future addMarkerIcons() async { if (Constant.selectedMapType == 'osm') return; - pickupIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/pickup.png', 100)); - dropoffIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/dropoff.png', 100)); - driverIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/food_delivery.png', 100)); + pickupIcon = BitmapDescriptor.fromBytes( + await Constant().getBytesFromAsset('assets/images/pickup.png', 100), + ); + dropoffIcon = BitmapDescriptor.fromBytes( + await Constant().getBytesFromAsset('assets/images/dropoff.png', 100), + ); + driverIcon = BitmapDescriptor.fromBytes( + await Constant().getBytesFromAsset( + 'assets/images/food_delivery.png', + 100, + ), + ); } Future _addPolyLine(List polylineCoordinates) async { if (polylineCoordinates.isEmpty) return; PolylineId id = const PolylineId("poly"); - Polyline polyline = Polyline(polylineId: id, color: Colors.blue, width: 5, points: polylineCoordinates); + Polyline polyline = Polyline( + polylineId: id, + color: Colors.blue, + width: 5, + points: polylineCoordinates, + ); polyLines[id] = polyline; await updateCameraBounds(polylineCoordinates); @@ -244,13 +333,26 @@ class LiveTrackingController extends GetxController { Future updateCameraBounds(List points) async { if (mapController == null || points.isEmpty) return; - double minLat = points.map((e) => e.latitude).reduce((a, b) => a < b ? a : b); - double maxLat = points.map((e) => e.latitude).reduce((a, b) => a > b ? a : b); - double minLng = points.map((e) => e.longitude).reduce((a, b) => a < b ? a : b); - double maxLng = points.map((e) => e.longitude).reduce((a, b) => a > b ? a : b); + double minLat = points + .map((e) => e.latitude) + .reduce((a, b) => a < b ? a : b); + double maxLat = points + .map((e) => e.latitude) + .reduce((a, b) => a > b ? a : b); + double minLng = points + .map((e) => e.longitude) + .reduce((a, b) => a < b ? a : b); + double maxLng = points + .map((e) => e.longitude) + .reduce((a, b) => a > b ? a : b); - LatLngBounds bounds = LatLngBounds(southwest: LatLng(minLat, minLng), northeast: LatLng(maxLat, maxLng)); + LatLngBounds bounds = LatLngBounds( + southwest: LatLng(minLat, minLng), + northeast: LatLng(maxLat, maxLng), + ); - await mapController!.animateCamera(CameraUpdate.newLatLngBounds(bounds, 80)); + await mapController!.animateCamera( + CameraUpdate.newLatLngBounds(bounds, 80), + ); } } diff --git a/lib/controllers/login_controller.dart b/lib/controllers/login_controller.dart index 132c7ad..3af30c4 100644 --- a/lib/controllers/login_controller.dart +++ b/lib/controllers/login_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/location_enable_screens/location_permission_s import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_sign_in/google_sign_in.dart'; import 'package:sign_in_with_apple/sign_in_with_apple.dart'; import '../constant/constant.dart'; @@ -46,16 +46,22 @@ class LoginController extends GetxController { isLoading.value = true; ShowToastDialog.showLoader("Logging in...".tr()); - final credential = await FirebaseAuth.instance.signInWithEmailAndPassword(email: email, password: password); + final credential = await FirebaseAuth.instance.signInWithEmailAndPassword( + email: email, + password: password, + ); - final userModel = await FireStoreUtils.getUserProfile(credential.user!.uid); + final userModel = await FireStoreUtils.getUserProfile( + credential.user!.uid, + ); if (userModel != null && userModel.role == Constant.userRoleCustomer) { if (userModel.active == true) { userModel.fcmToken = await NotificationService.getToken(); await FireStoreUtils.updateUser(userModel); - if (userModel.shippingAddress != null && userModel.shippingAddress!.isNotEmpty) { + if (userModel.shippingAddress != null && + userModel.shippingAddress!.isNotEmpty) { final defaultAddress = userModel.shippingAddress!.firstWhere( (e) => e.isDefault == true, orElse: () => userModel.shippingAddress!.first, @@ -69,12 +75,16 @@ class LoginController extends GetxController { } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user is disabled. Please contact admin.".tr()); + ShowToastDialog.showToast( + "This user is disabled. Please contact admin.".tr(), + ); Get.offAll(() => const LoginScreen()); } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user does not exist in the customer app.".tr()); + ShowToastDialog.showToast( + "This user does not exist in the customer app.".tr(), + ); Get.offAll(() => const LoginScreen()); } } on FirebaseAuthException catch (e) { @@ -85,7 +95,9 @@ class LoginController extends GetxController { } else if (e.code == 'invalid-email') { ShowToastDialog.showToast("Invalid email.".tr()); } else { - ShowToastDialog.showToast(e.message?.tr() ?? "Login failed. Please try again.".tr()); + ShowToastDialog.showToast( + e.message?.tr() ?? "Login failed. Please try again.".tr(), + ); } } finally { isLoading.value = false; @@ -107,22 +119,32 @@ class LoginController extends GetxController { userModel.provider = 'google'; ShowToastDialog.closeLoader(); - Get.off(const SignUpScreen(), arguments: {"userModel": userModel, "type": "google"}); + Get.off( + const SignUpScreen(), + arguments: {"userModel": userModel, "type": "google"}, + ); } else { - await FireStoreUtils.userExistOrNot(value.user!.uid).then((userExit) async { + await FireStoreUtils.userExistOrNot(value.user!.uid).then(( + userExit, + ) async { ShowToastDialog.closeLoader(); if (userExit == true) { - UserModel? userModel = await FireStoreUtils.getUserProfile(value.user!.uid); - if (userModel != null && userModel.role == Constant.userRoleCustomer) { + UserModel? userModel = await FireStoreUtils.getUserProfile( + value.user!.uid, + ); + if (userModel != null && + userModel.role == Constant.userRoleCustomer) { if (userModel.active == true) { userModel.fcmToken = await NotificationService.getToken(); await FireStoreUtils.updateUser(userModel); - if (userModel.shippingAddress != null && userModel.shippingAddress!.isNotEmpty) { - final defaultAddress = userModel.shippingAddress!.firstWhere( - (e) => e.isDefault == true, - orElse: () => userModel.shippingAddress!.first, - ); + if (userModel.shippingAddress != null && + userModel.shippingAddress!.isNotEmpty) { + final defaultAddress = userModel.shippingAddress! + .firstWhere( + (e) => e.isDefault == true, + orElse: () => userModel.shippingAddress!.first, + ); Constant.selectedLocation = defaultAddress; @@ -132,12 +154,16 @@ class LoginController extends GetxController { } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user is disabled. Please contact admin.".tr()); + ShowToastDialog.showToast( + "This user is disabled. Please contact admin.".tr(), + ); Get.offAll(() => const LoginScreen()); } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user does not exist in the customer app.".tr()); + ShowToastDialog.showToast( + "This user does not exist in the customer app.".tr(), + ); Get.offAll(() => const LoginScreen()); } } else { @@ -148,7 +174,10 @@ class LoginController extends GetxController { userModel.lastName = value.user!.displayName?.split(' ').last; userModel.provider = 'google'; - Get.off(const SignUpScreen(), arguments: {"userModel": userModel, "type": "google"}); + Get.off( + const SignUpScreen(), + arguments: {"userModel": userModel, "type": "google"}, + ); } }); } @@ -174,22 +203,32 @@ class LoginController extends GetxController { userModel.lastName = appleCredential.familyName; userModel.provider = 'apple'; - Get.off(const SignUpScreen(), arguments: {"userModel": userModel, "type": "apple"}); + Get.off( + const SignUpScreen(), + arguments: {"userModel": userModel, "type": "apple"}, + ); } else { // Existing user - await FireStoreUtils.userExistOrNot(userCredential.user!.uid).then((userExit) async { + await FireStoreUtils.userExistOrNot(userCredential.user!.uid).then(( + userExit, + ) async { if (userExit == true) { - UserModel? userModel = await FireStoreUtils.getUserProfile(userCredential.user!.uid); - if (userModel != null && userModel.role == Constant.userRoleCustomer) { + UserModel? userModel = await FireStoreUtils.getUserProfile( + userCredential.user!.uid, + ); + if (userModel != null && + userModel.role == Constant.userRoleCustomer) { if (userModel.active == true) { userModel.fcmToken = await NotificationService.getToken(); await FireStoreUtils.updateUser(userModel); - if (userModel.shippingAddress != null && userModel.shippingAddress!.isNotEmpty) { - final defaultAddress = userModel.shippingAddress!.firstWhere( - (e) => e.isDefault == true, - orElse: () => userModel.shippingAddress!.first, - ); + if (userModel.shippingAddress != null && + userModel.shippingAddress!.isNotEmpty) { + final defaultAddress = userModel.shippingAddress! + .firstWhere( + (e) => e.isDefault == true, + orElse: () => userModel.shippingAddress!.first, + ); Constant.selectedLocation = defaultAddress; Get.offAll(() => const ServiceListScreen()); @@ -198,12 +237,16 @@ class LoginController extends GetxController { } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user is disabled. Please contact admin.".tr()); + ShowToastDialog.showToast( + "This user is disabled. Please contact admin.".tr(), + ); Get.offAll(() => const LoginScreen()); } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user does not exist in the customer app.".tr()); + ShowToastDialog.showToast( + "This user does not exist in the customer app.".tr(), + ); Get.offAll(() => const LoginScreen()); } } else { @@ -215,7 +258,10 @@ class LoginController extends GetxController { userModel.lastName = appleCredential.familyName; userModel.provider = 'apple'; - Get.off(const SignUpScreen(), arguments: {"userModel": userModel, "type": "apple"}); + Get.off( + const SignUpScreen(), + arguments: {"userModel": userModel, "type": "apple"}, + ); } }); } @@ -234,8 +280,12 @@ class LoginController extends GetxController { final GoogleSignInAuthentication googleAuth = googleUser.authentication; - final credential = GoogleAuthProvider.credential(idToken: googleAuth.idToken); - final userCredential = await FirebaseAuth.instance.signInWithCredential(credential); + final credential = GoogleAuthProvider.credential( + idToken: googleAuth.idToken, + ); + final userCredential = await FirebaseAuth.instance.signInWithCredential( + credential, + ); return userCredential; } catch (e) { @@ -255,17 +305,27 @@ class LoginController extends GetxController { final rawNonce = generateNonce(); final nonce = sha256ofString(rawNonce); - AuthorizationCredentialAppleID appleCredential = await SignInWithApple.getAppleIDCredential( - scopes: [AppleIDAuthorizationScopes.email, AppleIDAuthorizationScopes.fullName], - nonce: nonce, + AuthorizationCredentialAppleID appleCredential = + await SignInWithApple.getAppleIDCredential( + scopes: [ + AppleIDAuthorizationScopes.email, + AppleIDAuthorizationScopes.fullName, + ], + nonce: nonce, + ); + + final oauthCredential = OAuthProvider("apple.com").credential( + idToken: appleCredential.identityToken, + rawNonce: rawNonce, + accessToken: appleCredential.authorizationCode, ); - final oauthCredential = OAuthProvider( - "apple.com", - ).credential(idToken: appleCredential.identityToken, rawNonce: rawNonce, accessToken: appleCredential.authorizationCode); - - UserCredential userCredential = await FirebaseAuth.instance.signInWithCredential(oauthCredential); - return {"appleCredential": appleCredential, "userCredential": userCredential}; + UserCredential userCredential = await FirebaseAuth.instance + .signInWithCredential(oauthCredential); + return { + "appleCredential": appleCredential, + "userCredential": userCredential, + }; } catch (e) { debugPrint(e.toString()); } diff --git a/lib/controllers/map_view_controller.dart b/lib/controllers/map_view_controller.dart index a7e148e..efa346f 100644 --- a/lib/controllers/map_view_controller.dart +++ b/lib/controllers/map_view_controller.dart @@ -2,7 +2,7 @@ import 'dart:typed_data'; import 'package:customer/constant/constant.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:latlong2/latlong.dart' as location; import '../screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart'; diff --git a/lib/controllers/mobile_login_controller.dart b/lib/controllers/mobile_login_controller.dart index ddca48c..5717b2c 100644 --- a/lib/controllers/mobile_login_controller.dart +++ b/lib/controllers/mobile_login_controller.dart @@ -2,14 +2,15 @@ import 'package:customer/themes/show_toast_dialog.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../constant/constant.dart'; import '../screen_ui/auth_screens/otp_verification_screen.dart'; class MobileLoginController extends GetxController { - final Rx mobileController = TextEditingController().obs; - final Rx countryCodeController = TextEditingController(text: Constant.defaultCountryCode).obs; + final Rx mobileController = + TextEditingController().obs; + final Rx countryCodeController = + TextEditingController(text: Constant.defaultCountryCode).obs; final FirebaseAuth _auth = FirebaseAuth.instance; @@ -19,7 +20,9 @@ class MobileLoginController extends GetxController { final countryCode = countryCodeController.value.text.trim(); if (mobile.isEmpty || mobile.length != 10) { - ShowToastDialog.showToast("Please enter a valid 10-digit mobile number".tr()); + ShowToastDialog.showToast( + "Please enter a valid 10-digit mobile number".tr(), + ); return; } @@ -36,12 +39,21 @@ class MobileLoginController extends GetxController { if (e.code == 'invalid-phone-number') { ShowToastDialog.showToast("Invalid phone number".tr()); } else { - ShowToastDialog.showToast(e.message ?? "OTP verification failed".tr()); + ShowToastDialog.showToast( + e.message ?? "OTP verification failed".tr(), + ); } }, codeSent: (String verificationId, int? resendToken) { ShowToastDialog.closeLoader(); - Get.to(() => const OtpVerificationScreen(), arguments: {'countryCode': countryCode, 'phoneNumber': mobile, 'verificationId': verificationId}); + Get.to( + () => const OtpVerificationScreen(), + arguments: { + 'countryCode': countryCode, + 'phoneNumber': mobile, + 'verificationId': verificationId, + }, + ); }, codeAutoRetrievalTimeout: (String verificationId) { ShowToastDialog.closeLoader(); diff --git a/lib/controllers/my_booking_on_demand_controller.dart b/lib/controllers/my_booking_on_demand_controller.dart index 150f4d5..6fc60e6 100644 --- a/lib/controllers/my_booking_on_demand_controller.dart +++ b/lib/controllers/my_booking_on_demand_controller.dart @@ -1,4 +1,4 @@ -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/onprovider_order_model.dart'; import '../models/worker_model.dart'; import '../service/fire_store_utils.dart'; @@ -18,7 +18,6 @@ class MyBookingOnDemandController extends GetxController { listenOrders(); // Listen for real-time updates } - void selectTab(String tab) { selectedTab.value = tab; } @@ -32,7 +31,9 @@ class MyBookingOnDemandController extends GetxController { // Fetch worker info if not already fetched for (var order in updatedOrders) { - if (order.workerId != null && order.workerId!.isNotEmpty && !workers.containsKey(order.workerId!)) { + if (order.workerId != null && + order.workerId!.isNotEmpty && + !workers.containsKey(order.workerId!)) { FireStoreUtils.getWorker(order.workerId!).then((worker) { if (worker != null) workers[order.workerId!] = worker; }); @@ -48,18 +49,39 @@ class MyBookingOnDemandController extends GetxController { ); } - List get filteredParcelOrders => getOrdersForTab(selectedTab.value); + List get filteredParcelOrders => + getOrdersForTab(selectedTab.value); List getOrdersForTab(String tab) { switch (tab) { case "Placed": - return orders.where((order) => ["Order Placed", "Order Accepted", "Order Assigned", "Order Ongoing", "In Transit"].contains(order.status)).toList(); + return orders + .where( + (order) => [ + "Order Placed", + "Order Accepted", + "Order Assigned", + "Order Ongoing", + "In Transit", + ].contains(order.status), + ) + .toList(); case "Completed": - return orders.where((order) => ["Order Completed"].contains(order.status)).toList(); + return orders + .where((order) => ["Order Completed"].contains(order.status)) + .toList(); case "Cancelled": - return orders.where((order) => ["Order Rejected", "Order Cancelled", "Driver Rejected"].contains(order.status)).toList(); + return orders + .where( + (order) => [ + "Order Rejected", + "Order Cancelled", + "Driver Rejected", + ].contains(order.status), + ) + .toList(); default: return []; diff --git a/lib/controllers/my_cab_booking_controller.dart b/lib/controllers/my_cab_booking_controller.dart index d563f7c..884a512 100644 --- a/lib/controllers/my_cab_booking_controller.dart +++ b/lib/controllers/my_cab_booking_controller.dart @@ -39,7 +39,7 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:intl/intl.dart'; import 'package:razorpay_flutter/razorpay_flutter.dart'; @@ -72,7 +72,9 @@ class MyCabBookingController extends GetxController { isLoading.value = true; if (FirebaseAuth.instance.currentUser != null) { - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((user) { + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + user, + ) { if (user != null) { userModel.value = user; } @@ -88,21 +90,45 @@ class MyCabBookingController extends GetxController { isLoading.value = false; } - List get filteredParcelOrders => getOrdersForTab(selectedTab.value); + List get filteredParcelOrders => + getOrdersForTab(selectedTab.value); List getOrdersForTab(String tab) { switch (tab) { case "New": - return cabOrder.where((order) => ["Order Placed", "Driver Pending"].contains(order.status)).toList(); + return cabOrder + .where( + (order) => + ["Order Placed", "Driver Pending"].contains(order.status), + ) + .toList(); case "On Going": - return cabOrder.where((order) => ["Driver Accepted", "Order Shipped", "In Transit"].contains(order.status)).toList(); + return cabOrder + .where( + (order) => [ + "Driver Accepted", + "Order Shipped", + "In Transit", + ].contains(order.status), + ) + .toList(); case "Completed": - return cabOrder.where((order) => ["Order Completed"].contains(order.status)).toList(); + return cabOrder + .where((order) => ["Order Completed"].contains(order.status)) + .toList(); case "Cancelled": - return cabOrder.where((order) => ["Order Rejected", "Order Cancelled", "Driver Rejected"].contains(order.status)).toList(); + return cabOrder + .where( + (order) => [ + "Order Rejected", + "Order Cancelled", + "Driver Rejected", + ].contains(order.status), + ) + .toList(); default: return []; @@ -164,15 +190,22 @@ class MyCabBookingController extends GetxController { selectedOrder.value = order; try { - subTotal.value = double.tryParse(selectedOrder.value.subTotal?.toString() ?? "0") ?? 0.0; - discount.value = double.tryParse(selectedOrder.value.discount?.toString() ?? "0") ?? 0.0; + subTotal.value = + double.tryParse(selectedOrder.value.subTotal?.toString() ?? "0") ?? + 0.0; + discount.value = + double.tryParse(selectedOrder.value.discount?.toString() ?? "0") ?? + 0.0; taxAmount.value = 0.0; subTotal.value = subTotal.value; if (selectedOrder.value.taxSetting != null) { for (var element in selectedOrder.value.taxSetting!) { - taxAmount.value += Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element); + taxAmount.value += Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + ); } } @@ -209,8 +242,13 @@ class MyCabBookingController extends GetxController { serviceType: Constant.parcelServiceType, ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ); }); } selectedOrder.value.paymentStatus = true; @@ -223,19 +261,45 @@ class MyCabBookingController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -277,20 +341,32 @@ class MyCabBookingController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -336,7 +412,10 @@ class MyCabBookingController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -346,8 +425,14 @@ class MyCabBookingController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -369,7 +454,11 @@ class MyCabBookingController extends GetxController { // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -452,15 +541,23 @@ class MyCabBookingController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -470,17 +567,23 @@ class MyCabBookingController extends GetxController { "payment_options": "ussd, card, barter, payattitude", "customer": { "email": Constant.userModel!.email.toString(), - "phonenumber": Constant.userModel!.phoneNumber, // Add a real phone number + "phonenumber": + Constant.userModel!.phoneNumber, // Add a real phone number "name": Constant.userModel!.fullName(), // Add a real customer name }, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -509,10 +612,14 @@ class MyCabBookingController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: Constant.userModel!).then(( - String? value, - ) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: Constant.userModel!, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -594,7 +701,11 @@ class MyCabBookingController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), @@ -610,13 +721,18 @@ class MyCabBookingController extends GetxController { return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } final response = await http.post( Uri.parse(initiateURL), @@ -634,9 +750,12 @@ class MyCabBookingController extends GetxController { ); log(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -654,7 +773,10 @@ class MyCabBookingController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': Constant.userModel!.phoneNumber, 'email': Constant.userModel!.email}, + 'prefill': { + 'contact': Constant.userModel!.phoneNumber, + 'email': Constant.userModel!.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -689,7 +811,10 @@ class MyCabBookingController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -708,7 +833,9 @@ class MyCabBookingController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); final url = Uri.parse( - midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links', + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', ); final response = await http.post( @@ -716,12 +843,19 @@ class MyCabBookingController extends GetxController { headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!), + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -729,7 +863,9 @@ class MyCabBookingController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -746,10 +882,18 @@ class MyCabBookingController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { Get.to( @@ -773,7 +917,12 @@ class MyCabBookingController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; @@ -794,9 +943,16 @@ class MyCabBookingController extends GetxController { accessToken = responseData['access_token']; // ignore: use_build_context_synchronously - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -827,7 +983,11 @@ class MyCabBookingController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -841,7 +1001,9 @@ class MyCabBookingController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -859,7 +1021,11 @@ class MyCabBookingController extends GetxController { ShowToastDialog.closeLoader(); if (model.id != null) { Get.to( - () => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()), + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); @@ -877,7 +1043,9 @@ class MyCabBookingController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -890,7 +1058,11 @@ class MyCabBookingController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/my_profile_controller.dart b/lib/controllers/my_profile_controller.dart index 566b012..c6d7068 100644 --- a/lib/controllers/my_profile_controller.dart +++ b/lib/controllers/my_profile_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/theme_controller.dart'; import '../service/fire_store_utils.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; class MyProfileController extends GetxController { @@ -41,7 +41,10 @@ class MyProfileController extends GetxController { Future deleteUserFromServer() async { var url = '${Constant.websiteUrl}/api/delete-user'; try { - var response = await http.post(Uri.parse(url), body: {'uuid': FireStoreUtils.getCurrentUid()}); + var response = await http.post( + Uri.parse(url), + body: {'uuid': FireStoreUtils.getCurrentUid()}, + ); log("deleteUserFromServer :: ${response.body}"); return response.statusCode == 200; } catch (e) { diff --git a/lib/controllers/my_rental_booking_controller.dart b/lib/controllers/my_rental_booking_controller.dart index 672ef22..3e595a7 100644 --- a/lib/controllers/my_rental_booking_controller.dart +++ b/lib/controllers/my_rental_booking_controller.dart @@ -5,7 +5,7 @@ import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/rental_order_model.dart'; import '../models/tax_model.dart'; import '../service/fire_store_utils.dart'; @@ -46,7 +46,6 @@ class MyRentalBookingController extends GetxController { ); } isLoading.value = false; - } Rx selectedOrder = RentalOrderModel().obs; @@ -67,38 +66,84 @@ class MyRentalBookingController extends GetxController { selectedOrder.value = order; try { - subTotal.value = double.tryParse(selectedOrder.value.subTotal?.toString() ?? "0") ?? 0.0; - discount.value = double.tryParse(selectedOrder.value.discount?.toString() ?? "0") ?? 0.0; + subTotal.value = + double.tryParse(selectedOrder.value.subTotal?.toString() ?? "0") ?? + 0.0; + discount.value = + double.tryParse(selectedOrder.value.discount?.toString() ?? "0") ?? + 0.0; taxAmount.value = 0.0; if (selectedOrder.value.endTime != null) { DateTime start = selectedOrder.value.startTime!.toDate(); DateTime end = selectedOrder.value.endTime!.toDate(); int hours = end.difference(start).inHours; - if (hours >= int.parse(selectedOrder.value.rentalPackageModel!.includedHours.toString())) { - hours = hours - int.parse(selectedOrder.value.rentalPackageModel!.includedHours.toString()); - double hourlyRate = double.tryParse(selectedOrder.value.rentalPackageModel?.extraMinuteFare?.toString() ?? "0") ?? 0.0; + if (hours >= + int.parse( + selectedOrder.value.rentalPackageModel!.includedHours.toString(), + )) { + hours = + hours - + int.parse( + selectedOrder.value.rentalPackageModel!.includedHours + .toString(), + ); + double hourlyRate = + double.tryParse( + selectedOrder.value.rentalPackageModel?.extraMinuteFare + ?.toString() ?? + "0", + ) ?? + 0.0; extraMinutesCharge.value = (hours * 60) * hourlyRate; } } - if (selectedOrder.value.startKitoMetersReading != null && selectedOrder.value.endKitoMetersReading != null) { - double startKm = double.tryParse(selectedOrder.value.startKitoMetersReading?.toString() ?? "0") ?? 0.0; - double endKm = double.tryParse(selectedOrder.value.endKitoMetersReading?.toString() ?? "0") ?? 0.0; + if (selectedOrder.value.startKitoMetersReading != null && + selectedOrder.value.endKitoMetersReading != null) { + double startKm = + double.tryParse( + selectedOrder.value.startKitoMetersReading?.toString() ?? "0", + ) ?? + 0.0; + double endKm = + double.tryParse( + selectedOrder.value.endKitoMetersReading?.toString() ?? "0", + ) ?? + 0.0; if (endKm > startKm) { double totalKm = endKm - startKm; - if (totalKm > double.parse(selectedOrder.value.rentalPackageModel!.includedDistance!)) { - totalKm = totalKm - double.parse(selectedOrder.value.rentalPackageModel!.includedDistance!); - double extraKmRate = double.tryParse(selectedOrder.value.rentalPackageModel?.extraKmFare?.toString() ?? "0") ?? 0.0; + if (totalKm > + double.parse( + selectedOrder.value.rentalPackageModel!.includedDistance!, + )) { + totalKm = + totalKm - + double.parse( + selectedOrder.value.rentalPackageModel!.includedDistance!, + ); + double extraKmRate = + double.tryParse( + selectedOrder.value.rentalPackageModel?.extraKmFare + ?.toString() ?? + "0", + ) ?? + 0.0; extraKilometerCharge.value = totalKm * extraKmRate; } } } - subTotal.value = subTotal.value + extraKilometerCharge.value + extraMinutesCharge.value; + subTotal.value = + subTotal.value + + extraKilometerCharge.value + + extraMinutesCharge.value; if (selectedOrder.value.taxSetting != null) { for (var element in selectedOrder.value.taxSetting!) { - taxAmount.value += Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element); + taxAmount.value += Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + ); } } @@ -134,9 +179,14 @@ class MyRentalBookingController extends GetxController { serviceType: Constant.parcelServiceType, ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ); } }); } @@ -153,16 +203,42 @@ class MyRentalBookingController extends GetxController { List getOrdersForTab(String tab) { switch (tab) { case "New": - return rentalOrders.where((order) => ["Order Placed", "Order Accepted", "Driver Pending"].contains(order.status)).toList(); + return rentalOrders + .where( + (order) => [ + "Order Placed", + "Order Accepted", + "Driver Pending", + ].contains(order.status), + ) + .toList(); case "On Going": - return rentalOrders.where((order) => ["Driver Accepted", "Order Shipped", "In Transit"].contains(order.status)).toList(); + return rentalOrders + .where( + (order) => [ + "Driver Accepted", + "Order Shipped", + "In Transit", + ].contains(order.status), + ) + .toList(); case "Completed": - return rentalOrders.where((order) => ["Order Completed"].contains(order.status)).toList(); + return rentalOrders + .where((order) => ["Order Completed"].contains(order.status)) + .toList(); case "Cancelled": - return rentalOrders.where((order) => ["Order Rejected", "Order Cancelled", "Driver Rejected"].contains(order.status)).toList(); + return rentalOrders + .where( + (order) => [ + "Order Rejected", + "Order Cancelled", + "Driver Rejected", + ].contains(order.status), + ) + .toList(); default: return []; @@ -170,9 +246,13 @@ class MyRentalBookingController extends GetxController { } /// Old helper (optional) - List get filteredRentalOrders => getOrdersForTab(selectedTab.value); + List get filteredRentalOrders => + getOrdersForTab(selectedTab.value); - Future cancelRentalRequest(RentalOrderModel order, {List? taxList}) async { + Future cancelRentalRequest( + RentalOrderModel order, { + List? taxList, + }) async { try { isLoading.value = true; order.status = Constant.orderCancelled; @@ -186,13 +266,18 @@ class MyRentalBookingController extends GetxController { if (taxList != null) { for (var element in taxList) { totalTax += Constant.calculateTax( - amount: (double.parse(order.subTotal.toString()) - double.parse(order.discount.toString())).toString(), + amount: + (double.parse(order.subTotal.toString()) - + double.parse(order.discount.toString())) + .toString(), taxModel: element, ); } } - double subTotal = double.parse(order.subTotal.toString()) - double.parse(order.discount.toString()); + double subTotal = + double.parse(order.subTotal.toString()) - + double.parse(order.discount.toString()); double refundAmount = subTotal + totalTax; WalletTransactionModel walletTransaction = WalletTransactionModel( @@ -211,7 +296,10 @@ class MyRentalBookingController extends GetxController { ); await FireStoreUtils.setWalletTransaction(walletTransaction); - await FireStoreUtils.updateUserWallet(amount: refundAmount.toString(), userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: refundAmount.toString(), + userId: FireStoreUtils.getCurrentUid(), + ); } ShowToastDialog.showToast("Booking cancelled successfully".tr()); } catch (e) { diff --git a/lib/controllers/on_boarding_controller.dart b/lib/controllers/on_boarding_controller.dart index 178fbaf..eed931f 100644 --- a/lib/controllers/on_boarding_controller.dart +++ b/lib/controllers/on_boarding_controller.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/on_boarding_model.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/on_demand_booking_controller.dart b/lib/controllers/on_demand_booking_controller.dart index ebc84d3..dc73c5b 100644 --- a/lib/controllers/on_demand_booking_controller.dart +++ b/lib/controllers/on_demand_booking_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../models/onprovider_order_model.dart'; import '../models/provider_serivce_model.dart'; @@ -55,8 +55,12 @@ class OnDemandBookingController extends GetxController { void fetchCoupons() { if (provider.value?.author != null && provider.value!.author!.isNotEmpty) { - FireStoreUtils.getProviderCoupon(provider.value!.author!).then((activeCoupons) => couponList.assignAll(activeCoupons)); - FireStoreUtils.getProviderCouponAfterExpire(provider.value!.author!).then((expiredCoupons) => couponList.addAll(expiredCoupons)); + FireStoreUtils.getProviderCoupon( + provider.value!.author!, + ).then((activeCoupons) => couponList.assignAll(activeCoupons)); + FireStoreUtils.getProviderCouponAfterExpire( + provider.value!.author!, + ).then((expiredCoupons) => couponList.addAll(expiredCoupons)); } } @@ -80,8 +84,12 @@ class OnDemandBookingController extends GetxController { void applyCoupon(CouponModel coupon) { double discount = 0.0; - if (coupon.discountType == "Percentage" || coupon.discountType == "Percent") { - discount = price.value * (double.tryParse(coupon.discount.toString()) ?? 0) / 100; + if (coupon.discountType == "Percentage" || + coupon.discountType == "Percent") { + discount = + price.value * + (double.tryParse(coupon.discount.toString()) ?? 0) / + 100; } else { discount = double.tryParse(coupon.discount.toString()) ?? 0; } @@ -115,9 +123,14 @@ class OnDemandBookingController extends GetxController { // discount if (discountType.value == "Percentage" || discountType.value == "Percent") { - discountAmount.value = price.value * (double.tryParse(discountLabel.value) ?? 0) / 100; + discountAmount.value = + price.value * (double.tryParse(discountLabel.value) ?? 0) / 100; } else { - discountAmount.value = double.tryParse(discountLabel.value.isEmpty ? '0' : discountLabel.value) ?? 0; + discountAmount.value = + double.tryParse( + discountLabel.value.isEmpty ? '0' : discountLabel.value, + ) ?? + 0; } subTotal.value = price.value - discountAmount.value; @@ -125,7 +138,10 @@ class OnDemandBookingController extends GetxController { // tax calculation double total = subTotal.value; for (var element in Constant.taxList) { - total += Constant.getTaxValue(amount: subTotal.value.toString(), taxModel: element); + total += Constant.getTaxValue( + amount: subTotal.value.toString(), + taxModel: element, + ); } totalAmount.value = total; @@ -137,7 +153,9 @@ class OnDemandBookingController extends GetxController { } else if (dateTimeController.value.text.isEmpty) { ShowToastDialog.showToast("Please select time slot.".tr()); } else { - UserModel? providerUser = await FireStoreUtils.getUserProfile(provider.value!.author!); + UserModel? providerUser = await FireStoreUtils.getUserProfile( + provider.value!.author!, + ); if (provider.value?.priceUnit == "Fixed") { OnProviderOrderModel onDemandOrderModel = OnProviderOrderModel( @@ -161,14 +179,27 @@ class OnDemandBookingController extends GetxController { adminCommissionType: Constant.sectionConstantModel?.adminCommision?.isEnabled == false ? 'fixed' - : providerUser?.adminCommissionModel?.commissionType ?? Constant.sectionConstantModel?.adminCommision?.commissionType, + : providerUser?.adminCommissionModel?.commissionType ?? + Constant + .sectionConstantModel + ?.adminCommision + ?.commissionType, otp: Constant.getReferralCode(), couponCode: offerCode.toString(), ); - print('totalAmount ::::::: ${double.tryParse(Constant.amountShow(amount: totalAmount.value.toString())) ?? 0.0}'); + print( + 'totalAmount ::::::: ${double.tryParse(Constant.amountShow(amount: totalAmount.value.toString())) ?? 0.0}', + ); print('totalAmount value ::::::: ${totalAmount.value}'); - Get.to(() => OnDemandPaymentScreen(), arguments: {'onDemandOrderModel': Rxn(onDemandOrderModel), 'totalAmount': totalAmount.value, 'isExtra': false}); + Get.to( + () => OnDemandPaymentScreen(), + arguments: { + 'onDemandOrderModel': Rxn(onDemandOrderModel), + 'totalAmount': totalAmount.value, + 'isExtra': false, + }, + ); } else { ShowToastDialog.showLoader("Please wait...".tr()); OnProviderOrderModel onDemandOrder = OnProviderOrderModel( @@ -192,21 +223,36 @@ class OnDemandBookingController extends GetxController { adminCommissionType: Constant.sectionConstantModel?.adminCommision?.isEnabled == false ? 'fixed' - : providerUser?.adminCommissionModel?.commissionType ?? Constant.sectionConstantModel?.adminCommision?.commissionType, + : providerUser?.adminCommissionModel?.commissionType ?? + Constant + .sectionConstantModel + ?.adminCommision + ?.commissionType, paymentStatus: true, ); await FireStoreUtils.onDemandOrderPlace(onDemandOrder, 0.0); - await FireStoreUtils.sendOrderOnDemandServiceEmail(orderModel: onDemandOrder); + await FireStoreUtils.sendOrderOnDemandServiceEmail( + orderModel: onDemandOrder, + ); if (providerUser != null) { - Map payLoad = {"type": 'provider_order', "orderId": onDemandOrder.id}; - await SendNotification.sendFcmMessage(Constant.bookingPlaced, providerUser.fcmToken.toString(), payLoad); + Map payLoad = { + "type": 'provider_order', + "orderId": onDemandOrder.id, + }; + await SendNotification.sendFcmMessage( + Constant.bookingPlaced, + providerUser.fcmToken.toString(), + payLoad, + ); } ShowToastDialog.closeLoader(); Get.offAll(const OnDemandDashboardScreen()); - OnDemandDashboardController controller = Get.put(OnDemandDashboardController()); + OnDemandDashboardController controller = Get.put( + OnDemandDashboardController(), + ); controller.selectedIndex.value = 2; ShowToastDialog.showToast("OnDemand Service successfully booked".tr()); } diff --git a/lib/controllers/on_demand_category_controller.dart b/lib/controllers/on_demand_category_controller.dart index 31e6da0..1df529a 100644 --- a/lib/controllers/on_demand_category_controller.dart +++ b/lib/controllers/on_demand_category_controller.dart @@ -1,5 +1,4 @@ -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../models/category_model.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/on_demand_dashboard_controller.dart b/lib/controllers/on_demand_dashboard_controller.dart index 33b395c..a6f90f8 100644 --- a/lib/controllers/on_demand_dashboard_controller.dart +++ b/lib/controllers/on_demand_dashboard_controller.dart @@ -3,8 +3,7 @@ import 'package:customer/screen_ui/multi_vendor_service/profile_screen/profile_s import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/screen_ui/on_demand_service/favourite_ondemand_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../screen_ui/on_demand_service/my_booking_on_demand_screen.dart'; import '../screen_ui/on_demand_service/on_demand_home_screen.dart'; @@ -17,7 +16,12 @@ class OnDemandDashboardController extends GetxController { void onInit() { getTaxList(); if (Constant.walletSetting == false) { - pageList.value = [OnDemandHomeScreen(), FavouriteOndemandScreen(), const MyBookingOnDemandScreen(), const ProfileScreen()]; + pageList.value = [ + OnDemandHomeScreen(), + FavouriteOndemandScreen(), + const MyBookingOnDemandScreen(), + const ProfileScreen(), + ]; } else { pageList.value = [ OnDemandHomeScreen(), @@ -31,7 +35,9 @@ class OnDemandDashboardController extends GetxController { } Future getTaxList() async { - await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) { + await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then(( + value, + ) { if (value != null) { Constant.taxList = value; } diff --git a/lib/controllers/on_demand_details_controller.dart b/lib/controllers/on_demand_details_controller.dart index 8f7ea01..a569994 100644 --- a/lib/controllers/on_demand_details_controller.dart +++ b/lib/controllers/on_demand_details_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/user_model.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../models/favorite_ondemand_service_model.dart'; import '../models/provider_serivce_model.dart'; @@ -14,7 +14,8 @@ class OnDemandDetailsController extends GetxController { final RxString subCategoryTitle = ''.obs; final RxString categoryTitle = ''.obs; final RxList ratingService = [].obs; - final RxList lstFav = [].obs; + final RxList lstFav = + [].obs; final RxBool isLoading = true.obs; final RxBool isOpen = false.obs; final RxString tabString = "About".obs; @@ -27,35 +28,44 @@ class OnDemandDetailsController extends GetxController { getData(); } - Future getData() async { await getReviewList(); await getAuthor(); //fetch and set provider author here if (Constant.userModel != null) { - lstFav.value = await FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()); + lstFav.value = await FireStoreUtils.getFavouritesServiceList( + FireStoreUtils.getCurrentUid(), + ); } isLoading.value = false; } Future getReviewList() async { - await FireStoreUtils.getCategoryById(provider.categoryId.toString()).then((value) { + await FireStoreUtils.getCategoryById(provider.categoryId.toString()).then(( + value, + ) { if (value != null) { categoryTitle.value = value.title.toString(); } }); - await FireStoreUtils.getSubCategoryById(provider.subCategoryId.toString()).then((value) { + await FireStoreUtils.getSubCategoryById( + provider.subCategoryId.toString(), + ).then((value) { if (value != null) { subCategoryTitle.value = value.title.toString(); } }); - await FireStoreUtils.getReviewByProviderServiceId(provider.id.toString()).then((value) { + await FireStoreUtils.getReviewByProviderServiceId( + provider.id.toString(), + ).then((value) { ratingService.value = value; }); if (Constant.userModel != null) { - await FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getFavouritesServiceList( + FireStoreUtils.getCurrentUid(), + ).then((value) { lstFav.value = value; }); } @@ -78,8 +88,12 @@ class OnDemandDetailsController extends GetxController { for (var element in provider.days) { if (day == element.toString()) { - final start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${provider.startTime}"); - final end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${provider.endTime}"); + final start = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${provider.startTime}"); + final end = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${provider.endTime}"); if (isCurrentDateInRange(start, end)) { isOpen.value = true; } @@ -96,5 +110,3 @@ class OnDemandDetailsController extends GetxController { tabString.value = tab; } } - - diff --git a/lib/controllers/on_demand_home_controller.dart b/lib/controllers/on_demand_home_controller.dart index 16f4aac..2b609a8 100644 --- a/lib/controllers/on_demand_home_controller.dart +++ b/lib/controllers/on_demand_home_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/favorite_ondemand_service_model.dart'; import 'package:customer/models/provider_serivce_model.dart'; import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../constant/constant.dart'; @@ -40,24 +40,31 @@ class OnDemandHomeController extends GetxController { // Fetch provider services FireStoreUtils.getProviderFuture() .then((providerServiceList) { - Set uniqueAuthorIds = providerServiceList.map((service) => service.author).toSet(); + Set uniqueAuthorIds = + providerServiceList.map((service) => service.author).toSet(); List listOfUniqueProviders = uniqueAuthorIds.toList(); List filteredProviders = []; for (var provider in listOfUniqueProviders) { - List filteredList = providerServiceList.where((service) => service.author == provider).toList(); + List filteredList = + providerServiceList + .where((service) => service.author == provider) + .toList(); filteredList.sort((a, b) => a.createdAt!.compareTo(b.createdAt!)); for (int index = 0; index < filteredList.length; index++) { final service = filteredList[index]; - if (Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) { + if (Constant.isSubscriptionModelApplied == true || + Constant.sectionConstantModel?.adminCommision?.isEnabled == + true) { if (service.subscriptionPlan?.itemLimit == "-1") { filteredProviders.add(service); } else { - if (index < int.parse(service.subscriptionPlan?.itemLimit ?? '0')) { + if (index < + int.parse(service.subscriptionPlan?.itemLimit ?? '0')) { filteredProviders.add(service); } } @@ -75,7 +82,9 @@ class OnDemandHomeController extends GetxController { isLoading.value = false; }); - FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()).then((favList) { + FireStoreUtils.getFavouritesServiceList( + FireStoreUtils.getCurrentUid(), + ).then((favList) { lstFav.value = favList; }); } @@ -85,7 +94,9 @@ class OnDemandHomeController extends GetxController { if (categoryId == null || categoryId.isEmpty) return null; // Try to find category from cached list - CategoryModel? cat = categories.firstWhereOrNull((element) => element.id == categoryId); + CategoryModel? cat = categories.firstWhereOrNull( + (element) => element.id == categoryId, + ); // If not found, fetch from Firestore cat ??= await FireStoreUtils.getCategoryById(categoryId); @@ -94,29 +105,34 @@ class OnDemandHomeController extends GetxController { return cat; } - RxList lstFav = [].obs; + RxList lstFav = + [].obs; void toggleFavourite(ProviderServiceModel provider) { if (Constant.userModel == null) { Get.to(LoginScreen()); } else { - var contain = lstFav.where((element) => element.service_id == provider.id); + var contain = lstFav.where( + (element) => element.service_id == provider.id, + ); if (contain.isNotEmpty) { - FavouriteOndemandServiceModel favouriteModel = FavouriteOndemandServiceModel( - section_id: provider.sectionId, - service_id: provider.id, - user_id: FireStoreUtils.getCurrentUid(), - serviceAuthorId: provider.author, - ); + FavouriteOndemandServiceModel favouriteModel = + FavouriteOndemandServiceModel( + section_id: provider.sectionId, + service_id: provider.id, + user_id: FireStoreUtils.getCurrentUid(), + serviceAuthorId: provider.author, + ); FireStoreUtils.removeFavouriteOndemandService(favouriteModel); lstFav.removeWhere((item) => item.service_id == provider.id); } else { - FavouriteOndemandServiceModel favouriteModel = FavouriteOndemandServiceModel( - section_id: provider.sectionId, - service_id: provider.id, - user_id: FireStoreUtils.getCurrentUid(), - serviceAuthorId: provider.author, - ); + FavouriteOndemandServiceModel favouriteModel = + FavouriteOndemandServiceModel( + section_id: provider.sectionId, + service_id: provider.id, + user_id: FireStoreUtils.getCurrentUid(), + serviceAuthorId: provider.author, + ); FireStoreUtils.setFavouriteOndemandSection(favouriteModel); lstFav.add(favouriteModel); } @@ -127,7 +143,13 @@ class OnDemandHomeController extends GetxController { await FireStoreUtils.getZone().then((value) { if (value != null) { for (int i = 0; i < value.length; i++) { - if (Constant.isPointInPolygon(LatLng(Constant.selectedLocation.location?.latitude ?? 0.0, Constant.selectedLocation.location?.longitude ?? 0.0), value[i].area!)) { + if (Constant.isPointInPolygon( + LatLng( + Constant.selectedLocation.location?.latitude ?? 0.0, + Constant.selectedLocation.location?.longitude ?? 0.0, + ), + value[i].area!, + )) { Constant.selectedZone = value[i]; Constant.isZoneAvailable = true; break; diff --git a/lib/controllers/on_demand_order_details_controller.dart b/lib/controllers/on_demand_order_details_controller.dart index 3860ac7..afab172 100644 --- a/lib/controllers/on_demand_order_details_controller.dart +++ b/lib/controllers/on_demand_order_details_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../constant/constant.dart'; import '../models/onprovider_order_model.dart'; import '../models/wallet_transaction_model.dart'; @@ -19,7 +19,8 @@ class OnDemandOrderDetailsController extends GetxController { Rxn worker = Rxn(); Rx couponTextController = TextEditingController().obs; - Rx cancelBookingController = TextEditingController().obs; + Rx cancelBookingController = + TextEditingController().obs; RxDouble subTotal = 0.0.obs; RxDouble price = 0.0.obs; @@ -48,17 +49,22 @@ class OnDemandOrderDetailsController extends GetxController { Future getData() async { try { - final order = await FireStoreUtils.getProviderOrderById(onProviderOrder.value!.id); + final order = await FireStoreUtils.getProviderOrderById( + onProviderOrder.value!.id, + ); if (order != null) { onProviderOrder.value = order; discountType.value = order.discountType ?? ""; discountLabel.value = order.discountLabel ?? ""; - discountAmount.value = double.tryParse(order.discount.toString()) ?? 0.0; + discountAmount.value = + double.tryParse(order.discount.toString()) ?? 0.0; offerCode.value = order.couponCode ?? ""; // Fetch provider - providerUser.value = await FireStoreUtils.getUserProfile(order.provider.author.toString()); + providerUser.value = await FireStoreUtils.getUserProfile( + order.provider.author.toString(), + ); // Fetch worker (if exists) if (order.workerId != null && order.workerId!.isNotEmpty) { @@ -70,7 +76,9 @@ class OnDemandOrderDetailsController extends GetxController { calculatePrice(); // Load available coupons - FireStoreUtils.getProviderCouponAfterExpire(order.provider.author.toString()).then((expiredCoupons) { + FireStoreUtils.getProviderCouponAfterExpire( + order.provider.author.toString(), + ).then((expiredCoupons) { couponList.assignAll(expiredCoupons); }); } else { @@ -90,8 +98,12 @@ class OnDemandOrderDetailsController extends GetxController { void applyCoupon(CouponModel coupon) { double discount = 0.0; - if (coupon.discountType == "Percentage" || coupon.discountType == "Percent") { - discount = price.value * (double.tryParse(coupon.discount.toString()) ?? 0) / 100; + if (coupon.discountType == "Percentage" || + coupon.discountType == "Percent") { + discount = + price.value * + (double.tryParse(coupon.discount.toString()) ?? 0) / + 100; } else { discount = double.tryParse(coupon.discount.toString()) ?? 0; } @@ -108,17 +120,29 @@ class OnDemandOrderDetailsController extends GetxController { void calculatePrice() { double basePrice = - (onProviderOrder.value?.provider.disPrice == "" || onProviderOrder.value?.provider.disPrice == "0") - ? double.tryParse(onProviderOrder.value?.provider.price.toString() ?? "0") ?? 0 - : double.tryParse(onProviderOrder.value?.provider.disPrice.toString() ?? "0") ?? 0; + (onProviderOrder.value?.provider.disPrice == "" || + onProviderOrder.value?.provider.disPrice == "0") + ? double.tryParse( + onProviderOrder.value?.provider.price.toString() ?? "0", + ) ?? + 0 + : double.tryParse( + onProviderOrder.value?.provider.disPrice.toString() ?? "0", + ) ?? + 0; price.value = basePrice * (onProviderOrder.value?.quantity ?? 0.0); // discount if (discountType.value == "Percentage" || discountType.value == "Percent") { - discountAmount.value = price.value * (double.tryParse(discountLabel.value) ?? 0) / 100; + discountAmount.value = + price.value * (double.tryParse(discountLabel.value) ?? 0) / 100; } else { - discountAmount.value = double.tryParse(discountLabel.value.isEmpty ? '0' : discountLabel.value) ?? 0; + discountAmount.value = + double.tryParse( + discountLabel.value.isEmpty ? '0' : discountLabel.value, + ) ?? + 0; } subTotal.value = price.value - discountAmount.value; @@ -126,7 +150,10 @@ class OnDemandOrderDetailsController extends GetxController { // tax calculation double total = subTotal.value; for (var element in Constant.taxList) { - total += Constant.getTaxValue(amount: subTotal.value.toString(), taxModel: element); + total += Constant.getTaxValue( + amount: subTotal.value.toString(), + taxModel: element, + ); } totalAmount.value = total; @@ -152,22 +179,30 @@ class OnDemandOrderDetailsController extends GetxController { // Calculate total final pricePerUnit = - (order.provider.disPrice == "" || order.provider.disPrice == "0") ? double.tryParse(order.provider.price.toString()) ?? 0 : double.tryParse(order.provider.disPrice.toString()) ?? 0; + (order.provider.disPrice == "" || order.provider.disPrice == "0") + ? double.tryParse(order.provider.price.toString()) ?? 0 + : double.tryParse(order.provider.disPrice.toString()) ?? 0; total = pricePerUnit * (order.quantity); // Add tax if (Constant.taxList.isNotEmpty) { for (var tax in Constant.taxList) { - total += Constant.getTaxValue(amount: total.toString(), taxModel: tax); + total += Constant.getTaxValue( + amount: total.toString(), + taxModel: tax, + ); } } // Admin commission double adminComm = 0.0; - if ((order.adminCommission ?? '0') != '0' && (order.adminCommissionType ?? '').isNotEmpty) { - if (order.adminCommissionType!.toLowerCase() == 'percentage' || order.adminCommissionType!.toLowerCase() == 'percent') { - adminComm = (total * (double.tryParse(order.adminCommission!) ?? 0)) / 100; + if ((order.adminCommission ?? '0') != '0' && + (order.adminCommissionType ?? '').isNotEmpty) { + if (order.adminCommissionType!.toLowerCase() == 'percentage' || + order.adminCommissionType!.toLowerCase() == 'percent') { + adminComm = + (total * (double.tryParse(order.adminCommission!) ?? 0)) / 100; } else { adminComm = double.tryParse(order.adminCommission!) ?? 0; } @@ -237,10 +272,19 @@ class OnDemandOrderDetailsController extends GetxController { await FireStoreUtils.updateOnDemandOrder(order); // Ensure this completes // Notify provider - final provider = await FireStoreUtils.getUserProfile(order.provider.author ?? ''); + final provider = await FireStoreUtils.getUserProfile( + order.provider.author ?? '', + ); if (provider != null) { - Map payload = {"type": 'provider_order', "orderId": order.id}; - await SendNotification.sendFcmMessage(Constant.bookingPlaced, provider.fcmToken ?? '', payload); + Map payload = { + "type": 'provider_order', + "orderId": order.id, + }; + await SendNotification.sendFcmMessage( + Constant.bookingPlaced, + provider.fcmToken ?? '', + payload, + ); } ShowToastDialog.closeLoader(); diff --git a/lib/controllers/on_demand_review_controller.dart b/lib/controllers/on_demand_review_controller.dart index 4d82f52..a5ea0a0 100644 --- a/lib/controllers/on_demand_review_controller.dart +++ b/lib/controllers/on_demand_review_controller.dart @@ -1,7 +1,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../constant/collection_name.dart'; import '../models/onprovider_order_model.dart'; import '../models/provider_serivce_model.dart'; @@ -20,7 +20,8 @@ class OnDemandReviewController extends GetxController { final TextEditingController comment = TextEditingController(); final Rxn provider = Rxn(); - final Rxn providerServiceModel = Rxn(); + final Rxn providerServiceModel = + Rxn(); final Rxn workerModel = Rxn(); final RxInt providerReviewCount = 0.obs; @@ -46,14 +47,20 @@ class OnDemandReviewController extends GetxController { void getReview() async { // Get existing rating if (reviewFor.value == "Provider") { - RatingModel? value = await FireStoreUtils.getReviewsByProviderID(order.value!.id, order.value!.provider.author.toString()); + RatingModel? value = await FireStoreUtils.getReviewsByProviderID( + order.value!.id, + order.value!.provider.author.toString(), + ); if (value != null) { ratingModel.value = value; ratings.value = value.rating ?? 0.0; comment.text = value.comment ?? ''; } } else { - RatingModel? value = await FireStoreUtils.getReviewsByWorkerID(order.value!.id, order.value!.workerId.toString()); + RatingModel? value = await FireStoreUtils.getReviewsByWorkerID( + order.value!.id, + order.value!.workerId.toString(), + ); if (value != null) { ratingModel.value = value; ratings.value = value.rating ?? 0.0; @@ -63,7 +70,9 @@ class OnDemandReviewController extends GetxController { // Worker review logic if (reviewFor.value == "Worker") { - WorkerModel? value = await FireStoreUtils.getWorker(order.value!.workerId.toString()); + WorkerModel? value = await FireStoreUtils.getWorker( + order.value!.workerId.toString(), + ); if (value != null) { workerModel.value = value; @@ -71,25 +80,35 @@ class OnDemandReviewController extends GetxController { final double existingSum = (value.reviewsSum ?? 0.0).toDouble(); final double oldRating = ratingModel.value?.rating ?? 0.0; - workerReviewCount.value = ratingModel.value != null ? (existingCount - 1) : existingCount; - workerReviewSum.value = ratingModel.value != null ? (existingSum - oldRating) : existingSum; + workerReviewCount.value = + ratingModel.value != null ? (existingCount - 1) : existingCount; + workerReviewSum.value = + ratingModel.value != null ? (existingSum - oldRating) : existingSum; } } // Provider & service review logic else { - UserModel? user = await FireStoreUtils.getUserProfile(order.value!.provider.author.toString()); + UserModel? user = await FireStoreUtils.getUserProfile( + order.value!.provider.author.toString(), + ); if (user != null) { provider.value = user; - final int existingCount = int.tryParse(user.reviewsCount?.toString() ?? '0') ?? 0; - final double existingSum = double.tryParse(user.reviewsSum?.toString() ?? '0.0') ?? 0.0; + final int existingCount = + int.tryParse(user.reviewsCount?.toString() ?? '0') ?? 0; + final double existingSum = + double.tryParse(user.reviewsSum?.toString() ?? '0.0') ?? 0.0; final double oldRating = ratingModel.value?.rating ?? 0.0; - providerReviewCount.value = ratingModel.value != null ? (existingCount - 1) : existingCount; - providerReviewSum.value = ratingModel.value != null ? (existingSum - oldRating) : existingSum; + providerReviewCount.value = + ratingModel.value != null ? (existingCount - 1) : existingCount; + providerReviewSum.value = + ratingModel.value != null ? (existingSum - oldRating) : existingSum; } - ProviderServiceModel? service = await FireStoreUtils.getCurrentProvider(order.value!.provider.id.toString()); + ProviderServiceModel? service = await FireStoreUtils.getCurrentProvider( + order.value!.provider.id.toString(), + ); if (service != null) { providerServiceModel.value = service; @@ -97,8 +116,10 @@ class OnDemandReviewController extends GetxController { final double existingSum = (service.reviewsSum ?? 0.0).toDouble(); final double oldRating = ratingModel.value?.rating ?? 0.0; - serviceReviewCount.value = ratingModel.value != null ? (existingCount - 1) : existingCount; - serviceReviewSum.value = ratingModel.value != null ? (existingSum - oldRating) : existingSum; + serviceReviewCount.value = + ratingModel.value != null ? (existingCount - 1) : existingCount; + serviceReviewSum.value = + ratingModel.value != null ? (existingSum - oldRating) : existingSum; } } } @@ -114,22 +135,29 @@ class OnDemandReviewController extends GetxController { Future _providerReviewSubmit() async { ShowToastDialog.showLoader("Submit in...".tr()); providerServiceModel.value!.reviewsCount = serviceReviewCount.value + 1; - providerServiceModel.value!.reviewsSum = serviceReviewSum.value + ratings.value; + providerServiceModel.value!.reviewsSum = + serviceReviewSum.value + ratings.value; // Convert to string only if your model field is String provider.value!.reviewsCount = (providerReviewCount.value + 1).toString(); - provider.value!.reviewsSum = (providerReviewSum.value + ratings.value).toString(); + provider.value!.reviewsSum = + (providerReviewSum.value + ratings.value).toString(); RatingModel rate = RatingModel( - id: ratingModel.value?.id ?? firestore.collection(CollectionName.itemsReview).doc().id, + id: + ratingModel.value?.id ?? + firestore.collection(CollectionName.itemsReview).doc().id, productId: ratingModel.value?.productId ?? order.value!.provider.id, comment: comment.text, photos: ratingModel.value?.photos ?? [], rating: ratings.value, orderId: ratingModel.value?.orderId ?? order.value!.id, - vendorId: ratingModel.value?.vendorId ?? order.value!.provider.author.toString(), + vendorId: + ratingModel.value?.vendorId ?? + order.value!.provider.author.toString(), customerId: Constant.userModel?.id, - uname: '${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}', + uname: + '${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}', profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); @@ -148,7 +176,9 @@ class OnDemandReviewController extends GetxController { workerModel.value!.reviewsSum = workerReviewSum.value + ratings.value; RatingModel rate = RatingModel( - id: ratingModel.value?.id ?? firestore.collection(CollectionName.itemsReview).doc().id, + id: + ratingModel.value?.id ?? + firestore.collection(CollectionName.itemsReview).doc().id, productId: ratingModel.value?.productId ?? order.value!.provider.id, comment: comment.text, photos: ratingModel.value?.photos ?? [], @@ -156,7 +186,8 @@ class OnDemandReviewController extends GetxController { orderId: ratingModel.value?.orderId ?? order.value!.id, driverId: ratingModel.value?.driverId ?? order.value!.workerId.toString(), customerId: Constant.userModel?.id, - uname: '${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}', + uname: + '${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}', profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); diff --git a/lib/controllers/order_controller.dart b/lib/controllers/order_controller.dart index c6b606b..7c39996 100644 --- a/lib/controllers/order_controller.dart +++ b/lib/controllers/order_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/cart_product_model.dart'; import 'package:customer/models/order_model.dart'; import '../service/cart_provider.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class OrderController extends GetxController { RxList allList = [].obs; @@ -26,16 +26,27 @@ class OrderController extends GetxController { await FireStoreUtils.getAllOrder().then((value) { allList.value = value; - rejectedList.value = allList.where((p0) => p0.status == Constant.orderRejected).toList(); + rejectedList.value = + allList.where((p0) => p0.status == Constant.orderRejected).toList(); inProgressList.value = allList .where( - (p0) => p0.status == Constant.orderAccepted || p0.status == Constant.driverPending || p0.status == Constant.orderShipped || p0.status == Constant.orderInTransit, + (p0) => + p0.status == Constant.orderAccepted || + p0.status == Constant.driverPending || + p0.status == Constant.orderShipped || + p0.status == Constant.orderInTransit, ) .toList(); - deliveredList.value = allList.where((p0) => p0.status == Constant.orderCompleted).toList(); - cancelledList.value = allList.where((p0) => p0.status == Constant.orderCancelled).toList(); + deliveredList.value = + allList + .where((p0) => p0.status == Constant.orderCompleted) + .toList(); + cancelledList.value = + allList + .where((p0) => p0.status == Constant.orderCancelled) + .toList(); }); } @@ -45,7 +56,11 @@ class OrderController extends GetxController { final CartProvider cartProvider = CartProvider(); void addToCart({required CartProductModel cartProductModel}) { - cartProvider.addToCart(Get.context!, cartProductModel, cartProductModel.quantity!); + cartProvider.addToCart( + Get.context!, + cartProductModel, + cartProductModel.quantity!, + ); update(); } } diff --git a/lib/controllers/order_details_controller.dart b/lib/controllers/order_details_controller.dart index 44c2898..e1a51fa 100644 --- a/lib/controllers/order_details_controller.dart +++ b/lib/controllers/order_details_controller.dart @@ -1,8 +1,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/cart_product_model.dart'; import 'package:customer/models/order_model.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../service/cart_provider.dart'; class OrderDetailsController extends GetxController { @@ -39,28 +38,48 @@ class OrderDetailsController extends GetxController { for (var element in orderModel.value.products!) { if (double.parse(element.discountPrice.toString()) <= 0) { - subTotal.value = subTotal.value + - double.parse(element.price.toString()) * double.parse(element.quantity.toString()) + - (double.parse(element.extrasPrice.toString()) * double.parse(element.quantity.toString())); + subTotal.value = + subTotal.value + + double.parse(element.price.toString()) * + double.parse(element.quantity.toString()) + + (double.parse(element.extrasPrice.toString()) * + double.parse(element.quantity.toString())); } else { - subTotal.value = subTotal.value + - double.parse(element.discountPrice.toString()) * double.parse(element.quantity.toString()) + - (double.parse(element.extrasPrice.toString()) * double.parse(element.quantity.toString())); + subTotal.value = + subTotal.value + + double.parse(element.discountPrice.toString()) * + double.parse(element.quantity.toString()) + + (double.parse(element.extrasPrice.toString()) * + double.parse(element.quantity.toString())); } } - if (orderModel.value.specialDiscount != null && orderModel.value.specialDiscount!['special_discount'] != null) { - specialDiscountAmount.value = double.parse(orderModel.value.specialDiscount!['special_discount'].toString()); + if (orderModel.value.specialDiscount != null && + orderModel.value.specialDiscount!['special_discount'] != null) { + specialDiscountAmount.value = double.parse( + orderModel.value.specialDiscount!['special_discount'].toString(), + ); } if (orderModel.value.taxSetting != null) { for (var element in orderModel.value.taxSetting!) { - taxAmount.value = taxAmount.value + - Constant.calculateTax(amount: (subTotal.value - double.parse(orderModel.value.discount.toString()) - specialDiscountAmount.value).toString(), taxModel: element); + taxAmount.value = + taxAmount.value + + Constant.calculateTax( + amount: + (subTotal.value - + double.parse(orderModel.value.discount.toString()) - + specialDiscountAmount.value) + .toString(), + taxModel: element, + ); } } - totalAmount.value = (subTotal.value - double.parse(orderModel.value.discount.toString()) - specialDiscountAmount.value) + + totalAmount.value = + (subTotal.value - + double.parse(orderModel.value.discount.toString()) - + specialDiscountAmount.value) + taxAmount.value + double.parse(orderModel.value.deliveryCharge.toString()) + double.parse(orderModel.value.tipAmount.toString()); @@ -71,7 +90,11 @@ class OrderDetailsController extends GetxController { final CartProvider cartProvider = CartProvider(); void addToCart({required CartProductModel cartProductModel}) { - cartProvider.addToCart(Get.context!, cartProductModel, cartProductModel.quantity!); + cartProvider.addToCart( + Get.context!, + cartProductModel, + cartProductModel.quantity!, + ); update(); } } diff --git a/lib/controllers/order_placing_controller.dart b/lib/controllers/order_placing_controller.dart index fa489d6..5fa8060 100644 --- a/lib/controllers/order_placing_controller.dart +++ b/lib/controllers/order_placing_controller.dart @@ -1,6 +1,6 @@ import 'dart:async'; import 'package:customer/models/order_model.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../service/database_helper.dart'; class OrderPlacingController extends GetxController { diff --git a/lib/controllers/osm_search_place_controller.dart b/lib/controllers/osm_search_place_controller.dart index 7cdf1e2..be7afab 100644 --- a/lib/controllers/osm_search_place_controller.dart +++ b/lib/controllers/osm_search_place_controller.dart @@ -1,7 +1,7 @@ import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter_osm_plugin/flutter_osm_plugin.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:shared_preferences/shared_preferences.dart'; class OsmSearchPlaceController extends GetxController { @@ -25,7 +25,8 @@ class OsmSearchPlaceController extends GetxController { try { String locale = 'en'; SharedPreferences sp = await SharedPreferences.getInstance(); - if (sp.getString("languageCode") != null || sp.getString("languageCode")?.isNotEmpty == true) { + if (sp.getString("languageCode") != null || + sp.getString("languageCode")?.isNotEmpty == true) { locale = sp.getString("languageCode") ?? "en"; } suggestionsList.value = await addressSuggestion(text, locale: locale); diff --git a/lib/controllers/otp_verification_controller.dart b/lib/controllers/otp_verification_controller.dart index f33f250..745082a 100644 --- a/lib/controllers/otp_verification_controller.dart +++ b/lib/controllers/otp_verification_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/themes/show_toast_dialog.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../constant/constant.dart'; import '../models/user_model.dart'; import '../screen_ui/auth_screens/login_screen.dart'; @@ -63,15 +63,27 @@ class OtpVerifyController extends GetxController { try { ShowToastDialog.showLoader("Verifying OTP...".tr()); - final credential = PhoneAuthProvider.credential(verificationId: verificationId.value, smsCode: otpController.value.text.trim()); + final credential = PhoneAuthProvider.credential( + verificationId: verificationId.value, + smsCode: otpController.value.text.trim(), + ); final fcmToken = await NotificationService.getToken(); final result = await _auth.signInWithCredential(credential); if (result.additionalUserInfo?.isNewUser == true) { - final userModel = UserModel(id: result.user!.uid, countryCode: countryCode.value, phoneNumber: phoneNumber.value, fcmToken: fcmToken, active: true); + final userModel = UserModel( + id: result.user!.uid, + countryCode: countryCode.value, + phoneNumber: phoneNumber.value, + fcmToken: fcmToken, + active: true, + ); ShowToastDialog.closeLoader(); - Get.to(() => const SignUpScreen(), arguments: {'type': 'mobileNumber', 'userModel': userModel}); + Get.to( + () => const SignUpScreen(), + arguments: {'type': 'mobileNumber', 'userModel': userModel}, + ); return; } @@ -79,8 +91,16 @@ class OtpVerifyController extends GetxController { ShowToastDialog.closeLoader(); if (!exists) { - final userModel = UserModel(id: result.user!.uid, countryCode: countryCode.value, phoneNumber: phoneNumber.value, fcmToken: fcmToken); - Get.off(() => const SignUpScreen(), arguments: {'type': 'mobileNumber', 'userModel': userModel}); + final userModel = UserModel( + id: result.user!.uid, + countryCode: countryCode.value, + phoneNumber: phoneNumber.value, + fcmToken: fcmToken, + ); + Get.off( + () => const SignUpScreen(), + arguments: {'type': 'mobileNumber', 'userModel': userModel}, + ); return; } @@ -102,7 +122,10 @@ class OtpVerifyController extends GetxController { await FireStoreUtils.updateUser(userModel); if (userModel.shippingAddress?.isNotEmpty ?? false) { - final defaultAddress = userModel.shippingAddress!.firstWhere((e) => e.isDefault == true, orElse: () => userModel.shippingAddress!.first); + final defaultAddress = userModel.shippingAddress!.firstWhere( + (e) => e.isDefault == true, + orElse: () => userModel.shippingAddress!.first, + ); Constant.selectedLocation = defaultAddress; Get.offAll(() => const ServiceListScreen()); diff --git a/lib/controllers/parcel_coupon_controller.dart b/lib/controllers/parcel_coupon_controller.dart index 89da091..fe0c298 100644 --- a/lib/controllers/parcel_coupon_controller.dart +++ b/lib/controllers/parcel_coupon_controller.dart @@ -1,9 +1,8 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; - -class ParcelCouponController extends GetxController{ +import 'package:get/get.dart' hide Trans; +class ParcelCouponController extends GetxController { @override void onInit() { // TODO: implement onInit @@ -11,10 +10,10 @@ class ParcelCouponController extends GetxController{ super.onInit(); } - - void getData(){ + void getData() { getCouponCode(); } + RxBool isLoading = true.obs; RxList cabCouponList = [].obs; @@ -26,4 +25,4 @@ class ParcelCouponController extends GetxController{ print("cabCouponList ${cabCouponList.length}"); isLoading.value = false; } -} \ No newline at end of file +} diff --git a/lib/controllers/parcel_dashboard_controller.dart b/lib/controllers/parcel_dashboard_controller.dart index bc9b6a5..38a274e 100644 --- a/lib/controllers/parcel_dashboard_controller.dart +++ b/lib/controllers/parcel_dashboard_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/multi_vendor_service/profile_screen/profile_s import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/screen_ui/parcel_service/home_parcel_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../screen_ui/parcel_service/my_booking_screen.dart'; class ParcelDashboardController extends GetxController { @@ -15,15 +15,26 @@ class ParcelDashboardController extends GetxController { void onInit() { getTaxList(); if (Constant.walletSetting == false) { - pageList.value = [const HomeParcelScreen(), const MyBookingScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeParcelScreen(), + const MyBookingScreen(), + const ProfileScreen(), + ]; } else { - pageList.value = [const HomeParcelScreen(), const MyBookingScreen(), const WalletScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeParcelScreen(), + const MyBookingScreen(), + const WalletScreen(), + const ProfileScreen(), + ]; } super.onInit(); } Future getTaxList() async { - await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) { + await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then(( + value, + ) { if (value != null) { Constant.taxList = value; } diff --git a/lib/controllers/parcel_my_booking_controller.dart b/lib/controllers/parcel_my_booking_controller.dart index 745472f..742e67c 100644 --- a/lib/controllers/parcel_my_booking_controller.dart +++ b/lib/controllers/parcel_my_booking_controller.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../constant/constant.dart'; import '../models/parcel_order_model.dart'; @@ -15,7 +15,8 @@ class ParcelMyBookingController extends GetxController { RxList parcelOrder = [].obs; RxString selectedTab = "New".obs; - RxList tabTitles = ["New", "In Transit", "Delivered", "Cancelled"].obs; + RxList tabTitles = + ["New", "In Transit", "Delivered", "Cancelled"].obs; StreamSubscription>? _parcelSubscription; @@ -53,16 +54,38 @@ class ParcelMyBookingController extends GetxController { List getOrdersForTab(String tab) { switch (tab) { case "New": - return parcelOrder.where((order) => ["Order Placed"].contains(order.status)).toList(); + return parcelOrder + .where((order) => ["Order Placed"].contains(order.status)) + .toList(); case "In Transit": - return parcelOrder.where((order) => ["Order Accepted", "Driver Accepted", "Driver Pending", "Order Shipped", "In Transit"].contains(order.status)).toList(); + return parcelOrder + .where( + (order) => [ + "Order Accepted", + "Driver Accepted", + "Driver Pending", + "Order Shipped", + "In Transit", + ].contains(order.status), + ) + .toList(); case "Delivered": - return parcelOrder.where((order) => ["Order Completed"].contains(order.status)).toList(); + return parcelOrder + .where((order) => ["Order Completed"].contains(order.status)) + .toList(); case "Cancelled": - return parcelOrder.where((order) => ["Order Rejected", "Order Cancelled", "Driver Rejected"].contains(order.status)).toList(); + return parcelOrder + .where( + (order) => [ + "Order Rejected", + "Order Cancelled", + "Driver Rejected", + ].contains(order.status), + ) + .toList(); default: return []; @@ -70,7 +93,8 @@ class ParcelMyBookingController extends GetxController { } /// Old helper (optional) - List get filteredParcelOrders => getOrdersForTab(selectedTab.value); + List get filteredParcelOrders => + getOrdersForTab(selectedTab.value); String formatDate(Timestamp timestamp) { final dateTime = timestamp.toDate(); @@ -97,10 +121,18 @@ class ParcelMyBookingController extends GetxController { final taxSettings = order.taxSetting ?? []; for (var element in taxSettings) { - totalTax += Constant.calculateTax(amount: (double.parse(order.subTotal.toString()) - double.parse(order.discount.toString())).toString(), taxModel: element); + totalTax += Constant.calculateTax( + amount: + (double.parse(order.subTotal.toString()) - + double.parse(order.discount.toString())) + .toString(), + taxModel: element, + ); } - double subTotal = double.parse(order.subTotal.toString()) - double.parse(order.discount.toString()); + double subTotal = + double.parse(order.subTotal.toString()) - + double.parse(order.discount.toString()); double refundAmount = subTotal + totalTax; WalletTransactionModel walletTransaction = WalletTransactionModel( @@ -122,7 +154,10 @@ class ParcelMyBookingController extends GetxController { await FireStoreUtils.setWalletTransaction(walletTransaction); // Update wallet balance - await FireStoreUtils.updateUserWallet(amount: refundAmount.toString(), userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: refundAmount.toString(), + userId: FireStoreUtils.getCurrentUid(), + ); } ShowToastDialog.showToast("Order cancelled successfully".tr()); diff --git a/lib/controllers/parcel_order_confirmation_controller.dart b/lib/controllers/parcel_order_confirmation_controller.dart index 85f2e1d..abbcef0 100644 --- a/lib/controllers/parcel_order_confirmation_controller.dart +++ b/lib/controllers/parcel_order_confirmation_controller.dart @@ -9,7 +9,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:image_picker/image_picker.dart'; import 'package:intl/intl.dart'; diff --git a/lib/controllers/parcel_order_details_controller.dart b/lib/controllers/parcel_order_details_controller.dart index 334b4f9..6e9e83b 100644 --- a/lib/controllers/parcel_order_details_controller.dart +++ b/lib/controllers/parcel_order_details_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../constant/constant.dart'; import '../models/parcel_category.dart'; @@ -45,7 +45,12 @@ class ParcelOrderDetailsController extends GetxController { discount.value = double.parse(parcelOrder.value.discount ?? '0.0'); for (var element in parcelOrder.value.taxSetting!) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } totalAmount.value = (subTotal.value - discount.value) + taxAmount.value; @@ -54,22 +59,32 @@ class ParcelOrderDetailsController extends GetxController { Future fetchDriverDetails() async { if (parcelOrder.value.driverId != null) { - await FireStoreUtils.getUserProfile(parcelOrder.value.driverId ?? '').then((value) { + await FireStoreUtils.getUserProfile( + parcelOrder.value.driverId ?? '', + ).then((value) { if (value != null) { driverUser.value = value; } }); - await FireStoreUtils.getReviewsbyID(parcelOrder.value.id.toString()).then((value) { - if (value != null) { - ratingModel.value = value; - } - }); + await FireStoreUtils.getReviewsbyID(parcelOrder.value.id.toString()).then( + (value) { + if (value != null) { + ratingModel.value = value; + } + }, + ); } } void setStatusHistoryFromString(ParcelOrderModel order) { - final steps = ["Order Placed", "Driver Accepted", "Pickup Done", "In Transit", "Delivered"]; + final steps = [ + "Order Placed", + "Driver Accepted", + "Pickup Done", + "In Transit", + "Delivered", + ]; final history = []; @@ -79,7 +94,12 @@ class ParcelOrderDetailsController extends GetxController { for (int i = 0; i < steps.length; i++) { final step = steps[i]; - history.add(ParcelStatus(status: step, time: baseTime.add(Duration(minutes: i * minutesGap)))); + history.add( + ParcelStatus( + status: step, + time: baseTime.add(Duration(minutes: i * minutesGap)), + ), + ); if (step == order.status) break; } @@ -109,7 +129,10 @@ class ParcelOrderDetailsController extends GetxController { await FireStoreUtils.setWalletTransaction(walletTransaction); // Update wallet balance - await FireStoreUtils.updateUserWallet(amount: totalAmount.value.toString(), userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: totalAmount.value.toString(), + userId: FireStoreUtils.getCurrentUid(), + ); } await FireStoreUtils.parcelOrderPlace(parcelOrder.value); @@ -132,7 +155,12 @@ class ParcelOrderDetailsController extends GetxController { ParcelCategory? getSelectedCategory() { try { - return parcelCategory.firstWhere((cat) => cat.title?.toLowerCase().trim() == parcelOrder.value.parcelType?.toLowerCase().trim(), orElse: () => ParcelCategory()); + return parcelCategory.firstWhere( + (cat) => + cat.title?.toLowerCase().trim() == + parcelOrder.value.parcelType?.toLowerCase().trim(), + orElse: () => ParcelCategory(), + ); } catch (e) { return null; } diff --git a/lib/controllers/parcel_review_controller.dart b/lib/controllers/parcel_review_controller.dart index 58691f8..2ad0958 100644 --- a/lib/controllers/parcel_review_controller.dart +++ b/lib/controllers/parcel_review_controller.dart @@ -2,7 +2,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/parcel_order_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/rating_model.dart'; import '../models/user_model.dart'; import '../service/fire_store_utils.dart'; @@ -47,12 +47,17 @@ class ParcelReviewController extends GetxController { } }); - await FireStoreUtils.getUserProfile(order.value?.driverId ?? '').then((value) { + await FireStoreUtils.getUserProfile(order.value?.driverId ?? '').then(( + value, + ) { if (value != null) { driverUser.value = value; - final int userReviewsCount = int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? 0; - final int userReviewsSum = int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0; + final int userReviewsCount = + int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? + 0; + final int userReviewsSum = + int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0; if (ratingModel.value != null) { final int oldRating = ratingModel.value?.rating?.toInt() ?? 0; @@ -77,7 +82,9 @@ class ParcelReviewController extends GetxController { ShowToastDialog.showLoader("Submit in...".tr()); - final user = await FireStoreUtils.getUserProfile(order.value?.driverId ?? ''); + final user = await FireStoreUtils.getUserProfile( + order.value?.driverId ?? '', + ); if (user != null) { user.reviewsCount = (futureCount.value + 1).toString(); @@ -94,7 +101,8 @@ class ParcelReviewController extends GetxController { driverId: ratingModel.value!.driverId, customerId: ratingModel.value!.customerId, vendorId: ratingModel.value?.vendorId, - uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", + uname: + "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); @@ -113,7 +121,8 @@ class ParcelReviewController extends GetxController { orderId: order.value?.id, driverId: order.value?.driverId.toString(), customerId: Constant.userModel?.id, - uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", + uname: + "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); diff --git a/lib/controllers/provider_controller.dart b/lib/controllers/provider_controller.dart index b10e21d..ed6379e 100644 --- a/lib/controllers/provider_controller.dart +++ b/lib/controllers/provider_controller.dart @@ -1,5 +1,5 @@ import 'package:customer/controllers/on_demand_home_controller.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/provider_serivce_model.dart'; import '../models/user_model.dart'; import '../service/fire_store_utils.dart'; @@ -10,7 +10,8 @@ class ProviderController extends GetxController { RxBool isLoading = true.obs; late final String providerId; - Rx onDemandHomeController = Get.put(OnDemandHomeController()).obs; + Rx onDemandHomeController = + Get.put(OnDemandHomeController()).obs; @override void onInit() { @@ -24,7 +25,9 @@ class ProviderController extends GetxController { } void getProvider() async { - FireStoreUtils.getProviderServiceByProviderId(providerId: providerId).then((catValue) { + FireStoreUtils.getProviderServiceByProviderId(providerId: providerId).then(( + catValue, + ) { providerList.value = catValue; }); diff --git a/lib/controllers/rate_product_controller.dart b/lib/controllers/rate_product_controller.dart index 61086a1..ece8c88 100644 --- a/lib/controllers/rate_product_controller.dart +++ b/lib/controllers/rate_product_controller.dart @@ -12,7 +12,7 @@ import '../models/review_attribute_model.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:image_picker/image_picker.dart'; import '../themes/show_toast_dialog.dart'; @@ -35,7 +35,8 @@ class RateProductController extends GetxController { Rx vendorModel = VendorModel().obs; Rx vendorCategoryModel = VendorCategoryModel().obs; - RxList reviewAttributeList = [].obs; + RxList reviewAttributeList = + [].obs; RxDouble ratings = 0.0.obs; @@ -54,7 +55,10 @@ class RateProductController extends GetxController { orderModel.value = argumentData['orderModel']; productId.value = argumentData['productId']; - await FireStoreUtils.getOrderReviewsByID(orderModel.value.id.toString(), productId.value).then((value) { + await FireStoreUtils.getOrderReviewsByID( + orderModel.value.id.toString(), + productId.value, + ).then((value) { if (value != null) { ratingModel.value = value; ratings.value = value.rating ?? 0.0; @@ -64,23 +68,33 @@ class RateProductController extends GetxController { } }); - await FireStoreUtils.getProductById(productId.value.split('~').first).then((value) { + await FireStoreUtils.getProductById( + productId.value.split('~').first, + ).then((value) { if (value != null) { productModel.value = value; - if (ratingModel.value.id != null && ratingModel.value.id!.isNotEmpty) { + if (ratingModel.value.id != null && + ratingModel.value.id!.isNotEmpty) { productReviewCount.value = value.reviewsCount! - 1; productReviewSum.value = value.reviewsSum! - ratings.value; if (value.reviewAttributes != null) { value.reviewAttributes!.forEach((key, value) { - ReviewsAttribute reviewsAttributeModel = ReviewsAttribute.fromJson(value); - reviewsAttributeModel.reviewsCount = reviewsAttributeModel.reviewsCount! - 1; - reviewsAttributeModel.reviewsSum = reviewsAttributeModel.reviewsSum! - reviewAttribute[key]; - reviewProductAttributes.addEntries([MapEntry(key, reviewsAttributeModel.toJson())]); + ReviewsAttribute reviewsAttributeModel = + ReviewsAttribute.fromJson(value); + reviewsAttributeModel.reviewsCount = + reviewsAttributeModel.reviewsCount! - 1; + reviewsAttributeModel.reviewsSum = + reviewsAttributeModel.reviewsSum! - reviewAttribute[key]; + reviewProductAttributes.addEntries([ + MapEntry(key, reviewsAttributeModel.toJson()), + ]); }); } } else { - productReviewCount.value = double.parse(value.reviewsCount.toString()); + productReviewCount.value = double.parse( + value.reviewsCount.toString(), + ); productReviewSum.value = double.parse(value.reviewsSum.toString()); if (value.reviewAttributes != null) { reviewProductAttributes.value = value.reviewAttributes!; @@ -89,24 +103,33 @@ class RateProductController extends GetxController { } }); - await FireStoreUtils.getVendorById(productModel.value.vendorID.toString()).then((value) { + await FireStoreUtils.getVendorById( + productModel.value.vendorID.toString(), + ).then((value) { if (value != null) { vendorModel.value = value; - if (ratingModel.value.id != null && ratingModel.value.id!.isNotEmpty) { + if (ratingModel.value.id != null && + ratingModel.value.id!.isNotEmpty) { vendorReviewCount.value = value.reviewsCount! - 1; vendorReviewSum.value = value.reviewsSum! - ratings.value; } else { - vendorReviewCount.value = double.parse(value.reviewsCount.toString()); + vendorReviewCount.value = double.parse( + value.reviewsCount.toString(), + ); vendorReviewSum.value = double.parse(value.reviewsSum.toString()); } } }); - await FireStoreUtils.getVendorCategoryByCategoryId(productModel.value.categoryID.toString()).then((value) async { + await FireStoreUtils.getVendorCategoryByCategoryId( + productModel.value.categoryID.toString(), + ).then((value) async { if (value != null) { vendorCategoryModel.value = value; for (var element in vendorCategoryModel.value.reviewAttributes!) { - await FireStoreUtils.getVendorReviewAttribute(element).then((value) { + await FireStoreUtils.getVendorReviewAttribute(element).then(( + value, + ) { reviewAttributeList.add(value!); }); } @@ -129,21 +152,36 @@ class RateProductController extends GetxController { if (reviewProductAttributes.isEmpty) { reviewAttribute.forEach((key, value) { - ReviewsAttribute reviewsAttributeModel = ReviewsAttribute(reviewsCount: 1, reviewsSum: value); - reviewProductAttributes.addEntries([MapEntry(key, reviewsAttributeModel.toJson())]); + ReviewsAttribute reviewsAttributeModel = ReviewsAttribute( + reviewsCount: 1, + reviewsSum: value, + ); + reviewProductAttributes.addEntries([ + MapEntry(key, reviewsAttributeModel.toJson()), + ]); }); } else { reviewProductAttributes.forEach((key, value) { - ReviewsAttribute reviewsAttributeModel = ReviewsAttribute.fromJson(value); - reviewsAttributeModel.reviewsCount = reviewsAttributeModel.reviewsCount! + 1; - reviewsAttributeModel.reviewsSum = reviewsAttributeModel.reviewsSum! + reviewAttribute[key]; - reviewProductAttributes.addEntries([MapEntry(key, reviewsAttributeModel.toJson())]); + ReviewsAttribute reviewsAttributeModel = ReviewsAttribute.fromJson( + value, + ); + reviewsAttributeModel.reviewsCount = + reviewsAttributeModel.reviewsCount! + 1; + reviewsAttributeModel.reviewsSum = + reviewsAttributeModel.reviewsSum! + reviewAttribute[key]; + reviewProductAttributes.addEntries([ + MapEntry(key, reviewsAttributeModel.toJson()), + ]); }); } for (int i = 0; i < images.length; i++) { if (images[i].runtimeType == XFile) { - String url = await Constant.uploadUserImageToFireStorage(File(images[i].path), "profileImage/${FireStoreUtils.getCurrentUid()}", File(images[i].path).path.split('/').last); + String url = await Constant.uploadUserImageToFireStorage( + File(images[i].path), + "profileImage/${FireStoreUtils.getCurrentUid()}", + File(images[i].path).path.split('/').last, + ); images.removeAt(i); images.insert(i, url); } @@ -155,7 +193,10 @@ class RateProductController extends GetxController { photos: images, rating: ratings.value, customerId: FireStoreUtils.getCurrentUid(), - id: ratingModel.value.id != null && ratingModel.value.id!.isNotEmpty ? ratingModel.value.id : Constant.getUuid(), + id: + ratingModel.value.id != null && ratingModel.value.id!.isNotEmpty + ? ratingModel.value.id + : Constant.getUuid(), orderId: orderModel.value.id, vendorId: productModel.value.vendorID, createdAt: Timestamp.now(), diff --git a/lib/controllers/redeem_gift_card_controller.dart b/lib/controllers/redeem_gift_card_controller.dart index d445e2f..8332496 100644 --- a/lib/controllers/redeem_gift_card_controller.dart +++ b/lib/controllers/redeem_gift_card_controller.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class RedeemGiftCardController extends GetxController { Rx giftCodeController = TextEditingController().obs; diff --git a/lib/controllers/refer_friend_controller.dart b/lib/controllers/refer_friend_controller.dart index 8b9cd87..66c3f7e 100644 --- a/lib/controllers/refer_friend_controller.dart +++ b/lib/controllers/refer_friend_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/referral_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class ReferFriendController extends GetxController { Rx referralModel = ReferralModel().obs; diff --git a/lib/controllers/rental_conformation_controller.dart b/lib/controllers/rental_conformation_controller.dart index a0bf823..49f838e 100644 --- a/lib/controllers/rental_conformation_controller.dart +++ b/lib/controllers/rental_conformation_controller.dart @@ -7,8 +7,7 @@ import 'package:customer/service/fire_store_utils.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../screen_ui/rental_service/rental_dashboard_screen.dart'; import 'cab_rental_dashboard_controllers.dart'; @@ -27,7 +26,8 @@ class RentalConformationController extends GetxController { void getArguments() { final args = Get.arguments; - if (args.containsKey('rentalOrderModel') && args['rentalOrderModel'] is RentalOrderModel) { + if (args.containsKey('rentalOrderModel') && + args['rentalOrderModel'] is RentalOrderModel) { rentalOrderModel.value = args['rentalOrderModel'] as RentalOrderModel; calculateAmount(); } else { @@ -48,12 +48,21 @@ class RentalConformationController extends GetxController { taxAmount.value = 0.0; totalAmount.value = 0.0; - subTotal.value = double.tryParse(rentalOrderModel.value.subTotal ?? '0') ?? 0.0; + subTotal.value = + double.tryParse(rentalOrderModel.value.subTotal ?? '0') ?? 0.0; if (selectedCouponModel.value.id != null) { - discount.value = Constant.calculateDiscount(amount: subTotal.value.toString(), offerModel: selectedCouponModel.value); + discount.value = Constant.calculateDiscount( + amount: subTotal.value.toString(), + offerModel: selectedCouponModel.value, + ); } for (var element in rentalOrderModel.value.taxSetting ?? []) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } totalAmount.value = subTotal.value - discount.value + taxAmount.value; @@ -77,12 +86,17 @@ class RentalConformationController extends GetxController { rentalOrderModel.value.couponCode = selectedCouponModel.value.code; rentalOrderModel.value.couponId = selectedCouponModel.value.id; rentalOrderModel.value.subTotal = subTotal.value.toString(); - rentalOrderModel.value.otpCode = (maths.Random().nextInt(9000) + 1000).toString(); - await FireStoreUtils.rentalOrderPlace(rentalOrderModel.value).then((value) async { + rentalOrderModel.value.otpCode = + (maths.Random().nextInt(9000) + 1000).toString(); + await FireStoreUtils.rentalOrderPlace(rentalOrderModel.value).then(( + value, + ) async { ShowToastDialog.closeLoader(); ShowToastDialog.showToast("Order placed successfully".tr()); Get.offAll(const RentalDashboardScreen()); - CabRentalDashboardControllers controller = Get.put(CabRentalDashboardControllers()); + CabRentalDashboardControllers controller = Get.put( + CabRentalDashboardControllers(), + ); controller.selectedIndex.value = 1; // Get.back(); }); diff --git a/lib/controllers/rental_coupon_controller.dart b/lib/controllers/rental_coupon_controller.dart index 9f4b303..4cb1292 100644 --- a/lib/controllers/rental_coupon_controller.dart +++ b/lib/controllers/rental_coupon_controller.dart @@ -1,9 +1,8 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; - -class RentalCouponController extends GetxController{ +import 'package:get/get.dart' hide Trans; +class RentalCouponController extends GetxController { @override void onInit() { // TODO: implement onInit @@ -11,10 +10,10 @@ class RentalCouponController extends GetxController{ super.onInit(); } - - void getData(){ + void getData() { getCouponCode(); } + RxBool isLoading = true.obs; RxList cabCouponList = [].obs; @@ -25,4 +24,4 @@ class RentalCouponController extends GetxController{ print("cabCouponList ${cabCouponList.length}"); isLoading.value = false; } -} \ No newline at end of file +} diff --git a/lib/controllers/rental_home_controller.dart b/lib/controllers/rental_home_controller.dart index c7a3a36..87b8181 100644 --- a/lib/controllers/rental_home_controller.dart +++ b/lib/controllers/rental_home_controller.dart @@ -10,7 +10,7 @@ import 'package:customer/widget/geoflutterfire/src/geoflutterfire.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart' as latlong; import '../constant/constant.dart'; import '../models/payment_model/cod_setting_model.dart'; @@ -38,7 +38,8 @@ class RentalHomeController extends GetxController { RxBool isLoading = false.obs; // Location input - final Rx sourceTextEditController = TextEditingController().obs; + final Rx sourceTextEditController = + TextEditingController().obs; // Selected date Rx selectedDate = DateTime.now().obs; @@ -74,11 +75,20 @@ class RentalHomeController extends GetxController { Constant.currentLocation = position; // Set default coordinates for Google or OSM - departureLatLong.value = gmaps.LatLng(position.latitude, position.longitude); - departureLatLongOsm.value = latlong.LatLng(position.latitude, position.longitude); + departureLatLong.value = gmaps.LatLng( + position.latitude, + position.longitude, + ); + departureLatLongOsm.value = latlong.LatLng( + position.latitude, + position.longitude, + ); // Get readable address - String address = await Utils.getAddressFromCoordinates(position.latitude, position.longitude); + String address = await Utils.getAddressFromCoordinates( + position.latitude, + position.longitude, + ); sourceTextEditController.value.text = address; } } catch (e) { @@ -102,7 +112,12 @@ class RentalHomeController extends GetxController { /// Date Picker Future pickDate(BuildContext context) async { - final DateTime? picked = await showDatePicker(context: context, initialDate: selectedDate.value, firstDate: DateTime.now(), lastDate: DateTime(2100)); + final DateTime? picked = await showDatePicker( + context: context, + initialDate: selectedDate.value, + firstDate: DateTime.now(), + lastDate: DateTime(2100), + ); if (picked != null) { selectedDate.value = picked; @@ -110,7 +125,9 @@ class RentalHomeController extends GetxController { } Future getRentalPackage() async { - await FireStoreUtils.getRentalPackage(selectedVehicleType.value!.id.toString()).then((value) { + await FireStoreUtils.getRentalPackage( + selectedVehicleType.value!.id.toString(), + ).then((value) { rentalPackages.value = value; if (rentalPackages.isNotEmpty) { selectedPackage.value = rentalPackages[0]; @@ -120,8 +137,14 @@ class RentalHomeController extends GetxController { void completeOrder() { DestinationLocation sourceLocation = DestinationLocation( - latitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.latitude : departureLatLong.value.latitude, - longitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.longitude : departureLatLong.value.longitude, + latitude: + Constant.selectedMapType == 'osm' + ? departureLatLongOsm.value.latitude + : departureLatLong.value.latitude, + longitude: + Constant.selectedMapType == 'osm' + ? departureLatLongOsm.value.longitude + : departureLatLong.value.longitude, ); print("=====>"); @@ -144,18 +167,35 @@ class RentalHomeController extends GetxController { rentalOrderModel.taxSetting = Constant.taxList; rentalOrderModel.createdAt = Timestamp.now(); rentalOrderModel.sourceLocation = sourceLocation; - rentalOrderModel.adminCommission = Constant.sectionConstantModel!.adminCommision!.amount; - rentalOrderModel.adminCommissionType = Constant.sectionConstantModel!.adminCommision!.commissionType; + rentalOrderModel.adminCommission = + Constant.sectionConstantModel!.adminCommision!.amount; + rentalOrderModel.adminCommissionType = + Constant.sectionConstantModel!.adminCommision!.commissionType; rentalOrderModel.sourcePoint = G( - geopoint: GeoPoint(sourceLocation.latitude ?? 0.0, sourceLocation.longitude ?? 0.0), - geohash: Geoflutterfire().point(latitude: sourceLocation.latitude ?? 0.0, longitude: sourceLocation.longitude ?? 0.0).hash, + geopoint: GeoPoint( + sourceLocation.latitude ?? 0.0, + sourceLocation.longitude ?? 0.0, + ), + geohash: + Geoflutterfire() + .point( + latitude: sourceLocation.latitude ?? 0.0, + longitude: sourceLocation.longitude ?? 0.0, + ) + .hash, + ); + rentalOrderModel.zoneId = Constant.getZoneId( + sourceLocation.latitude ?? 0.0, + sourceLocation.longitude ?? 0.0, ); - rentalOrderModel.zoneId = Constant.getZoneId(sourceLocation.latitude ?? 0.0, sourceLocation.longitude ?? 0.0); log(rentalOrderModel.toJson().toString()); Get.back(); Get.back(); - Get.to(() => RentalConformationScreen(), arguments: {"rentalOrderModel": rentalOrderModel}); + Get.to( + () => RentalConformationScreen(), + arguments: {"rentalOrderModel": rentalOrderModel}, + ); } void setDepartureMarker(double lat, double lng) { @@ -194,19 +234,45 @@ class RentalHomeController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; diff --git a/lib/controllers/rental_order_details_controller.dart b/lib/controllers/rental_order_details_controller.dart index e51f7af..69bd57c 100644 --- a/lib/controllers/rental_order_details_controller.dart +++ b/lib/controllers/rental_order_details_controller.dart @@ -39,7 +39,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:razorpay_flutter/razorpay_flutter.dart'; import 'package:uuid/uuid.dart'; @@ -84,13 +84,17 @@ class RentalOrderDetailsController extends GetxController { Future fetchDriverDetails() async { if (order.value.driverId != null) { - await FireStoreUtils.getUserProfile(order.value.driverId ?? '').then((value) { + await FireStoreUtils.getUserProfile(order.value.driverId ?? '').then(( + value, + ) { if (value != null) { driverUser.value = value; } }); - await FireStoreUtils.getReviewsbyID(order.value.id.toString()).then((value) { + await FireStoreUtils.getReviewsbyID(order.value.id.toString()).then(( + value, + ) { if (value != null) { ratingModel.value = value; } @@ -100,9 +104,15 @@ class RentalOrderDetailsController extends GetxController { String getExtraKm() { try { - final double start = double.tryParse(order.value.startKitoMetersReading ?? '0') ?? 0.0; - final double end = double.tryParse(order.value.endKitoMetersReading ?? '0') ?? 0.0; - final double included = double.tryParse(order.value.rentalPackageModel?.includedDistance?.toString() ?? '0') ?? 0.0; + final double start = + double.tryParse(order.value.startKitoMetersReading ?? '0') ?? 0.0; + final double end = + double.tryParse(order.value.endKitoMetersReading ?? '0') ?? 0.0; + final double included = + double.tryParse( + order.value.rentalPackageModel?.includedDistance?.toString() ?? '0', + ) ?? + 0.0; // Calculate extra km safely final double extra = (end - start - included); @@ -117,8 +127,10 @@ class RentalOrderDetailsController extends GetxController { ///Safe calculation after order is loaded void calculateTotalAmount() { try { - subTotal.value = double.tryParse(order.value.subTotal?.toString() ?? "0") ?? 0.0; - discount.value = double.tryParse(order.value.discount?.toString() ?? "0") ?? 0.0; + subTotal.value = + double.tryParse(order.value.subTotal?.toString() ?? "0") ?? 0.0; + discount.value = + double.tryParse(order.value.discount?.toString() ?? "0") ?? 0.0; taxAmount.value = 0.0; if (order.value.endTime != null) { @@ -128,12 +140,23 @@ class RentalOrderDetailsController extends GetxController { // Total rented minutes int totalMinutes = end.difference(start).inMinutes; - int includedMinutes = (int.tryParse(order.value.rentalPackageModel?.includedHours.toString() ?? "0") ?? 0) * 60; + int includedMinutes = + (int.tryParse( + order.value.rentalPackageModel?.includedHours.toString() ?? + "0", + ) ?? + 0) * + 60; if (totalMinutes > includedMinutes) { int extraMinutes = totalMinutes - includedMinutes; - double minuteFare = double.tryParse(order.value.rentalPackageModel?.extraMinuteFare?.toString() ?? "0") ?? 0.0; + double minuteFare = + double.tryParse( + order.value.rentalPackageModel?.extraMinuteFare?.toString() ?? + "0", + ) ?? + 0.0; extraMinutesCharge.value = extraMinutes * minuteFare; } else { @@ -141,24 +164,47 @@ class RentalOrderDetailsController extends GetxController { } } - if (order.value.startKitoMetersReading != null && order.value.endKitoMetersReading != null) { - double startKm = double.tryParse(order.value.startKitoMetersReading?.toString() ?? "0") ?? 0.0; - double endKm = double.tryParse(order.value.endKitoMetersReading?.toString() ?? "0") ?? 0.0; + if (order.value.startKitoMetersReading != null && + order.value.endKitoMetersReading != null) { + double startKm = + double.tryParse( + order.value.startKitoMetersReading?.toString() ?? "0", + ) ?? + 0.0; + double endKm = + double.tryParse( + order.value.endKitoMetersReading?.toString() ?? "0", + ) ?? + 0.0; if (endKm > startKm) { double totalKm = endKm - startKm; - if (totalKm > double.parse(order.value.rentalPackageModel!.includedDistance!)) { - totalKm = totalKm - double.parse(order.value.rentalPackageModel!.includedDistance!); - double extraKmRate = double.tryParse(order.value.rentalPackageModel?.extraKmFare?.toString() ?? "0") ?? 0.0; + if (totalKm > + double.parse(order.value.rentalPackageModel!.includedDistance!)) { + totalKm = + totalKm - + double.parse(order.value.rentalPackageModel!.includedDistance!); + double extraKmRate = + double.tryParse( + order.value.rentalPackageModel?.extraKmFare?.toString() ?? + "0", + ) ?? + 0.0; extraKilometerCharge.value = totalKm * extraKmRate; } } } - subTotal.value = subTotal.value + extraKilometerCharge.value + extraMinutesCharge.value; + subTotal.value = + subTotal.value + + extraKilometerCharge.value + + extraMinutesCharge.value; if (order.value.taxSetting != null) { for (var element in order.value.taxSetting!) { - taxAmount.value += Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element); + taxAmount.value += Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + ); } } @@ -194,9 +240,14 @@ class RentalOrderDetailsController extends GetxController { serviceType: Constant.parcelServiceType, ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.toString()}", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ); } }); } @@ -209,7 +260,10 @@ class RentalOrderDetailsController extends GetxController { } } - Future cancelRentalRequest(RentalOrderModel order, {List? taxList}) async { + Future cancelRentalRequest( + RentalOrderModel order, { + List? taxList, + }) async { try { isLoading.value = true; @@ -221,11 +275,19 @@ class RentalOrderDetailsController extends GetxController { if (taxList != null) { for (var element in taxList) { - totalTax += Constant.calculateTax(amount: (double.parse(order.subTotal.toString()) - double.parse(order.discount.toString())).toString(), taxModel: element); + totalTax += Constant.calculateTax( + amount: + (double.parse(order.subTotal.toString()) - + double.parse(order.discount.toString())) + .toString(), + taxModel: element, + ); } } - double subTotal = double.parse(order.subTotal.toString()) - double.parse(order.discount.toString()); + double subTotal = + double.parse(order.subTotal.toString()) - + double.parse(order.discount.toString()); double refundAmount = subTotal + totalTax; WalletTransactionModel walletTransaction = WalletTransactionModel( @@ -244,7 +306,10 @@ class RentalOrderDetailsController extends GetxController { ); await FireStoreUtils.setWalletTransaction(walletTransaction); - await FireStoreUtils.updateUserWallet(amount: refundAmount.toString(), userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: refundAmount.toString(), + userId: FireStoreUtils.getCurrentUid(), + ); } ShowToastDialog.showToast("Booking cancelled successfully".tr()); Get.back(); @@ -272,19 +337,45 @@ class RentalOrderDetailsController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -326,20 +417,32 @@ class RentalOrderDetailsController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -385,7 +488,10 @@ class RentalOrderDetailsController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -395,8 +501,14 @@ class RentalOrderDetailsController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -409,12 +521,20 @@ class RentalOrderDetailsController extends GetxController { }, ], "payer": {"email": Constant.userModel!.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, "auto_return": "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -497,15 +617,23 @@ class RentalOrderDetailsController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -515,17 +643,23 @@ class RentalOrderDetailsController extends GetxController { "payment_options": "ussd, card, barter, payattitude", "customer": { "email": Constant.userModel!.email.toString(), - "phonenumber": Constant.userModel!.phoneNumber, // Add a real phone number + "phonenumber": + Constant.userModel!.phoneNumber, // Add a real phone number "name": Constant.userModel!.fullName(), // Add a real customer name }, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -554,8 +688,14 @@ class RentalOrderDetailsController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: Constant.userModel!).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: Constant.userModel!, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -594,7 +734,14 @@ class RentalOrderDetailsController extends GetxController { // }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -630,24 +777,38 @@ class RentalOrderDetailsController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), "checksum_value": checkSum}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } final response = await http.post( Uri.parse(initiateURL), @@ -665,9 +826,12 @@ class RentalOrderDetailsController extends GetxController { ); log(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -685,7 +849,10 @@ class RentalOrderDetailsController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': Constant.userModel!.phoneNumber, 'email': Constant.userModel!.email}, + 'prefill': { + 'contact': Constant.userModel!.phoneNumber, + 'email': Constant.userModel!.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -720,7 +887,10 @@ class RentalOrderDetailsController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -738,15 +908,30 @@ class RentalOrderDetailsController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -754,7 +939,9 @@ class RentalOrderDetailsController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -771,13 +958,30 @@ class RentalOrderDetailsController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -789,13 +993,22 @@ class RentalOrderDetailsController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -806,17 +1019,32 @@ class RentalOrderDetailsController extends GetxController { accessToken = responseData['access_token']; // ignore: use_build_context_synchronously - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; - String apiUrl = orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + orangeMoneyModel.value.isSandbox! == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, @@ -831,7 +1059,11 @@ class RentalOrderDetailsController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -845,7 +1077,9 @@ class RentalOrderDetailsController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -861,7 +1095,13 @@ class RentalOrderDetailsController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -877,7 +1117,9 @@ class RentalOrderDetailsController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -890,7 +1132,11 @@ class RentalOrderDetailsController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/rental_review_controller.dart b/lib/controllers/rental_review_controller.dart index 1314702..88d06c3 100644 --- a/lib/controllers/rental_review_controller.dart +++ b/lib/controllers/rental_review_controller.dart @@ -1,7 +1,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../constant/collection_name.dart'; import '../models/rating_model.dart'; import '../models/rental_order_model.dart'; @@ -48,12 +48,17 @@ class RentalReviewController extends GetxController { } }); - await FireStoreUtils.getUserProfile(order.value?.driverId ?? '').then((value) { + await FireStoreUtils.getUserProfile(order.value?.driverId ?? '').then(( + value, + ) { if (value != null) { driverUser.value = value; - final int userReviewsCount = int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? 0; - final int userReviewsSum = int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0; + final int userReviewsCount = + int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? + 0; + final int userReviewsSum = + int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0; if (ratingModel.value != null) { final int oldRating = ratingModel.value?.rating?.toInt() ?? 0; @@ -78,7 +83,9 @@ class RentalReviewController extends GetxController { ShowToastDialog.showLoader("Submit in...".tr()); - final user = await FireStoreUtils.getUserProfile(order.value?.driverId ?? ''); + final user = await FireStoreUtils.getUserProfile( + order.value?.driverId ?? '', + ); if (user != null) { user.reviewsCount = (futureCount.value + 1).toString(); @@ -95,7 +102,8 @@ class RentalReviewController extends GetxController { driverId: ratingModel.value!.driverId, customerId: ratingModel.value!.customerId, vendorId: ratingModel.value?.vendorId, - uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", + uname: + "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); @@ -106,7 +114,8 @@ class RentalReviewController extends GetxController { } } else { /// New review - final docRef = FireStoreUtils.fireStore.collection(CollectionName.itemsReview).doc(); + final docRef = + FireStoreUtils.fireStore.collection(CollectionName.itemsReview).doc(); final newRating = RatingModel( id: docRef.id, comment: comment.value.text, @@ -115,7 +124,8 @@ class RentalReviewController extends GetxController { orderId: order.value?.id, driverId: order.value?.driverId.toString(), customerId: Constant.userModel?.id, - uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", + uname: + "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); diff --git a/lib/controllers/restaurant_details_controller.dart b/lib/controllers/restaurant_details_controller.dart index 7901954..dcc56ac 100644 --- a/lib/controllers/restaurant_details_controller.dart +++ b/lib/controllers/restaurant_details_controller.dart @@ -13,11 +13,12 @@ import '../models/attributes_model.dart'; import '../service/cart_provider.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; class RestaurantDetailsController extends GetxController { - Rx searchEditingController = TextEditingController().obs; + Rx searchEditingController = + TextEditingController().obs; RxBool isLoading = true.obs; Rx pageController = PageController().obs; @@ -44,7 +45,8 @@ class RestaurantDetailsController extends GetxController { } void animateSlider() { - if (vendorModel.value.photos != null && vendorModel.value.photos!.isNotEmpty) { + if (vendorModel.value.photos != null && + vendorModel.value.photos!.isNotEmpty) { Timer.periodic(const Duration(seconds: 2), (Timer timer) { if (currentPage < vendorModel.value.photos!.length - 1) { currentPage++; @@ -53,7 +55,11 @@ class RestaurantDetailsController extends GetxController { } if (pageController.value.hasClients) { - pageController.value.animateToPage(currentPage.value, duration: const Duration(milliseconds: 300), curve: Curves.easeIn); + pageController.value.animateToPage( + currentPage.value, + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn, + ); } }); } @@ -86,14 +92,25 @@ class RestaurantDetailsController extends GetxController { RxList brandList = [].obs; Future getProduct() async { - await FireStoreUtils.getProductByVendorId(vendorModel.value.id.toString()).then((value) { - if ((Constant.isSubscriptionModelApplied == true || vendorModel.value.adminCommission?.isEnabled == true) && vendorModel.value.subscriptionPlan != null) { + await FireStoreUtils.getProductByVendorId( + vendorModel.value.id.toString(), + ).then((value) { + if ((Constant.isSubscriptionModelApplied == true || + vendorModel.value.adminCommission?.isEnabled == true) && + vendorModel.value.subscriptionPlan != null) { if (vendorModel.value.subscriptionPlan?.itemLimit == '-1') { allProductList.value = value; productList.value = value; } else { int selectedProduct = - value.length < int.parse(vendorModel.value.subscriptionPlan?.itemLimit ?? '0') ? (value.isEmpty ? 0 : (value.length)) : int.parse(vendorModel.value.subscriptionPlan?.itemLimit ?? '0'); + value.length < + int.parse( + vendorModel.value.subscriptionPlan?.itemLimit ?? '0', + ) + ? (value.isEmpty ? 0 : (value.length)) + : int.parse( + vendorModel.value.subscriptionPlan?.itemLimit ?? '0', + ); allProductList.value = value.sublist(0, selectedProduct); productList.value = value.sublist(0, selectedProduct); } @@ -104,7 +121,9 @@ class RestaurantDetailsController extends GetxController { }); for (var element in productList) { - await FireStoreUtils.getVendorCategoryById(element.categoryID.toString()).then((value) { + await FireStoreUtils.getVendorCategoryById( + element.categoryID.toString(), + ).then((value) { if (value != null) { vendorCategoryList.add(value); } @@ -116,7 +135,10 @@ class RestaurantDetailsController extends GetxController { }); var seen = {}; - vendorCategoryList.value = vendorCategoryList.where((element) => seen.add(element.id.toString())).toList(); + vendorCategoryList.value = + vendorCategoryList + .where((element) => seen.add(element.id.toString())) + .toList(); } void searchProduct(String name) { @@ -126,25 +148,42 @@ class RestaurantDetailsController extends GetxController { } else { isVag.value = false; isNonVag.value = false; - productList.value = allProductList.where((p0) => p0.name!.toLowerCase().contains(name.toLowerCase())).toList(); + productList.value = + allProductList + .where( + (p0) => p0.name!.toLowerCase().contains(name.toLowerCase()), + ) + .toList(); } update(); } void filterRecord() { if (isVag.value == true && isNonVag.value == true) { - productList.value = allProductList.where((p0) => p0.nonveg == true || p0.nonveg == false).toList(); + productList.value = + allProductList + .where((p0) => p0.nonveg == true || p0.nonveg == false) + .toList(); } else if (isVag.value == true && isNonVag.value == false) { - productList.value = allProductList.where((p0) => p0.nonveg == false).toList(); + productList.value = + allProductList.where((p0) => p0.nonveg == false).toList(); } else if (isVag.value == false && isNonVag.value == true) { - productList.value = allProductList.where((p0) => p0.nonveg == true).toList(); + productList.value = + allProductList.where((p0) => p0.nonveg == true).toList(); } else if (isVag.value == false && isNonVag.value == false) { - productList.value = allProductList.where((p0) => p0.nonveg == true || p0.nonveg == false).toList(); + productList.value = + allProductList + .where((p0) => p0.nonveg == true || p0.nonveg == false) + .toList(); } } - Future> getProductByCategory(VendorCategoryModel vendorCategoryModel) async { - return productList.where((p0) => p0.categoryID == vendorCategoryModel.id).toList(); + Future> getProductByCategory( + VendorCategoryModel vendorCategoryModel, + ) async { + return productList + .where((p0) => p0.categoryID == vendorCategoryModel.id) + .toList(); } Future getFavouriteList() async { @@ -157,7 +196,9 @@ class RestaurantDetailsController extends GetxController { favouriteItemList.value = value; }); - await FireStoreUtils.getOfferByVendorId(vendorModel.value.id.toString()).then((value) { + await FireStoreUtils.getOfferByVendorId( + vendorModel.value.id.toString(), + ).then((value) { couponList.value = value; }); } @@ -175,8 +216,12 @@ class RestaurantDetailsController extends GetxController { if (day == element.day.toString()) { if (element.timeslot!.isNotEmpty) { for (var element in element.timeslot!) { - var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}"); - var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}"); + var start = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.from}"); + var end = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.to}"); if (isCurrentDateInRange(start, end)) { isOpen.value = true; } @@ -219,15 +264,33 @@ class RestaurantDetailsController extends GetxController { String adOnsPrice = "0"; if (productModel.itemAttribute != null) { - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { + if (productModel.itemAttribute!.variants! + .where((element) => element.variantSku == selectedVariants.join('-')) + .isNotEmpty) { variantPrice = Constant.productCommissionPrice( vendorModel.value, - productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0', + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == selectedVariants.join('-'), + ) + .first + .variantPrice ?? + '0', ); } } else { - String price = Constant.productCommissionPrice(vendorModel.value, productModel.price.toString()); - String disPrice = double.parse(productModel.disPrice.toString()) <= 0 ? "0" : Constant.productCommissionPrice(vendorModel.value, productModel.disPrice.toString()); + String price = Constant.productCommissionPrice( + vendorModel.value, + productModel.price.toString(), + ); + String disPrice = + double.parse(productModel.disPrice.toString()) <= 0 + ? "0" + : Constant.productCommissionPrice( + vendorModel.value, + productModel.disPrice.toString(), + ); if (double.parse(disPrice) <= 0) { variantPrice = price; } else { @@ -237,11 +300,23 @@ class RestaurantDetailsController extends GetxController { for (int i = 0; i < productModel.addOnsPrice!.length; i++) { if (selectedAddOns.contains(productModel.addOnsTitle![i]) == true) { - adOnsPrice = (double.parse(adOnsPrice.toString()) + double.parse(Constant.productCommissionPrice(vendorModel.value, productModel.addOnsPrice![i].toString()))).toString(); + adOnsPrice = + (double.parse(adOnsPrice.toString()) + + double.parse( + Constant.productCommissionPrice( + vendorModel.value, + productModel.addOnsPrice![i].toString(), + ), + )) + .toString(); } } adOnsPrice = (quantity.value * double.parse(adOnsPrice)).toString(); - mainPrice = ((double.parse(variantPrice.toString()) * double.parse(quantity.value.toString())) + double.parse(adOnsPrice.toString())).toString(); + mainPrice = + ((double.parse(variantPrice.toString()) * + double.parse(quantity.value.toString())) + + double.parse(adOnsPrice.toString())) + .toString(); return mainPrice; } @@ -253,18 +328,35 @@ class RestaurantDetailsController extends GetxController { }); } - Future addToCart({required ProductModel productModel, required String price, required String discountPrice, required bool isIncrement, required int quantity, VariantInfo? variantInfo}) async { + Future addToCart({ + required ProductModel productModel, + required String price, + required String discountPrice, + required bool isIncrement, + required int quantity, + VariantInfo? variantInfo, + }) async { CartProductModel cartProductModel = CartProductModel(); String adOnsPrice = "0"; for (int i = 0; i < productModel.addOnsPrice!.length; i++) { - if (selectedAddOns.contains(productModel.addOnsTitle![i]) == true && productModel.addOnsPrice![i] != '0') { - adOnsPrice = (double.parse(adOnsPrice.toString()) + double.parse(Constant.productCommissionPrice(vendorModel.value, productModel.addOnsPrice![i].toString()))).toString(); + if (selectedAddOns.contains(productModel.addOnsTitle![i]) == true && + productModel.addOnsPrice![i] != '0') { + adOnsPrice = + (double.parse(adOnsPrice.toString()) + + double.parse( + Constant.productCommissionPrice( + vendorModel.value, + productModel.addOnsPrice![i].toString(), + ), + )) + .toString(); } } if (variantInfo != null) { - cartProductModel.id = "${productModel.id!}~${variantInfo.variantId.toString()}"; + cartProductModel.id = + "${productModel.id!}~${variantInfo.variantId.toString()}"; cartProductModel.name = productModel.name!; cartProductModel.photo = productModel.photo!; cartProductModel.categoryId = productModel.categoryID!; diff --git a/lib/controllers/restaurant_list_controller.dart b/lib/controllers/restaurant_list_controller.dart index fe953e2..bfe86f8 100644 --- a/lib/controllers/restaurant_list_controller.dart +++ b/lib/controllers/restaurant_list_controller.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class RestaurantListController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/review_list_controller.dart b/lib/controllers/review_list_controller.dart index 540165c..659bfb5 100644 --- a/lib/controllers/review_list_controller.dart +++ b/lib/controllers/review_list_controller.dart @@ -1,7 +1,7 @@ import 'package:customer/models/rating_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class ReviewListController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/scan_qr_code_controller.dart b/lib/controllers/scan_qr_code_controller.dart index 066dcee..8c36a5b 100644 --- a/lib/controllers/scan_qr_code_controller.dart +++ b/lib/controllers/scan_qr_code_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class ScanQrCodeController extends GetxController { @override diff --git a/lib/controllers/search_controller.dart b/lib/controllers/search_controller.dart index bf20ea6..01dee30 100644 --- a/lib/controllers/search_controller.dart +++ b/lib/controllers/search_controller.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class SearchScreenController extends GetxController { @override @@ -28,13 +28,20 @@ class SearchScreenController extends GetxController { isLoading.value = false; for (var element in vendorList) { - await FireStoreUtils.getProductByVendorId(element.id.toString()).then((value) { - if ((Constant.isSubscriptionModelApplied == true || element.adminCommission?.isEnabled == true) && element.subscriptionPlan != null) { + await FireStoreUtils.getProductByVendorId(element.id.toString()).then(( + value, + ) { + if ((Constant.isSubscriptionModelApplied == true || + element.adminCommission?.isEnabled == true) && + element.subscriptionPlan != null) { if (element.subscriptionPlan?.itemLimit == '-1') { productList.addAll(value); } else { int selectedProduct = - value.length < int.parse(element.subscriptionPlan?.itemLimit ?? '0') ? (value.isEmpty ? 0 : (value.length)) : int.parse(element.subscriptionPlan?.itemLimit ?? '0'); + value.length < + int.parse(element.subscriptionPlan?.itemLimit ?? '0') + ? (value.isEmpty ? 0 : (value.length)) + : int.parse(element.subscriptionPlan?.itemLimit ?? '0'); productList.addAll(value.sublist(0, selectedProduct)); } } else { diff --git a/lib/controllers/service_list_controller.dart b/lib/controllers/service_list_controller.dart index b12354b..e21ce0f 100644 --- a/lib/controllers/service_list_controller.dart +++ b/lib/controllers/service_list_controller.dart @@ -16,7 +16,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart' as auth; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../screen_ui/auth_screens/login_screen.dart'; import '../screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart'; import '../screen_ui/on_demand_service/on_demand_dashboard_screen.dart'; diff --git a/lib/controllers/sign_up_controller.dart b/lib/controllers/sign_up_controller.dart index 04f9de4..bd990ba 100644 --- a/lib/controllers/sign_up_controller.dart +++ b/lib/controllers/sign_up_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/user_model.dart'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:firebase_auth/firebase_auth.dart' as auth; import '../constant/constant.dart'; import '../models/referral_model.dart'; @@ -17,9 +17,11 @@ class SignUpController extends GetxController { Rx lastNameController = TextEditingController().obs; Rx emailController = TextEditingController().obs; Rx mobileController = TextEditingController().obs; - Rx countryCodeController = TextEditingController(text: Constant.defaultCountryCode).obs; + Rx countryCodeController = + TextEditingController(text: Constant.defaultCountryCode).obs; Rx passwordController = TextEditingController().obs; - Rx confirmPasswordController = TextEditingController().obs; + Rx confirmPasswordController = + TextEditingController().obs; Rx referralController = TextEditingController().obs; final FocusNode emailFocusNode = FocusNode(); @@ -90,7 +92,8 @@ class SignUpController extends GetxController { } else if (lastNameController.value.text.isEmpty) { ShowToastDialog.showToast("Please enter last name".tr()); return false; - } else if (emailController.value.text.isEmpty || !emailController.value.text.isEmail) { + } else if (emailController.value.text.isEmpty || + !emailController.value.text.isEmail) { ShowToastDialog.showToast("Please enter a valid email address".tr()); return false; } else if (mobileController.value.text.isEmpty) { @@ -99,8 +102,11 @@ class SignUpController extends GetxController { } else if (passwordController.value.text.length < 6) { ShowToastDialog.showToast("Password must be at least 6 characters".tr()); return false; - } else if (passwordController.value.text != confirmPasswordController.value.text) { - ShowToastDialog.showToast("Password and Confirm password do not match".tr()); + } else if (passwordController.value.text != + confirmPasswordController.value.text) { + ShowToastDialog.showToast( + "Password and Confirm password do not match".tr(), + ); return false; } return true; @@ -109,7 +115,10 @@ class SignUpController extends GetxController { /// Email Sign-up Flow Future _signUpWithEmail() async { try { - final credential = await _firebaseAuth.createUserWithEmailAndPassword(email: emailController.value.text.trim(), password: passwordController.value.text.trim()); + final credential = await _firebaseAuth.createUserWithEmailAndPassword( + email: emailController.value.text.trim(), + password: passwordController.value.text.trim(), + ); if (credential.user != null) { final newUser = await _buildUserModel(credential.user?.uid ?? ''); @@ -119,7 +128,9 @@ class SignUpController extends GetxController { _navigateBasedOnAddress(newUser); } } on auth.FirebaseAuthException catch (e) { - debugPrint("FirebaseAuthException caught: code=${e.code}, message=${e.message}"); + debugPrint( + "FirebaseAuthException caught: code=${e.code}, message=${e.message}", + ); if (e.code == 'email-already-in-use') { ShowToastDialog.showToast("Email already in use".tr()); } else if (e.code == 'weak-password') { @@ -131,7 +142,9 @@ class SignUpController extends GetxController { } } catch (e) { debugPrint("Something went wrong: ${e.toString()}"); - ShowToastDialog.showToast("${'something_went_wrong'.tr()}: ${e.toString()}"); + ShowToastDialog.showToast( + "${'something_went_wrong'.tr()}: ${e.toString()}", + ); } } @@ -173,9 +186,17 @@ class SignUpController extends GetxController { /// Handle Referral Logic Future _handleReferral(String userId) async { final referralCode = referralController.value.text.trim(); - final referralBy = referralCode.isNotEmpty ? (await FireStoreUtils.getReferralUserByCode(referralCode))?.id ?? '' : ''; + final referralBy = + referralCode.isNotEmpty + ? (await FireStoreUtils.getReferralUserByCode(referralCode))?.id ?? + '' + : ''; - final referral = ReferralModel(id: userId, referralBy: referralBy, referralCode: Constant.getReferralCode()); + final referral = ReferralModel( + id: userId, + referralBy: referralBy, + referralCode: Constant.getReferralCode(), + ); await FireStoreUtils.referralAdd(referral); } @@ -183,7 +204,10 @@ class SignUpController extends GetxController { /// Navigate Based on Shipping Address void _navigateBasedOnAddress(UserModel user) { if (user.shippingAddress?.isNotEmpty == true) { - final defaultAddress = user.shippingAddress!.firstWhere((e) => e.isDefault == true, orElse: () => user.shippingAddress!.first); + final defaultAddress = user.shippingAddress!.firstWhere( + (e) => e.isDefault == true, + orElse: () => user.shippingAddress!.first, + ); /// Save the default address to global constant Constant.selectedLocation = defaultAddress; diff --git a/lib/controllers/splash_controller.dart b/lib/controllers/splash_controller.dart index 3042224..3143267 100644 --- a/lib/controllers/splash_controller.dart +++ b/lib/controllers/splash_controller.dart @@ -7,7 +7,7 @@ import 'package:customer/screen_ui/service_home_screen/service_list_screen.dart' import 'package:customer/utils/notification_service.dart'; import 'package:customer/utils/preferences.dart'; import 'package:firebase_auth/firebase_auth.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../screen_ui/auth_screens/login_screen.dart'; import '../screen_ui/location_enable_screens/location_permission_screen.dart'; import '../screen_ui/on_boarding_screen/on_boarding_screen.dart'; @@ -30,7 +30,9 @@ class SplashController extends GetxController { } else { bool isLogin = await FireStoreUtils.isLogin(); if (isLogin == true) { - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) async { + await FireStoreUtils.getUserProfile( + FireStoreUtils.getCurrentUid(), + ).then((value) async { if (value != null) { UserModel userModel = value; log(userModel.toJson().toString()); @@ -38,11 +40,18 @@ class SplashController extends GetxController { if (userModel.active == true) { userModel.fcmToken = await NotificationService.getToken(); await FireStoreUtils.updateUser(userModel); - if (userModel.shippingAddress != null && userModel.shippingAddress!.isNotEmpty) { - if (userModel.shippingAddress!.where((element) => element.isDefault == true).isNotEmpty) { - Constant.selectedLocation = userModel.shippingAddress!.where((element) => element.isDefault == true).single; + if (userModel.shippingAddress != null && + userModel.shippingAddress!.isNotEmpty) { + if (userModel.shippingAddress! + .where((element) => element.isDefault == true) + .isNotEmpty) { + Constant.selectedLocation = + userModel.shippingAddress! + .where((element) => element.isDefault == true) + .single; } else { - Constant.selectedLocation = userModel.shippingAddress!.first; + Constant.selectedLocation = + userModel.shippingAddress!.first; } Get.offAll(const ServiceListScreen()); } else { diff --git a/lib/controllers/theme_controller.dart b/lib/controllers/theme_controller.dart index 64b05d6..92ebb62 100644 --- a/lib/controllers/theme_controller.dart +++ b/lib/controllers/theme_controller.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../utils/preferences.dart'; class ThemeController extends GetxController { @@ -23,5 +23,3 @@ class ThemeController extends GetxController { ThemeMode get themeMode => isDark.value ? ThemeMode.dark : ThemeMode.light; } - - diff --git a/lib/controllers/view_all_category_controller.dart b/lib/controllers/view_all_category_controller.dart index 1612e88..52ad4a4 100644 --- a/lib/controllers/view_all_category_controller.dart +++ b/lib/controllers/view_all_category_controller.dart @@ -1,7 +1,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/vendor_category_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class ViewAllCategoryController extends GetxController { RxBool isLoading = true.obs; @@ -18,12 +18,19 @@ class ViewAllCategoryController extends GetxController { Future getCategoryData() async { await FireStoreUtils.getVendorCategory().then((value) { vendorCategoryModel.value = value; - }); if (Constant.restaurantList != null) { - List usedCategoryIds = Constant.restaurantList!.expand((vendor) => vendor.categoryID ?? []).whereType().toSet().toList(); - vendorCategoryModel.value = vendorCategoryModel.where((category) => usedCategoryIds.contains(category.id)).toList(); + List usedCategoryIds = + Constant.restaurantList! + .expand((vendor) => vendor.categoryID ?? []) + .whereType() + .toSet() + .toList(); + vendorCategoryModel.value = + vendorCategoryModel + .where((category) => usedCategoryIds.contains(category.id)) + .toList(); } isLoading.value = false; diff --git a/lib/controllers/view_all_popular_service_controller.dart b/lib/controllers/view_all_popular_service_controller.dart index 24da089..68379a6 100644 --- a/lib/controllers/view_all_popular_service_controller.dart +++ b/lib/controllers/view_all_popular_service_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/on_demand_home_controller.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:flutter/material.dart'; import '../models/favorite_ondemand_service_model.dart'; import '../models/provider_serivce_model.dart'; @@ -10,13 +10,17 @@ class ViewAllPopularServiceController extends GetxController { RxList providerList = [].obs; RxList allProviderList = [].obs; RxBool isLoading = true.obs; - Rx onDemandHomeController = Get.find().obs; + Rx onDemandHomeController = + Get.find().obs; - final OnDemandHomeController onDemandController = Get.find(); + final OnDemandHomeController onDemandController = + Get.find(); - Rx searchTextFiledController = TextEditingController().obs; + Rx searchTextFiledController = + TextEditingController().obs; - RxList lstFav = [].obs; + RxList lstFav = + [].obs; @override void onInit() { @@ -29,24 +33,31 @@ class ViewAllPopularServiceController extends GetxController { await FireStoreUtils.getProviderFuture() .then((providerServiceList) { - Set uniqueAuthorIds = providerServiceList.map((service) => service.author).toSet(); + Set uniqueAuthorIds = + providerServiceList.map((service) => service.author).toSet(); List listOfUniqueProviders = uniqueAuthorIds.toList(); List filteredProviders = []; for (var provider in listOfUniqueProviders) { - List filteredList = providerServiceList.where((service) => service.author == provider).toList(); + List filteredList = + providerServiceList + .where((service) => service.author == provider) + .toList(); filteredList.sort((a, b) => a.createdAt!.compareTo(b.createdAt!)); for (int index = 0; index < filteredList.length; index++) { final service = filteredList[index]; - if (Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) { + if (Constant.isSubscriptionModelApplied == true || + Constant.sectionConstantModel?.adminCommision?.isEnabled == + true) { if (service.subscriptionPlan?.itemLimit == "-1") { filteredProviders.add(service); } else { - if (index < int.parse(service.subscriptionPlan?.itemLimit ?? '0')) { + if (index < + int.parse(service.subscriptionPlan?.itemLimit ?? '0')) { filteredProviders.add(service); } } @@ -66,7 +77,9 @@ class ViewAllPopularServiceController extends GetxController { }); if (Constant.userModel != null) { - await FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getFavouritesServiceList( + FireStoreUtils.getCurrentUid(), + ).then((value) { lstFav.value = value; }); } @@ -75,7 +88,14 @@ class ViewAllPopularServiceController extends GetxController { void getFilterData(String value) { if (value.isNotEmpty) { - providerList.value = allProviderList.where((e) => e.title!.toLowerCase().contains(value.toLowerCase()) || e.title!.startsWith(value)).toList(); + providerList.value = + allProviderList + .where( + (e) => + e.title!.toLowerCase().contains(value.toLowerCase()) || + e.title!.startsWith(value), + ) + .toList(); } else { providerList.assignAll(allProviderList); } diff --git a/lib/controllers/view_category_service_controller.dart b/lib/controllers/view_category_service_controller.dart index 58cdaf6..433bd2a 100644 --- a/lib/controllers/view_category_service_controller.dart +++ b/lib/controllers/view_category_service_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/on_demand_home_controller.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/provider_serivce_model.dart'; import '../service/fire_store_utils.dart'; @@ -9,7 +9,8 @@ class ViewCategoryServiceController extends GetxController { RxList providerList = [].obs; RxString categoryId = "".obs, categoryTitle = "".obs; - Rx onDemandHomeController = Get.find().obs; + Rx onDemandHomeController = + Get.find().obs; @override void onInit() { @@ -26,21 +27,32 @@ class ViewCategoryServiceController extends GetxController { providerList.clear(); isLoading.value = true; - List providerServiceList = await FireStoreUtils.getProviderFuture(categoryId: categoryId.value); + List providerServiceList = + await FireStoreUtils.getProviderFuture(categoryId: categoryId.value); - List uniqueAuthId = providerServiceList.map((service) => service.author).toList(); - List uniqueServiceId = providerServiceList.map((service) => service.id).toList(); + List uniqueAuthId = + providerServiceList.map((service) => service.author).toList(); + List uniqueServiceId = + providerServiceList.map((service) => service.id).toList(); List filterByItemLimit = []; List uniqueId = []; - if ((Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel!.adminCommision?.isEnabled == true)) { + if ((Constant.isSubscriptionModelApplied == true || + Constant.sectionConstantModel!.adminCommision?.isEnabled == true)) { for (var authUser in uniqueAuthId) { - List listofAllServiceByAuth = await FireStoreUtils.getAllProviderServiceByAuthorId(authUser!); + List listofAllServiceByAuth = + await FireStoreUtils.getAllProviderServiceByAuthorId(authUser!); for (int i = 0; i < listofAllServiceByAuth.length; i++) { if (listofAllServiceByAuth[i].subscriptionPlan?.itemLimit != null && - (i < int.parse(listofAllServiceByAuth[i].subscriptionPlan?.itemLimit ?? '0') || listofAllServiceByAuth[i].subscriptionPlan?.itemLimit == '-1')) { + (i < + int.parse( + listofAllServiceByAuth[i].subscriptionPlan?.itemLimit ?? + '0', + ) || + listofAllServiceByAuth[i].subscriptionPlan?.itemLimit == + '-1')) { if (uniqueServiceId.contains(listofAllServiceByAuth[i].id)) { filterByItemLimit.add(listofAllServiceByAuth[i]); } @@ -49,7 +61,9 @@ class ViewCategoryServiceController extends GetxController { for (var service in filterByItemLimit) { for (var unique in uniqueServiceId) { - if (service.id == unique && !uniqueId.contains(service.id) && service.subscriptionTotalOrders != '0') { + if (service.id == unique && + !uniqueId.contains(service.id) && + service.subscriptionTotalOrders != '0') { uniqueId.add(service.id); providerList.add(service); } diff --git a/lib/controllers/wallet_controller.dart b/lib/controllers/wallet_controller.dart index 638eddc..44518fb 100644 --- a/lib/controllers/wallet_controller.dart +++ b/lib/controllers/wallet_controller.dart @@ -34,7 +34,7 @@ import '../payment/xenditScreen.dart'; import '../service/fire_store_utils.dart'; import 'package:customer/utils/preferences.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:uuid/uuid.dart'; @@ -45,7 +45,8 @@ class WalletController extends GetxController { Rx topUpAmountController = TextEditingController().obs; - RxList walletTransactionList = [].obs; + RxList walletTransactionList = + [].obs; Rx userModel = UserModel().obs; RxString selectedPaymentMethod = "".obs; @@ -71,17 +72,37 @@ class WalletController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(json.decode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + json.decode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); Stripe.publishableKey = stripeModel.value.clientpublishableKey.toString(); Stripe.merchantIdentifier = 'GoRide'; @@ -101,7 +122,9 @@ class WalletController extends GetxController { walletTransactionList.value = value; } }); - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + value, + ) { if (value != null) { userModel.value = value; } @@ -123,9 +146,14 @@ class WalletController extends GetxController { paymentStatus: "success", ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: topUpAmountController.value.text, userId: FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.updateUserWallet( + amount: topUpAmountController.value.text, + userId: FireStoreUtils.getCurrentUid(), + ).then((value) { getWalletTransaction(); Get.back(); }); @@ -139,20 +167,32 @@ class WalletController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -198,7 +238,10 @@ class WalletController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -208,8 +251,14 @@ class WalletController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -222,11 +271,20 @@ class WalletController extends GetxController { }, ], "payer": {"email": userModel.value.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, - "auto_return": "approved", // Automatically return after payment is approved + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, + "auto_return": + "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -239,7 +297,9 @@ class WalletController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something want wrong please contact administrator".tr()); + ShowToastDialog.showToast( + "Something want wrong please contact administrator".tr(), + ); print('Error creating preference: ${response.body}'); return null; } @@ -284,9 +344,12 @@ class WalletController extends GetxController { ///PayStack Payment Method Future payStackPayment(String totalAmount) async { - await PayStackURLGen.payStackURLGen(amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value).then(( - value, - ) async { + await PayStackURLGen.payStackURLGen( + amount: (double.parse(totalAmount) * 100).toString(), + currency: "ZAR", + secretKey: payStackModel.value.secretKey.toString(), + userModel: userModel.value, + ).then((value) async { if (value != null) { PayStackUrlModel payStackModel0 = value; Get.to( @@ -306,15 +369,23 @@ class WalletController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -327,14 +398,19 @@ class WalletController extends GetxController { "phonenumber": userModel.value.phoneNumber, // Add a real phone number "name": userModel.value.fullName(), // Add a real customer name }, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); @@ -363,8 +439,14 @@ class WalletController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: userModel.value, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -389,7 +471,10 @@ class WalletController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': userModel.value.phoneNumber, 'email': userModel.value.email}, + 'prefill': { + 'contact': userModel.value.phoneNumber, + 'email': userModel.value.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -418,7 +503,10 @@ class WalletController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -436,15 +524,30 @@ class WalletController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -452,7 +555,9 @@ class WalletController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -469,13 +574,30 @@ class WalletController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); @@ -486,13 +608,22 @@ class WalletController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -500,17 +631,32 @@ class WalletController extends GetxController { Map responseData = jsonDecode(response.body); accessToken = responseData['access_token']; - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; - String apiUrl = orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + orangeMoneyModel.value.isSandbox! == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, @@ -525,7 +671,11 @@ class WalletController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); print(response.statusCode); @@ -541,7 +691,9 @@ class WalletController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -558,7 +710,13 @@ class WalletController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); @@ -574,7 +732,9 @@ class WalletController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -587,7 +747,11 @@ class WalletController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/main.dart b/lib/main.dart index bc48340..94ab4a6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -13,6 +13,8 @@ import 'controllers/global_setting_controller.dart'; import 'controllers/theme_controller.dart'; import 'firebase_options.dart'; + + void main() async { WidgetsFlutterBinding.ensureInitialized(); await EasyLocalization.ensureInitialized(); diff --git a/lib/payment/MercadoPagoScreen.dart b/lib/payment/MercadoPagoScreen.dart index f296a79..432e62c 100644 --- a/lib/payment/MercadoPagoScreen.dart +++ b/lib/payment/MercadoPagoScreen.dart @@ -3,7 +3,7 @@ import 'dart:async'; import 'package:customer/constant/constant.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:webview_flutter/webview_flutter.dart'; class MercadoPagoScreen extends StatefulWidget { @@ -36,10 +36,17 @@ class _MercadoPagoScreenState extends State { onWebResourceError: (WebResourceError error) {}, onNavigationRequest: (NavigationRequest navigation) async { debugPrint("--->2 ${navigation.url}"); - if (navigation.url.contains("${Constant.globalUrl}payment/success")) { + if (navigation.url.contains( + "${Constant.globalUrl}payment/success", + )) { Get.back(result: true); } - if (navigation.url.contains("${Constant.globalUrl}payment/failure") || navigation.url.contains("${Constant.globalUrl}payment/pending")) { + if (navigation.url.contains( + "${Constant.globalUrl}payment/failure", + ) || + navigation.url.contains( + "${Constant.globalUrl}payment/pending", + )) { Get.back(result: false); } return NavigationDecision.navigate; @@ -82,14 +89,20 @@ class _MercadoPagoScreenState extends State { content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), actions: [ TextButton( - child: Text('Cancel'.tr(), style: const TextStyle(color: Colors.red)), + child: Text( + 'Cancel'.tr(), + style: const TextStyle(color: Colors.red), + ), onPressed: () { Navigator.of(context).pop(); Get.back(result: false); }, ), TextButton( - child: Text('Continue'.tr(), style: const TextStyle(color: Colors.green)), + child: Text( + 'Continue'.tr(), + style: const TextStyle(color: Colors.green), + ), onPressed: () { Navigator.of(context).pop(); }, diff --git a/lib/payment/PayFastScreen.dart b/lib/payment/PayFastScreen.dart index 5b24b4e..d1cd451 100644 --- a/lib/payment/PayFastScreen.dart +++ b/lib/payment/PayFastScreen.dart @@ -6,14 +6,18 @@ import 'package:customer/models/payment_model/pay_fast_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:webview_flutter/webview_flutter.dart'; class PayFastScreen extends StatefulWidget { final String htmlData; final PayFastModel payFastSettingData; - const PayFastScreen({super.key, required this.htmlData, required this.payFastSettingData}); + const PayFastScreen({ + super.key, + required this.htmlData, + required this.payFastSettingData, + }); @override State createState() => _PayFastScreenState(); @@ -45,9 +49,11 @@ class _PayFastScreenState extends State { } if (navigation.url == widget.payFastSettingData.returnUrl) { Get.back(result: true); - } else if (navigation.url == widget.payFastSettingData.notifyUrl) { + } else if (navigation.url == + widget.payFastSettingData.notifyUrl) { Get.back(result: false); - } else if (navigation.url == widget.payFastSettingData.cancelUrl) { + } else if (navigation.url == + widget.payFastSettingData.cancelUrl) { _showMyDialog(); } return NavigationDecision.navigate; @@ -95,7 +101,10 @@ class _PayFastScreenState extends State { }, ), TextButton( - child: Text('Continue Payment'.tr(), style: TextStyle(color: Colors.green)), + child: Text( + 'Continue Payment'.tr(), + style: TextStyle(color: Colors.green), + ), onPressed: () { Get.back(); }, diff --git a/lib/payment/midtrans_screen.dart b/lib/payment/midtrans_screen.dart index 7336b51..9c6c6c2 100644 --- a/lib/payment/midtrans_screen.dart +++ b/lib/payment/midtrans_screen.dart @@ -4,7 +4,7 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:webview_flutter/webview_flutter.dart'; class MidtransScreen extends StatefulWidget { @@ -48,7 +48,10 @@ class _MidtransScreenState extends State { Get.back(result: false); } } else { - String? orderId = Uri.parse(navigation.url).queryParameters['merchant_order_id']; + String? orderId = + Uri.parse( + navigation.url, + ).queryParameters['merchant_order_id']; if (orderId != null) { Get.back(result: true); } else { @@ -81,7 +84,16 @@ class _MidtransScreenState extends State { child: const Icon(Icons.arrow_back, color: Colors.white), ), ), - body: Stack(alignment: Alignment.center, children: [WebViewWidget(controller: controller), Visibility(visible: isLoading, child: const Center(child: CircularProgressIndicator()))]), + body: Stack( + alignment: Alignment.center, + children: [ + WebViewWidget(controller: controller), + Visibility( + visible: isLoading, + child: const Center(child: CircularProgressIndicator()), + ), + ], + ), ), ); } @@ -96,14 +108,20 @@ class _MidtransScreenState extends State { content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), actions: [ TextButton( - child: Text('Cancel'.tr(), style: const TextStyle(color: Colors.red)), + child: Text( + 'Cancel'.tr(), + style: const TextStyle(color: Colors.red), + ), onPressed: () { Get.back(result: false); Get.back(result: false); }, ), TextButton( - child: Text('Continue'.tr(), style: const TextStyle(color: Colors.green)), + child: Text( + 'Continue'.tr(), + style: const TextStyle(color: Colors.green), + ), onPressed: () { Get.back(result: false); }, diff --git a/lib/payment/orangePayScreen.dart b/lib/payment/orangePayScreen.dart index 47e0f6b..7d2bbd7 100644 --- a/lib/payment/orangePayScreen.dart +++ b/lib/payment/orangePayScreen.dart @@ -5,7 +5,7 @@ import 'dart:convert'; import 'package:customer/models/payment_model/orange_money.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:webview_flutter/webview_flutter.dart'; @@ -17,7 +17,15 @@ class OrangeMoneyScreen extends StatefulWidget { String orderId = ''; String amount = ''; - OrangeMoneyScreen({super.key, required this.initialURl, required this.orangePay, required this.accessToken, required this.payToken, required this.orderId, required this.amount}); + OrangeMoneyScreen({ + super.key, + required this.initialURl, + required this.orangePay, + required this.accessToken, + required this.payToken, + required this.orderId, + required this.amount, + }); @override State createState() => _OrangeMoneyScreenState(); @@ -41,7 +49,12 @@ class _OrangeMoneyScreenState extends State { timer = Timer.periodic(const Duration(seconds: 3), (Timer t) async { if (!mounted) return; - String status = await transactionStatus(accessToken: widget.accessToken, amount: widget.amount, orderId: widget.orderId, payToken: widget.payToken); + String status = await transactionStatus( + accessToken: widget.accessToken, + amount: widget.amount, + orderId: widget.orderId, + payToken: widget.payToken, + ); if (status == 'SUCCESS') { timer?.cancel(); @@ -72,15 +85,31 @@ class _OrangeMoneyScreenState extends State { ..loadRequest(Uri.parse(widget.initialURl)); } - Future transactionStatus({required String orderId, required String amount, required String payToken, required String accessToken}) async { - String apiUrl = widget.orangePay.isSandbox == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/transactionstatus' : 'https://api.orange.com/orange-money-webpay/cm/v1/transactionstatus'; + Future transactionStatus({ + required String orderId, + required String amount, + required String payToken, + required String accessToken, + }) async { + String apiUrl = + widget.orangePay.isSandbox == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/transactionstatus' + : 'https://api.orange.com/orange-money-webpay/cm/v1/transactionstatus'; - Map requestBody = {"order_id": orderId, "amount": amount, "pay_token": payToken}; + Map requestBody = { + "order_id": orderId, + "amount": amount, + "pay_token": payToken, + }; try { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -107,10 +136,16 @@ class _OrangeMoneyScreenState extends State { child: Scaffold( appBar: AppBar( backgroundColor: Colors.black, - leading: IconButton(icon: const Icon(Icons.arrow_back, color: Colors.white), onPressed: _showCancelDialog), + leading: IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.white), + onPressed: _showCancelDialog, + ), title: Text('Orange Money Payment'.tr()), ), - body: isLoading ? const Center(child: CircularProgressIndicator()) : WebViewWidget(controller: controller), + body: + isLoading + ? const Center(child: CircularProgressIndicator()) + : WebViewWidget(controller: controller), ), ); } @@ -124,9 +159,12 @@ class _OrangeMoneyScreenState extends State { title: Text('Cancel Payment'.tr()), content: Text('Are you sure you want to cancel this payment?'.tr()), actions: [ - TextButton(child: Text('No', style: TextStyle(color: Colors.green)), onPressed: () => Get.back()), TextButton( - child: Text('Yes'.tr(), style: TextStyle(color: Colors.red)), + child: Text('No', style: TextStyle(color: Colors.green)), + onPressed: () => Get.back(), + ), + TextButton( + child: Text('Yes'.tr(), style: TextStyle(color: Colors.red)), onPressed: () { timer?.cancel(); Get.back(); // close dialog @@ -152,8 +190,7 @@ class _OrangeMoneyScreenState extends State { // import 'dart:convert'; // import 'package:customer/models/payment_model/orange_money.dart'; // import 'package:flutter/material.dart'; -// import 'package:get/get.dart'; -// import 'package:http/http.dart' as http; +// import 'package:get/get.dart' hide Trans;// import 'package:http/http.dart' as http; // import 'package:webview_flutter/webview_flutter.dart'; // // class OrangeMoneyScreen extends StatefulWidget { diff --git a/lib/payment/paystack/pay_stack_screen.dart b/lib/payment/paystack/pay_stack_screen.dart index d33d2b4..51d3854 100644 --- a/lib/payment/paystack/pay_stack_screen.dart +++ b/lib/payment/paystack/pay_stack_screen.dart @@ -4,7 +4,7 @@ import 'package:customer/payment/paystack/paystack_url_genrater.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:webview_flutter/webview_flutter.dart'; class PayStackScreen extends StatefulWidget { @@ -14,7 +14,14 @@ class PayStackScreen extends StatefulWidget { final String secretKey; final String callBackUrl; - const PayStackScreen({super.key, required this.initialURl, required this.reference, required this.amount, required this.secretKey, required this.callBackUrl}); + const PayStackScreen({ + super.key, + required this.initialURl, + required this.reference, + required this.amount, + required this.secretKey, + required this.callBackUrl, + }); @override State createState() => _PayStackScreenState(); @@ -30,37 +37,52 @@ class _PayStackScreenState extends State { } void initController() { - controller = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setBackgroundColor(const Color(0x00000000)) - ..setNavigationDelegate( - NavigationDelegate( - onProgress: (int progress) { - // Update loading bar. - }, - onPageStarted: (String url) {}, - onPageFinished: (String url) {}, - onWebResourceError: (WebResourceError error) {}, - onNavigationRequest: (NavigationRequest navigation) async { - debugPrint("--->2${navigation.url}"); - debugPrint("--->2" "${widget.callBackUrl}?trxref=${widget.reference}&reference=${widget.reference}"); - if (navigation.url == 'https://foodieweb.siswebapp.com/success?trxref=${widget.reference}&reference=${widget.reference}' || - navigation.url == '${widget.callBackUrl}?trxref=${widget.reference}&reference=${widget.reference}') { - final isDone = await PayStackURLGen.verifyTransaction(secretKey: widget.secretKey, reference: widget.reference, amount: widget.amount); - Get.back(result: isDone); - } - if ((navigation.url == '${widget.callBackUrl}?trxref=${widget.reference}&reference=${widget.reference}') || - (navigation.url == "https://hello.pstk.xyz/callback") || - (navigation.url == 'https://standard.paystack.co/close') || - (navigation.url == 'https://talazo.app/login')) { - final isDone = await PayStackURLGen.verifyTransaction(secretKey: widget.secretKey, reference: widget.reference, amount: widget.amount); - Get.back(result: isDone); - } - return NavigationDecision.navigate; - }, - ), - ) - ..loadRequest(Uri.parse(widget.initialURl)); + controller = + WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setBackgroundColor(const Color(0x00000000)) + ..setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) { + // Update loading bar. + }, + onPageStarted: (String url) {}, + onPageFinished: (String url) {}, + onWebResourceError: (WebResourceError error) {}, + onNavigationRequest: (NavigationRequest navigation) async { + debugPrint("--->2${navigation.url}"); + debugPrint( + "--->2" + "${widget.callBackUrl}?trxref=${widget.reference}&reference=${widget.reference}", + ); + if (navigation.url == + 'https://foodieweb.siswebapp.com/success?trxref=${widget.reference}&reference=${widget.reference}' || + navigation.url == + '${widget.callBackUrl}?trxref=${widget.reference}&reference=${widget.reference}') { + final isDone = await PayStackURLGen.verifyTransaction( + secretKey: widget.secretKey, + reference: widget.reference, + amount: widget.amount, + ); + Get.back(result: isDone); + } + if ((navigation.url == + '${widget.callBackUrl}?trxref=${widget.reference}&reference=${widget.reference}') || + (navigation.url == "https://hello.pstk.xyz/callback") || + (navigation.url == 'https://standard.paystack.co/close') || + (navigation.url == 'https://talazo.app/login')) { + final isDone = await PayStackURLGen.verifyTransaction( + secretKey: widget.secretKey, + reference: widget.reference, + amount: widget.amount, + ); + Get.back(result: isDone); + } + return NavigationDecision.navigate; + }, + ), + ) + ..loadRequest(Uri.parse(widget.initialURl)); } @override @@ -72,17 +94,16 @@ class _PayStackScreenState extends State { }, child: Scaffold( appBar: AppBar( - backgroundColor: AppThemeData.grey50, - title: Text("Payment".tr()), - centerTitle: false, - leading: GestureDetector( - onTap: () { - _showMyDialog(); - }, - child: const Icon( - Icons.arrow_back, - ), - )), + backgroundColor: AppThemeData.grey50, + title: Text("Payment".tr()), + centerTitle: false, + leading: GestureDetector( + onTap: () { + _showMyDialog(); + }, + child: const Icon(Icons.arrow_back), + ), + ), body: WebViewWidget(controller: controller), ), ); @@ -95,15 +116,10 @@ class _PayStackScreenState extends State { builder: (BuildContext context) { return AlertDialog( title: const Text('Cancel Payment'), - content: const SingleChildScrollView( - child: Text("cancelPayment?"), - ), + content: const SingleChildScrollView(child: Text("cancelPayment?")), actions: [ TextButton( - child: const Text( - 'Cancel', - style: TextStyle(color: Colors.red), - ), + child: const Text('Cancel', style: TextStyle(color: Colors.red)), onPressed: () { Navigator.of(context).pop(); Navigator.of(context).pop(false); diff --git a/lib/payment/xenditScreen.dart b/lib/payment/xenditScreen.dart index b3ace2b..0f3b178 100644 --- a/lib/payment/xenditScreen.dart +++ b/lib/payment/xenditScreen.dart @@ -5,7 +5,7 @@ import 'dart:developer'; import 'package:customer/payment/xenditModel.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:webview_flutter/webview_flutter.dart'; @@ -14,7 +14,12 @@ class XenditScreen extends StatefulWidget { final String transId; final String apiKey; - const XenditScreen({super.key, required this.initialURl, required this.transId, required this.apiKey}); + const XenditScreen({ + super.key, + required this.initialURl, + required this.transId, + required this.apiKey, + }); @override State createState() => _XenditScreenState(); @@ -102,7 +107,16 @@ class _XenditScreenState extends State { child: const Icon(Icons.arrow_back, color: Colors.white), ), ), - body: Stack(alignment: Alignment.center, children: [WebViewWidget(controller: controller), Visibility(visible: isLoading, child: const Center(child: CircularProgressIndicator()))]), + body: Stack( + alignment: Alignment.center, + children: [ + WebViewWidget(controller: controller), + Visibility( + visible: isLoading, + child: const Center(child: CircularProgressIndicator()), + ), + ], + ), ), ); } @@ -117,14 +131,20 @@ class _XenditScreenState extends State { content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), actions: [ TextButton( - child: Text('Cancel'.tr(), style: const TextStyle(color: Colors.red)), + child: Text( + 'Cancel'.tr(), + style: const TextStyle(color: Colors.red), + ), onPressed: () { Navigator.of(context).pop(false); Navigator.of(context).pop(false); }, ), TextButton( - child: Text('Continue'.tr(), style: const TextStyle(color: Colors.green)), + child: Text( + 'Continue'.tr(), + style: const TextStyle(color: Colors.green), + ), onPressed: () { Navigator.of(context).pop(false); }, @@ -140,7 +160,10 @@ class _XenditScreenState extends State { var url = Uri.parse('https://api.xendit.co/v2/invoices/$paymentId'); // Headers - var headers = {'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(widget.apiKey.toString())}; + var headers = { + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader(widget.apiKey.toString()), + }; // Making the POST request var response = await http.get(url, headers: headers); diff --git a/lib/screen_ui/auth_screens/forgot_password_screen.dart b/lib/screen_ui/auth_screens/forgot_password_screen.dart index 894fed1..e1ab3ad 100644 --- a/lib/screen_ui/auth_screens/forgot_password_screen.dart +++ b/lib/screen_ui/auth_screens/forgot_password_screen.dart @@ -3,7 +3,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/forgot_password_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; diff --git a/lib/screen_ui/auth_screens/login_screen.dart b/lib/screen_ui/auth_screens/login_screen.dart index 24e3116..620ffc7 100644 --- a/lib/screen_ui/auth_screens/login_screen.dart +++ b/lib/screen_ui/auth_screens/login_screen.dart @@ -13,7 +13,7 @@ import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; import '../../themes/round_button_fill.dart'; import '../../themes/text_field_widget.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'forgot_password_screen.dart'; import 'mobile_login_screen.dart'; @@ -72,8 +72,7 @@ class LoginScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - ConstTexts.loginToExplore.tr() - , + ConstTexts.loginToExplore.tr(), style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -143,7 +142,7 @@ class LoginScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.login.tr(), onPress: controller.loginWithEmail, color: @@ -218,7 +217,7 @@ class LoginScreen extends StatelessWidget { children: [ Expanded( child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.withGoogle.tr(), textColor: isDark @@ -242,7 +241,7 @@ class LoginScreen extends StatelessWidget { Platform.isIOS ? Expanded( child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.withApple.tr(), isCenter: true, textColor: diff --git a/lib/screen_ui/auth_screens/mobile_login_screen.dart b/lib/screen_ui/auth_screens/mobile_login_screen.dart index 9d1164c..7a04934 100644 --- a/lib/screen_ui/auth_screens/mobile_login_screen.dart +++ b/lib/screen_ui/auth_screens/mobile_login_screen.dart @@ -7,7 +7,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/assets.dart'; import '../../constant/constant.dart'; import '../../controllers/mobile_login_controller.dart'; diff --git a/lib/screen_ui/auth_screens/otp_verification_screen.dart b/lib/screen_ui/auth_screens/otp_verification_screen.dart index 7a62a97..251e952 100644 --- a/lib/screen_ui/auth_screens/otp_verification_screen.dart +++ b/lib/screen_ui/auth_screens/otp_verification_screen.dart @@ -4,7 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:pin_code_fields/pin_code_fields.dart'; import '../../constant/assets.dart'; import '../../controllers/otp_verification_controller.dart'; diff --git a/lib/screen_ui/auth_screens/sign_up_screen.dart b/lib/screen_ui/auth_screens/sign_up_screen.dart index 51fc91c..9ea4b1f 100644 --- a/lib/screen_ui/auth_screens/sign_up_screen.dart +++ b/lib/screen_ui/auth_screens/sign_up_screen.dart @@ -13,7 +13,7 @@ import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; import '../../themes/round_button_fill.dart'; import '../../themes/text_field_widget.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'login_screen.dart'; import 'mobile_login_screen.dart'; diff --git a/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart b/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart index 45d7169..33fcf94 100644 --- a/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart +++ b/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart @@ -19,7 +19,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart' as get_cord_address; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:latlong2/latlong.dart' as latlong; @@ -59,19 +59,57 @@ class IntercityHomeScreen extends StatelessWidget { options: flutterMap.MapOptions( initialCenter: Constant.currentLocation != null - ? latlong.LatLng(Constant.currentLocation!.latitude, Constant.currentLocation!.longitude) + ? latlong.LatLng( + Constant.currentLocation!.latitude, + Constant.currentLocation!.longitude, + ) : controller.currentOrder.value.id != null ? latlong.LatLng( - double.parse(controller.currentOrder.value.sourceLocation!.latitude.toString()), - double.parse(controller.currentOrder.value.sourceLocation!.longitude.toString()), + double.parse( + controller + .currentOrder + .value + .sourceLocation! + .latitude + .toString(), + ), + double.parse( + controller + .currentOrder + .value + .sourceLocation! + .longitude + .toString(), + ), ) - : latlong.LatLng(41.4219057, -102.0840772), + : latlong.LatLng( + 41.4219057, + -102.0840772, + ), initialZoom: 14, ), children: [ - flutterMap.TileLayer(urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: Platform.isAndroid ? "com.emart" : "com.emart.ios"), - flutterMap.MarkerLayer(markers: controller.osmMarker), - if (controller.routePoints.isNotEmpty) flutterMap.PolylineLayer(polylines: [flutterMap.Polyline(points: controller.routePoints, strokeWidth: 5.0, color: Colors.blue)]), + flutterMap.TileLayer( + urlTemplate: + 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: + Platform.isAndroid + ? "com.emart" + : "com.emart.ios", + ), + flutterMap.MarkerLayer( + markers: controller.osmMarker, + ), + if (controller.routePoints.isNotEmpty) + flutterMap.PolylineLayer( + polylines: [ + flutterMap.Polyline( + points: controller.routePoints, + strokeWidth: 5.0, + color: Colors.blue, + ), + ], + ), ], ) : GoogleMap( @@ -79,16 +117,26 @@ class IntercityHomeScreen extends StatelessWidget { controller.mapController = googleMapController; if (Constant.currentLocation != null) { - controller.setDepartureMarker(Constant.currentLocation!.latitude, Constant.currentLocation!.longitude); + controller.setDepartureMarker( + Constant.currentLocation!.latitude, + Constant.currentLocation!.longitude, + ); controller.searchPlaceNameGoogle(); } }, - initialCameraPosition: CameraPosition(target: controller.currentPosition.value, zoom: 14), + initialCameraPosition: CameraPosition( + target: controller.currentPosition.value, + zoom: 14, + ), myLocationEnabled: true, zoomControlsEnabled: true, zoomGesturesEnabled: true, - polylines: Set.of(controller.polyLines.values), - markers: controller.markers.toSet(), // reactive marker set + polylines: Set.of( + controller.polyLines.values, + ), + markers: + controller.markers + .toSet(), // reactive marker set ), Positioned( top: 50, @@ -96,36 +144,64 @@ class IntercityHomeScreen extends StatelessWidget { right: Constant.isRtl ? 20 : null, child: InkWell( onTap: () { - if (controller.bottomSheetType.value == "vehicleSelection") { + if (controller.bottomSheetType.value == + "vehicleSelection") { controller.bottomSheetType.value = "location"; - } else if (controller.bottomSheetType.value == "payment") { - controller.bottomSheetType.value = "vehicleSelection"; - } else if (controller.bottomSheetType.value == "conformRide") { + } else if (controller.bottomSheetType.value == + "payment") { + controller.bottomSheetType.value = + "vehicleSelection"; + } else if (controller.bottomSheetType.value == + "conformRide") { controller.bottomSheetType.value = "payment"; - } else if (controller.bottomSheetType.value == "waitingDriver" || controller.bottomSheetType.value == "driverDetails") { + } else if (controller.bottomSheetType.value == + "waitingDriver" || + controller.bottomSheetType.value == + "driverDetails") { Get.back(result: true); } else { Get.back(); } }, child: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + borderRadius: BorderRadius.circular(30), + ), child: Padding( padding: const EdgeInsets.all(10), - child: Center(child: Icon(Icons.arrow_back_ios_new, size: 20, color: isDark ? AppThemeData.grey50 : AppThemeData.greyDark50)), + child: Center( + child: Icon( + Icons.arrow_back_ios_new, + size: 20, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.greyDark50, + ), + ), ), ), ), ), controller.bottomSheetType.value == "location" - ? searchLocationBottomSheet(context, controller, isDark) - : controller.bottomSheetType.value == "vehicleSelection" + ? searchLocationBottomSheet( + context, + controller, + isDark, + ) + : controller.bottomSheetType.value == + "vehicleSelection" ? vehicleSelection(context, controller, isDark) : controller.bottomSheetType.value == "payment" ? paymentBottomSheet(context, controller, isDark) : controller.bottomSheetType.value == "conformRide" ? conformBottomSheet(context, isDark) - : controller.bottomSheetType.value == "waitingForDriver" + : controller.bottomSheetType.value == + "waitingForDriver" ? waitingDialog(context, controller, isDark) : controller.bottomSheetType.value == "driverDetails" ? driverDialog(context, controller, isDark) @@ -137,7 +213,11 @@ class IntercityHomeScreen extends StatelessWidget { ); } - Widget searchLocationBottomSheet(BuildContext context, IntercityHomeController controller, bool isDark) { + Widget searchLocationBottomSheet( + BuildContext context, + IntercityHomeController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.48, @@ -147,16 +227,29 @@ class IntercityHomeScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.all(16), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(35))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(35)), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), SizedBox(height: 10), Stack( children: [ Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.circular(12)), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.circular(12), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -164,40 +257,82 @@ class IntercityHomeScreen extends StatelessWidget { InkWell( onTap: () async { if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); - controller.sourceTextEditController.value.text = ''; + final result = await Get.to( + () => MapPickerPage(), + ); + controller.sourceTextEditController.value.text = + ''; final firstPlace = result; if (result != null) { - if (Constant.checkZoneCheck(firstPlace.coordinates.latitude, firstPlace.coordinates.longitude) == true) { + if (Constant.checkZoneCheck( + firstPlace.coordinates.latitude, + firstPlace.coordinates.longitude, + ) == + true) { final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lng = + firstPlace.coordinates.longitude; final address = firstPlace.address; - controller.sourceTextEditController.value.text = address.toString(); + controller + .sourceTextEditController + .value + .text = address.toString(); controller.setDepartureMarker(lat, lng); } else { - ShowToastDialog.showToast(ConstTexts.serviceIsUnavailable.tr()); + ShowToastDialog.showToast( + ConstTexts.serviceIsUnavailable.tr(), + ); } } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - if (Constant.checkZoneCheck(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude) == true) { - controller.sourceTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.setDepartureMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + if (Constant.checkZoneCheck( + selectedLocationModel + .latLng! + .latitude, + selectedLocationModel + .latLng! + .longitude, + ) == + true) { + controller + .sourceTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + controller.setDepartureMarker( + selectedLocationModel.latLng!.latitude, + selectedLocationModel.latLng!.longitude, + ); } else { - ShowToastDialog.showToast(ConstTexts.serviceIsUnavailable.tr()); + ShowToastDialog.showToast( + ConstTexts.serviceIsUnavailable.tr(), + ); } } }); } }, child: TextFieldWidget( - controller: controller.sourceTextEditController.value, + controller: + controller.sourceTextEditController.value, hintText: ConstTexts.pickUpLocation.tr(), enable: false, - prefix: Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Image.asset("assets/icons/pickup.png", height: 22, width: 22)), + prefix: Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: Image.asset( + "assets/icons/pickup.png", + height: 22, + width: 22, + ), + ), ), ), const SizedBox(height: 10), @@ -205,34 +340,62 @@ class IntercityHomeScreen extends StatelessWidget { InkWell( onTap: () async { if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { - controller.destinationTextEditController.value.text = ''; + controller + .destinationTextEditController + .value + .text = ''; final firstPlace = result; final lat = firstPlace.coordinates.latitude; final lng = firstPlace.coordinates.longitude; final address = firstPlace.address; - controller.destinationTextEditController.value.text = address.toString(); + controller + .destinationTextEditController + .value + .text = address.toString(); controller.setDestinationMarker(lat, lng); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.destinationTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.setDestinationMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + controller + .destinationTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + controller.setDestinationMarker( + selectedLocationModel.latLng!.latitude, + selectedLocationModel.latLng!.longitude, + ); } }); } }, child: TextFieldWidget( - controller: controller.destinationTextEditController.value, + controller: + controller + .destinationTextEditController + .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, hintText: ConstTexts.destinationLocation.tr(), enable: false, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.radio_button_checked, color: Colors.red)), + prefix: const Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: Icon( + Icons.radio_button_checked, + color: Colors.red, + ), + ), ), ), ], @@ -258,7 +421,16 @@ class IntercityHomeScreen extends StatelessWidget { ], ), SizedBox(height: 15), - Align(alignment: Alignment.centerLeft, child: Text(ConstTexts.popularDestinations.tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: AppThemeData.grey900))), + Align( + alignment: Alignment.centerLeft, + child: Text( + ConstTexts.popularDestinations.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: AppThemeData.grey900, + ), + ), + ), SizedBox( height: 120, child: Padding( @@ -269,22 +441,62 @@ class IntercityHomeScreen extends StatelessWidget { itemBuilder: (context, index) { return InkWell( onTap: () async { - if (controller.popularDestination[index].latitude != null || controller.popularDestination[index].longitude != null) { - List placeMarks = await get_cord_address.placemarkFromCoordinates( - controller.popularDestination[index].latitude ?? 0.0, - controller.popularDestination[index].longitude ?? 0.0, - ); + if (controller.popularDestination[index].latitude != + null || + controller + .popularDestination[index] + .longitude != + null) { + List placeMarks = + await get_cord_address + .placemarkFromCoordinates( + controller + .popularDestination[index] + .latitude ?? + 0.0, + controller + .popularDestination[index] + .longitude ?? + 0.0, + ); final address = - (placeMarks.first.subLocality!.isEmpty ? '' : "${placeMarks.first.subLocality}, ") + - (placeMarks.first.street!.isEmpty ? '' : "${placeMarks.first.street}, ") + - (placeMarks.first.name!.isEmpty ? '' : "${placeMarks.first.name}, ") + - (placeMarks.first.subAdministrativeArea!.isEmpty ? '' : "${placeMarks.first.subAdministrativeArea}, ") + - (placeMarks.first.administrativeArea!.isEmpty ? '' : "${placeMarks.first.administrativeArea}, ") + - (placeMarks.first.country!.isEmpty ? '' : "${placeMarks.first.country}, ") + - (placeMarks.first.postalCode!.isEmpty ? '' : "${placeMarks.first.postalCode}, "); - controller.destinationTextEditController.value.text = address; - controller.setDestinationMarker(controller.popularDestination[index].latitude ?? 0.0, controller.popularDestination[index].longitude ?? 0.0); + (placeMarks.first.subLocality!.isEmpty + ? '' + : "${placeMarks.first.subLocality}, ") + + (placeMarks.first.street!.isEmpty + ? '' + : "${placeMarks.first.street}, ") + + (placeMarks.first.name!.isEmpty + ? '' + : "${placeMarks.first.name}, ") + + (placeMarks + .first + .subAdministrativeArea! + .isEmpty + ? '' + : "${placeMarks.first.subAdministrativeArea}, ") + + (placeMarks.first.administrativeArea!.isEmpty + ? '' + : "${placeMarks.first.administrativeArea}, ") + + (placeMarks.first.country!.isEmpty + ? '' + : "${placeMarks.first.country}, ") + + (placeMarks.first.postalCode!.isEmpty + ? '' + : "${placeMarks.first.postalCode}, "); + controller + .destinationTextEditController + .value + .text = address; + controller.setDestinationMarker( + controller.popularDestination[index].latitude ?? + 0.0, + controller + .popularDestination[index] + .longitude ?? + 0.0, + ); } }, child: Padding( @@ -293,24 +505,65 @@ class IntercityHomeScreen extends StatelessWidget { children: [ CachedNetworkImage( imageUrl: - (controller.popularDestination[index].image != null && controller.popularDestination[index].image!.isNotEmpty) - ? controller.popularDestination[index].image! + (controller + .popularDestination[index] + .image != + null && + controller + .popularDestination[index] + .image! + .isNotEmpty) + ? controller + .popularDestination[index] + .image! : Constant.placeHolderImage, height: 160, width: 120, imageBuilder: - (context, imageProvider) => - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover))), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), + (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 10, + ), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: + CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData.primary300, + ), + ), + ), errorWidget: - (context, url, error) => - ClipRRect(borderRadius: BorderRadius.circular(10), child: Image.network(Constant.placeHolderImage, fit: BoxFit.cover, cacheHeight: 80, cacheWidth: 80)), + (context, url, error) => ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Image.network( + Constant.placeHolderImage, + fit: BoxFit.cover, + cacheHeight: 80, + cacheWidth: 80, + ), + ), fit: BoxFit.cover, ), Positioned( left: 5, top: 80, - child: Text(controller.popularDestination[index].title.toString(), style: AppThemeData.boldTextStyle(fontSize: 15, color: AppThemeData.surface)), + child: Text( + controller.popularDestination[index].title + .toString(), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: AppThemeData.surface, + ), + ), ), ], ), @@ -322,13 +575,25 @@ class IntercityHomeScreen extends StatelessWidget { ), SizedBox(height: 10), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.continueT.tr(), onPress: () { - if (controller.sourceTextEditController.value.text.isEmpty) { - ShowToastDialog.showToast(ConstTexts.plsSelectSourceLocation.tr()); - } else if (controller.destinationTextEditController.value.text.isEmpty) { - ShowToastDialog.showToast(ConstTexts.plsSelectDestinationLocations.tr()); + if (controller + .sourceTextEditController + .value + .text + .isEmpty) { + ShowToastDialog.showToast( + ConstTexts.plsSelectSourceLocation.tr(), + ); + } else if (controller + .destinationTextEditController + .value + .text + .isEmpty) { + ShowToastDialog.showToast( + ConstTexts.plsSelectDestinationLocations.tr(), + ); } else { controller.bottomSheetType.value = "vehicleSelection"; } @@ -344,7 +609,11 @@ class IntercityHomeScreen extends StatelessWidget { ); } - Widget vehicleSelection(BuildContext context, IntercityHomeController controller, bool isDark) { + Widget vehicleSelection( + BuildContext context, + IntercityHomeController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.40, @@ -353,20 +622,42 @@ class IntercityHomeScreen extends StatelessWidget { expand: false, builder: (context, scrollController) { return Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: const BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(24), + topRight: Radius.circular(24), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), Align( alignment: Alignment.topLeft, child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Text( - ConstTexts.selectVehicleType.tr(), - style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ConstTexts.selectVehicleType.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), textAlign: TextAlign.start, ), ), @@ -379,11 +670,13 @@ class IntercityHomeScreen extends StatelessWidget { controller: scrollController, scrollDirection: Axis.vertical, itemBuilder: (context, index) { - VehicleType vehicleType = controller.vehicleTypes[index]; + VehicleType vehicleType = + controller.vehicleTypes[index]; return Obx( () => InkWell( onTap: () { - controller.selectedVehicleType.value = controller.vehicleTypes[index]; + controller.selectedVehicleType.value = + controller.vehicleTypes[index]; }, child: Padding( padding: const EdgeInsets.only(bottom: 10), @@ -393,60 +686,130 @@ class IntercityHomeScreen extends StatelessWidget { border: Border.all( color: isDark - ? controller.selectedVehicleType.value.id == vehicleType.id + ? controller + .selectedVehicleType + .value + .id == + vehicleType.id ? Colors.white : AppThemeData.grey500 - : controller.selectedVehicleType.value.id == vehicleType.id + : controller + .selectedVehicleType + .value + .id == + vehicleType.id ? AppThemeData.grey300 : Colors.transparent, width: 1, ), color: - controller.selectedVehicleType.value.id == vehicleType.id + controller.selectedVehicleType.value.id == + vehicleType.id ? AppThemeData.grey50 : isDark ? AppThemeData.grey300 : Colors.white, ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), child: Row( children: [ ClipRRect( //borderRadius: BorderRadius.circular(10), child: CachedNetworkImage( - imageUrl: vehicleType.vehicleIcon.toString(), + imageUrl: + vehicleType.vehicleIcon + .toString(), height: 60, width: 60, imageBuilder: (context, imageProvider) => - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover))), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => ClipRRect(borderRadius: BorderRadius.circular(20), child: Image.network(Constant.userPlaceHolder, fit: BoxFit.cover)), + Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 10, + ), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: + CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), + errorWidget: + (context, url, error) => + ClipRRect( + borderRadius: + BorderRadius.circular( + 20, + ), + child: Image.network( + Constant.userPlaceHolder, + fit: BoxFit.cover, + ), + ), fit: BoxFit.cover, ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${vehicleType.name} | ${controller.distance.toStringAsFixed(2)}km", - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold, letterSpacing: 1), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 1, + ), ), Padding( - padding: const EdgeInsets.only(top: 2.0), - child: Text(controller.duration.value, style: const TextStyle(fontWeight: FontWeight.w400, letterSpacing: 1)), + padding: const EdgeInsets.only( + top: 2.0, + ), + child: Text( + controller.duration.value, + style: const TextStyle( + fontWeight: FontWeight.w400, + letterSpacing: 1, + ), + ), ), ], ), ), ), Text( - Constant.amountShow(amount: controller.getAmount(vehicleType).toString()), - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold, letterSpacing: 1), + Constant.amountShow( + amount: + controller + .getAmount(vehicleType) + .toString(), + ), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 1, + ), ), ], ), @@ -460,13 +823,17 @@ class IntercityHomeScreen extends StatelessWidget { ), Obx( () => RoundedButtonFill( - borderRadius: 10.r, - title: 'pay_amount'.trParams({ - 'amount': - controller.selectedVehicleType.value.id == null - ? Constant.amountShow(amount: "0.0") - : Constant.amountShow(amount: controller.getAmount(controller.selectedVehicleType.value).toString()), - }), + borderRadius: 10.r, + title: 'pay_amount'.tr(namedArgs: { + 'amount': controller.selectedVehicleType.value.id == null + ? Constant.amountShow(amount: "0.0") + : Constant.amountShow( + amount: controller + .getAmount(controller.selectedVehicleType.value) + .toString(), + ), +}), + // title: // "Pay ${controller.selectedVehicleType.value.id == null ? Constant.amountShow(amount: "0.0") : Constant.amountShow(amount: controller.getAmount(controller.selectedVehicleType.value).toString())}", onPress: () async { @@ -474,7 +841,9 @@ class IntercityHomeScreen extends StatelessWidget { controller.calculateTotalAmount(); controller.bottomSheetType.value = "payment"; } else { - ShowToastDialog.showToast(ConstTexts.plsSelectVehicleTypeFirst.tr()); + ShowToastDialog.showToast( + ConstTexts.plsSelectVehicleTypeFirst.tr(), + ); } }, color: AppThemeData.primary300, @@ -490,7 +859,11 @@ class IntercityHomeScreen extends StatelessWidget { ); } - Widget paymentBottomSheet(BuildContext context, IntercityHomeController controller, bool isDark) { + Widget paymentBottomSheet( + BuildContext context, + IntercityHomeController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.70, @@ -500,19 +873,37 @@ class IntercityHomeScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.selectPaymentMethod.tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + ConstTexts.selectPaymentMethod.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), GestureDetector( onTap: () { Get.back(); }, - child: Icon(Icons.close, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + child: Icon( + Icons.close, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -522,32 +913,82 @@ class IntercityHomeScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text(ConstTexts.prefferedPayment.tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + ConstTexts.prefferedPayment.tr(), + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == + true || + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == + true || + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -555,7 +996,13 @@ class IntercityHomeScreen extends StatelessWidget { Text( ConstTexts.otherPaymentOptions.tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), ), const SizedBox(height: 10), ], @@ -563,32 +1010,136 @@ class IntercityHomeScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller + .mercadoPagoModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller + .flutterWaveModel + .value + .isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -598,19 +1149,24 @@ class IntercityHomeScreen extends StatelessWidget { ), ), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.continueT.tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast(ConstTexts.plsSelectPaymentMethod.tr()); + ShowToastDialog.showToast( + ConstTexts.plsSelectPaymentMethod.tr(), + ); return; } if (controller.selectedPaymentMethod.value == "wallet") { - num walletAmount = controller.userModel.value.walletAmount ?? 0; + num walletAmount = + controller.userModel.value.walletAmount ?? 0; if (walletAmount <= 0) { - ShowToastDialog.showToast(ConstTexts.insufficientWallet.tr()); + ShowToastDialog.showToast( + ConstTexts.insufficientWallet.tr(), + ); return; } } @@ -657,13 +1213,29 @@ class IntercityHomeScreen extends StatelessWidget { init: IntercityHomeController(), builder: (controller) { return Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.only(topLeft: Radius.circular(30), topRight: Radius.circular(30))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), Expanded( child: ListView( controller: scrollController, @@ -673,75 +1245,178 @@ class IntercityHomeScreen extends StatelessWidget { Stack( children: [ Container( - decoration: BoxDecoration(color: isDark ? Colors.transparent : Colors.white, borderRadius: BorderRadius.circular(12)), + decoration: BoxDecoration( + color: + isDark + ? Colors.transparent + : Colors.white, + borderRadius: BorderRadius.circular(12), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ // Pickup Location InkWell( onTap: () async { - if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + if (Constant.selectedMapType == + 'osm') { + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { - controller.sourceTextEditController.value.text = ''; + controller + .sourceTextEditController + .value + .text = ''; final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; - final address = firstPlace.address; - controller.sourceTextEditController.value.text = address.toString(); - controller.setDepartureMarker(lat, lng); + final lat = + firstPlace + .coordinates + .latitude; + final lng = + firstPlace + .coordinates + .longitude; + final address = + firstPlace.address; + controller + .sourceTextEditController + .value + .text = address.toString(); + controller.setDepartureMarker( + lat, + lng, + ); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to( + LocationPickerScreen(), + )!.then((value) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.sourceTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.setDepartureMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + controller + .sourceTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: + selectedLocationModel, + ); + controller.setDepartureMarker( + selectedLocationModel + .latLng! + .latitude, + selectedLocationModel + .latLng! + .longitude, + ); } }); } }, child: TextFieldWidget( - controller: controller.sourceTextEditController.value, - hintText: ConstTexts.pickUpLocation.tr(), + controller: + controller + .sourceTextEditController + .value, + hintText: + ConstTexts.pickUpLocation.tr(), enable: false, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.stop_circle_outlined, color: Colors.green)), + prefix: const Padding( + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + child: Icon( + Icons.stop_circle_outlined, + color: Colors.green, + ), + ), ), ), const SizedBox(height: 10), // Destination Location InkWell( onTap: () async { - if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + if (Constant.selectedMapType == + 'osm') { + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { - controller.destinationTextEditController.value.text = ''; + controller + .destinationTextEditController + .value + .text = ''; final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; - final address = firstPlace.address; - controller.destinationTextEditController.value.text = address.toString(); - controller.setDestinationMarker(lat, lng); + final lat = + firstPlace + .coordinates + .latitude; + final lng = + firstPlace + .coordinates + .longitude; + final address = + firstPlace.address; + controller + .destinationTextEditController + .value + .text = address.toString(); + controller.setDestinationMarker( + lat, + lng, + ); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to( + LocationPickerScreen(), + )!.then((value) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.destinationTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.setDestinationMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + controller + .destinationTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: + selectedLocationModel, + ); + controller.setDestinationMarker( + selectedLocationModel + .latLng! + .latitude, + selectedLocationModel + .latLng! + .longitude, + ); } }); } }, child: TextFieldWidget( - controller: controller.destinationTextEditController.value, + controller: + controller + .destinationTextEditController + .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: ConstTexts.destinationLocation.tr(), + hintText: + ConstTexts.destinationLocation + .tr(), enable: false, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.radio_button_checked, color: Colors.red)), + prefix: const Padding( + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + child: Icon( + Icons.radio_button_checked, + color: Colors.red, + ), + ), ), ), ], @@ -759,9 +1434,15 @@ class IntercityHomeScreen extends StatelessWidget { (size) => Path() ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), + ..lineTo( + size.width / 2, + size.height, + ), + ), + child: const SizedBox( + width: 20, + height: 40, ), - child: const SizedBox(width: 20, height: 40), ), ), ], @@ -770,24 +1451,55 @@ class IntercityHomeScreen extends StatelessWidget { Row( children: [ - Expanded(child: Text(ConstTexts.promoCode.tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Expanded( + child: Text( + ConstTexts.promoCode.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), InkWell( onTap: () { - Get.to(CabCouponCodeScreen())!.then((value) { + Get.to(CabCouponCodeScreen())!.then(( + value, + ) { if (value != null) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: value); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = value; + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: value, + ); + if (couponAmount < + controller.subTotal.value) { + controller.selectedCouponModel.value = + value; controller.calculateTotalAmount(); } else { - ShowToastDialog.showToast(ConstTexts.thisOfferNotEligible.tr()); + ShowToastDialog.showToast( + ConstTexts.thisOfferNotEligible + .tr(), + ); } } }); }, child: Text( ConstTexts.viewAll.tr(), - style: AppThemeData.boldTextStyle(decoration: TextDecoration.underline, fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.boldTextStyle( + decoration: TextDecoration.underline, + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ], @@ -800,56 +1512,130 @@ class IntercityHomeScreen extends StatelessWidget { height: Responsive.height(6, context), color: AppThemeData.carRent50, child: DottedBorder( - options: RectDottedBorderOptions(dashPattern: [10, 5], strokeWidth: 1, padding: EdgeInsets.all(0), color: AppThemeData.carRent400), + options: RectDottedBorderOptions( + dashPattern: [10, 5], + strokeWidth: 1, + padding: EdgeInsets.all(0), + color: AppThemeData.carRent400, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_coupon.svg"), + SvgPicture.asset( + "assets/icons/ic_coupon.svg", + ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: TextFormField( - controller: controller.couponCodeTextEditController.value, - style: AppThemeData.semiBoldTextStyle(color: AppThemeData.parcelService500, fontSize: 16), + controller: + controller + .couponCodeTextEditController + .value, + style: + AppThemeData.semiBoldTextStyle( + color: + AppThemeData + .parcelService500, + fontSize: 16, + ), decoration: InputDecoration( border: InputBorder.none, - hintText: ConstTexts.writeCoupon.tr(), - contentPadding: EdgeInsets.only(bottom: 10), - hintStyle: AppThemeData.semiBoldTextStyle(color: AppThemeData.parcelService500, fontSize: 16), + hintText: + ConstTexts.writeCoupon.tr(), + contentPadding: EdgeInsets.only( + bottom: 10, + ), + hintStyle: + AppThemeData.semiBoldTextStyle( + color: + AppThemeData + .parcelService500, + fontSize: 16, + ), ), ), ), ), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.redeemNow.tr(), width: 27.w, fontSizes: 14, onPress: () async { if (controller.cabCouponList - .where((element) => element.code!.toLowerCase() == controller.couponCodeTextEditController.value.text.toLowerCase()) + .where( + (element) => + element.code! + .toLowerCase() == + controller + .couponCodeTextEditController + .value + .text + .toLowerCase(), + ) .isNotEmpty) { - CouponModel couponModel = controller.cabCouponList.firstWhere( - (p0) => p0.code!.toLowerCase() == controller.couponCodeTextEditController.value.text.toLowerCase(), - ); - if (couponModel.expiresAt!.toDate().isAfter(DateTime.now())) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: couponModel); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = couponModel; - controller.calculateTotalAmount(); + CouponModel + couponModel = controller + .cabCouponList + .firstWhere( + (p0) => + p0.code! + .toLowerCase() == + controller + .couponCodeTextEditController + .value + .text + .toLowerCase(), + ); + if (couponModel.expiresAt! + .toDate() + .isAfter(DateTime.now())) { + double couponAmount = + Constant.calculateDiscount( + amount: + controller + .subTotal + .value + .toString(), + offerModel: couponModel, + ); + if (couponAmount < + controller.subTotal.value) { + controller + .selectedCouponModel + .value = couponModel; + controller + .calculateTotalAmount(); controller.update(); } else { - ShowToastDialog.showToast(ConstTexts.thisOfferNotEligible.tr()); + ShowToastDialog.showToast( + ConstTexts + .thisOfferNotEligible + .tr(), + ); } } else { - ShowToastDialog.showToast(ConstTexts.couponExpired.tr()); + ShowToastDialog.showToast( + ConstTexts.couponExpired.tr(), + ); } } else { - ShowToastDialog.showToast(ConstTexts.invalidCouponCode.tr()); + ShowToastDialog.showToast( + ConstTexts.invalidCouponCode + .tr(), + ); } }, color: AppThemeData.parcelService300, @@ -866,46 +1652,121 @@ class IntercityHomeScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(ConstTexts.orderSummary.tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + ConstTexts.orderSummary.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 8), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.subtotal.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - Constant.amountShow(amount: controller.subTotal.value.toString()), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ConstTexts.subtotal.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.subTotal.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Row( children: [ - Text(ConstTexts.discount.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + ConstTexts.discount.tr(), + style: + AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), SizedBox(width: 5), Text( - controller.selectedCouponModel.value.id == null ? "" : "(${controller.selectedCouponModel.value.code})", - style: AppThemeData.mediumTextStyle(fontSize: 16, color: AppThemeData.primary300), + controller + .selectedCouponModel + .value + .id == + null + ? "" + : "(${controller.selectedCouponModel.value.code})", + style: + AppThemeData.mediumTextStyle( + fontSize: 16, + color: + AppThemeData.primary300, + ), ), ], ), - Text(Constant.amountShow(amount: controller.discount.value.toString()), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.danger300)), + Text( + Constant.amountShow( + amount: + controller.discount.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: AppThemeData.danger300, + ), + ), ], ), ), @@ -917,24 +1778,56 @@ class IntercityHomeScreen extends StatelessWidget { physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (context, index) { - TaxModel taxModel = Constant.taxList[index]; + TaxModel taxModel = + Constant.taxList[index]; return Padding( - padding: const EdgeInsets.only(bottom: 5), + padding: const EdgeInsets.only( + bottom: 5, + ), child: Row( children: [ Expanded( child: Text( '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})', textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( Constant.amountShow( - amount: Constant.calculateTax(amount: (controller.subTotal.value - controller.discount.value).toString(), taxModel: taxModel).toString(), + amount: + Constant.calculateTax( + amount: + (controller + .subTotal + .value - + controller + .discount + .value) + .toString(), + taxModel: taxModel, + ).toString(), ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), @@ -944,14 +1837,36 @@ class IntercityHomeScreen extends StatelessWidget { const Divider(), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.orderTotal.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - Constant.amountShow(amount: controller.totalAmount.value.toString()), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ConstTexts.orderTotal.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.totalAmount.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -963,42 +1878,154 @@ class IntercityHomeScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(10), child: Row( children: [ controller.selectedPaymentMethod.value == '' - ? cardDecorationScreen(controller, PaymentGateway.wallet, isDark, "") - : controller.selectedPaymentMethod.value == PaymentGateway.wallet.name - ? cardDecorationScreen(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png") - : controller.selectedPaymentMethod.value == PaymentGateway.cod.name - ? cardDecorationScreen(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png") - : controller.selectedPaymentMethod.value == PaymentGateway.stripe.name - ? cardDecorationScreen(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png") - : controller.selectedPaymentMethod.value == PaymentGateway.paypal.name - ? cardDecorationScreen(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payStack.name - ? cardDecorationScreen(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png") - : controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name - ? cardDecorationScreen(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png") - : controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name - ? cardDecorationScreen(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payFast.name - ? cardDecorationScreen(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png") - : controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name - ? cardDecorationScreen(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png") - : controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name - ? cardDecorationScreen(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png") - : controller.selectedPaymentMethod.value == PaymentGateway.xendit.name - ? cardDecorationScreen(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png") - : cardDecorationScreen(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), + ? cardDecorationScreen( + controller, + PaymentGateway.wallet, + isDark, + "", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.wallet.name + ? cardDecorationScreen( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.cod.name + ? cardDecorationScreen( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.stripe.name + ? cardDecorationScreen( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.paypal.name + ? cardDecorationScreen( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.payStack.name + ? cardDecorationScreen( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.mercadoPago.name + ? cardDecorationScreen( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.flutterWave.name + ? cardDecorationScreen( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.payFast.name + ? cardDecorationScreen( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.midTrans.name + ? cardDecorationScreen( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.orangeMoney.name + ? cardDecorationScreen( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.xendit.name + ? cardDecorationScreen( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ) + : cardDecorationScreen( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), SizedBox(width: 22), Text( controller.selectedPaymentMethod.value, textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -1007,7 +2034,7 @@ class IntercityHomeScreen extends StatelessWidget { ), ), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.confirmBooking.tr(), onPress: () async { controller.placeOrder(); @@ -1026,7 +2053,11 @@ class IntercityHomeScreen extends StatelessWidget { ); } - Widget waitingDialog(BuildContext context, IntercityHomeController controller, bool isDark) { + Widget waitingDialog( + BuildContext context, + IntercityHomeController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.4, @@ -1035,18 +2066,40 @@ class IntercityHomeScreen extends StatelessWidget { expand: false, builder: (context, scrollController) { return Container( - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.only(topLeft: Radius.circular(30), topRight: Radius.circular(30))), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), SizedBox(height: 30), - Text(ConstTexts.waitingForDriver.tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + ConstTexts.waitingForDriver.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), Image.asset('assets/loader.gif', width: 250), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.cancelRide.tr(), onPress: () async { try { @@ -1059,7 +2112,9 @@ class IntercityHomeScreen extends StatelessWidget { // 2. Save to Firestore if (controller.currentOrder.value.id != null) { - await FireStoreUtils.updateCabOrder(controller.currentOrder.value); + await FireStoreUtils.updateCabOrder( + controller.currentOrder.value, + ); } // 3. Reset controller states @@ -1070,10 +2125,22 @@ class IntercityHomeScreen extends StatelessWidget { controller.routePoints.clear(); controller.sourceTextEditController.value.clear(); controller.destinationTextEditController.value.clear(); - controller.departureLatLong.value = const LatLng(0.0, 0.0); - controller.destinationLatLong.value = const LatLng(0.0, 0.0); - controller.departureLatLongOsm.value = latlong.LatLng(0.0, 0.0); - controller.destinationLatLongOsm.value = latlong.LatLng(0.0, 0.0); + controller.departureLatLong.value = const LatLng( + 0.0, + 0.0, + ); + controller.destinationLatLong.value = const LatLng( + 0.0, + 0.0, + ); + controller.departureLatLongOsm.value = latlong.LatLng( + 0.0, + 0.0, + ); + controller.destinationLatLongOsm.value = latlong.LatLng( + 0.0, + 0.0, + ); // 4. Reset user’s in-progress order if (Constant.userModel != null) { @@ -1082,12 +2149,18 @@ class IntercityHomeScreen extends StatelessWidget { } // 5. Optional feedback - ShowToastDialog.showToast(ConstTexts.riderCancelledSucces.tr()); + ShowToastDialog.showToast( + ConstTexts.riderCancelledSucces.tr(), + ); Get.back(); - CabDashboardController cabDashboardController = Get.put(CabDashboardController()); + CabDashboardController cabDashboardController = Get.put( + CabDashboardController(), + ); cabDashboardController.selectedIndex.value = 0; } catch (e) { - ShowToastDialog.showToast(ConstTexts.failedToCancel.tr()); + ShowToastDialog.showToast( + ConstTexts.failedToCancel.tr(), + ); } }, color: AppThemeData.danger300, @@ -1102,7 +2175,11 @@ class IntercityHomeScreen extends StatelessWidget { ); } - Widget driverDialog(BuildContext context, IntercityHomeController controller, bool isDark) { + Widget driverDialog( + BuildContext context, + IntercityHomeController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.7, @@ -1111,13 +2188,29 @@ class IntercityHomeScreen extends StatelessWidget { expand: false, builder: (context, scrollController) { return Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.only(topLeft: Radius.circular(30), topRight: Radius.circular(30))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), Expanded( child: ListView( controller: scrollController, @@ -1127,7 +2220,11 @@ class IntercityHomeScreen extends StatelessWidget { Stack( children: [ Container( - decoration: BoxDecoration(color: isDark ? Colors.transparent : Colors.white, borderRadius: BorderRadius.circular(12)), + decoration: BoxDecoration( + color: + isDark ? Colors.transparent : Colors.white, + borderRadius: BorderRadius.circular(12), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -1157,11 +2254,23 @@ class IntercityHomeScreen extends StatelessWidget { // } }, child: TextFieldWidget( - controller: controller.sourceTextEditController.value, + controller: + controller + .sourceTextEditController + .value, hintText: ConstTexts.pickUpLocation.tr(), enable: false, readOnly: true, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.stop_circle_outlined, color: Colors.green)), + prefix: const Padding( + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + child: Icon( + Icons.stop_circle_outlined, + color: Colors.green, + ), + ), ), ), const SizedBox(height: 10), @@ -1191,13 +2300,26 @@ class IntercityHomeScreen extends StatelessWidget { // } }, child: TextFieldWidget( - controller: controller.destinationTextEditController.value, + controller: + controller + .destinationTextEditController + .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: ConstTexts.destinationLocation.tr(), + hintText: + ConstTexts.destinationLocation.tr(), enable: false, readOnly: true, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.radio_button_checked, color: Colors.red)), + prefix: const Padding( + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + child: Icon( + Icons.radio_button_checked, + color: Colors.red, + ), + ), ), ), ], @@ -1215,7 +2337,10 @@ class IntercityHomeScreen extends StatelessWidget { (size) => Path() ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), + ..lineTo( + size.width / 2, + size.height, + ), ), child: const SizedBox(width: 20, height: 40), ), @@ -1229,7 +2354,18 @@ class IntercityHomeScreen extends StatelessWidget { children: [ ClipRRect( borderRadius: BorderRadiusGeometry.circular(10), - child: NetworkImageWidget(imageUrl: controller.currentOrder.value.driver?.profilePictureURL ?? '', height: 70, width: 70, borderRadius: 35), + child: NetworkImageWidget( + imageUrl: + controller + .currentOrder + .value + .driver + ?.profilePictureURL ?? + '', + height: 70, + width: 70, + borderRadius: 35, + ), ), SizedBox(width: 10), Expanded( @@ -1238,22 +2374,51 @@ class IntercityHomeScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - controller.currentOrder.value.driver?.fullName() ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 18), + controller.currentOrder.value.driver + ?.fullName() ?? + '', + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 18, + ), ), Text( "${controller.currentOrder.value.driver?.vehicleType ?? ''} | ${controller.currentOrder.value.driver?.carMakes ?? ''}", - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, fontSize: 14), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.greyDark700 + : AppThemeData.grey700, + fontSize: 14, + ), ), Text( - controller.currentOrder.value.driver?.carNumber ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, fontSize: 16), + controller + .currentOrder + .value + .driver + ?.carNumber ?? + '', + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData.greyDark700 + : AppThemeData.grey700, + fontSize: 16, + ), ), ], ), ), RoundedButtonBorder( - title: controller.driverModel.value.averageRating.toStringAsFixed(1) ?? '', + title: + controller.driverModel.value.averageRating + .toStringAsFixed(1) ?? + '', width: 20, height: 3.5, radius: 10, @@ -1262,7 +2427,9 @@ class IntercityHomeScreen extends StatelessWidget { textColor: AppThemeData.warning400, borderColor: AppThemeData.warning400, color: AppThemeData.warning50, - icon: SvgPicture.asset("assets/icons/ic_start.svg"), + icon: SvgPicture.asset( + "assets/icons/ic_start.svg", + ), onPress: () {}, ), ], @@ -1271,37 +2438,98 @@ class IntercityHomeScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(ConstTexts.orderSummary.tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + ConstTexts.orderSummary.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 8), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.subtotal.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - Constant.amountShow(amount: controller.subTotal.value.toString()), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ConstTexts.subtotal.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.subTotal.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.discount.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(Constant.amountShow(amount: controller.discount.value.toString()), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.danger300)), + Text( + ConstTexts.discount.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.discount.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: AppThemeData.danger300, + ), + ), ], ), ), @@ -1322,15 +2550,38 @@ class IntercityHomeScreen extends StatelessWidget { child: Text( '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})', textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), Text( Constant.amountShow( - amount: Constant.calculateTax(amount: (controller.subTotal.value - controller.discount.value).toString(), taxModel: taxModel).toString(), + amount: + Constant.calculateTax( + amount: + (controller + .subTotal + .value - + controller + .discount + .value) + .toString(), + taxModel: taxModel, + ).toString(), ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -1340,14 +2591,36 @@ class IntercityHomeScreen extends StatelessWidget { const Divider(), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.orderTotal.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - Constant.amountShow(amount: controller.totalAmount.value.toString()), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ConstTexts.orderTotal.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.totalAmount.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -1359,8 +2632,16 @@ class IntercityHomeScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(10), child: InkWell( @@ -1369,34 +2650,111 @@ class IntercityHomeScreen extends StatelessWidget { }, child: Row( children: [ - controller.selectedPaymentMethod.value == PaymentGateway.wallet.name - ? cardDecorationScreen(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png") - : controller.selectedPaymentMethod.value == PaymentGateway.cod.name - ? cardDecorationScreen(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png") - : controller.selectedPaymentMethod.value == PaymentGateway.stripe.name - ? cardDecorationScreen(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png") - : controller.selectedPaymentMethod.value == PaymentGateway.paypal.name - ? cardDecorationScreen(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payStack.name - ? cardDecorationScreen(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png") - : controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name - ? cardDecorationScreen(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png") - : controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name - ? cardDecorationScreen(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payFast.name - ? cardDecorationScreen(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png") - : controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name - ? cardDecorationScreen(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png") - : controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name - ? cardDecorationScreen(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png") - : controller.selectedPaymentMethod.value == PaymentGateway.xendit.name - ? cardDecorationScreen(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png") - : cardDecorationScreen(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), + controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name + ? cardDecorationScreen( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.cod.name + ? cardDecorationScreen( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name + ? cardDecorationScreen( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name + ? cardDecorationScreen( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name + ? cardDecorationScreen( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name + ? cardDecorationScreen( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name + ? cardDecorationScreen( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name + ? cardDecorationScreen( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name + ? cardDecorationScreen( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name + ? cardDecorationScreen( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name + ? cardDecorationScreen( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ) + : cardDecorationScreen( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), SizedBox(width: 22), Text( controller.selectedPaymentMethod.value, textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -1404,48 +2762,77 @@ class IntercityHomeScreen extends StatelessWidget { ), const SizedBox(height: 20), Obx(() { - if (controller.currentOrder.value.status == Constant.orderInTransit) { + if (controller.currentOrder.value.status == + Constant.orderInTransit) { return Column( children: [ RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "SOS", color: Colors.red.withValues(alpha: 0.50), textColor: AppThemeData.grey50, isCenter: true, icon: Icon(Icons.call, color: Colors.white), onPress: () async { - ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr()); + ShowToastDialog.showLoader( + ConstTexts.pleaseWait.tr(), + ); - LocationData location = await controller.currentLocation.value.getLocation(); + LocationData location = + await controller.currentLocation.value + .getLocation(); - await FireStoreUtils.getSOS(controller.currentOrder.value.id ?? '').then((value) async { + await FireStoreUtils.getSOS( + controller.currentOrder.value.id ?? '', + ).then((value) async { if (value == false) { - await FireStoreUtils.setSos(controller.currentOrder.value.id ?? '', UserLocation(latitude: location.latitude!, longitude: location.longitude!)).then((value) { + await FireStoreUtils.setSos( + controller.currentOrder.value.id ?? + '', + UserLocation( + latitude: location.latitude!, + longitude: location.longitude!, + ), + ).then((value) { ShowToastDialog.closeLoader(); - ScaffoldMessenger.of(context).showSnackBar( + ScaffoldMessenger.of( + context, + ).showSnackBar( SnackBar( content: Builder( builder: (context) { - return Text(ConstTexts.yourSosRequest.tr()); + return Text( + ConstTexts.yourSosRequest + .tr(), + ); }, ), backgroundColor: Colors.green, - duration: const Duration(seconds: 3), + duration: const Duration( + seconds: 3, + ), ), ); }); } else { ShowToastDialog.closeLoader(); - ScaffoldMessenger.of(context).showSnackBar( + ScaffoldMessenger.of( + context, + ).showSnackBar( SnackBar( content: Builder( builder: (context) { - return Text(ConstTexts.yourSosrequestAlreadySubmitted.tr()); + return Text( + ConstTexts + .yourSosrequestAlreadySubmitted + .tr(), + ); }, ), backgroundColor: Colors.red, - duration: const Duration(seconds: 3), + duration: const Duration( + seconds: 3, + ), ), ); } @@ -1463,45 +2850,100 @@ class IntercityHomeScreen extends StatelessWidget { ), ), Obx(() { - if (controller.currentOrder.value.status == Constant.orderInTransit && controller.currentOrder.value.paymentStatus == false) { + if (controller.currentOrder.value.status == + Constant.orderInTransit && + controller.currentOrder.value.paymentStatus == false) { return RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.payNow.tr(), onPress: () async { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.totalAmount.value.toString(), context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.totalAmount.value.toString(), + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.cod.name) { controller.completeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name) { controller.completeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast(ConstTexts.somethingWentWrong.tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); - } - }); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.totalAmount.value.toString(), + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + ConstTexts.somethingWentWrong.tr(), + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: + controller.totalAmount.value + .toString(), + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast(ConstTexts.plsSelectPaymentMethod.tr()); + ShowToastDialog.showToast( + ConstTexts.plsSelectPaymentMethod.tr(), + ); } }, color: AppThemeData.primary300, @@ -1520,19 +2962,42 @@ class IntercityHomeScreen extends StatelessWidget { ); } - Padding cardDecorationScreen(IntercityHomeController controller, PaymentGateway value, isDark, String image) { + Padding cardDecorationScreen( + IntercityHomeController controller, + PaymentGateway value, + isDark, + String image, + ) { return Padding( padding: const EdgeInsets.symmetric(vertical: 5), child: Container( width: 40, height: 40, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: image == '' ? Container(color: isDark ? AppThemeData.grey800 : AppThemeData.grey100) : Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), + child: + image == '' + ? Container( + color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + ) + : Image.asset(image), + ), ), ); } - Obx cardDecoration(IntercityHomeController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + IntercityHomeController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -1547,8 +3012,21 @@ class IntercityHomeScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -1559,12 +3037,34 @@ class IntercityHomeScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: controller.userModel.value.walletAmount == null ? '0.0' : controller.userModel.value.walletAmount.toString()), + Constant.amountShow( + amount: + controller.userModel.value.walletAmount == + null + ? '0.0' + : controller + .userModel + .value + .walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -1573,14 +3073,23 @@ class IntercityHomeScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart index 0df9bdd..56de16c 100644 --- a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart @@ -18,7 +18,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:latlong2/latlong.dart' as latlong; @@ -668,21 +668,16 @@ class CabBookingScreen extends StatelessWidget { child: Obx( () => RoundedButtonFill( borderRadius: 10.r, - title: 'pay_amount'.trParams({ - 'amount': - controller.selectedVehicleType.value.id == null - ? Constant.amountShow(amount: "0.0") - : Constant.amountShow( - amount: - controller - .getAmount( - controller - .selectedVehicleType - .value, - ) - .toString(), - ), - }), + title: 'pay_amount'.tr(namedArgs: { + 'amount': controller.selectedVehicleType.value.id == null + ? Constant.amountShow(amount: "0.0") + : Constant.amountShow( + amount: controller + .getAmount(controller.selectedVehicleType.value) + .toString(), + ), +}), + onPress: () async { if (controller.selectedVehicleType.value.id != null) { controller.calculateTotalAmount(); @@ -1927,7 +1922,9 @@ class CabBookingScreen extends StatelessWidget { ); cabDashboardController.selectedIndex.value = 0; } catch (e) { - ShowToastDialog.showToast(ConstTexts.failedToCancel.tr()); + ShowToastDialog.showToast( + ConstTexts.failedToCancel.tr(), + ); } }, ), @@ -2069,7 +2066,8 @@ class CabBookingScreen extends StatelessWidget { .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: ConstTexts.destinationLocation.tr(), + hintText: + ConstTexts.destinationLocation.tr(), enable: false, readOnly: true, prefix: const Padding( @@ -2282,7 +2280,7 @@ class CabBookingScreen extends StatelessWidget { InkWell( onTap: () async { ShowToastDialog.showLoader( - ConstTexts.pleaseWait.tr(), + ConstTexts.pleaseWait.tr(), ); UserModel? customer = @@ -2621,8 +2619,7 @@ class CabBookingScreen extends StatelessWidget { children: [ Expanded( child: Text( - '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})' - , + '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})', textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle( fontSize: 14, @@ -2720,7 +2717,9 @@ class CabBookingScreen extends StatelessWidget { isCenter: true, icon: const Icon(Icons.call, color: Colors.white), onPress: () async { - ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr()); + ShowToastDialog.showLoader( + ConstTexts.pleaseWait.tr(), + ); LocationData location = await controller.currentLocation.value @@ -2741,8 +2740,7 @@ class CabBookingScreen extends StatelessWidget { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - ConstTexts.yourSosRequest.tr() - + ConstTexts.yourSosRequest.tr(), ), backgroundColor: Colors.green, duration: Duration(seconds: 3), @@ -2754,7 +2752,9 @@ class CabBookingScreen extends StatelessWidget { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - ConstTexts.yourSosrequestAlreadySubmitted.tr() + ConstTexts + .yourSosrequestAlreadySubmitted + .tr(), ), backgroundColor: Colors.red, duration: Duration(seconds: 3), @@ -2822,7 +2822,8 @@ class CabBookingScreen extends StatelessWidget { Constant.userModel!.walletAmount! < controller.totalAmount.value) { ShowToastDialog.showToast( - ConstTexts.youDoNothaveSufficientwalletBalance.tr() + ConstTexts.youDoNothaveSufficientwalletBalance + .tr(), ); } else { controller.completeOrder(); @@ -2858,8 +2859,7 @@ class CabBookingScreen extends StatelessWidget { if (value == null) { Get.back(); ShowToastDialog.showToast( - - ConstTexts.somethingWentWrong.tr() + ConstTexts.somethingWentWrong.tr(), ); } else { CreateRazorPayOrderModel result = value; @@ -2873,7 +2873,7 @@ class CabBookingScreen extends StatelessWidget { }); } else { ShowToastDialog.showToast( - ConstTexts.plsSelectPaymentMethod.tr(), + ConstTexts.plsSelectPaymentMethod.tr(), ); } }, diff --git a/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart b/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart index 251c102..c74bdb0 100644 --- a/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart @@ -9,7 +9,7 @@ import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class CabCouponCodeScreen extends StatelessWidget { const CabCouponCodeScreen({super.key}); @@ -34,12 +34,30 @@ class CabCouponCodeScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text(ConstTexts.coupon.tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + ConstTexts.coupon.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -48,24 +66,44 @@ class CabCouponCodeScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.cabCouponList.isEmpty - ? Constant.showEmptyView(message: ConstTexts.couponNotFound.tr()) + ? Constant.showEmptyView( + message: ConstTexts.couponNotFound.tr(), + ) : ListView.builder( shrinkWrap: true, itemCount: controller.cabCouponList.length, itemBuilder: (context, index) { CouponModel couponModel = controller.cabCouponList[index]; return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Container( height: Responsive.height(16, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(10), bottomLeft: Radius.circular(10)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10), + ), child: Stack( children: [ - Image.asset("assets/images/ic_coupon_image.png", height: Responsive.height(16, context), fit: BoxFit.fill), + Image.asset( + "assets/images/ic_coupon_image.png", + height: Responsive.height(16, context), + fit: BoxFit.fill, + ), Padding( padding: const EdgeInsets.only(left: 10), child: Align( @@ -75,7 +113,14 @@ class CabCouponCodeScreen extends StatelessWidget { child: Text( "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ), ), @@ -85,24 +130,53 @@ class CabCouponCodeScreen extends StatelessWidget { ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 18), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(6), color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + options: + RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular( + 6, + ), + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), child: Text( "${couponModel.code}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), ), ), ), - const Expanded(child: SizedBox(height: 10)), + const Expanded( + child: SizedBox(height: 10), + ), InkWell( onTap: () { Get.back(result: couponModel); @@ -110,18 +184,38 @@ class CabCouponCodeScreen extends StatelessWidget { child: Text( ConstTexts.tapToApply.tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ], ), const SizedBox(height: 20), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 20), Text( "${couponModel.description}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), diff --git a/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart b/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart index 9f322af..2e29d07 100644 --- a/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart @@ -7,7 +7,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class CabDashboardScreen extends StatelessWidget { const CabDashboardScreen({super.key}); diff --git a/lib/screen_ui/cab_service_screens/cab_home_screen.dart b/lib/screen_ui/cab_service_screens/cab_home_screen.dart index c5e981b..bf9e6d9 100644 --- a/lib/screen_ui/cab_service_screens/cab_home_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_home_screen.dart @@ -10,7 +10,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'Intercity_home_screen.dart'; import 'cab_booking_screen.dart'; @@ -123,7 +123,7 @@ class CabHomeScreen extends HookWidget { CrossAxisAlignment.start, children: [ Text( - ConstTexts.everyRideVerified.tr(), + ConstTexts.everyRideVerified.tr(), style: AppThemeData.boldTextStyle( color: isDark @@ -133,8 +133,7 @@ class CabHomeScreen extends HookWidget { ), ), Text( - ConstTexts.allDriversIDCheck - .tr(), + ConstTexts.allDriversIDCheck.tr(), style: AppThemeData.mediumTextStyle( color: isDark diff --git a/lib/screen_ui/cab_service_screens/cab_order_details.dart b/lib/screen_ui/cab_service_screens/cab_order_details.dart index 1c2a5c2..1e3b71a 100644 --- a/lib/screen_ui/cab_service_screens/cab_order_details.dart +++ b/lib/screen_ui/cab_service_screens/cab_order_details.dart @@ -4,7 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/cab_order_details_controller.dart'; import '../../controllers/theme_controller.dart'; diff --git a/lib/screen_ui/cab_service_screens/cab_review_screen.dart b/lib/screen_ui/cab_service_screens/cab_review_screen.dart index e39a593..ef6ee21 100644 --- a/lib/screen_ui/cab_service_screens/cab_review_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_review_screen.dart @@ -4,7 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; diff --git a/lib/screen_ui/cab_service_screens/complain_screen.dart b/lib/screen_ui/cab_service_screens/complain_screen.dart index 94402a8..b3019ce 100644 --- a/lib/screen_ui/cab_service_screens/complain_screen.dart +++ b/lib/screen_ui/cab_service_screens/complain_screen.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/const_texts.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/complain_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -35,12 +35,27 @@ class ComplainScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: const Center(child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20)), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: const Center( + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), ), ), const SizedBox(width: 10), - Text(ConstTexts.complain.tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + ConstTexts.complain.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -52,11 +67,30 @@ class ComplainScreen extends StatelessWidget { padding: const EdgeInsets.all(16), child: Column( children: [ - Obx(() => TextFieldWidget(title: ConstTexts.title.tr(), hintText: ConstTexts.title.tr(), controller: controller.title.value)), + Obx( + () => TextFieldWidget( + title: ConstTexts.title.tr(), + hintText: ConstTexts.title.tr(), + controller: controller.title.value, + ), + ), const SizedBox(height: 10), - Obx(() => TextFieldWidget(title:ConstTexts.complain.tr(), hintText: ConstTexts.typeDescription.tr(), controller: controller.comment.value, maxLine: 8)), + Obx( + () => TextFieldWidget( + title: ConstTexts.complain.tr(), + hintText: ConstTexts.typeDescription.tr(), + controller: controller.comment.value, + maxLine: 8, + ), + ), const SizedBox(height: 20), - RoundedButtonFill( borderRadius: 10.r,title: ConstTexts.save.tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.submitComplain()), + RoundedButtonFill( + borderRadius: 10.r, + title: ConstTexts.save.tr(), + color: AppThemeData.primary300, + textColor: AppThemeData.grey50, + onPress: () => controller.submitComplain(), + ), ], ), ), diff --git a/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart index 5a85e86..de98f82 100644 --- a/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart @@ -9,7 +9,7 @@ import 'package:customer/themes/show_toast_dialog.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/my_cab_booking_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -33,14 +33,27 @@ class MyCabBookingScreen extends StatelessWidget { // length: controller.tabTitles.length, // initialIndex: controller.tabTitles.indexOf(controller.selectedTab.value), length: controller.tabKeys.length, - initialIndex: controller.tabKeys.indexOf(controller.selectedTab.value), + initialIndex: controller.tabKeys.indexOf( + controller.selectedTab.value, + ), child: Scaffold( appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: AppThemeData.primary300, title: Padding( padding: const EdgeInsets.only(bottom: 10), - child: Row(children: [const SizedBox(width: 10), Text(ConstTexts.rideHistory.tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))]), + child: Row( + children: [ + const SizedBox(width: 10), + Text( + ConstTexts.rideHistory.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), + ], + ), ), bottom: PreferredSize( preferredSize: const Size.fromHeight(48), @@ -53,7 +66,9 @@ class MyCabBookingScreen extends StatelessWidget { labelColor: AppThemeData.taxiBooking500, unselectedLabelColor: AppThemeData.taxiBooking500, labelStyle: AppThemeData.boldTextStyle(fontSize: 14), - unselectedLabelStyle: AppThemeData.mediumTextStyle(fontSize: 14), + unselectedLabelStyle: AppThemeData.mediumTextStyle( + fontSize: 14, + ), tabs: controller.tabKeys .map( @@ -63,7 +78,9 @@ class MyCabBookingScreen extends StatelessWidget { child: Text( controller.getLocalizedTabTitle(key), textAlign: TextAlign.center, - overflow: TextOverflow.visible, // 👈 show full text + overflow: + TextOverflow + .visible, // 👈 show full text ), ), ), @@ -83,16 +100,33 @@ class MyCabBookingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text(ConstTexts.plsLoginToAcc.tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + ConstTexts.plsLoginToAcc.tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( ConstTexts.youAreNotLoggedIn.tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.login.tr(), width: 55, height: 5.5, @@ -111,7 +145,17 @@ class MyCabBookingScreen extends StatelessWidget { final orders = controller.getOrdersForTab(title); if (orders.isEmpty) { - return Center(child: Text(ConstTexts.noOrderfound.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center( + child: Text( + ConstTexts.noOrderfound.tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ); } return ListView.builder( @@ -121,74 +165,150 @@ class MyCabBookingScreen extends StatelessWidget { CabOrderModel order = orders[index]; return GestureDetector( onTap: () { - Get.to(() => CabOrderDetails(), arguments: {"cabOrderModel": order}); + Get.to( + () => CabOrderDetails(), + arguments: {"cabOrderModel": order}, + ); }, child: Container( margin: const EdgeInsets.only(bottom: 16), padding: const EdgeInsets.all(16), decoration: BoxDecoration( - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, borderRadius: BorderRadius.circular(15), - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${'Booking Date:'.tr} ${controller.formatDate(order.scheduleDateTime!)}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Column( children: [ - Icon(Icons.stop_circle_outlined, color: Colors.green), - DottedBorder( - options: CustomPathDottedBorderOptions( - color: Colors.grey.shade400, - strokeWidth: 2, - dashPattern: [4, 4], - customPath: - (size) => - Path() - ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), - ), - child: const SizedBox(width: 20, height: 55), + Icon( + Icons.stop_circle_outlined, + color: Colors.green, + ), + DottedBorder( + options: + CustomPathDottedBorderOptions( + color: + Colors + .grey + .shade400, + strokeWidth: 2, + dashPattern: [4, 4], + customPath: + (size) => + Path() + ..moveTo( + size.width / + 2, + 0, + ) + ..lineTo( + size.width / + 2, + size.height, + ), + ), + child: const SizedBox( + width: 20, + height: 55, + ), + ), + Icon( + Icons.radio_button_checked, + color: Colors.red, ), - Icon(Icons.radio_button_checked, color: Colors.red), ], ), const SizedBox(width: 12), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ // Source Location Name Expanded( child: Text( - order.sourceLocationName.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + order + .sourceLocationName + .toString(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), maxLines: 2, - overflow: TextOverflow.ellipsis, + overflow: + TextOverflow + .ellipsis, ), ), const SizedBox(width: 8), Container( decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border.all(color: AppThemeData.warning300, width: 1), - color: AppThemeData.warning50, + borderRadius: + BorderRadius.circular( + 10, + ), + border: Border.all( + color: + AppThemeData + .warning300, + width: 1, + ), + color: + AppThemeData + .warning50, ), - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + padding: + const EdgeInsets.symmetric( + vertical: 8, + horizontal: 12, + ), child: Text( - order.status.toString(), - style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.warning500), - overflow: TextOverflow.ellipsis, + order.status + .toString(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + AppThemeData + .warning500, + ), + overflow: + TextOverflow + .ellipsis, ), ), ], @@ -196,46 +316,114 @@ class MyCabBookingScreen extends StatelessWidget { SizedBox(height: 15), DottedBorder( options: CustomPathDottedBorderOptions( - color: Colors.grey.shade400, + color: + Colors.grey.shade400, strokeWidth: 2, dashPattern: [4, 4], customPath: (size) => Path() - ..moveTo(0, size.height / 2) // start from left center - ..lineTo(size.width, size.height / 2), // draw to right center + ..moveTo( + 0, + size.height / + 2, + ) // start from left center + ..lineTo( + size.width, + size.height / + 2, + ), // draw to right center + ), + child: const SizedBox( + width: 295, + height: 3, ), - child: const SizedBox(width: 295, height: 3), ), SizedBox(height: 15), Text( - order.destinationLocationName.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + order + .destinationLocationName + .toString(), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), ), ], ), - if (Constant.isEnableOTPTripStart == true) + if (Constant.isEnableOTPTripStart == + true) Row( //mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - Text("Otp :", style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + "Otp :", + style: + AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark800 + : AppThemeData + .grey800, + ), + ), SizedBox(width: 5), - Text(order.otpCode ?? '', style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + order.otpCode ?? '', + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), ], ), - if (order.status == Constant.orderInTransit && order.paymentStatus == false) SizedBox(height: 14), - order.status == Constant.orderInTransit && order.paymentStatus == false + if (order.status == + Constant.orderInTransit && + order.paymentStatus == false) + SizedBox(height: 14), + order.status == + Constant.orderInTransit && + order.paymentStatus == false ? RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.payNow.tr(), onPress: () async { - controller.selectedPaymentMethod.value = order.paymentMethod.toString(); - controller.calculateTotalAmount(order); - Get.bottomSheet(paymentBottomSheet(context, controller, isDark), isScrollControlled: true, backgroundColor: Colors.transparent); + controller + .selectedPaymentMethod + .value = order.paymentMethod + .toString(); + controller.calculateTotalAmount( + order, + ); + Get.bottomSheet( + paymentBottomSheet( + context, + controller, + isDark, + ), + isScrollControlled: true, + backgroundColor: + Colors.transparent, + ); }, color: AppThemeData.primary300, textColor: AppThemeData.grey900, @@ -255,7 +443,11 @@ class MyCabBookingScreen extends StatelessWidget { ); } - Widget paymentBottomSheet(BuildContext context, MyCabBookingController controller, bool isDark) { + Widget paymentBottomSheet( + BuildContext context, + MyCabBookingController controller, + bool isDark, + ) { return DraggableScrollableSheet( initialChildSize: 0.70, // Start height @@ -268,14 +460,26 @@ class MyCabBookingScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey500 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey500 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.selectPaymentMethod.tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + ConstTexts.selectPaymentMethod.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), GestureDetector( onTap: () { Get.back(); @@ -290,40 +494,88 @@ class MyCabBookingScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text(ConstTexts.prefferedPayment.tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + ConstTexts.prefferedPayment.tr(), + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 10), Text( - ConstTexts.otherPaymentOptions.tr(), + ConstTexts.otherPaymentOptions.tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), ), const SizedBox(height: 10), ], @@ -331,32 +583,129 @@ class MyCabBookingScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -366,52 +715,109 @@ class MyCabBookingScreen extends StatelessWidget { ), ), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.continueT.tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast(ConstTexts.plsSelectPaymentMethod.tr()); + ShowToastDialog.showToast( + ConstTexts.plsSelectPaymentMethod.tr(), + ); } else { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.totalAmount.value.toString(), context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.totalAmount.value.toString(), + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.cod.name) { controller.completeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { - if (Constant.userModel!.walletAmount == null || Constant.userModel!.walletAmount! < controller.totalAmount.value) { - ShowToastDialog.showToast(ConstTexts.youDoNothaveSufficientwalletBalance.tr()); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name) { + if (Constant.userModel!.walletAmount == null || + Constant.userModel!.walletAmount! < + controller.totalAmount.value) { + ShowToastDialog.showToast( + ConstTexts.youDoNothaveSufficientwalletBalance.tr(), + ); } else { controller.completeOrder(); } - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast(ConstTexts.somethingWentWrong.tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); - } - }); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.totalAmount.value.toString(), + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + ConstTexts.somethingWentWrong.tr(), + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: controller.totalAmount.value.toString(), + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast(ConstTexts.plsSelectPaymentMethod.tr()); + ShowToastDialog.showToast( + ConstTexts.plsSelectPaymentMethod.tr(), + ); } } }, @@ -423,7 +829,12 @@ class MyCabBookingScreen extends StatelessWidget { ); } - Obx cardDecoration(MyCabBookingController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + MyCabBookingController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -438,8 +849,21 @@ class MyCabBookingScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -450,12 +874,30 @@ class MyCabBookingScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: Constant.userModel!.walletAmount == null ? '0.0' : Constant.userModel!.walletAmount.toString()), + Constant.amountShow( + amount: + Constant.userModel!.walletAmount == null + ? '0.0' + : Constant.userModel!.walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -464,14 +906,23 @@ class MyCabBookingScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/ecommarce/all_brand_product_screen.dart b/lib/screen_ui/ecommarce/all_brand_product_screen.dart index c50aa39..0545863 100644 --- a/lib/screen_ui/ecommarce/all_brand_product_screen.dart +++ b/lib/screen_ui/ecommarce/all_brand_product_screen.dart @@ -9,7 +9,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class AllBrandProductScreen extends StatelessWidget { const AllBrandProductScreen({super.key}); @@ -22,23 +22,41 @@ class AllBrandProductScreen extends StatelessWidget { init: AllBrandProductController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + ), body: controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16,vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), child: GridView.builder( shrinkWrap: true, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 3.5 / 6, crossAxisSpacing: 10), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: 3.5 / 6, + crossAxisSpacing: 10, + ), padding: EdgeInsets.zero, - itemCount: controller.productList.length, + itemCount: controller.productList.length, itemBuilder: (context, index) { - ProductModel productModel = controller.productList[index]; + ProductModel productModel = + controller.productList[index]; return FutureBuilder( - future: FireStoreUtils.getVendorById(productModel.vendorID.toString()), + future: FireStoreUtils.getVendorById( + productModel.vendorID.toString(), + ), builder: (context, vendorSnapshot) { - if (!vendorSnapshot.hasData || vendorSnapshot.connectionState == ConnectionState.waiting) { + if (!vendorSnapshot.hasData || + vendorSnapshot.connectionState == + ConnectionState.waiting) { return const SizedBox(); // Show placeholder or loader } VendorModel? vendorModel = vendorSnapshot.data; @@ -48,34 +66,78 @@ class AllBrandProductScreen extends StatelessWidget { List selectedIndexVariants = []; List selectedIndexArray = []; if (productModel.itemAttribute != null) { - if (productModel.itemAttribute!.attributes!.isNotEmpty) { - for (var element in productModel.itemAttribute!.attributes!) { + if (productModel + .itemAttribute! + .attributes! + .isNotEmpty) { + for (var element + in productModel + .itemAttribute! + .attributes!) { if (element.attributeOptions!.isNotEmpty) { selectedVariants.add( - productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString(), + productModel + .itemAttribute! + .attributes![productModel + .itemAttribute! + .attributes! + .indexOf(element)] + .attributeOptions![0] + .toString(), ); selectedIndexVariants.add( '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', ); - selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + selectedIndexArray.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { + if (productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + selectedVariants.join('-'), + ) + .isNotEmpty) { price = Constant.productCommissionPrice( vendorModel!, - productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0', + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + selectedVariants.join('-'), + ) + .first + .variantPrice ?? + '0', ); disPrice = "0"; } } else { - price = Constant.productCommissionPrice(vendorModel!, productModel.price.toString()); - disPrice = double.parse(productModel.disPrice.toString()) <= 0 ? "0" : Constant.productCommissionPrice(vendorModel, productModel.disPrice.toString()); + price = Constant.productCommissionPrice( + vendorModel!, + productModel.price.toString(), + ); + disPrice = + double.parse( + productModel.disPrice.toString(), + ) <= + 0 + ? "0" + : Constant.productCommissionPrice( + vendorModel, + productModel.disPrice.toString(), + ); } return GestureDetector( onTap: () async { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -85,47 +147,108 @@ class AllBrandProductScreen extends StatelessWidget { child: SizedBox( height: 90, width: Responsive.width(100, context), - child: NetworkImageWidget(imageUrl: productModel.photo.toString(), fit: BoxFit.cover), + child: NetworkImageWidget( + imageUrl: productModel.photo.toString(), + fit: BoxFit.cover, + ), ), ), Column( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( productModel.name!.capitalizeString(), textAlign: TextAlign.start, maxLines: 1, - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), ), disPrice == "" || disPrice == "0" - ? Text(Constant.amountShow(amount: price), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.primary300)) + ? Text( + Constant.amountShow(amount: price), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + AppThemeData.primary300, + ), + ) : Row( children: [ Text( - Constant.amountShow(amount: price), - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: Colors.grey, decoration: TextDecoration.lineThrough), + Constant.amountShow( + amount: price, + ), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: Colors.grey, + decoration: + TextDecoration + .lineThrough, + ), ), const SizedBox(width: 5), Text( - Constant.amountShow(amount: disPrice), - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: disPrice, + ), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.warning50 : AppThemeData.warning50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.warning50 + : AppThemeData.warning50, + borderRadius: BorderRadius.circular( + 30, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 6, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - Icon(Icons.star, size: 18, color: AppThemeData.warning400), + Icon( + Icons.star, + size: 18, + color: AppThemeData.warning400, + ), Text( "${Constant.calculateReview(reviewCount: productModel.reviewsCount.toString(), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsSum})", - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: AppThemeData.warning400), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + AppThemeData + .warning400, + ), ), ], ), diff --git a/lib/screen_ui/ecommarce/all_category_product_screen.dart b/lib/screen_ui/ecommarce/all_category_product_screen.dart index 16d9658..30afacd 100644 --- a/lib/screen_ui/ecommarce/all_category_product_screen.dart +++ b/lib/screen_ui/ecommarce/all_category_product_screen.dart @@ -9,7 +9,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class AllCategoryProductScreen extends StatelessWidget { const AllCategoryProductScreen({super.key}); @@ -22,23 +22,41 @@ class AllCategoryProductScreen extends StatelessWidget { init: AllCategoryProductController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + ), body: controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), child: GridView.builder( shrinkWrap: true, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 3.5 / 6, crossAxisSpacing: 10), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: 3.5 / 6, + crossAxisSpacing: 10, + ), padding: EdgeInsets.zero, itemCount: controller.productList.length, itemBuilder: (context, index) { - ProductModel productModel = controller.productList[index]; + ProductModel productModel = + controller.productList[index]; return FutureBuilder( - future: FireStoreUtils.getVendorById(productModel.vendorID.toString()), + future: FireStoreUtils.getVendorById( + productModel.vendorID.toString(), + ), builder: (context, vendorSnapshot) { - if (!vendorSnapshot.hasData || vendorSnapshot.connectionState == ConnectionState.waiting) { + if (!vendorSnapshot.hasData || + vendorSnapshot.connectionState == + ConnectionState.waiting) { return const SizedBox(); // Show placeholder or loader } VendorModel? vendorModel = vendorSnapshot.data; @@ -48,34 +66,78 @@ class AllCategoryProductScreen extends StatelessWidget { List selectedIndexVariants = []; List selectedIndexArray = []; if (productModel.itemAttribute != null) { - if (productModel.itemAttribute!.attributes!.isNotEmpty) { - for (var element in productModel.itemAttribute!.attributes!) { + if (productModel + .itemAttribute! + .attributes! + .isNotEmpty) { + for (var element + in productModel + .itemAttribute! + .attributes!) { if (element.attributeOptions!.isNotEmpty) { selectedVariants.add( - productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString(), + productModel + .itemAttribute! + .attributes![productModel + .itemAttribute! + .attributes! + .indexOf(element)] + .attributeOptions![0] + .toString(), ); selectedIndexVariants.add( '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', ); - selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + selectedIndexArray.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { + if (productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + selectedVariants.join('-'), + ) + .isNotEmpty) { price = Constant.productCommissionPrice( vendorModel!, - productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0', + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + selectedVariants.join('-'), + ) + .first + .variantPrice ?? + '0', ); disPrice = "0"; } } else { - price = Constant.productCommissionPrice(vendorModel!, productModel.price.toString()); - disPrice = double.parse(productModel.disPrice.toString()) <= 0 ? "0" : Constant.productCommissionPrice(vendorModel, productModel.disPrice.toString()); + price = Constant.productCommissionPrice( + vendorModel!, + productModel.price.toString(), + ); + disPrice = + double.parse( + productModel.disPrice.toString(), + ) <= + 0 + ? "0" + : Constant.productCommissionPrice( + vendorModel, + productModel.disPrice.toString(), + ); } return GestureDetector( onTap: () async { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -85,47 +147,108 @@ class AllCategoryProductScreen extends StatelessWidget { child: SizedBox( height: 90, width: Responsive.width(100, context), - child: NetworkImageWidget(imageUrl: productModel.photo.toString(), fit: BoxFit.cover), + child: NetworkImageWidget( + imageUrl: productModel.photo.toString(), + fit: BoxFit.cover, + ), ), ), Column( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( productModel.name!.capitalizeString(), textAlign: TextAlign.start, maxLines: 1, - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), ), disPrice == "" || disPrice == "0" - ? Text(Constant.amountShow(amount: price), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.primary300)) + ? Text( + Constant.amountShow(amount: price), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + AppThemeData.primary300, + ), + ) : Row( children: [ Text( - Constant.amountShow(amount: price), - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: Colors.grey, decoration: TextDecoration.lineThrough), + Constant.amountShow( + amount: price, + ), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: Colors.grey, + decoration: + TextDecoration + .lineThrough, + ), ), const SizedBox(width: 5), Text( - Constant.amountShow(amount: disPrice), - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: disPrice, + ), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.warning50 : AppThemeData.warning50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.warning50 + : AppThemeData.warning50, + borderRadius: BorderRadius.circular( + 30, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 6, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - Icon(Icons.star, size: 18, color: AppThemeData.warning400), + Icon( + Icons.star, + size: 18, + color: AppThemeData.warning400, + ), Text( "${Constant.calculateReview(reviewCount: productModel.reviewsCount.toString(), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsSum})", - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: AppThemeData.warning400), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + AppThemeData + .warning400, + ), ), ], ), diff --git a/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart b/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart index 9f7b0bd..dfdbdc0 100644 --- a/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart +++ b/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart @@ -5,8 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../controllers/theme_controller.dart'; class DashBoardEcommerceScreen extends StatelessWidget { @@ -27,12 +26,19 @@ class DashBoardEcommerceScreen extends StatelessWidget { showUnselectedLabels: true, showSelectedLabels: true, selectedFontSize: 12, - selectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), - unselectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), + selectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), + unselectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), currentIndex: controller.selectedIndex.value, - backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - selectedItemColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - unselectedItemColor: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + backgroundColor: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + selectedItemColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, + unselectedItemColor: + isDark ? AppThemeData.grey300 : AppThemeData.grey600, onTap: (int index) { if (index == 0) { Get.put(DashBoardController()); @@ -42,17 +48,71 @@ class DashBoardEcommerceScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_fav.svg", + label: 'Favourites'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_orders.svg", + label: 'Orders'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet.svg", label: 'Wallet'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr(), controller: controller), - navigationBarItem(isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_fav.svg", + label: 'Favourites'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_wallet.svg", + label: 'Wallet'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_orders.svg", + label: 'Orders'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 4, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ], ), ); @@ -61,7 +121,13 @@ class DashBoardEcommerceScreen extends StatelessWidget { }); } - BottomNavigationBarItem navigationBarItem(isDark, {required int index, required String label, required String assetIcon, required DashBoardEcommerceController controller}) { + BottomNavigationBarItem navigationBarItem( + isDark, { + required int index, + required String label, + required String assetIcon, + required DashBoardEcommerceController controller, + }) { return BottomNavigationBarItem( icon: Padding( padding: const EdgeInsets.symmetric(vertical: 5), diff --git a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart index cae6b77..7e4dae3 100644 --- a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart +++ b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart @@ -17,7 +17,8 @@ import 'package:customer/screen_ui/location_enable_screens/address_list_screen.d import 'package:customer/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart'; -import 'package:customer/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart' show RestaurantListScreen; +import 'package:customer/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart' + show RestaurantListScreen; import 'package:customer/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/search_screen/search_screen.dart'; @@ -37,7 +38,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:url_launcher/url_launcher.dart'; class HomeECommerceScreen extends StatelessWidget { @@ -53,13 +54,18 @@ class HomeECommerceScreen extends StatelessWidget { return Scaffold( backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, + backgroundColor: + isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, titleSpacing: 0, leading: InkWell( onTap: () { Get.back(); }, - child: Icon(Icons.arrow_back, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, size: 20), + child: Icon( + Icons.arrow_back, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, + size: 20, + ), ), title: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -69,9 +75,27 @@ class HomeECommerceScreen extends StatelessWidget { onTap: () { Get.offAll(const LoginScreen()); }, - child: Text("Login".tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 12)), + child: Text( + "Login".tr(), + textAlign: TextAlign.center, + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontSize: 12, + ), + ), ) - : Text(Constant.userModel!.fullName(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 12)), + : Text( + Constant.userModel!.fullName(), + textAlign: TextAlign.center, + style: AppThemeData.semiBoldTextStyle( + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey50, + fontSize: 12, + ), + ), InkWell( onTap: () async { if (Constant.userModel != null) { @@ -96,7 +120,9 @@ class HomeECommerceScreen extends StatelessWidget { ShowToastDialog.closeLoader(); if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; final lat = firstPlace.coordinates.latitude; @@ -105,19 +131,31 @@ class HomeECommerceScreen extends StatelessWidget { shippingAddress.addressAs = "Home"; shippingAddress.locality = address.toString(); - shippingAddress.location = UserLocation(latitude: lat, longitude: lng); + shippingAddress.location = UserLocation( + latitude: lat, + longitude: lng, + ); Constant.selectedLocation = shippingAddress; controller.getData(); Get.back(); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel selectedLocationModel = + value; shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); - shippingAddress.locality = "Picked from Map"; // You can reverse-geocode + shippingAddress.location = UserLocation( + latitude: + selectedLocationModel.latLng!.latitude, + longitude: + selectedLocationModel.latLng!.longitude, + ); + shippingAddress.locality = + "Picked from Map"; // You can reverse-geocode Constant.selectedLocation = shippingAddress; controller.getData(); @@ -125,9 +163,15 @@ class HomeECommerceScreen extends StatelessWidget { }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then((valuePlaceMaker) { Placemark placeMark = valuePlaceMaker[0]; - shippingAddress.location = UserLocation(latitude: 19.228825, longitude: 72.854118); + shippingAddress.location = UserLocation( + latitude: 19.228825, + longitude: 72.854118, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; shippingAddress.locality = currentLocation; @@ -147,8 +191,25 @@ class HomeECommerceScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, TextSpan( children: [ - TextSpan(text: Constant.selectedLocation.getFullAddress(), style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 14)), - WidgetSpan(child: SvgPicture.asset("assets/icons/ic_down.svg", colorFilter: ColorFilter.mode(AppThemeData.grey50, BlendMode.srcIn))), + TextSpan( + text: Constant.selectedLocation.getFullAddress(), + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontSize: 14, + ), + ), + WidgetSpan( + child: SvgPicture.asset( + "assets/icons/ic_down.svg", + colorFilter: ColorFilter.mode( + AppThemeData.grey50, + BlendMode.srcIn, + ), + ), + ), ], ), ), @@ -168,10 +229,14 @@ class HomeECommerceScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey50, ), ), - badgeStyle: badges.BadgeStyle(shape: badges.BadgeShape.circle, badgeColor: AppThemeData.info300), + badgeStyle: badges.BadgeStyle( + shape: badges.BadgeShape.circle, + badgeColor: AppThemeData.info300, + ), child: InkWell( onTap: () async { (await Get.to(const CartScreen())); @@ -182,11 +247,28 @@ class HomeECommerceScreen extends StatelessWidget { width: 30, height: 30, decoration: ShapeDecoration( - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), borderRadius: BorderRadius.circular(120)), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + borderRadius: BorderRadius.circular(120), + ), ), child: Padding( padding: const EdgeInsets.all(8.0), - child: SvgPicture.asset("assets/icons/ic_shoping_cart.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey50 : AppThemeData.grey50, BlendMode.srcIn)), + child: SvgPicture.asset( + "assets/icons/ic_shoping_cart.svg", + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + BlendMode.srcIn, + ), + ), ), ), ), @@ -196,22 +278,39 @@ class HomeECommerceScreen extends StatelessWidget { ), ], bottom: PreferredSize( - preferredSize: Size.fromHeight(50.0), // height of the bottom widget + preferredSize: Size.fromHeight( + 50.0, + ), // height of the bottom widget child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), child: InkWell( onTap: () { - Get.to(const SearchScreen(), arguments: {"vendorList": controller.allNearestRestaurant}); + Get.to( + const SearchScreen(), + arguments: { + "vendorList": controller.allNearestRestaurant, + }, + ); }, child: TextFieldWidget( hintText: 'Search the store, item and more...'.tr(), controller: null, enable: false, backgroundColor: AppThemeData.grey50, - hintColor: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + hintColor: + isDark ? AppThemeData.grey400 : AppThemeData.grey400, prefix: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), - child: SvgPicture.asset("assets/icons/ic_search.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey400 : AppThemeData.grey400, BlendMode.srcIn)), + child: SvgPicture.asset( + "assets/icons/ic_search.svg", + colorFilter: ColorFilter.mode( + isDark ? AppThemeData.grey400 : AppThemeData.grey400, + BlendMode.srcIn, + ), + ), ), ), ), @@ -236,7 +335,13 @@ class HomeECommerceScreen extends StatelessWidget { child: Text( "Category".tr(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16), + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), ), ), InkWell( @@ -248,7 +353,10 @@ class HomeECommerceScreen extends StatelessWidget { textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( decoration: TextDecoration.underline, - color: isDark ? AppThemeData.multiVendorDark300 : AppThemeData.multiVendor300, + color: + isDark + ? AppThemeData.multiVendorDark300 + : AppThemeData.multiVendor300, fontSize: 14, ), ), @@ -264,26 +372,51 @@ class HomeECommerceScreen extends StatelessWidget { child: ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), - itemCount: controller.vendorCategoryModel.length, + itemCount: + controller.vendorCategoryModel.length, scrollDirection: Axis.horizontal, itemBuilder: (context, index) { - VendorCategoryModel vendorCategoryModel = controller.vendorCategoryModel[index]; + VendorCategoryModel vendorCategoryModel = + controller.vendorCategoryModel[index]; return InkWell( onTap: () { - Get.to(const CategoryRestaurantScreen(), arguments: {"vendorCategoryModel": vendorCategoryModel, "dineIn": false}); + Get.to( + const CategoryRestaurantScreen(), + arguments: { + "vendorCategoryModel": + vendorCategoryModel, + "dineIn": false, + }, + ); }, child: Padding( padding: const EdgeInsets.only(right: 18), child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - NetworkImageWidget(imageUrl: vendorCategoryModel.photo.toString(), height: 60, width: 60, fit: BoxFit.cover), + NetworkImageWidget( + imageUrl: + vendorCategoryModel.photo + .toString(), + height: 60, + width: 60, + fit: BoxFit.cover, + ), const SizedBox(height: 5), Text( - vendorCategoryModel.title.toString(), + vendorCategoryModel.title + .toString(), textAlign: TextAlign.center, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, fontSize: 14), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + fontSize: 14, + ), ), ], ), @@ -294,20 +427,38 @@ class HomeECommerceScreen extends StatelessWidget { ), ), SizedBox(height: 10), - Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: controller.bannerModel.isEmpty ? const SizedBox() : BannerView(controller: controller)), - Visibility(visible: (Constant.isEnableAdsFeature == true && controller.advertisementList.isNotEmpty), child: const SizedBox(height: 20)), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: + controller.bannerModel.isEmpty + ? const SizedBox() + : BannerView(controller: controller), + ), + Visibility( + visible: + (Constant.isEnableAdsFeature == true && + controller.advertisementList.isNotEmpty), + child: const SizedBox(height: 20), + ), Visibility( visible: Constant.isEnableAdsFeature == true, child: controller.advertisementList.isEmpty ? const SizedBox() : Container( - color: AppThemeData.primary300.withAlpha(40), + color: AppThemeData.primary300.withAlpha( + 40, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 16, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ @@ -315,19 +466,41 @@ class HomeECommerceScreen extends StatelessWidget { child: Text( "Highlights for you".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + ), ), ), InkWell( onTap: () { - Get.to(AllAdvertisementScreen())?.then((value) { - controller.getFavouriteRestaurant(); + Get.to( + AllAdvertisementScreen(), + )?.then((value) { + controller + .getFavouriteRestaurant(); }); }, child: Text( "View all".tr(), textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ], @@ -336,12 +509,30 @@ class HomeECommerceScreen extends StatelessWidget { SizedBox( height: 220, child: ListView.builder( - physics: const BouncingScrollPhysics(), - scrollDirection: Axis.horizontal, - itemCount: controller.advertisementList.length >= 10 ? 10 : controller.advertisementList.length, + physics: + const BouncingScrollPhysics(), + scrollDirection: + Axis.horizontal, + itemCount: + controller + .advertisementList + .length >= + 10 + ? 10 + : controller + .advertisementList + .length, padding: EdgeInsets.all(0), - itemBuilder: (BuildContext context, int index) { - return AdvertisementHomeCard(controller: controller, model: controller.advertisementList[index]); + itemBuilder: ( + BuildContext context, + int index, + ) { + return AdvertisementHomeCard( + controller: controller, + model: + controller + .advertisementList[index], + ); }, ), ), @@ -356,7 +547,13 @@ class HomeECommerceScreen extends StatelessWidget { child: Text( "New Arrivals".tr(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16), + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), ), ), SizedBox(height: 20), @@ -372,7 +569,13 @@ class HomeECommerceScreen extends StatelessWidget { childAspectRatio: 1 / 1.1, padding: EdgeInsets.zero, physics: NeverScrollableScrollPhysics(), - children: controller.newArrivalRestaurantList.take(4).map((item) => NewArrivalCard(item: item)).toList(), + children: + controller.newArrivalRestaurantList + .take(4) + .map( + (item) => NewArrivalCard(item: item), + ) + .toList(), ), ), ), @@ -381,11 +584,24 @@ class HomeECommerceScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 16), child: RoundedButtonBorder( radius: 10, - color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + color: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey100, + borderColor: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, title: 'View All Arrivals'.tr(), onPress: () { - Get.to(RestaurantListScreen(), arguments: {"vendorList": controller.newArrivalRestaurantList, "title": "New Arrivals".tr()}); + Get.to( + RestaurantListScreen(), + arguments: { + "vendorList": + controller.newArrivalRestaurantList, + "title": "New Arrivals".tr(), + }, + ); }, ), ), @@ -395,19 +611,38 @@ class HomeECommerceScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Top Brands".tr(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), + Text( + "Top Brands".tr(), + textAlign: TextAlign.start, + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), + ), SizedBox(height: 10), GridView.builder( padding: EdgeInsets.zero, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 4.5 / 6, crossAxisSpacing: 2), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + childAspectRatio: 4.5 / 6, + crossAxisSpacing: 2, + ), itemCount: controller.brandList.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (context, index) { - BrandsModel brandModel = controller.brandList[index]; + BrandsModel brandModel = + controller.brandList[index]; return InkWell( onTap: () { - Get.to(AllBrandProductScreen(), arguments: {"brandModel": brandModel}); + Get.to( + AllBrandProductScreen(), + arguments: {"brandModel": brandModel}, + ); }, child: Column( children: [ @@ -415,20 +650,49 @@ class HomeECommerceScreen extends StatelessWidget { width: 80, height: 80, decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, strokeAlign: BorderSide.strokeAlignOutside, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100), - borderRadius: BorderRadius.circular(10), + side: BorderSide( + width: 1, + strokeAlign: + BorderSide + .strokeAlignOutside, + color: + isDark + ? AppThemeData.grey800 + : AppThemeData + .grey100, + ), + borderRadius: + BorderRadius.circular(10), + ), + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: ClipOval( + child: NetworkImageWidget( + imageUrl: + brandModel.photo + .toString(), + fit: BoxFit.cover, + ), ), ), - child: Padding(padding: const EdgeInsets.all(10), child: ClipOval(child: NetworkImageWidget(imageUrl: brandModel.photo.toString(), fit: BoxFit.cover))), ), SizedBox(height: 5), Text( '${brandModel.title}', textAlign: TextAlign.center, maxLines: 2, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), @@ -443,137 +707,389 @@ class HomeECommerceScreen extends StatelessWidget { shrinkWrap: true, physics: const BouncingScrollPhysics(), padding: EdgeInsets.zero, - itemCount: controller.categoryWiseProductList.length, + itemCount: + controller.categoryWiseProductList.length, itemBuilder: (context, index) { - VendorCategoryModel item = controller.categoryWiseProductList[index]; - String imagePath = ["assets/images/ic_product_bg_1.png", "assets/images/ic_product_bg_2.png", "assets/images/ic_product_bg_3.png"][index % ["", "", ""].length]; + VendorCategoryModel item = + controller.categoryWiseProductList[index]; + String imagePath = + [ + "assets/images/ic_product_bg_1.png", + "assets/images/ic_product_bg_2.png", + "assets/images/ic_product_bg_3.png", + ][index % ["", "", ""].length]; return Container( width: Responsive.width(100, context), - decoration: BoxDecoration(image: DecorationImage(image: AssetImage(imagePath), fit: BoxFit.fill)), + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(imagePath), + fit: BoxFit.fill, + ), + ), child: Padding( - padding: const EdgeInsets.only(left: 16, right: 16, top: 10, bottom: 20), + padding: const EdgeInsets.only( + left: 16, + right: 16, + top: 10, + bottom: 20, + ), child: FutureBuilder>( - future: FireStoreUtils.getProductListByCategoryId(item.id.toString()), + future: + FireStoreUtils.getProductListByCategoryId( + item.id.toString(), + ), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))); - } else if ((snapshot.hasData || (snapshot.data?.isNotEmpty ?? false))) { - List productList = snapshot.data!; + if (snapshot.connectionState == + ConnectionState.waiting) { + return Center( + child: + CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData.primary300, + ), + ), + ); + } else if ((snapshot.hasData || + (snapshot.data?.isNotEmpty ?? + false))) { + List productList = + snapshot.data!; return snapshot.data!.isEmpty ? Container() : Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, children: [ - Text(item.title.toString(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(color: AppThemeData.grey900, fontSize: 18)), Text( - "Style up with the latest fits, now at unbeatable prices.".tr(), + item.title.toString(), textAlign: TextAlign.start, - style: AppThemeData.regularTextStyle(color: AppThemeData.grey900, fontSize: 12), + style: + AppThemeData.boldTextStyle( + color: + AppThemeData + .grey900, + fontSize: 18, + ), + ), + Text( + "Style up with the latest fits, now at unbeatable prices." + .tr(), + textAlign: TextAlign.start, + style: + AppThemeData.regularTextStyle( + color: + AppThemeData + .grey900, + fontSize: 12, + ), ), SizedBox(height: 20), GridView.builder( shrinkWrap: true, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 3.5 / 6, crossAxisSpacing: 10), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: + 3.5 / 6, + crossAxisSpacing: 10, + ), padding: EdgeInsets.zero, - physics: NeverScrollableScrollPhysics(), - itemCount: productList.length > 6 ? 6 : productList.length, - itemBuilder: (context, index) { - ProductModel productModel = productList[index]; + physics: + NeverScrollableScrollPhysics(), + itemCount: + productList.length > 6 + ? 6 + : productList.length, + itemBuilder: ( + context, + index, + ) { + ProductModel productModel = + productList[index]; return FutureBuilder( - future: FireStoreUtils.getVendorById(productModel.vendorID.toString()), - builder: (context, vendorSnapshot) { - if (!vendorSnapshot.hasData || vendorSnapshot.connectionState == ConnectionState.waiting) { + future: + FireStoreUtils.getVendorById( + productModel + .vendorID + .toString(), + ), + builder: ( + context, + vendorSnapshot, + ) { + if (!vendorSnapshot + .hasData || + vendorSnapshot + .connectionState == + ConnectionState + .waiting) { return const SizedBox(); // Show placeholder or loader } - VendorModel? vendorModel = vendorSnapshot.data; + VendorModel? + vendorModel = + vendorSnapshot.data; String price = "0.0"; String disPrice = "0.0"; - List selectedVariants = []; - List selectedIndexVariants = []; - List selectedIndexArray = []; - if (productModel.itemAttribute != null) { - if (productModel.itemAttribute!.attributes!.isNotEmpty) { - for (var element in productModel.itemAttribute!.attributes!) { - if (element.attributeOptions!.isNotEmpty) { + List + selectedVariants = []; + List + selectedIndexVariants = + []; + List + selectedIndexArray = []; + if (productModel + .itemAttribute != + null) { + if (productModel + .itemAttribute! + .attributes! + .isNotEmpty) { + for (var element + in productModel + .itemAttribute! + .attributes!) { + if (element + .attributeOptions! + .isNotEmpty) { selectedVariants.add( - productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString(), + productModel + .itemAttribute! + .attributes![productModel + .itemAttribute! + .attributes! + .indexOf( + element, + )] + .attributeOptions![0] + .toString(), ); - selectedIndexVariants.add( - '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', - ); - selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + selectedIndexVariants + .add( + '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', + ); + selectedIndexArray + .add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { + if (productModel + .itemAttribute! + .variants! + .where( + (element) => + element + .variantSku == + selectedVariants + .join( + '-', + ), + ) + .isNotEmpty) { price = Constant.productCommissionPrice( vendorModel!, - productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0', + productModel + .itemAttribute! + .variants! + .where( + ( + element, + ) => + element.variantSku == + selectedVariants.join( + '-', + ), + ) + .first + .variantPrice ?? + '0', ); disPrice = "0"; } } else { - price = Constant.productCommissionPrice(vendorModel!, productModel.price.toString()); + price = + Constant.productCommissionPrice( + vendorModel!, + productModel + .price + .toString(), + ); disPrice = - double.parse(productModel.disPrice.toString()) <= 0 + double.parse( + productModel + .disPrice + .toString(), + ) <= + 0 ? "0" - : Constant.productCommissionPrice(vendorModel, productModel.disPrice.toString()); + : Constant.productCommissionPrice( + vendorModel, + productModel + .disPrice + .toString(), + ); } return GestureDetector( onTap: () async { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: { + "vendorModel": + vendorModel, + }, + ); }, child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ ClipRRect( - borderRadius: BorderRadius.circular(10), + borderRadius: + BorderRadius.circular( + 10, + ), child: SizedBox( height: 90, - width: Responsive.width(100, context), - child: NetworkImageWidget(imageUrl: productModel.photo.toString(), fit: BoxFit.cover), + width: + Responsive.width( + 100, + context, + ), + child: NetworkImageWidget( + imageUrl: + productModel + .photo + .toString(), + fit: + BoxFit + .cover, + ), ), ), Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( - productModel.name!.capitalizeString(), - textAlign: TextAlign.start, + productModel + .name! + .capitalizeString(), + textAlign: + TextAlign + .start, maxLines: 1, - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + style: AppThemeData.semiBoldTextStyle( + fontSize: + 18, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), ), - disPrice == "" || disPrice == "0" - ? Text(Constant.amountShow(amount: price), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.primary300)) + disPrice == + "" || + disPrice == + "0" + ? Text( + Constant.amountShow( + amount: + price, + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: + 16, + color: + AppThemeData.primary300, + ), + ) : Column( children: [ Text( - Constant.amountShow(amount: price), - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: Colors.grey, decoration: TextDecoration.lineThrough), + Constant.amountShow( + amount: + price, + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: + 14, + color: + Colors.grey, + decoration: + TextDecoration.lineThrough, + ), + ), + const SizedBox( + width: + 5, ), - const SizedBox(width: 5), Text( - Constant.amountShow(amount: disPrice), - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: + disPrice, + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: + 14, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.warning50 : AppThemeData.warning50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.warning50 + : AppThemeData.warning50, + borderRadius: + BorderRadius.circular( + 30, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: + 10, + vertical: + 6, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.min, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + mainAxisSize: + MainAxisSize.min, children: [ - Icon(Icons.star, size: 18, color: AppThemeData.warning400), + Icon( + Icons.star, + size: + 18, + color: + AppThemeData.warning400, + ), Text( "${Constant.calculateReview(reviewCount: productModel.reviewsCount.toString(), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsSum})", - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: AppThemeData.warning400), + style: AppThemeData.semiBoldTextStyle( + fontSize: + 12, + color: + AppThemeData.warning400, + ), ), ], ), @@ -590,11 +1106,26 @@ class HomeECommerceScreen extends StatelessWidget { ), RoundedButtonBorder( radius: 10, - color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + color: + isDark + ? AppThemeData + .greyDark100 + : AppThemeData + .grey100, + borderColor: + isDark + ? AppThemeData + .greyDark200 + : AppThemeData + .grey200, title: 'View All Products', onPress: () { - Get.to(AllCategoryProductScreen(), arguments: {"categoryModel": item}); + Get.to( + AllCategoryProductScreen(), + arguments: { + "categoryModel": item, + }, + ); }, ), ], @@ -609,7 +1140,13 @@ class HomeECommerceScreen extends StatelessWidget { }, ), SizedBox(height: 10), - Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: controller.bannerModel.isEmpty ? const SizedBox() : BannerBottomView(controller: controller)), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: + controller.bannerModel.isEmpty + ? const SizedBox() + : BannerBottomView(controller: controller), + ), // Visibility( // visible: (Constant.isEnableAdsFeature == true && controller.advertisementList.isNotEmpty), // child: const SizedBox(height: 20), @@ -687,56 +1224,145 @@ class HomeECommerceScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("All Store".tr(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), + Text( + "All Store".tr(), + textAlign: TextAlign.start, + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), + ), SizedBox(height: 10), ListView.builder( padding: EdgeInsets.zero, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), - itemCount: controller.allNearestRestaurant.length > 8 ? 8 : controller.allNearestRestaurant.length, + itemCount: + controller.allNearestRestaurant.length > 8 + ? 8 + : controller + .allNearestRestaurant + .length, itemBuilder: (context, index) { - VendorModel item = controller.allNearestRestaurant[index]; + VendorModel item = + controller.allNearestRestaurant[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": item}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": item}, + ); }, child: Padding( - padding: const EdgeInsets.only(bottom: 20), + padding: const EdgeInsets.only( + bottom: 20, + ), child: Row( children: [ - ClipRRect(borderRadius: BorderRadius.circular(10), child: NetworkImageWidget(imageUrl: item.photo.toString(), height: 80, width: 130, fit: BoxFit.cover)), + ClipRRect( + borderRadius: + BorderRadius.circular(10), + child: NetworkImageWidget( + imageUrl: item.photo.toString(), + height: 80, + width: 130, + fit: BoxFit.cover, + ), + ), SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text(item.title.toString(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), + Text( + item.title.toString(), + style: + AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + fontSize: 16, + ), + ), Row( children: [ - Icon(Icons.location_on, size: 14, color: Colors.grey), + Icon( + Icons.location_on, + size: 14, + color: Colors.grey, + ), SizedBox(width: 4), Expanded( child: Text( - item.location.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), - overflow: TextOverflow.ellipsis, + item.location + .toString(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData + .greyDark500 + : AppThemeData + .grey500, + ), + overflow: + TextOverflow + .ellipsis, ), ), ], ), Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.warning50 : AppThemeData.warning50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData + .warning50 + : AppThemeData + .warning50, + borderRadius: + BorderRadius.circular( + 30, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 6, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.min, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .center, + mainAxisSize: + MainAxisSize.min, children: [ - Icon(Icons.star, size: 18, color: AppThemeData.warning400), + Icon( + Icons.star, + size: 18, + color: + AppThemeData + .warning400, + ), Text( "${Constant.calculateReview(reviewCount: item.reviewsCount.toString(), reviewSum: item.reviewsSum.toString())} (${item.reviewsSum})", - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: AppThemeData.warning400), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + AppThemeData + .warning400, + ), ), ], ), @@ -753,11 +1379,23 @@ class HomeECommerceScreen extends StatelessWidget { ), RoundedButtonBorder( radius: 10, - color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + color: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey100, + borderColor: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, title: 'View All Stores'.tr(), onPress: () { - Get.to(const RestaurantListScreen(), arguments: {"vendorList": controller.allNearestRestaurant}); + Get.to( + const RestaurantListScreen(), + arguments: { + "vendorList": + controller.allNearestRestaurant, + }, + ); }, ), ], @@ -784,7 +1422,10 @@ class NewArrivalCard extends StatelessWidget { final isDark = themeController.isDark.value; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": item}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": item}, + ); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -795,11 +1436,20 @@ class NewArrivalCard extends StatelessWidget { height: 100, width: double.infinity, fit: BoxFit.cover, - imageUrl: item.photo != null && item.photo!.isNotEmpty ? item.photo.toString() : Constant.placeHolderImage.toString(), + imageUrl: + item.photo != null && item.photo!.isNotEmpty + ? item.photo.toString() + : Constant.placeHolderImage.toString(), ), ), SizedBox(height: 5), - Text(item.title.toString(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 14)), + Text( + item.title.toString(), + style: AppThemeData.semiBoldTextStyle( + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + fontSize: 14, + ), + ), Row( children: [ Icon(Icons.location_on, size: 14, color: Colors.grey), @@ -807,14 +1457,23 @@ class NewArrivalCard extends StatelessWidget { Expanded( child: Text( item.location.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), overflow: TextOverflow.ellipsis, ), ), ], ), Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.warning50 : AppThemeData.warning50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: isDark ? AppThemeData.warning50 : AppThemeData.warning50, + borderRadius: BorderRadius.circular(30), + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), child: Row( @@ -825,7 +1484,10 @@ class NewArrivalCard extends StatelessWidget { Icon(Icons.star, size: 18, color: AppThemeData.warning400), Text( "${Constant.calculateReview(reviewCount: item.reviewsCount.toString(), reviewSum: item.reviewsSum.toString())} (${item.reviewsSum})", - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: AppThemeData.warning400), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: AppThemeData.warning400, + ), ), ], ), @@ -865,17 +1527,32 @@ class BannerView extends StatelessWidget { onTap: () async { if (bannerModel.redirect_type == "store") { ShowToastDialog.showLoader("Please wait...".tr()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(bannerModel.redirect_id.toString()); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + bannerModel.redirect_id.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "product") { ShowToastDialog.showLoader("Please wait...".tr()); - ProductModel? productModel = await FireStoreUtils.getProductById(bannerModel.redirect_id.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel!.vendorID.toString()); + ProductModel? productModel = + await FireStoreUtils.getProductById( + bannerModel.redirect_id.toString(), + ); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + productModel!.vendorID.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "external_link") { final uri = Uri.parse(bannerModel.redirect_id.toString()); if (await canLaunchUrl(uri)) { @@ -887,7 +1564,13 @@ class BannerView extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.only(right: 14), - child: ClipRRect(borderRadius: const BorderRadius.all(Radius.circular(12)), child: NetworkImageWidget(imageUrl: bannerModel.photo.toString(), fit: BoxFit.cover)), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(12)), + child: NetworkImageWidget( + imageUrl: bannerModel.photo.toString(), + fit: BoxFit.cover, + ), + ), ), ); }, @@ -905,7 +1588,13 @@ class BannerView extends StatelessWidget { alignment: Alignment.centerLeft, height: 9, width: 9, - decoration: BoxDecoration(shape: BoxShape.circle, color: controller.currentPage.value == index ? AppThemeData.primary300 : Colors.black12), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + controller.currentPage.value == index + ? AppThemeData.primary300 + : Colors.black12, + ), ), ); }), @@ -944,17 +1633,32 @@ class BannerBottomView extends StatelessWidget { onTap: () async { if (bannerModel.redirect_type == "store") { ShowToastDialog.showLoader("Please wait...".tr()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(bannerModel.redirect_id.toString()); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + bannerModel.redirect_id.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "product") { ShowToastDialog.showLoader("Please wait...".tr()); - ProductModel? productModel = await FireStoreUtils.getProductById(bannerModel.redirect_id.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel!.vendorID.toString()); + ProductModel? productModel = + await FireStoreUtils.getProductById( + bannerModel.redirect_id.toString(), + ); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + productModel!.vendorID.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "external_link") { final uri = Uri.parse(bannerModel.redirect_id.toString()); if (await canLaunchUrl(uri)) { @@ -966,7 +1670,13 @@ class BannerBottomView extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.only(right: 14), - child: ClipRRect(borderRadius: const BorderRadius.all(Radius.circular(12)), child: NetworkImageWidget(imageUrl: bannerModel.photo.toString(), fit: BoxFit.cover)), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(12)), + child: NetworkImageWidget( + imageUrl: bannerModel.photo.toString(), + fit: BoxFit.cover, + ), + ), ), ); }, @@ -977,14 +1687,22 @@ class BannerBottomView extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - children: List.generate(controller.bannerBottomModel.length, (index) { + children: List.generate(controller.bannerBottomModel.length, ( + index, + ) { return Obx( () => Container( margin: const EdgeInsets.only(right: 5), alignment: Alignment.centerLeft, height: 9, width: 9, - decoration: BoxDecoration(shape: BoxShape.circle, color: controller.currentBottomPage.value == index ? AppThemeData.primary300 : Colors.black12), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + controller.currentBottomPage.value == index + ? AppThemeData.primary300 + : Colors.black12, + ), ), ); }), @@ -999,7 +1717,11 @@ class AdvertisementHomeCard extends StatelessWidget { final AdvertisementModel model; final HomeECommerceController controller; - const AdvertisementHomeCard({super.key, required this.controller, required this.model}); + const AdvertisementHomeCard({ + super.key, + required this.controller, + required this.model, + }); @override Widget build(BuildContext context) { @@ -1008,9 +1730,14 @@ class AdvertisementHomeCard extends StatelessWidget { return InkWell( onTap: () async { ShowToastDialog.showLoader("Please wait...".tr()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(model.vendorId!); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + model.vendorId!, + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Container( margin: EdgeInsets.only(right: 16), @@ -1018,7 +1745,14 @@ class AdvertisementHomeCard extends StatelessWidget { decoration: BoxDecoration( color: isDark ? AppThemeData.info600 : AppThemeData.surface, borderRadius: BorderRadius.circular(16), - boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.1), blurRadius: isDark ? 6 : 2, spreadRadius: 0, offset: Offset(0, isDark ? 3 : 1))], + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: isDark ? 6 : 2, + spreadRadius: 0, + offset: Offset(0, isDark ? 3 : 1), + ), + ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -1027,18 +1761,32 @@ class AdvertisementHomeCard extends StatelessWidget { children: [ model.type == 'restaurant_promotion' ? ClipRRect( - borderRadius: BorderRadius.vertical(top: Radius.circular(16)), - child: NetworkImageWidget(imageUrl: model.coverImage ?? '', height: 135, width: double.infinity, fit: BoxFit.cover), + borderRadius: BorderRadius.vertical( + top: Radius.circular(16), + ), + child: NetworkImageWidget( + imageUrl: model.coverImage ?? '', + height: 135, + width: double.infinity, + fit: BoxFit.cover, + ), ) - : VideoAdvWidget(url: model.video ?? '', height: 135, width: double.infinity), - if (model.type != 'video_promotion' && model.vendorId != null && (model.showRating == true || model.showReview == true)) + : VideoAdvWidget( + url: model.video ?? '', + height: 135, + width: double.infinity, + ), + if (model.type != 'video_promotion' && + model.vendorId != null && + (model.showRating == true || model.showReview == true)) Positioned( bottom: 8, right: 8, child: FutureBuilder( future: FireStoreUtils.getVendorById(model.vendorId!), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == + ConnectionState.waiting) { return const SizedBox(); } else { if (snapshot.hasError) { @@ -1048,16 +1796,43 @@ class AdvertisementHomeCard extends StatelessWidget { } else { VendorModel vendorModel = snapshot.data!; return Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - if (model.showRating == true) SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), - if (model.showRating == true) const SizedBox(width: 5), + if (model.showRating == true) + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), + if (model.showRating == true) + const SizedBox(width: 5), Text( "${model.showRating == true ? Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString()) : ''} ${model.showReview == true ? '(${vendorModel.reviewsCount!.toStringAsFixed(0)})' : ''}", - style: TextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), @@ -1076,7 +1851,15 @@ class AdvertisementHomeCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ if (model.type == 'restaurant_promotion') - ClipRRect(borderRadius: BorderRadius.circular(30), child: NetworkImageWidget(imageUrl: model.profileImage ?? '', height: 50, width: 50, fit: BoxFit.cover)), + ClipRRect( + borderRadius: BorderRadius.circular(30), + child: NetworkImageWidget( + imageUrl: model.profileImage ?? '', + height: 50, + width: 50, + fit: BoxFit.cover, + ), + ), SizedBox(width: 8), Expanded( child: Column( @@ -1084,12 +1867,26 @@ class AdvertisementHomeCard extends StatelessWidget { children: [ Text( model.title ?? '', - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 14, fontWeight: FontWeight.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 14, + fontWeight: FontWeight.bold, + ), overflow: TextOverflow.ellipsis, ), Text( model.description ?? '', - style: TextStyle(fontSize: 12, fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey400 : AppThemeData.grey600), + style: TextStyle( + fontSize: 12, + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey600, + ), overflow: TextOverflow.ellipsis, maxLines: 2, ), @@ -1100,26 +1897,73 @@ class AdvertisementHomeCard extends StatelessWidget { ? IconButton( icon: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == model.vendorId).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey400 : AppThemeData.grey600, BlendMode.srcIn)), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == model.vendorId, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey400 + : AppThemeData.grey600, + BlendMode.srcIn, + ), + ), ), onPressed: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == model.vendorId).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: model.vendorId, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == model.vendorId); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where((p0) => p0.restaurantId == model.vendorId) + .isNotEmpty) { + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: model.vendorId, + userId: FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => item.restaurantId == model.vendorId, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: model.vendorId, userId: FireStoreUtils.getCurrentUid()); + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: model.vendorId, + userId: FireStoreUtils.getCurrentUid(), + ); controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } controller.update(); }, ) : Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5))), - child: Padding(padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), child: Icon(Icons.arrow_forward, size: 20, color: AppThemeData.primary300)), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 4, + ), + child: Icon( + Icons.arrow_forward, + size: 20, + color: AppThemeData.primary300, + ), + ), ), ], ), diff --git a/lib/screen_ui/location_enable_screens/address_list_screen.dart b/lib/screen_ui/location_enable_screens/address_list_screen.dart index 474620a..f8eca2e 100644 --- a/lib/screen_ui/location_enable_screens/address_list_screen.dart +++ b/lib/screen_ui/location_enable_screens/address_list_screen.dart @@ -10,7 +10,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class AddressListScreen extends StatelessWidget { const AddressListScreen({super.key}); @@ -39,50 +39,120 @@ class AddressListScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("My Addresses".tr(), style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "My Addresses".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(height: 5), - Text("Allows users to view, manage, add, or edit delivery addresses.".tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey600)), + Text( + "Allows users to view, manage, add, or edit delivery addresses." + .tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.grey600, + ), + ), const SizedBox(height: 24), Expanded( child: controller.shippingAddressList.isEmpty - ? Constant.showEmptyView(message: "Address not found".tr()) + ? Constant.showEmptyView( + message: "Address not found".tr(), + ) : ListView.separated( - itemCount: controller.shippingAddressList.length, + itemCount: + controller.shippingAddressList.length, itemBuilder: (context, index) { - ShippingAddress address = controller.shippingAddressList[index]; + ShippingAddress address = + controller.shippingAddressList[index]; return InkWell( onTap: () { Get.back(result: address); }, child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData + .greyDark100 + : AppThemeData + .grey100, + borderRadius: + BorderRadius.circular( + 8, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Text( - address.addressAs.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + address.addressAs + .toString(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ), ), SizedBox(width: 10), address.isDefault == true ? Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.success100 : AppThemeData.success100, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData + .success100 + : AppThemeData + .success100, + borderRadius: + BorderRadius.circular( + 8, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: + const EdgeInsets.symmetric( + horizontal: + 10, + vertical: 5, + ), child: Text( "Default".tr(), - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ), ) @@ -91,35 +161,72 @@ class AddressListScreen extends StatelessWidget { ), SizedBox(height: 10), Text( - address.getFullAddress().toString(), - style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + address + .getFullAddress() + .toString(), + style: + AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark800 + : AppThemeData + .grey800, + ), ), ], ), ), InkWell( onTap: () async { - await controller.deleteAddress(index); + await controller.deleteAddress( + index, + ); }, - child: SvgPicture.asset("assets/icons/ic_delete_address.svg"), + child: SvgPicture.asset( + "assets/icons/ic_delete_address.svg", + ), ), SizedBox(width: 10), InkWell( onTap: () { - Get.to(EnterManuallyLocationScreen(), arguments: {"address": address, "mode": "Edit"})!.then((value) { + Get.to( + EnterManuallyLocationScreen(), + arguments: { + "address": address, + "mode": "Edit", + }, + )!.then((value) { if (value == true) { controller.getUser(); } }); }, - child: SvgPicture.asset("assets/icons/ic_edit_address.svg"), + child: SvgPicture.asset( + "assets/icons/ic_edit_address.svg", + ), ), ], ), ); }, - separatorBuilder: (BuildContext context, int index) { - return Padding(padding: const EdgeInsets.symmetric(vertical: 20), child: Divider(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, height: 1)); + separatorBuilder: ( + BuildContext context, + int index, + ) { + return Padding( + padding: const EdgeInsets.symmetric( + vertical: 20, + ), + child: Divider( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + height: 1, + ), + ); }, ), ), @@ -127,9 +234,14 @@ class AddressListScreen extends StatelessWidget { ), ), bottomNavigationBar: Padding( - padding: const EdgeInsets.only(bottom: 30, left: 16, right: 16, top: 20), + padding: const EdgeInsets.only( + bottom: 30, + left: 16, + right: 16, + top: 20, + ), child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Add New Address", onPress: () { Get.to(EnterManuallyLocationScreen())!.then((value) { @@ -140,7 +252,15 @@ class AddressListScreen extends StatelessWidget { }, isRight: false, isCenter: true, - icon: SvgPicture.asset(AppAssets.icPlus, width: 20, height: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.greyDark900), + icon: SvgPicture.asset( + AppAssets.icPlus, + width: 20, + height: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.greyDark900, + ), color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, textColor: isDark ? AppThemeData.grey50 : AppThemeData.grey50, ), diff --git a/lib/screen_ui/location_enable_screens/enter_manually_location.dart b/lib/screen_ui/location_enable_screens/enter_manually_location.dart index 83046f1..ff1f41e 100644 --- a/lib/screen_ui/location_enable_screens/enter_manually_location.dart +++ b/lib/screen_ui/location_enable_screens/enter_manually_location.dart @@ -9,8 +9,7 @@ import 'package:customer/widget/place_picker/selected_location_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../controllers/enter_manually_location_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -40,23 +39,50 @@ class EnterManuallyLocationScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15, + vertical: 10, + ), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - controller.mode == "Edit" ? "Edit Address".tr() : "Add a New Address".tr(), - style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller.mode == "Edit" + ? "Edit Address".tr() + : "Add a New Address".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), const SizedBox(height: 10), - Text("Enter your location details so we can deliver your orders quickly and accurately.".tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey600)), + Text( + "Enter your location details so we can deliver your orders quickly and accurately." + .tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.grey600, + ), + ), const SizedBox(height: 24), Row( children: [ - Expanded(child: Text("Set as Default Address".tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey600))), + Expanded( + child: Text( + "Set as Default Address".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.grey600, + ), + ), + ), Transform.scale( - scale: 0.7, // Decrease the size (try 0.5, 0.6, etc.) + scale: + 0.7, // Decrease the size (try 0.5, 0.6, etc.) child: Switch( value: controller.isDefault.value, onChanged: (value) { @@ -74,23 +100,53 @@ class EnterManuallyLocationScreen extends StatelessWidget { context: context, onTap: () async { if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lat = + firstPlace.coordinates.latitude; + final lng = + firstPlace.coordinates.longitude; final address = firstPlace.address; - controller.localityEditingController.value.text = address.toString(); - controller.location.value = UserLocation(latitude: lat, longitude: lng); + controller + .localityEditingController + .value + .text = address.toString(); + controller.location.value = UserLocation( + latitude: lat, + longitude: lng, + ); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.localityEditingController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.location.value = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); + controller + .localityEditingController + .value + .text = Utils.formatAddress( + selectedLocation: + selectedLocationModel, + ); + controller + .location + .value = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, + ); } }); } @@ -109,23 +165,55 @@ class EnterManuallyLocationScreen extends StatelessWidget { context: context, onTap: () async { if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lat = + firstPlace.coordinates.latitude; + final lng = + firstPlace.coordinates.longitude; final address = firstPlace.address; - controller.localityEditingController.value.text = address.toString(); - controller.location.value = UserLocation(latitude: lat, longitude: lng); + controller + .localityEditingController + .value + .text = address.toString(); + controller + .location + .value = UserLocation( + latitude: lat, + longitude: lng, + ); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.localityEditingController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.location.value = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); + controller + .localityEditingController + .value + .text = Utils.formatAddress( + selectedLocation: + selectedLocationModel, + ); + controller + .location + .value = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, + ); Get.back(); } }); @@ -133,20 +221,50 @@ class EnterManuallyLocationScreen extends StatelessWidget { }, ); }, - child: Padding(padding: const EdgeInsets.only(right: 10), child: Icon(Icons.gps_fixed, size: 24, color: AppThemeData.ecommerce300)), + child: Padding( + padding: const EdgeInsets.only(right: 10), + child: Icon( + Icons.gps_fixed, + size: 24, + color: AppThemeData.ecommerce300, + ), + ), ), ), ), const SizedBox(height: 15), - TextFieldWidget(title: "Flat/House/Floor/Building*".tr(), hintText: "Enter address details".tr(), controller: controller.houseBuildingTextEditingController.value), + TextFieldWidget( + title: "Flat/House/Floor/Building*".tr(), + hintText: "Enter address details".tr(), + controller: + controller + .houseBuildingTextEditingController + .value, + ), const SizedBox(height: 15), - TextFieldWidget(title: "Area/Sector/Locality*".tr(), hintText: "Enter area/locality".tr(), controller: controller.localityEditingController.value), + TextFieldWidget( + title: "Area/Sector/Locality*".tr(), + hintText: "Enter area/locality".tr(), + controller: + controller.localityEditingController.value, + ), const SizedBox(height: 15), - TextFieldWidget(title: "Nearby Landmark".tr(), hintText: "Add a landmark".tr(), controller: controller.landmarkEditingController.value), + TextFieldWidget( + title: "Nearby Landmark".tr(), + hintText: "Add a landmark".tr(), + controller: + controller.landmarkEditingController.value, + ), const SizedBox(height: 30), Container(height: 1, color: AppThemeData.grey200), const SizedBox(height: 25), - Text("Save Address As".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + Text( + "Save Address As".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), + ), const SizedBox(height: 10), Wrap( spacing: 10, @@ -155,17 +273,37 @@ class EnterManuallyLocationScreen extends StatelessWidget { .map( (item) => GestureDetector( onTap: () { - controller.selectedSaveAs.value = item; + controller.selectedSaveAs.value = + item; }, child: Container( decoration: BoxDecoration( - color: controller.selectedSaveAs.value == item ? AppThemeData.primary300 : AppThemeData.grey100, - borderRadius: BorderRadius.circular(10), + color: + controller + .selectedSaveAs + .value == + item + ? AppThemeData.primary300 + : AppThemeData.grey100, + borderRadius: BorderRadius.circular( + 10, + ), + ), + padding: const EdgeInsets.symmetric( + horizontal: 20, + vertical: 10, ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), child: Text( controller.getLocalizedSaveAs(item), - style: AppThemeData.mediumTextStyle(color: controller.selectedSaveAs.value == item ? AppThemeData.grey50 : AppThemeData.grey600), + style: AppThemeData.mediumTextStyle( + color: + controller + .selectedSaveAs + .value == + item + ? AppThemeData.grey50 + : AppThemeData.grey600, + ), textAlign: TextAlign.center, ), ), @@ -175,55 +313,111 @@ class EnterManuallyLocationScreen extends StatelessWidget { ), const SizedBox(height: 30), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Save Address".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { - if (controller.location.value.latitude == null || controller.location.value.longitude == null) { - ShowToastDialog.showToast("Please select Location".tr()); - } else if (controller.houseBuildingTextEditingController.value.text.isEmpty) { - ShowToastDialog.showToast("Please Enter Flat / House / Floor / Building".tr()); - } else if (controller.localityEditingController.value.text.isEmpty) { - ShowToastDialog.showToast("Please Enter Area / Sector / Locality".tr()); + if (controller.location.value.latitude == null || + controller.location.value.longitude == null) { + ShowToastDialog.showToast( + "Please select Location".tr(), + ); + } else if (controller + .houseBuildingTextEditingController + .value + .text + .isEmpty) { + ShowToastDialog.showToast( + "Please Enter Flat / House / Floor / Building" + .tr(), + ); + } else if (controller + .localityEditingController + .value + .text + .isEmpty) { + ShowToastDialog.showToast( + "Please Enter Area / Sector / Locality".tr(), + ); } else { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); //Common values - controller.shippingModel.value.location = controller.location.value; - controller.shippingModel.value.addressAs = controller.selectedSaveAs.value; - controller.shippingModel.value.address = controller.houseBuildingTextEditingController.value.text; - controller.shippingModel.value.locality = controller.localityEditingController.value.text; - controller.shippingModel.value.landmark = controller.landmarkEditingController.value.text; + controller.shippingModel.value.location = + controller.location.value; + controller.shippingModel.value.addressAs = + controller.selectedSaveAs.value; + controller.shippingModel.value.address = + controller + .houseBuildingTextEditingController + .value + .text; + controller.shippingModel.value.locality = + controller + .localityEditingController + .value + .text; + controller.shippingModel.value.landmark = + controller + .landmarkEditingController + .value + .text; if (controller.mode.value == "Edit") { //Edit Mode controller.shippingAddressList.value = - controller.shippingAddressList.map((address) { - if (address.id == controller.shippingModel.value.id) { - return controller.shippingModel.value; // replace existing one + controller.shippingAddressList.map(( + address, + ) { + if (address.id == + controller.shippingModel.value.id) { + return controller + .shippingModel + .value; // replace existing one } return address; }).toList(); - Constant.selectedLocation = controller.shippingModel.value; + Constant.selectedLocation = + controller.shippingModel.value; } else { //Add Mode - controller.shippingModel.value.id = Constant.getUuid(); - controller.shippingModel.value.isDefault = controller.shippingAddressList.isEmpty ? true : false; - controller.shippingAddressList.add(controller.shippingModel.value); + controller.shippingModel.value.id = + Constant.getUuid(); + controller.shippingModel.value.isDefault = + controller.shippingAddressList.isEmpty + ? true + : false; + controller.shippingAddressList.add( + controller.shippingModel.value, + ); } //Handle default address switch if (controller.isDefault.value) { controller.shippingAddressList.value = - controller.shippingAddressList.map((address) { - address.isDefault = address.id == controller.shippingModel.value.id ? true : false; + controller.shippingAddressList.map(( + address, + ) { + address.isDefault = + address.id == + controller + .shippingModel + .value + .id + ? true + : false; return address; }).toList(); } - controller.userModel.value.shippingAddress = controller.shippingAddressList; - await FireStoreUtils.updateUser(controller.userModel.value); + controller.userModel.value.shippingAddress = + controller.shippingAddressList; + await FireStoreUtils.updateUser( + controller.userModel.value, + ); ShowToastDialog.closeLoader(); Get.back(result: true); diff --git a/lib/screen_ui/location_enable_screens/location_permission_screen.dart b/lib/screen_ui/location_enable_screens/location_permission_screen.dart index b3903e1..7577eea 100644 --- a/lib/screen_ui/location_enable_screens/location_permission_screen.dart +++ b/lib/screen_ui/location_enable_screens/location_permission_screen.dart @@ -14,8 +14,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../constant/assets.dart'; import '../../utils/utils.dart'; @@ -41,7 +40,13 @@ class LocationPermissionScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 25), child: Text( "Enable Location for a Personalized Experience".tr(), - style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), textAlign: TextAlign.center, ), ), @@ -49,14 +54,21 @@ class LocationPermissionScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 50), child: Text( - "Allow location access to discover beauty stores and services near you.".tr(), - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + "Allow location access to discover beauty stores and services near you." + .tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), textAlign: TextAlign.center, ), ), const SizedBox(height: 30), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Use current location".tr(), onPress: () async { Constant.checkPermission( @@ -66,34 +78,51 @@ class LocationPermissionScreen extends StatelessWidget { ShippingAddress addressModel = ShippingAddress(); try { await Geolocator.requestPermission(); - Position newLocalData = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high); - await placemarkFromCoordinates(newLocalData.latitude, newLocalData.longitude).then((valuePlaceMaker) { + Position newLocalData = + await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high, + ); + await placemarkFromCoordinates( + newLocalData.latitude, + newLocalData.longitude, + ).then((valuePlaceMaker) { Placemark placeMark = valuePlaceMaker[0]; addressModel.addressAs = "Home"; - addressModel.location = UserLocation(latitude: newLocalData.latitude, longitude: newLocalData.longitude); + addressModel.location = UserLocation( + latitude: newLocalData.latitude, + longitude: newLocalData.longitude, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; addressModel.locality = currentLocation; }); Constant.selectedLocation = addressModel; - Constant.currentLocation = await Utils.getCurrentLocation(); + Constant.currentLocation = + await Utils.getCurrentLocation(); ShowToastDialog.closeLoader(); Get.offAll(const ServiceListScreen()); } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then((valuePlaceMaker) { Placemark placeMark = valuePlaceMaker[0]; addressModel.addressAs = "Home"; - addressModel.location = UserLocation(latitude: 19.228825, longitude: 72.854118); + addressModel.location = UserLocation( + latitude: 19.228825, + longitude: 72.854118, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; addressModel.locality = currentLocation; }); Constant.selectedLocation = addressModel; - Constant.currentLocation = await Utils.getCurrentLocation(); + Constant.currentLocation = + await Utils.getCurrentLocation(); ShowToastDialog.closeLoader(); @@ -107,7 +136,7 @@ class LocationPermissionScreen extends StatelessWidget { ), const SizedBox(height: 10), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Set from map".tr(), onPress: () async { Constant.checkPermission( @@ -117,7 +146,9 @@ class LocationPermissionScreen extends StatelessWidget { ShippingAddress addressModel = ShippingAddress(); try { await Geolocator.requestPermission(); - await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high); + await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high, + ); ShowToastDialog.closeLoader(); if (Constant.selectedMapType == 'osm') { final result = await Get.to(() => MapPickerPage()); @@ -129,18 +160,29 @@ class LocationPermissionScreen extends StatelessWidget { addressModel.addressAs = "Home"; addressModel.locality = address.toString(); - addressModel.location = UserLocation(latitude: lat, longitude: lng); + addressModel.location = UserLocation( + latitude: lat, + longitude: lng, + ); Constant.selectedLocation = addressModel; Get.offAll(const ServiceListScreen()); } } else { Get.to(LocationPickerScreen())!.then((value) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel selectedLocationModel = + value; addressModel.addressAs = "Home"; - addressModel.locality = Utils.formatAddress(selectedLocation: selectedLocationModel); - addressModel.location = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); + addressModel.locality = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + addressModel.location = UserLocation( + latitude: + selectedLocationModel.latLng!.latitude, + longitude: + selectedLocationModel.latLng!.longitude, + ); Constant.selectedLocation = addressModel; Get.offAll(const ServiceListScreen()); @@ -148,10 +190,16 @@ class LocationPermissionScreen extends StatelessWidget { }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then((valuePlaceMaker) { Placemark placeMark = valuePlaceMaker[0]; addressModel.addressAs = "Home"; - addressModel.location = UserLocation(latitude: 19.228825, longitude: 72.854118); + addressModel.location = UserLocation( + latitude: 19.228825, + longitude: 72.854118, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; addressModel.locality = currentLocation; @@ -181,7 +229,16 @@ class LocationPermissionScreen extends StatelessWidget { } }); }, - child: Text("Enter Manually location".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + "Enter Manually location".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), ], ), diff --git a/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart b/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart index 38ae3cc..7a67cfc 100644 --- a/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart +++ b/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart @@ -1,7 +1,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class MaintenanceModeScreen extends StatelessWidget { const MaintenanceModeScreen({super.key}); @@ -14,14 +14,24 @@ class MaintenanceModeScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Center(child: Image.asset('assets/images/maintenance.png', height: 200, width: 200)), + Center( + child: Image.asset( + 'assets/images/maintenance.png', + height: 200, + width: 200, + ), + ), const SizedBox(height: 20), - Text("We'll be back soon!".tr(), style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold)), + Text( + "We'll be back soon!".tr(), + style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + ), const SizedBox(height: 10), Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0), child: Text( - "Sorry for the inconvenience but we're performing some maintenance at the moment. We'll be back online shortly!".tr(), + "Sorry for the inconvenience but we're performing some maintenance at the moment. We'll be back online shortly!" + .tr(), textAlign: TextAlign.center, style: const TextStyle(fontSize: 16), ), diff --git a/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart b/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart index 87b1649..8585299 100644 --- a/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart +++ b/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart @@ -9,8 +9,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -30,20 +29,27 @@ class AllAdvertisementScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( "Highlights for you".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), body: controller.isLoading.value ? Constant.loader() : controller.advertisementList.isEmpty - ? Constant.showEmptyView(message: "Highlights for you not found.".tr()) + ? Constant.showEmptyView( + message: "Highlights for you not found.".tr(), + ) : Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: ListView.builder( @@ -51,7 +57,10 @@ class AllAdvertisementScreen extends StatelessWidget { itemCount: controller.advertisementList.length, padding: EdgeInsets.all(0), itemBuilder: (BuildContext context, int index) { - return AdvertisementCard(controller: controller, model: controller.advertisementList[index]); + return AdvertisementCard( + controller: controller, + model: controller.advertisementList[index], + ); }, ), ), @@ -65,7 +74,11 @@ class AdvertisementCard extends StatelessWidget { final AdvertisementModel model; final AdvertisementListController controller; - const AdvertisementCard({super.key, required this.controller, required this.model}); + const AdvertisementCard({ + super.key, + required this.controller, + required this.model, + }); @override Widget build(BuildContext context) { @@ -74,9 +87,14 @@ class AdvertisementCard extends StatelessWidget { return InkWell( onTap: () async { ShowToastDialog.showLoader("Please wait...".tr()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(model.vendorId!); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + model.vendorId!, + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Container( margin: EdgeInsets.only(bottom: 16), @@ -84,7 +102,14 @@ class AdvertisementCard extends StatelessWidget { decoration: BoxDecoration( color: isDark ? AppThemeData.info600 : AppThemeData.surface, borderRadius: BorderRadius.circular(16), - boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.1), blurRadius: isDark ? 6 : 2, spreadRadius: 0, offset: Offset(0, isDark ? 3 : 1))], + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: isDark ? 6 : 2, + spreadRadius: 0, + offset: Offset(0, isDark ? 3 : 1), + ), + ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -93,18 +118,32 @@ class AdvertisementCard extends StatelessWidget { children: [ model.type == 'restaurant_promotion' ? ClipRRect( - borderRadius: BorderRadius.vertical(top: Radius.circular(16)), - child: NetworkImageWidget(imageUrl: model.coverImage ?? '', height: 150, width: double.infinity, fit: BoxFit.cover), + borderRadius: BorderRadius.vertical( + top: Radius.circular(16), + ), + child: NetworkImageWidget( + imageUrl: model.coverImage ?? '', + height: 150, + width: double.infinity, + fit: BoxFit.cover, + ), ) - : VideoAdvWidget(url: model.video ?? '', height: 150, width: double.infinity), - if (model.type != 'video_promotion' && model.vendorId != null && (model.showRating == true || model.showReview == true)) + : VideoAdvWidget( + url: model.video ?? '', + height: 150, + width: double.infinity, + ), + if (model.type != 'video_promotion' && + model.vendorId != null && + (model.showRating == true || model.showReview == true)) Positioned( bottom: 8, right: 8, child: FutureBuilder( future: FireStoreUtils.getVendorById(model.vendorId!), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == + ConnectionState.waiting) { return const SizedBox(); } else { if (snapshot.hasError) { @@ -114,16 +153,42 @@ class AdvertisementCard extends StatelessWidget { } else { VendorModel vendorModel = snapshot.data!; return Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - if (model.showRating == true) SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), - if (model.showRating == true) const SizedBox(width: 5), + if (model.showRating == true) + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), + if (model.showRating == true) + const SizedBox(width: 5), Text( "${model.showRating == true ? Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString()) : ''}${model.showRating == true && model.showReview == true ? ' ' : ''}${model.showReview == true ? '(${vendorModel.reviewsCount!.toStringAsFixed(0)})' : ''}", - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), @@ -142,7 +207,15 @@ class AdvertisementCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ if (model.type == 'restaurant_promotion') - ClipRRect(borderRadius: BorderRadius.circular(30), child: NetworkImageWidget(imageUrl: model.profileImage ?? '', height: 50, width: 50, fit: BoxFit.cover)), + ClipRRect( + borderRadius: BorderRadius.circular(30), + child: NetworkImageWidget( + imageUrl: model.profileImage ?? '', + height: 50, + width: 50, + fit: BoxFit.cover, + ), + ), SizedBox(width: 8), Expanded( child: Column( @@ -150,12 +223,26 @@ class AdvertisementCard extends StatelessWidget { children: [ Text( model.title ?? '', - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16, fontWeight: FontWeight.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + fontWeight: FontWeight.bold, + ), overflow: TextOverflow.ellipsis, ), Text( model.description ?? '', - style: TextStyle(fontSize: 14, fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey400 : AppThemeData.grey600), + style: TextStyle( + fontSize: 14, + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey600, + ), overflow: TextOverflow.ellipsis, maxLines: 2, ), @@ -166,25 +253,74 @@ class AdvertisementCard extends StatelessWidget { ? Obx( () => IconButton( icon: - controller.favouriteList.where((p0) => p0.restaurantId == model.vendorId).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey400 : AppThemeData.grey600, BlendMode.srcIn)), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == model.vendorId, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey400 + : AppThemeData.grey600, + BlendMode.srcIn, + ), + ), onPressed: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == model.vendorId).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: model.vendorId, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == model.vendorId); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => p0.restaurantId == model.vendorId, + ) + .isNotEmpty) { + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: model.vendorId, + userId: FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => item.restaurantId == model.vendorId, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: model.vendorId, userId: FireStoreUtils.getCurrentUid()); + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: model.vendorId, + userId: FireStoreUtils.getCurrentUid(), + ); controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, ), ) : Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5))), - child: Padding(padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), child: Icon(Icons.arrow_forward, size: 20, color: AppThemeData.primary300)), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 4, + ), + child: Icon( + Icons.arrow_forward, + size: 20, + color: AppThemeData.primary300, + ), + ), ), ], ), diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart index acf9906..85e802c 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart @@ -19,8 +19,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../models/user_model.dart'; import '../../../service/fire_store_utils.dart'; @@ -41,8 +40,12 @@ class CartScreen extends StatelessWidget { init: CartController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + ), body: cartItem.isEmpty ? Constant.showEmptyView(message: "Item Not available".tr()) @@ -53,17 +56,28 @@ class CartScreen extends StatelessWidget { controller.selectedFoodType.value == 'TakeAway' ? const SizedBox() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: InkWell( onTap: () { Get.to(AddressListScreen())!.then((value) { if (value != null) { ShippingAddress shippingAddress = value; - if (Constant.checkZoneCheck(shippingAddress.location!.latitude ?? 0.0, shippingAddress.location!.longitude ?? 0.0)) { - controller.selectedAddress.value = shippingAddress; + if (Constant.checkZoneCheck( + shippingAddress.location!.latitude ?? + 0.0, + shippingAddress.location!.longitude ?? + 0.0, + )) { + controller.selectedAddress.value = + shippingAddress; controller.calculatePrice(); } else { - ShowToastDialog.showToast("Service not available in this area".tr()); + ShowToastDialog.showToast( + "Service not available in this area" + .tr(), + ); } } }); @@ -71,33 +85,71 @@ class CartScreen extends StatelessWidget { child: Column( children: [ Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 8, + ), + ), + ), child: Padding( padding: const EdgeInsets.all(10), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_send_one.svg"), + SvgPicture.asset( + "assets/icons/ic_send_one.svg", + ), const SizedBox(width: 10), Expanded( child: Text( - controller.selectedAddress.value.addressAs.toString(), + controller + .selectedAddress + .value + .addressAs + .toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontSize: 16, + ), ), ), - SvgPicture.asset("assets/icons/ic_down.svg"), + SvgPicture.asset( + "assets/icons/ic_down.svg", + ), ], ), const SizedBox(height: 5), Text( - controller.selectedAddress.value.getFullAddress(), + controller.selectedAddress.value + .getFullAddress(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -111,87 +163,189 @@ class CartScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), child: ListView.separated( shrinkWrap: true, padding: EdgeInsets.zero, itemCount: cartItem.length, physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { - CartProductModel cartProductModel = cartItem[index]; + CartProductModel cartProductModel = + cartItem[index]; ProductModel? productModel; - FireStoreUtils.getProductById(cartProductModel.id!.split('~').first).then((value) { + FireStoreUtils.getProductById( + cartProductModel.id!.split('~').first, + ).then((value) { productModel = value; }); - print("cartItem[index] :: ${cartItem[index].extras} ::${cartItem[index].extrasPrice}"); + print( + "cartItem[index] :: ${cartItem[index].extras} ::${cartItem[index].extrasPrice}", + ); return InkWell( onTap: () async { - await FireStoreUtils.getVendorById(productModel!.vendorID.toString()).then((value) { + await FireStoreUtils.getVendorById( + productModel!.vendorID.toString(), + ).then((value) { if (value != null) { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": value}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": value}, + ); } }); }, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(16)), + borderRadius: + const BorderRadius.all( + Radius.circular(16), + ), child: NetworkImageWidget( - imageUrl: cartProductModel.photo.toString(), - height: Responsive.height(10, context), - width: Responsive.width(20, context), + imageUrl: + cartProductModel.photo + .toString(), + height: Responsive.height( + 10, + context, + ), + width: Responsive.width( + 20, + context, + ), fit: BoxFit.cover, ), ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${cartProductModel.name}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), - double.parse(cartProductModel.discountPrice.toString()) <= 0 + double.parse( + cartProductModel + .discountPrice + .toString(), + ) <= + 0 ? Text( - Constant.amountShow(amount: cartProductModel.price), + Constant.amountShow( + amount: + cartProductModel + .price, + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ) : Row( children: [ Text( - Constant.amountShow(amount: cartProductModel.discountPrice.toString()), + Constant.amountShow( + amount: + cartProductModel + .discountPrice + .toString(), + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), - const SizedBox(width: 5), + const SizedBox( + width: 5, + ), Text( - Constant.amountShow(amount: cartProductModel.price), + Constant.amountShow( + amount: + cartProductModel + .price, + ), style: TextStyle( fontSize: 14, - decoration: TextDecoration.lineThrough, - decorationColor: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - color: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + decoration: + TextDecoration + .lineThrough, + decorationColor: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + color: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), ], @@ -201,76 +355,219 @@ class CartScreen extends StatelessWidget { ), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFD1D5DB)), borderRadius: BorderRadius.circular(200)), + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFD1D5DB), + ), + borderRadius: + BorderRadius.circular( + 200, + ), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 5), + padding: + const EdgeInsets.symmetric( + vertical: 5, + horizontal: 5, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .center, children: [ InkWell( onTap: () { - controller.addToCart(cartProductModel: cartProductModel, isIncrement: false, quantity: cartProductModel.quantity! - 1); + controller.addToCart( + cartProductModel: + cartProductModel, + isIncrement: false, + quantity: + cartProductModel + .quantity! - + 1, + ); }, - child: Icon(Icons.remove, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + child: Icon( + Icons.remove, + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, + ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), child: Text( - cartProductModel.quantity.toString(), - textAlign: TextAlign.start, + cartProductModel + .quantity + .toString(), + textAlign: + TextAlign.start, maxLines: 1, style: TextStyle( fontSize: 16, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + overflow: + TextOverflow + .ellipsis, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w500, + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, ), ), ), InkWell( onTap: () { - if (productModel!.itemAttribute != null) { - if (productModel!.itemAttribute!.variants!.where((element) => element.variantSku == cartProductModel.variantInfo!.variantSku).isNotEmpty) { + if (productModel! + .itemAttribute != + null) { + if (productModel! + .itemAttribute! + .variants! + .where( + (element) => + element + .variantSku == + cartProductModel + .variantInfo! + .variantSku, + ) + .isNotEmpty) { if (int.parse( - productModel!.itemAttribute!.variants! - .where((element) => element.variantSku == cartProductModel.variantInfo!.variantSku) + productModel! + .itemAttribute! + .variants! + .where( + ( + element, + ) => + element.variantSku == + cartProductModel.variantInfo!.variantSku, + ) .first .variantQuantity .toString(), ) > - (cartProductModel.quantity ?? 0) || + (cartProductModel + .quantity ?? + 0) || int.parse( - productModel!.itemAttribute!.variants! - .where((element) => element.variantSku == cartProductModel.variantInfo!.variantSku) + productModel! + .itemAttribute! + .variants! + .where( + ( + element, + ) => + element.variantSku == + cartProductModel.variantInfo!.variantSku, + ) .first .variantQuantity .toString(), ) == -1) { - controller.addToCart(cartProductModel: cartProductModel, isIncrement: true, quantity: cartProductModel.quantity! + 1); + controller.addToCart( + cartProductModel: + cartProductModel, + isIncrement: + true, + quantity: + cartProductModel + .quantity! + + 1, + ); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock" + .tr(), + ); } } else { - if ((productModel!.quantity ?? 0) > (cartProductModel.quantity ?? 0) || productModel!.quantity == -1) { - controller.addToCart(cartProductModel: cartProductModel, isIncrement: true, quantity: cartProductModel.quantity! + 1); + if ((productModel! + .quantity ?? + 0) > + (cartProductModel + .quantity ?? + 0) || + productModel! + .quantity == + -1) { + controller.addToCart( + cartProductModel: + cartProductModel, + isIncrement: + true, + quantity: + cartProductModel + .quantity! + + 1, + ); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock" + .tr(), + ); } } } else { - if ((productModel!.quantity ?? 0) > (cartProductModel.quantity ?? 0) || productModel!.quantity == -1) { - controller.addToCart(cartProductModel: cartProductModel, isIncrement: true, quantity: cartProductModel.quantity! + 1); + if ((productModel! + .quantity ?? + 0) > + (cartProductModel + .quantity ?? + 0) || + productModel! + .quantity == + -1) { + controller.addToCart( + cartProductModel: + cartProductModel, + isIncrement: + true, + quantity: + cartProductModel + .quantity! + + 1, + ); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock" + .tr(), + ); } } }, - child: Icon(Icons.add, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + child: Icon( + Icons.add, + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, + ), ), ], ), @@ -278,47 +575,112 @@ class CartScreen extends StatelessWidget { ), ], ), - cartProductModel.variantInfo == null || cartProductModel.variantInfo!.variantOptions == null || cartProductModel.variantInfo!.variantOptions!.isEmpty + cartProductModel.variantInfo == + null || + cartProductModel + .variantInfo! + .variantOptions == + null || + cartProductModel + .variantInfo! + .variantOptions! + .isEmpty ? Container() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 5, + vertical: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Variants".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), const SizedBox(height: 5), Wrap( spacing: 6.0, runSpacing: 6.0, children: - List.generate(cartProductModel.variantInfo!.variantOptions!.length, (i) { - return Container( - decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), - child: Text( - "${cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)} : ${cartProductModel.variantInfo!.variantOptions![cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)]}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey500 : AppThemeData.grey400), + List.generate( + cartProductModel + .variantInfo! + .variantOptions! + .length, + (i) { + return Container( + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), ), - ), - ); - }).toList(), + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: + 16, + vertical: + 5, + ), + child: Text( + "${cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)} : ${cartProductModel.variantInfo!.variantOptions![cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)]}", + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + ), + ), + ), + ); + }, + ).toList(), ), ], ), ), - cartProductModel.extras == null || cartProductModel.extras!.isEmpty || cartProductModel.extrasPrice == '0' + cartProductModel.extras == null || + cartProductModel + .extras! + .isEmpty || + cartProductModel + .extrasPrice == + '0' ? const SizedBox() : Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ const SizedBox(height: 10), Row( @@ -326,16 +688,51 @@ class CartScreen extends StatelessWidget { Expanded( child: Text( "Addons".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( Constant.amountShow( - amount: (double.parse(cartProductModel.extrasPrice.toString()) * double.parse(cartProductModel.quantity.toString())).toString(), + amount: + (double.parse( + cartProductModel + .extrasPrice + .toString(), + ) * + double.parse( + cartProductModel + .quantity + .toString(), + )) + .toString(), + ), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontSize: 16, ), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), ), ], ), @@ -344,22 +741,55 @@ class CartScreen extends StatelessWidget { spacing: 6.0, runSpacing: 6.0, children: - List.generate(cartProductModel.extras!.length, (i) { - return Container( - decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), - child: Text( - cartProductModel.extras![i].toString(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey500 : AppThemeData.grey400), + List.generate( + cartProductModel + .extras! + .length, + (i) { + return Container( + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), ), - ), - ); - }).toList(), + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: + 16, + vertical: + 5, + ), + child: Text( + cartProductModel + .extras![i] + .toString(), + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + ), + ), + ), + ); + }, + ).toList(), ), ], ), @@ -369,7 +799,17 @@ class CartScreen extends StatelessWidget { ); }, separatorBuilder: (context, index) { - return Padding(padding: const EdgeInsets.symmetric(vertical: 10), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)); + return Padding( + padding: const EdgeInsets.symmetric( + vertical: 10, + ), + child: MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + ); }, ), ), @@ -382,44 +822,84 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Delivery Type'.tr()} (${controller.selectedFoodType.value})".tr(), + "${'Delivery Type'.tr()} (${controller.selectedFoodType.value})" + .tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), const SizedBox(height: 10), controller.selectedFoodType.value == 'TakeAway' ? const SizedBox() : Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(10), child: Row( children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Instant Delivery".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.medium, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontSize: 16, + ), ), const SizedBox(height: 5), Text( "Standard".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: + AppThemeData.medium, + fontSize: 12, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + ), ), ], ), ), Radio( - value: controller.deliveryType.value, + value: + controller.deliveryType.value, groupValue: "instant".tr(), - activeColor: AppThemeData.primary300, + activeColor: + AppThemeData.primary300, onChanged: (value) { - controller.deliveryType.value = "instant"; + controller.deliveryType.value = + "instant"; }, ), ], @@ -429,18 +909,28 @@ class CartScreen extends StatelessWidget { const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: InkWell( onTap: () { controller.deliveryType.value = "schedule"; BottomPicker.dateTime( onSubmit: (index) { - controller.scheduleDateTime.value = index; + controller.scheduleDateTime.value = + index; }, minDateTime: DateTime.now(), displaySubmitButton: true, pickerTitle: Text('Schedule Time'.tr()), - buttonSingleColor: AppThemeData.primary300, + buttonSingleColor: + AppThemeData.primary300, ).show(context); }, child: Padding( @@ -449,18 +939,38 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Schedule Time".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.medium, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontSize: 16, + ), ), const SizedBox(height: 5), Text( "${'Your preferred time'.tr()} ${controller.deliveryType.value == "schedule" ? Constant.timestampToDateTime(Timestamp.fromDate(controller.scheduleDateTime.value)) : ""}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: + AppThemeData.medium, + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), ), ], ), @@ -470,16 +980,28 @@ class CartScreen extends StatelessWidget { groupValue: "schedule".tr(), activeColor: AppThemeData.primary300, onChanged: (value) { - controller.deliveryType.value = "schedule"; + controller.deliveryType.value = + "schedule"; BottomPicker.dateTime( - initialDateTime: controller.scheduleDateTime.value, + initialDateTime: + controller + .scheduleDateTime + .value, onSubmit: (index) { - controller.scheduleDateTime.value = index; + controller + .scheduleDateTime + .value = index; }, - minDateTime: controller.scheduleDateTime.value, + minDateTime: + controller + .scheduleDateTime + .value, displaySubmitButton: true, - pickerTitle: Text('Schedule Time'.tr()), - buttonSingleColor: AppThemeData.primary300, + pickerTitle: Text( + 'Schedule Time'.tr(), + ), + buttonSingleColor: + AppThemeData.primary300, ).show(context); }, ), @@ -500,7 +1022,14 @@ class CartScreen extends StatelessWidget { Text( "Offers & Benefits".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), const SizedBox(height: 10), InkWell( @@ -510,20 +1039,43 @@ class CartScreen extends StatelessWidget { child: Container( width: Responsive.width(100, context), decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - shadows: const [BoxShadow(color: Color(0x14000000), blurRadius: 52, offset: Offset(0, 0), spreadRadius: 0)], + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + shadows: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 52, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Apply Coupons".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ), const SizedBox(height: 5), @@ -545,101 +1097,234 @@ class CartScreen extends StatelessWidget { Text( "Bill Details".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - shadows: const [BoxShadow(color: Color(0x14000000), blurRadius: 52, offset: Offset(0, 0), spreadRadius: 0)], + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + shadows: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 52, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Column( children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Item totals".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - Constant.amountShow(amount: controller.subTotal.value.toString()), + Constant.amountShow( + amount: + controller.subTotal.value + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), - controller.selectedFoodType.value == 'TakeAway' + controller.selectedFoodType.value == + 'TakeAway' ? const SizedBox() : Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Delivery Fee".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), - (controller.vendorModel.value.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true) + (controller + .vendorModel + .value + .isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true) ? Text( 'Free Delivery'.tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: AppThemeData.success400, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + AppThemeData + .success400, + fontSize: 16, + ), ) : Text( - Constant.amountShow(amount: controller.deliveryCharges.value.toString()), + Constant.amountShow( + amount: + controller + .deliveryCharges + .value + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Coupon Discount".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( "- (${Constant.amountShow(amount: controller.couponAmount.value.toString())})", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.danger300 : AppThemeData.danger300, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.danger300 + : AppThemeData.danger300, + fontSize: 16, + ), ), ], ), - controller.vendorModel.value.specialDiscountEnable == true && Constant.specialDiscountOffer == true + controller + .vendorModel + .value + .specialDiscountEnable == + true && + Constant.specialDiscountOffer == + true ? Column( children: [ const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Special Discount".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( "- (${Constant.amountShow(amount: controller.specialDiscountAmount.value.toString())})", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.danger300 : AppThemeData.danger300, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .danger300 + : AppThemeData + .danger300, + fontSize: 16, + ), ), ], ), @@ -647,63 +1332,135 @@ class CartScreen extends StatelessWidget { ) : const SizedBox(), const SizedBox(height: 10), - controller.selectedFoodType.value == 'TakeAway' || (controller.vendorModel.value.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true) + controller.selectedFoodType.value == + 'TakeAway' || + (controller + .vendorModel + .value + .isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true) ? const SizedBox() : Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Delivery Tips".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), - controller.deliveryTips.value == 0 + controller + .deliveryTips + .value == + 0 ? const SizedBox() : InkWell( onTap: () { - controller.deliveryTips.value = 0; - controller.calculatePrice(); + controller + .deliveryTips + .value = 0; + controller + .calculatePrice(); }, child: Text( "Remove".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ], ), ), Text( - Constant.amountShow(amount: controller.deliveryTips.toString()), + Constant.amountShow( + amount: + controller.deliveryTips + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 10), ListView.builder( itemCount: Constant.taxList.length, shrinkWrap: true, padding: EdgeInsets.zero, - physics: const NeverScrollableScrollPhysics(), + physics: + const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { - TaxModel taxModel = Constant.taxList[index]; + TaxModel taxModel = + Constant.taxList[index]; return Padding( - padding: const EdgeInsets.symmetric(vertical: 5), + padding: const EdgeInsets.symmetric( + vertical: 5, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "${taxModel.title.toString()} (${taxModel.type == "fix" ? Constant.amountShow(amount: taxModel.tax) : "${taxModel.tax}%"})", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( @@ -711,12 +1468,34 @@ class CartScreen extends StatelessWidget { amount: Constant.calculateTax( amount: - (double.parse(controller.subTotal.value.toString()) - controller.couponAmount.value - controller.specialDiscountAmount.value).toString(), + (double.parse( + controller + .subTotal + .value + .toString(), + ) - + controller + .couponAmount + .value - + controller + .specialDiscountAmount + .value) + .toString(), taxModel: taxModel, ).toString(), ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ], ), @@ -725,19 +1504,39 @@ class CartScreen extends StatelessWidget { ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "To Pay".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - Constant.amountShow(amount: controller.totalAmount.value.toString()), + Constant.amountShow( + amount: + controller.totalAmount.value + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -748,10 +1547,15 @@ class CartScreen extends StatelessWidget { ], ), ), - controller.selectedFoodType.value == 'TakeAway' || (controller.vendorModel.value.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true) + controller.selectedFoodType.value == 'TakeAway' || + (controller.vendorModel.value.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == true) ? const SizedBox() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -759,32 +1563,67 @@ class CartScreen extends StatelessWidget { Text( "Thanks with a tip!".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - shadows: const [BoxShadow(color: Color(0x14000000), blurRadius: 52, offset: Offset(0, 0), spreadRadius: 0)], + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + shadows: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 52, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Column( children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( - "Around the clock, our delivery partners make it happen. Show gratitude with a tip..".tr(), + "Around the clock, our delivery partners make it happen. Show gratitude with a tip.." + .tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600), + style: TextStyle( + fontFamily: + AppThemeData.medium, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + ), ), ), const SizedBox(width: 10), - SvgPicture.asset("assets/images/ic_tips.svg"), + SvgPicture.asset( + "assets/images/ic_tips.svg", + ), ], ), const SizedBox(height: 20), @@ -793,7 +1632,9 @@ class CartScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - controller.deliveryTips.value = 20; + controller + .deliveryTips + .value = 20; controller.calculatePrice(); }, child: Container( @@ -802,25 +1643,47 @@ class CartScreen extends StatelessWidget { side: BorderSide( width: 1, color: - controller.deliveryTips.value == 20 - ? AppThemeData.primary300 + controller + .deliveryTips + .value == + 20 + ? AppThemeData + .primary300 : isDark - ? AppThemeData.grey800 - : AppThemeData.grey100, + ? AppThemeData + .grey800 + : AppThemeData + .grey100, ), - borderRadius: BorderRadius.circular(8), + borderRadius: + BorderRadius.circular( + 8, + ), ), ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: Center( child: Text( - Constant.amountShow(amount: "20"), + Constant.amountShow( + amount: "20", + ), style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, fontSize: 14, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w600, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w600, ), ), ), @@ -832,7 +1695,9 @@ class CartScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - controller.deliveryTips.value = 30; + controller + .deliveryTips + .value = 30; controller.calculatePrice(); }, child: Container( @@ -841,25 +1706,47 @@ class CartScreen extends StatelessWidget { side: BorderSide( width: 1, color: - controller.deliveryTips.value == 30 - ? AppThemeData.primary300 + controller + .deliveryTips + .value == + 30 + ? AppThemeData + .primary300 : isDark - ? AppThemeData.grey800 - : AppThemeData.grey100, + ? AppThemeData + .grey800 + : AppThemeData + .grey100, ), - borderRadius: BorderRadius.circular(8), + borderRadius: + BorderRadius.circular( + 8, + ), ), ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: Center( child: Text( - Constant.amountShow(amount: "30"), + Constant.amountShow( + amount: "30", + ), style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, fontSize: 14, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w600, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w600, ), ), ), @@ -871,7 +1758,9 @@ class CartScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - controller.deliveryTips.value = 40; + controller + .deliveryTips + .value = 40; controller.calculatePrice(); }, child: Container( @@ -880,25 +1769,47 @@ class CartScreen extends StatelessWidget { side: BorderSide( width: 1, color: - controller.deliveryTips.value == 40 - ? AppThemeData.primary300 + controller + .deliveryTips + .value == + 40 + ? AppThemeData + .primary300 : isDark - ? AppThemeData.grey800 - : AppThemeData.grey100, + ? AppThemeData + .grey800 + : AppThemeData + .grey100, ), - borderRadius: BorderRadius.circular(8), + borderRadius: + BorderRadius.circular( + 8, + ), ), ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: Center( child: Text( - Constant.amountShow(amount: "40"), + Constant.amountShow( + amount: "40", + ), style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, fontSize: 14, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w600, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w600, ), ), ), @@ -912,28 +1823,55 @@ class CartScreen extends StatelessWidget { onTap: () { showDialog( context: context, - builder: (BuildContext context) { - return tipsDialog(controller, isDark); + builder: ( + BuildContext context, + ) { + return tipsDialog( + controller, + isDark, + ); }, ); }, child: Container( decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100), - borderRadius: BorderRadius.circular(8), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + ), + borderRadius: + BorderRadius.circular( + 8, + ), ), ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: Center( child: Text( 'Other'.tr(), style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, fontSize: 14, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w600, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w600, ), ), ), @@ -953,7 +1891,16 @@ class CartScreen extends StatelessWidget { const SizedBox(height: 20), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), - child: Column(children: [TextFieldWidget(title: 'Remarks'.tr(), controller: controller.reMarkController.value, hintText: 'Write remarks for the store'.tr(), maxLine: 4)]), + child: Column( + children: [ + TextFieldWidget( + title: 'Remarks'.tr(), + controller: controller.reMarkController.value, + hintText: 'Write remarks for the store'.tr(), + maxLine: 4, + ), + ], + ), ), ], ), @@ -962,8 +1909,12 @@ class CartScreen extends StatelessWidget { cartItem.isEmpty ? null : Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), - height: controller.isCashbackApply.value == true ? 150 : 100, + decoration: BoxDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + ), + height: + controller.isCashbackApply.value == true ? 150 : 100, child: Column( children: [ if (controller.isCashbackApply.value == true) @@ -974,77 +1925,240 @@ class CartScreen extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(top: 8), - child: Text("Cashback Offer".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontSize: 13)), + child: Text( + "Cashback Offer".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontSize: 13, + ), + ), ), Text( "${"Cashback Name :".tr()} ${controller.bestCashback.value.title ?? ''}", - style: TextStyle(color: AppThemeData.success300, fontFamily: AppThemeData.semiBold, fontSize: 13), + style: TextStyle( + color: AppThemeData.success300, + fontFamily: AppThemeData.semiBold, + fontSize: 13, + ), ), Text( "${"You will get".tr()} ${Constant.amountShow(amount: controller.bestCashback.value.cashbackValue?.toStringAsFixed(2))} ${"cashback after completing the order.".tr()}", - style: TextStyle(color: AppThemeData.success300, fontFamily: AppThemeData.semiBold, fontSize: 13), + style: TextStyle( + color: AppThemeData.success300, + fontFamily: AppThemeData.semiBold, + fontSize: 13, + ), ), ], ), ), Padding( - padding: EdgeInsets.only(left: 16, right: 16, top: controller.isCashbackApply.value == false ? 16 : 12, bottom: 20), + padding: EdgeInsets.only( + left: 16, + right: 16, + top: + controller.isCashbackApply.value == false + ? 16 + : 12, + bottom: 20, + ), child: Row( children: [ Expanded( flex: 2, child: InkWell( onTap: () { - Get.to(const SelectPaymentScreen())?.then((v) { + Get.to(const SelectPaymentScreen())?.then(( + v, + ) { controller.getCashback(); }); }, child: Row( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - controller.selectedPaymentMethod.value == '' - ? cardDecoration(controller, PaymentGateway.wallet, isDark, "") - : controller.selectedPaymentMethod.value == PaymentGateway.wallet.name - ? cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png") - : controller.selectedPaymentMethod.value == PaymentGateway.cod.name - ? cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png") - : controller.selectedPaymentMethod.value == PaymentGateway.stripe.name - ? cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png") - : controller.selectedPaymentMethod.value == PaymentGateway.paypal.name - ? cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payStack.name - ? cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png") - : controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name - ? cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png") - : controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name - ? cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payFast.name - ? cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png") - : controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name - ? cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png") - : controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name - ? cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png") - : controller.selectedPaymentMethod.value == PaymentGateway.xendit.name - ? cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png") - : cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), + controller.selectedPaymentMethod.value == + '' + ? cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.wallet.name + ? cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.cod.name + ? cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.stripe.name + ? cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.paypal.name + ? cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.payStack.name + ? cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.mercadoPago.name + ? cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.flutterWave.name + ? cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.payFast.name + ? cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.midTrans.name + ? cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.orangeMoney.name + ? cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.xendit.name + ? cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ) + : cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), const SizedBox(width: 10), Column( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Pay Via".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontSize: 12), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontSize: 12, + ), ), - controller.selectedPaymentMethod.value == '' - ? Padding(padding: const EdgeInsets.only(top: 4), child: Container(width: 60, height: 12, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100)) + controller + .selectedPaymentMethod + .value == + '' + ? Padding( + padding: const EdgeInsets.only( + top: 4, + ), + child: Container( + width: 60, + height: 12, + color: + isDark + ? AppThemeData.grey800 + : AppThemeData + .grey100, + ), + ) : Text( - controller.selectedPaymentMethod.value, + controller + .selectedPaymentMethod + .value, textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ], ), @@ -1054,9 +2168,10 @@ class CartScreen extends StatelessWidget { ), Expanded( child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, textColor: - controller.selectedPaymentMethod.value != '' + controller.selectedPaymentMethod.value != + '' ? AppThemeData.surface : isDark ? AppThemeData.grey800 @@ -1064,61 +2179,176 @@ class CartScreen extends StatelessWidget { title: "Pay Now".tr(), height: 5, color: - controller.selectedPaymentMethod.value != '' + controller.selectedPaymentMethod.value != + '' ? AppThemeData.primary300 : isDark ? AppThemeData.grey800 : AppThemeData.grey100, fontSizes: 16, onPress: () async { - if ((controller.couponAmount.value >= 1) && (controller.couponAmount.value > controller.totalAmount.value)) { - ShowToastDialog.showToast("The total price must be greater than or equal to the coupon discount value for the code to apply. Please review your cart total.".tr()); + if ((controller.couponAmount.value >= 1) && + (controller.couponAmount.value > + controller.totalAmount.value)) { + ShowToastDialog.showToast( + "The total price must be greater than or equal to the coupon discount value for the code to apply. Please review your cart total." + .tr(), + ); return; } - if ((controller.specialDiscountAmount.value >= 1) && (controller.specialDiscountAmount.value > controller.totalAmount.value)) { - ShowToastDialog.showToast("The total price must be greater than or equal to the special discount value for the code to apply. Please review your cart total.".tr()); + if ((controller + .specialDiscountAmount + .value >= + 1) && + (controller + .specialDiscountAmount + .value > + controller.totalAmount.value)) { + ShowToastDialog.showToast( + "The total price must be greater than or equal to the special discount value for the code to apply. Please review your cart total." + .tr(), + ); return; } - if (controller.isOrderPlaced.value == false) { + if (controller.isOrderPlaced.value == + false) { controller.isOrderPlaced.value = true; await controller.getCashback(); - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.totalAmount.value.toString(), context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + if (controller + .selectedPaymentMethod + .value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.totalAmount.value + .toString(), + context, + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.cod.name) { controller.placeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.wallet.name) { controller.placeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then(( - value, - ) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); - } - }); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.totalAmount.value + .toString(), + ), + razorpayModel: + controller + .razorPayModel + .value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr(), + ); + } else { + CreateRazorPayOrderModel + result = value; + controller.openCheckout( + amount: + controller + .totalAmount + .value + .toString(), + orderId: result.id, + ); + } + }); } else { controller.isOrderPlaced.value = false; - ShowToastDialog.showToast("Please select payment method".tr()); + ShowToastDialog.showToast( + "Please select payment method".tr(), + ); } controller.isOrderPlaced.value = false; } @@ -1136,14 +2366,32 @@ class CartScreen extends StatelessWidget { ); } - Padding cardDecoration(CartController controller, PaymentGateway value, isDark, String image) { + Padding cardDecoration( + CartController controller, + PaymentGateway value, + isDark, + String image, + ) { return Padding( padding: const EdgeInsets.symmetric(vertical: 5), child: Container( width: 40, height: 40, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: image == '' ? Container(color: isDark ? AppThemeData.grey800 : AppThemeData.grey100) : Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), + child: + image == '' + ? Container( + color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + ) + : Image.asset(image), + ), ), ); } @@ -1165,12 +2413,28 @@ class CartScreen extends StatelessWidget { TextFieldWidget( title: 'Tips Amount'.tr(), controller: controller.tipsController.value, - textInputType: const TextInputType.numberWithOptions(signed: true, decimal: true), + textInputType: const TextInputType.numberWithOptions( + signed: true, + decimal: true, + ), textInputAction: TextInputAction.done, - inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]'))], + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp('[0-9]')), + ], prefix: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), - child: Text(Constant.currencyModel!.symbol.tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontSize: 18)), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 14, + ), + child: Text( + Constant.currencyModel!.symbol.tr(), + style: TextStyle( + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontSize: 18, + ), + ), ), hintText: 'Enter Tips Amount'.tr(), ), @@ -1179,10 +2443,12 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Cancel".tr(), - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, - textColor: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark ? AppThemeData.grey700 : AppThemeData.grey200, + textColor: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, onPress: () async { Get.back(); }, @@ -1191,15 +2457,19 @@ class CartScreen extends StatelessWidget { const SizedBox(width: 20), Expanded( child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Add".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { if (controller.tipsController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter tips Amount".tr()); + ShowToastDialog.showToast( + "Please enter tips Amount".tr(), + ); } else { - controller.deliveryTips.value = double.parse(controller.tipsController.value.text); + controller.deliveryTips.value = double.parse( + controller.tipsController.value.text, + ); controller.calculatePrice(); Get.back(); } diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart index 812e5df..4e7a57e 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart @@ -8,7 +8,7 @@ import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -23,12 +23,22 @@ class CouponListScreen extends StatelessWidget { init: CartController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Coupon Code".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Coupon Code".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), bottom: PreferredSize( preferredSize: const Size.fromHeight(55), child: Padding( @@ -37,23 +47,44 @@ class CouponListScreen extends StatelessWidget { hintText: 'Enter coupon code'.tr(), controller: controller.couponCodeController.value, suffix: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 12, + ), child: InkWell( onTap: () { - if (controller.couponCodeController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter coupon code".tr()); + if (controller + .couponCodeController + .value + .text + .isEmpty) { + ShowToastDialog.showToast( + "Please enter coupon code".tr(), + ); return; } - CouponModel? matchedCoupon = controller.couponList.firstWhereOrNull((coupon) => coupon.code!.toLowerCase() == controller.couponCodeController.value.text.toLowerCase()); + CouponModel? matchedCoupon = controller.couponList + .firstWhereOrNull( + (coupon) => + coupon.code!.toLowerCase() == + controller.couponCodeController.value.text + .toLowerCase(), + ); if (matchedCoupon != null) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: matchedCoupon); + double couponAmount = Constant.calculateDiscount( + amount: controller.subTotal.value.toString(), + offerModel: matchedCoupon, + ); if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = matchedCoupon; + controller.selectedCouponModel.value = + matchedCoupon; controller.calculatePrice(); Get.back(); } else { - ShowToastDialog.showToast("Coupon code not applied".tr()); + ShowToastDialog.showToast( + "Coupon code not applied".tr(), + ); } } else { ShowToastDialog.showToast("Invalid Coupon".tr()); @@ -62,7 +93,14 @@ class CouponListScreen extends StatelessWidget { child: Text( "Apply".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ), @@ -76,17 +114,32 @@ class CouponListScreen extends StatelessWidget { itemBuilder: (context, index) { CouponModel couponModel = controller.couponList[index]; return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Container( height: Responsive.height(16, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(10), bottomLeft: Radius.circular(10)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10), + ), child: Stack( children: [ - Image.asset("assets/images/ic_coupon_image.png", height: Responsive.height(16, context), fit: BoxFit.fill), + Image.asset( + "assets/images/ic_coupon_image.png", + height: Responsive.height(16, context), + fit: BoxFit.fill, + ), Padding( padding: const EdgeInsets.only(left: 10), child: Align( @@ -96,7 +149,14 @@ class CouponListScreen extends StatelessWidget { child: Text( "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr()}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ), ), @@ -106,51 +166,98 @@ class CouponListScreen extends StatelessWidget { ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 18), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(6), color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(6), + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Text( "${couponModel.code}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ), ), const Expanded(child: SizedBox(height: 10)), InkWell( onTap: () { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: couponModel); + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: couponModel, + ); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = couponModel; + if (couponAmount < + controller.subTotal.value) { + controller.selectedCouponModel.value = + couponModel; controller.calculatePrice(); Get.back(); } else { - ShowToastDialog.showToast("Coupon code not applied".tr()); + ShowToastDialog.showToast( + "Coupon code not applied".tr(), + ); } }, child: Text( "Tap To Apply".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ], ), const SizedBox(height: 20), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 20), Text( "${couponModel.description}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart b/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart index 07796a8..cf4d0bc 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart @@ -10,8 +10,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../dash_board_screens/dash_board_screen.dart'; @@ -26,8 +25,14 @@ class OrderPlacingScreen extends StatelessWidget { init: OrderPlacingController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + ), body: controller.isLoading.value ? Constant.loader() @@ -41,16 +46,41 @@ class OrderPlacingScreen extends StatelessWidget { Text( "Order Placed".tr(), textAlign: TextAlign.start, - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey900, fontSize: 34, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey900, + fontSize: 34, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w400, + ), ), Text( - "Hang tight — your items are being delivered quickly and safely!".tr(), + "Hang tight — your items are being delivered quickly and safely!" + .tr(), textAlign: TextAlign.start, - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 40), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(10), child: Column( @@ -60,13 +90,26 @@ class OrderPlacingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_location.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_location.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 10), Expanded( child: Text( "Order ID".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontSize: 16, + ), ), ), ], @@ -75,7 +118,13 @@ class OrderPlacingScreen extends StatelessWidget { Text( controller.orderModel.value.id.toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -90,21 +139,51 @@ class OrderPlacingScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Center(child: Image.asset("assets/images/ic_timer.gif", height: 140)), + Center( + child: Image.asset( + "assets/images/ic_timer.gif", + height: 140, + ), + ), const SizedBox(height: 20), Text( "Placing your order".tr(), textAlign: TextAlign.start, - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey900, fontSize: 34, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey900, + fontSize: 34, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w400, + ), ), Text( - "Take a moment to review your order before proceeding to checkout.".tr(), + "Take a moment to review your order before proceeding to checkout." + .tr(), textAlign: TextAlign.start, - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 40), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(10), child: Column( @@ -114,22 +193,42 @@ class OrderPlacingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_location.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_location.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 10), Expanded( child: Text( "Delivery Address".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontSize: 16, + ), ), ), ], ), const SizedBox(height: 5), Text( - controller.orderModel.value.address!.getFullAddress(), + controller.orderModel.value.address! + .getFullAddress(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -137,7 +236,15 @@ class OrderPlacingScreen extends StatelessWidget { ), const SizedBox(height: 10), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(10), child: Column( @@ -147,13 +254,27 @@ class OrderPlacingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_book.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn), height: 22), + SvgPicture.asset( + "assets/icons/ic_book.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + height: 22, + ), const SizedBox(width: 10), Expanded( child: Text( "Order Summary".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontSize: 16, + ), ), ), ], @@ -161,21 +282,47 @@ class OrderPlacingScreen extends StatelessWidget { const SizedBox(height: 5), ListView.builder( shrinkWrap: true, - itemCount: controller.orderModel.value.products!.length, + itemCount: + controller + .orderModel + .value + .products! + .length, itemBuilder: (context, index) { - CartProductModel cartProductModel = controller.orderModel.value.products![index]; + CartProductModel cartProductModel = + controller + .orderModel + .value + .products![index]; return Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${cartProductModel.quantity} x".tr(), textAlign: TextAlign.start, - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey900, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey900, + fontSize: 14, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), Text( "${cartProductModel.name}".tr(), textAlign: TextAlign.start, - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey900, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey900, + fontSize: 14, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ], ); @@ -196,30 +343,39 @@ class OrderPlacingScreen extends StatelessWidget { child: controller.isPlacing.value ? RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Track Order".tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, fontSizes: 16, onPress: () async { - if (Constant.sectionConstantModel!.serviceTypeFlag == "ecommerce-service") { + if (Constant.sectionConstantModel!.serviceTypeFlag == + "ecommerce-service") { Get.offAll(const DashBoardEcommerceScreen()); - DashBoardEcommerceController controller = Get.put(DashBoardEcommerceController()); + DashBoardEcommerceController controller = Get.put( + DashBoardEcommerceController(), + ); controller.selectedIndex.value = 3; } else { Get.offAll(const DashBoardScreen()); - DashBoardController controller = Get.put(DashBoardController()); + DashBoardController controller = Get.put( + DashBoardController(), + ); controller.selectedIndex.value = 3; } }, ) : RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Track Order".tr(), height: 5.5, - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, - textColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + textColor: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, fontSizes: 16, onPress: () async {}, ), diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart index ed41845..8817c3c 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart @@ -5,8 +5,7 @@ import 'package:customer/themes/round_button_fill.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../wallet_screen/wallet_screen.dart'; diff --git a/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart b/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart index 92801a3..bc0aea5 100644 --- a/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart +++ b/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart @@ -3,8 +3,7 @@ import 'package:customer/controllers/cashback_controller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; class CashbackOffersListScreen extends StatelessWidget { @@ -21,8 +20,17 @@ class CashbackOffersListScreen extends StatelessWidget { appBar: AppBar( centerTitle: false, titleSpacing: 0, - title: Text("Cashback Offers".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + title: Text( + "Cashback Offers".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, ), body: controller.isLoading.value @@ -35,9 +43,18 @@ class CashbackOffersListScreen extends StatelessWidget { padding: const EdgeInsets.all(16), margin: const EdgeInsets.symmetric(vertical: 6), decoration: BoxDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, borderRadius: BorderRadius.circular(12), - boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 6, offset: const Offset(0, 3))], + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 6, + offset: const Offset(0, 3), + ), + ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -47,25 +64,57 @@ class CashbackOffersListScreen extends StatelessWidget { Expanded( child: Text( controller.cashbackList[index].title ?? '', - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), Text( - controller.cashbackList[index].cashbackType == 'Percent' + controller.cashbackList[index].cashbackType == + 'Percent' ? "${controller.cashbackList[index].cashbackAmount}%" - : Constant.amountShow(amount: "${controller.cashbackList[index].cashbackAmount}"), - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + : Constant.amountShow( + amount: + "${controller.cashbackList[index].cashbackAmount}", + ), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), const SizedBox(height: 6), Text( "${"Min spent".tr()} ${Constant.amountShow(amount: "${controller.cashbackList[index].minimumPurchaseAmount ?? 0.0}")} | ${"Valid till".tr()} ${Constant.timestampToDateTime2(controller.cashbackList[index].endDate!)}", - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontSize: 14), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontSize: 14, + ), ), Text( "${"Maximum cashback up to".tr()} ${Constant.amountShow(amount: "${controller.cashbackList[index].maximumDiscount ?? 0.0}")}", - style: TextStyle(color: isDark ? AppThemeData.primary200 : AppThemeData.primary300, fontFamily: AppThemeData.regular, fontSize: 14), + style: TextStyle( + color: + isDark + ? AppThemeData.primary200 + : AppThemeData.primary300, + fontFamily: AppThemeData.regular, + fontSize: 14, + ), ), ], ), diff --git a/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart b/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart index bdbd0b0..537a753 100644 --- a/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart +++ b/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart @@ -6,8 +6,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/utils/preferences.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import '../../../controllers/theme_controller.dart'; +import 'package:get/get.dart' hide Trans;import '../../../controllers/theme_controller.dart'; import '../../../service/localization_service.dart'; class ChangeLanguageScreen extends StatelessWidget { diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart index 0a9f324..fc40a8a 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart @@ -11,7 +11,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:image_picker/image_picker.dart'; import 'package:intl/intl.dart'; import '../../../service/fire_store_utils.dart'; @@ -33,13 +33,18 @@ class ChatScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( controller.restaurantName.value, textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), body: Column( @@ -53,18 +58,28 @@ class ChatScreen extends StatelessWidget { controller: controller.scrollController, physics: const BouncingScrollPhysics(), itemBuilder: (context, documentSnapshots, index) { - ConversationModel inboxModel = ConversationModel.fromJson(documentSnapshots[index].data() as Map); - return chatItemView(isDark, inboxModel.senderId == FireStoreUtils.getCurrentUid(), inboxModel); + ConversationModel inboxModel = ConversationModel.fromJson( + documentSnapshots[index].data() as Map, + ); + return chatItemView( + isDark, + inboxModel.senderId == FireStoreUtils.getCurrentUid(), + inboxModel, + ); }, - onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), + onEmpty: Constant.showEmptyView( + message: "No Conversion found".tr(), + ), // orderBy is compulsory to enable pagination query: FirebaseFirestore.instance .collection( controller.chatType.value == "Driver" ? 'chat_driver' - : controller.chatType.value == "Provider" || controller.chatType.value == "provider" + : controller.chatType.value == "Provider" || + controller.chatType.value == "provider" ? 'chat_provider' - : controller.chatType.value == "worker" || controller.chatType.value == "Worker" + : controller.chatType.value == "worker" || + controller.chatType.value == "Worker" ? 'chat_worker' : 'chat_store', ) @@ -79,7 +94,10 @@ class ChatScreen extends StatelessWidget { Container( color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -90,7 +108,9 @@ class ChatScreen extends StatelessWidget { onTap: () { onCameraClick(context, controller); }, - child: SvgPicture.asset("assets/icons/ic_picture_one.svg"), + child: SvgPicture.asset( + "assets/icons/ic_picture_one.svg", + ), ), Flexible( child: Padding( @@ -98,18 +118,39 @@ class ChatScreen extends StatelessWidget { child: TextField( textInputAction: TextInputAction.send, keyboardType: TextInputType.text, - textCapitalization: TextCapitalization.sentences, + textCapitalization: + TextCapitalization.sentences, controller: controller.messageController.value, decoration: InputDecoration( - contentPadding: const EdgeInsets.only(top: 3, left: 10), + contentPadding: const EdgeInsets.only( + top: 3, + left: 10, + ), focusedBorder: InputBorder.none, enabledBorder: InputBorder.none, hintText: 'Type message here....'.tr(), ), onSubmitted: (value) async { - if (controller.messageController.value.text.isNotEmpty) { - controller.sendMessage(controller.messageController.value.text, null, '', 'text'); - Timer(const Duration(milliseconds: 500), () => controller.scrollController.jumpTo(controller.scrollController.position.maxScrollExtent)); + if (controller + .messageController + .value + .text + .isNotEmpty) { + controller.sendMessage( + controller.messageController.value.text, + null, + '', + 'text', + ); + Timer( + const Duration(milliseconds: 500), + () => controller.scrollController.jumpTo( + controller + .scrollController + .position + .maxScrollExtent, + ), + ); controller.messageController.value.clear(); } }, @@ -118,16 +159,36 @@ class ChatScreen extends StatelessWidget { ), InkWell( onTap: () { - if (controller.messageController.value.text.isNotEmpty) { - controller.sendMessage(controller.messageController.value.text, null, '', 'text'); + if (controller + .messageController + .value + .text + .isNotEmpty) { + controller.sendMessage( + controller.messageController.value.text, + null, + '', + 'text', + ); controller.messageController.value.clear(); // Timer(const Duration(milliseconds: 500), () => controller.scrollController.jumpTo(controller.scrollController.position.maxScrollExtent)); } }, child: Container( margin: const EdgeInsets.only(left: 10), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, borderRadius: BorderRadius.circular(30)), - child: Padding(padding: const EdgeInsets.all(10), child: SvgPicture.asset("assets/icons/ic_send.svg")), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + borderRadius: BorderRadius.circular(30), + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: SvgPicture.asset( + "assets/icons/ic_send.svg", + ), + ), ), ), ], @@ -157,23 +218,53 @@ class ChatScreen extends StatelessWidget { data.messageType == "text" ? Container( decoration: BoxDecoration( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12), bottomLeft: Radius.circular(12)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(12), + topRight: Radius.circular(12), + bottomLeft: Radius.circular(12), + ), color: AppThemeData.primary300, ), - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - child: Text(data.message.toString(), style: const TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: AppThemeData.grey50)), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), + child: Text( + data.message.toString(), + style: const TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: AppThemeData.grey50, + ), + ), ) : data.messageType == "image" ? ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12), bottomLeft: Radius.circular(12)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(12), + topRight: Radius.circular(12), + bottomLeft: Radius.circular(12), + ), child: Stack( alignment: Alignment.center, children: [ GestureDetector( onTap: () { - Get.to(FullScreenImageViewer(imageUrl: data.url!.url)); + Get.to( + FullScreenImageViewer( + imageUrl: data.url!.url, + ), + ); }, - child: Hero(tag: data.url!.url, child: NetworkImageWidget(imageUrl: data.url!.url, height: 100, width: 100, fit: BoxFit.cover)), + child: Hero( + tag: data.url!.url, + child: NetworkImageWidget( + imageUrl: data.url!.url, + height: 100, + width: 100, + fit: BoxFit.cover, + ), + ), ), ], ), @@ -183,13 +274,25 @@ class ChatScreen extends StatelessWidget { heroTag: data.id, backgroundColor: AppThemeData.primary300, onPressed: () { - Get.to(FullScreenVideoViewer(heroTag: data.id.toString(), videoUrl: data.url!.url)); + Get.to( + FullScreenVideoViewer( + heroTag: data.id.toString(), + videoUrl: data.url!.url, + ), + ); }, - child: const Icon(Icons.play_arrow, color: Colors.white), + child: const Icon( + Icons.play_arrow, + color: Colors.white, + ), ), const SizedBox(height: 5), Text( - DateFormat('MMM d, yyyy hh:mm aa').format(DateTime.fromMillisecondsSinceEpoch(data.createdAt!.millisecondsSinceEpoch)), + DateFormat('MMM d, yyyy hh:mm aa').format( + DateTime.fromMillisecondsSinceEpoch( + data.createdAt!.millisecondsSinceEpoch, + ), + ), style: const TextStyle(color: Colors.grey, fontSize: 12), ), ], @@ -201,25 +304,61 @@ class ChatScreen extends StatelessWidget { data.messageType == "text" ? Container( decoration: BoxDecoration( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12), bottomRight: Radius.circular(12)), - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(12), + topRight: Radius.circular(12), + bottomRight: Radius.circular(12), + ), + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), + child: Text( + data.message.toString(), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - child: Text(data.message.toString(), style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800)), ) : data.messageType == "image" ? ConstrainedBox( - constraints: const BoxConstraints(minWidth: 50, maxWidth: 200), + constraints: const BoxConstraints( + minWidth: 50, + maxWidth: 200, + ), child: ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12), bottomRight: Radius.circular(12)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(12), + topRight: Radius.circular(12), + bottomRight: Radius.circular(12), + ), child: Stack( alignment: Alignment.center, children: [ GestureDetector( onTap: () { - Get.to(FullScreenImageViewer(imageUrl: data.url!.url)); + Get.to( + FullScreenImageViewer( + imageUrl: data.url!.url, + ), + ); }, - child: Hero(tag: data.url!.url, child: NetworkImageWidget(imageUrl: data.url!.url)), + child: Hero( + tag: data.url!.url, + child: NetworkImageWidget( + imageUrl: data.url!.url, + ), + ), ), ], ), @@ -230,13 +369,25 @@ class ChatScreen extends StatelessWidget { heroTag: data.id, backgroundColor: AppThemeData.primary300, onPressed: () { - Get.to(FullScreenVideoViewer(heroTag: data.id.toString(), videoUrl: data.url!.url)); + Get.to( + FullScreenVideoViewer( + heroTag: data.id.toString(), + videoUrl: data.url!.url, + ), + ); }, - child: const Icon(Icons.play_arrow, color: Colors.white), + child: const Icon( + Icons.play_arrow, + color: Colors.white, + ), ), const SizedBox(height: 5), Text( - DateFormat('MMM d, yyyy hh:mm aa').format(DateTime.fromMillisecondsSinceEpoch(data.createdAt!.millisecondsSinceEpoch)), + DateFormat('MMM d, yyyy hh:mm aa').format( + DateTime.fromMillisecondsSinceEpoch( + data.createdAt!.millisecondsSinceEpoch, + ), + ), style: const TextStyle(color: Colors.grey, fontSize: 12), ), ], @@ -252,9 +403,14 @@ class ChatScreen extends StatelessWidget { isDefaultAction: false, onPressed: () async { Get.back(); - XFile? image = await controller.imagePicker.pickImage(source: ImageSource.gallery); + XFile? image = await controller.imagePicker.pickImage( + source: ImageSource.gallery, + ); if (image != null) { - Url url = await FireStoreUtils.uploadChatImageToFireStorage(File(image.path), context); + Url url = await FireStoreUtils.uploadChatImageToFireStorage( + File(image.path), + context, + ); controller.sendMessage('', url, '', 'image'); } }, @@ -264,11 +420,22 @@ class ChatScreen extends StatelessWidget { isDefaultAction: false, onPressed: () async { Get.back(); - XFile? galleryVideo = await controller.imagePicker.pickVideo(source: ImageSource.gallery); + XFile? galleryVideo = await controller.imagePicker.pickVideo( + source: ImageSource.gallery, + ); if (galleryVideo != null) { - ChatVideoContainer? videoContainer = await FireStoreUtils.uploadChatVideoToFireStorage(context, File(galleryVideo.path)); + ChatVideoContainer? videoContainer = + await FireStoreUtils.uploadChatVideoToFireStorage( + context, + File(galleryVideo.path), + ); if (videoContainer != null) { - controller.sendMessage('', videoContainer.videoUrl, videoContainer.thumbnailUrl, 'video'); + controller.sendMessage( + '', + videoContainer.videoUrl, + videoContainer.thumbnailUrl, + 'video', + ); } } }, @@ -278,9 +445,14 @@ class ChatScreen extends StatelessWidget { isDestructiveAction: false, onPressed: () async { Get.back(); - XFile? image = await controller.imagePicker.pickImage(source: ImageSource.camera); + XFile? image = await controller.imagePicker.pickImage( + source: ImageSource.camera, + ); if (image != null) { - Url url = await FireStoreUtils.uploadChatImageToFireStorage(File(image.path), context); + Url url = await FireStoreUtils.uploadChatImageToFireStorage( + File(image.path), + context, + ); controller.sendMessage('', url, '', 'image'); } }, diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart index 4427f8d..39bf091 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart @@ -7,8 +7,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -25,10 +24,19 @@ class DriverInboxScreen extends StatelessWidget { final isDark = themeController.isDark.value; return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Driver Inbox".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Driver Inbox".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: FirestorePagination( //item builder type is compulsory. @@ -40,8 +48,12 @@ class DriverInboxScreen extends StatelessWidget { onTap: () async { ShowToastDialog.showLoader("Please wait...".tr()); - UserModel? customer = await FireStoreUtils.getUserProfile(inboxModel.customerId.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(inboxModel.restaurantId.toString()); + UserModel? customer = await FireStoreUtils.getUserProfile( + inboxModel.customerId.toString(), + ); + UserModel? restaurantUser = await FireStoreUtils.getUserProfile( + inboxModel.restaurantId.toString(), + ); ShowToastDialog.closeLoader(); Get.to( @@ -62,15 +74,23 @@ class DriverInboxScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: NetworkImageWidget( - imageUrl: inboxModel.restaurantProfileImage.toString(), + imageUrl: + inboxModel.restaurantProfileImage.toString(), fit: BoxFit.cover, height: Responsive.height(6, context), width: Responsive.width(12, context), @@ -87,13 +107,29 @@ class DriverInboxScreen extends StatelessWidget { child: Text( "${inboxModel.restaurantName}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), ), Text( - Constant.timestampToDate(inboxModel.createdAt!), + Constant.timestampToDate( + inboxModel.createdAt!, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.regular, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -101,7 +137,14 @@ class DriverInboxScreen extends StatelessWidget { Text( "${inboxModel.lastMessage}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + ), ), ], ), @@ -116,7 +159,10 @@ class DriverInboxScreen extends StatelessWidget { shrinkWrap: true, onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination - query: FirebaseFirestore.instance.collection('chat_driver').where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()).orderBy('createdAt', descending: true), + query: FirebaseFirestore.instance + .collection('chat_driver') + .where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()) + .orderBy('createdAt', descending: true), //Change types customerId viewType: ViewType.list, initialLoader: Constant.loader(), diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart index 9f99581..a1d22b5 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart @@ -10,8 +10,7 @@ import 'package:customer/widget/firebase_pagination/src/fireStore_pagination.dar import 'package:customer/widget/firebase_pagination/src/models/view_type.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -26,10 +25,19 @@ class RestaurantInboxScreen extends StatelessWidget { final isDark = themeController.isDark.value; return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Store Inbox".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Store Inbox".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: FirestorePagination( //item builder type is compulsory. @@ -41,9 +49,15 @@ class RestaurantInboxScreen extends StatelessWidget { onTap: () async { ShowToastDialog.showLoader("Please wait...".tr()); - UserModel? customer = await FireStoreUtils.getUserProfile(inboxModel.customerId.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(inboxModel.restaurantId.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(restaurantUser!.vendorID.toString()); + UserModel? customer = await FireStoreUtils.getUserProfile( + inboxModel.customerId.toString(), + ); + UserModel? restaurantUser = await FireStoreUtils.getUserProfile( + inboxModel.restaurantId.toString(), + ); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + restaurantUser!.vendorID.toString(), + ); ShowToastDialog.closeLoader(); Get.to( @@ -64,15 +78,23 @@ class RestaurantInboxScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: NetworkImageWidget( - imageUrl: inboxModel.restaurantProfileImage.toString(), + imageUrl: + inboxModel.restaurantProfileImage.toString(), fit: BoxFit.cover, height: Responsive.height(6, context), width: Responsive.width(12, context), @@ -89,13 +111,29 @@ class RestaurantInboxScreen extends StatelessWidget { child: Text( "${inboxModel.restaurantName}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), ), Text( - Constant.timestampToDate(inboxModel.createdAt!), + Constant.timestampToDate( + inboxModel.createdAt!, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.regular, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -103,7 +141,14 @@ class RestaurantInboxScreen extends StatelessWidget { Text( "${inboxModel.lastMessage}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + ), ), ], ), @@ -118,7 +163,10 @@ class RestaurantInboxScreen extends StatelessWidget { shrinkWrap: true, onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination - query: FirebaseFirestore.instance.collection('chat_store').where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()).orderBy('createdAt', descending: true), + query: FirebaseFirestore.instance + .collection('chat_store') + .where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()) + .orderBy('createdAt', descending: true), //Change types customerId viewType: ViewType.list, initialLoader: Constant.loader(), diff --git a/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart b/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart index 90c1480..0421c23 100644 --- a/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart @@ -4,8 +4,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; class DashBoardScreen extends StatelessWidget { @@ -26,12 +25,19 @@ class DashBoardScreen extends StatelessWidget { showUnselectedLabels: true, showSelectedLabels: true, selectedFontSize: 12, - selectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), - unselectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), + selectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), + unselectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), currentIndex: controller.selectedIndex.value, - backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - selectedItemColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - unselectedItemColor: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + backgroundColor: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + selectedItemColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, + unselectedItemColor: + isDark ? AppThemeData.grey300 : AppThemeData.grey600, onTap: (int index) { if (index == 0) { Get.put(DashBoardController()); @@ -41,17 +47,71 @@ class DashBoardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_fav.svg", + label: 'Favourites'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_orders.svg", + label: 'Orders'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet.svg", label: 'Wallet'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr(), controller: controller), - navigationBarItem(isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_fav.svg", + label: 'Favourites'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_wallet.svg", + label: 'Wallet'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_orders.svg", + label: 'Orders'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 4, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ], ), ); @@ -60,7 +120,13 @@ class DashBoardScreen extends StatelessWidget { }); } - BottomNavigationBarItem navigationBarItem(isDark, {required int index, required String label, required String assetIcon, required DashBoardController controller}) { + BottomNavigationBarItem navigationBarItem( + isDark, { + required int index, + required String label, + required String assetIcon, + required DashBoardController controller, + }) { return BottomNavigationBarItem( icon: Padding( padding: const EdgeInsets.symmetric(vertical: 5), diff --git a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart index 8bb2ec2..b19398c 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart @@ -4,7 +4,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:url_launcher/url_launcher.dart'; import '../../../controllers/theme_controller.dart'; @@ -23,10 +23,16 @@ class DineInBookingDetails extends StatelessWidget { appBar: AppBar( centerTitle: false, titleSpacing: 0, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text( "Dine in Bookings".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ), body: @@ -45,25 +51,55 @@ class DineInBookingDetails extends StatelessWidget { children: [ Text( "${'Order'.tr()} ${Constant.orderId(orderId: controller.bookingModel.value.id.toString())}", - style: TextStyle(fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), Text( "${controller.bookingModel.value.totalGuest} ${'Peoples'.tr()}", - style: TextStyle(fontSize: 14, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ], ), ), Container( decoration: ShapeDecoration( - color: Constant.statusColor(status: controller.bookingModel.value.status), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + color: Constant.statusColor( + status: controller.bookingModel.value.status, + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 6, + ), child: Text( "${controller.bookingModel.value.status}", - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ), ), @@ -71,7 +107,15 @@ class DineInBookingDetails extends StatelessWidget { ), const SizedBox(height: 20), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( @@ -79,19 +123,47 @@ class DineInBookingDetails extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_building.svg"), + SvgPicture.asset( + "assets/icons/ic_building.svg", + ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.bookingModel.value.vendor!.title.toString(), - style: TextStyle(fontSize: 18, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + controller + .bookingModel + .value + .vendor! + .title + .toString(), + style: TextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), Text( - controller.bookingModel.value.vendor!.location.toString(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + controller + .bookingModel + .value + .vendor! + .location + .toString(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ], ), @@ -107,9 +179,23 @@ class DineInBookingDetails extends StatelessWidget { onTap: () { launchUrl( Constant.createCoordinatesUrl( - controller.bookingModel.value.vendor!.latitude ?? 0.0, - controller.bookingModel.value.vendor!.longitude ?? 0.0, - controller.bookingModel.value.vendor!.title, + controller + .bookingModel + .value + .vendor! + .latitude ?? + 0.0, + controller + .bookingModel + .value + .vendor! + .longitude ?? + 0.0, + controller + .bookingModel + .value + .vendor! + .title, ), ); }, @@ -117,19 +203,44 @@ class DineInBookingDetails extends StatelessWidget { "View in Map".tr(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, decoration: TextDecoration.underline, - decorationColor: AppThemeData.primary300, + decorationColor: + AppThemeData.primary300, ), ), ), - const Padding(padding: EdgeInsets.symmetric(horizontal: 16), child: SizedBox(height: 16, child: VerticalDivider(width: 1))), + const Padding( + padding: EdgeInsets.symmetric( + horizontal: 16, + ), + child: SizedBox( + height: 16, + child: VerticalDivider(width: 1), + ), + ), InkWell( onTap: () { - if (controller.bookingModel.value.vendor!.phonenumber!.isNotEmpty) { - final Uri launchUri = Uri(scheme: 'tel', path: controller.bookingModel.value.vendor!.phonenumber); + if (controller + .bookingModel + .value + .vendor! + .phonenumber! + .isNotEmpty) { + final Uri launchUri = Uri( + scheme: 'tel', + path: + controller + .bookingModel + .value + .vendor! + .phonenumber, + ); launchUrl(launchUri); } }, @@ -137,11 +248,15 @@ class DineInBookingDetails extends StatelessWidget { "Call Now".tr(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, decoration: TextDecoration.underline, - decorationColor: AppThemeData.primary300, + decorationColor: + AppThemeData.primary300, ), ), ), @@ -156,11 +271,26 @@ class DineInBookingDetails extends StatelessWidget { Text( "Booking Details".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), const SizedBox(height: 5), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( @@ -171,14 +301,28 @@ class DineInBookingDetails extends StatelessWidget { Expanded( child: Text( "Name".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ), Expanded( child: Text( "${controller.bookingModel.value.guestFirstName} ${controller.bookingModel.value.guestLastName}", textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], @@ -190,14 +334,28 @@ class DineInBookingDetails extends StatelessWidget { Expanded( child: Text( "Phone number".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ), Expanded( child: Text( "${controller.bookingModel.value.guestPhone}", textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], @@ -209,14 +367,30 @@ class DineInBookingDetails extends StatelessWidget { Expanded( child: Text( "Date and Time".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ), Expanded( child: Text( - Constant.timestampToDateTime(controller.bookingModel.value.date!), + Constant.timestampToDateTime( + controller.bookingModel.value.date!, + ), textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], @@ -228,14 +402,28 @@ class DineInBookingDetails extends StatelessWidget { Expanded( child: Text( "Guest".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ), Expanded( child: Text( "${controller.bookingModel.value.totalGuest}", textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], @@ -247,14 +435,28 @@ class DineInBookingDetails extends StatelessWidget { Expanded( child: Text( "Discount".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ), Expanded( child: Text( "${controller.bookingModel.value.discount} %", textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart index 1bbeb1d..85e714c 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart @@ -6,7 +6,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/app_them_data.dart'; import '../../../widget/my_separator.dart'; @@ -26,10 +26,16 @@ class DineInBookingScreen extends StatelessWidget { appBar: AppBar( centerTitle: false, titleSpacing: 0, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text( "Dine in Bookings".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ), body: @@ -40,7 +46,15 @@ class DineInBookingScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Row( @@ -54,16 +68,28 @@ class DineInBookingScreen extends StatelessWidget { decoration: controller.isFeature.value == false ? null - : ShapeDecoration(color: AppThemeData.primary300, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + : ShapeDecoration( + color: AppThemeData.primary300, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Text( "Upcoming".tr(), textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.semiBold, color: - controller.isFeature.value == false + controller.isFeature.value == + false ? isDark ? AppThemeData.grey400 : AppThemeData.grey500 @@ -85,16 +111,28 @@ class DineInBookingScreen extends StatelessWidget { decoration: controller.isFeature.value == true ? null - : ShapeDecoration(color: AppThemeData.primary300, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + : ShapeDecoration( + color: AppThemeData.primary300, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Text( "History".tr(), textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.semiBold, color: - controller.isFeature.value == true + controller.isFeature.value == + true ? isDark ? AppThemeData.grey400 : AppThemeData.grey500 @@ -119,26 +157,45 @@ class DineInBookingScreen extends StatelessWidget { child: controller.isFeature.value ? controller.featureList.isEmpty - ? Constant.showEmptyView(message: "Upcoming Booking not found.".tr()) + ? Constant.showEmptyView( + message: + "Upcoming Booking not found.".tr(), + ) : ListView.builder( shrinkWrap: true, padding: EdgeInsets.zero, scrollDirection: Axis.vertical, - itemCount: controller.featureList.length, - itemBuilder: (BuildContext context, int index) { - DineInBookingModel dineBookingModel = controller.featureList[index]; - return itemView(isDark, context, dineBookingModel); + itemCount: + controller.featureList.length, + itemBuilder: ( + BuildContext context, + int index, + ) { + DineInBookingModel dineBookingModel = + controller.featureList[index]; + return itemView( + isDark, + context, + dineBookingModel, + ); }, ) : controller.historyList.isEmpty - ? Constant.showEmptyView(message: "History not found.".tr()) + ? Constant.showEmptyView( + message: "History not found.".tr(), + ) : ListView.builder( itemCount: controller.historyList.length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - DineInBookingModel dineBookingModel = controller.historyList[index]; - return itemView(isDark, context, dineBookingModel); + DineInBookingModel dineBookingModel = + controller.historyList[index]; + return itemView( + isDark, + context, + dineBookingModel, + ); }, ), ), @@ -150,15 +207,27 @@ class DineInBookingScreen extends StatelessWidget { ); } - InkWell itemView(isDark, BuildContext context, DineInBookingModel orderModel) { + InkWell itemView( + isDark, + BuildContext context, + DineInBookingModel orderModel, + ) { return InkWell( onTap: () { - Get.to(const DineInBookingDetails(), arguments: {"bookingModel": orderModel}); + Get.to( + const DineInBookingDetails(), + arguments: {"bookingModel": orderModel}, + ); }, child: Padding( padding: const EdgeInsets.symmetric(vertical: 5), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( @@ -169,12 +238,24 @@ class DineInBookingScreen extends StatelessWidget { borderRadius: const BorderRadius.all(Radius.circular(16)), child: Stack( children: [ - NetworkImageWidget(imageUrl: orderModel.vendor!.photo.toString(), fit: BoxFit.cover, height: Responsive.height(10, context), width: Responsive.width(20, context)), + NetworkImageWidget( + imageUrl: orderModel.vendor!.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height(10, context), + width: Responsive.width(20, context), + ), Container( height: Responsive.height(10, context), width: Responsive.width(20, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, 1.00), end: const Alignment(0, -1), colors: [Colors.black.withOpacity(0), AppThemeData.grey900]), + gradient: LinearGradient( + begin: const Alignment(0.00, 1.00), + end: const Alignment(0, -1), + colors: [ + Colors.black.withOpacity(0), + AppThemeData.grey900, + ], + ), ), ), ], @@ -188,33 +269,79 @@ class DineInBookingScreen extends StatelessWidget { Text( orderModel.status.toString(), textAlign: TextAlign.right, - style: TextStyle(color: Constant.statusColor(status: orderModel.status.toString()), fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500, fontSize: 12), + style: TextStyle( + color: Constant.statusColor( + status: orderModel.status.toString(), + ), + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + fontSize: 12, + ), ), const SizedBox(height: 5), Text( orderModel.vendor!.title.toString(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w400), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 5), Text( Constant.timestampToDateTime(orderModel.createdAt!), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ], ), ), ], ), - Padding(padding: const EdgeInsets.symmetric(vertical: 14), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)), + Padding( + padding: const EdgeInsets.symmetric(vertical: 14), + child: MySeparator( + color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + ), + ), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded(child: Text("Name".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400))), + Expanded( + child: Text( + "Name".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), + ), + ), Expanded( child: Text( "${orderModel.guestFirstName} ${orderModel.guestLastName}", textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], @@ -224,18 +351,40 @@ class DineInBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( - child: Text("Guest Number".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400)), + child: Text( + "Guest Number".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), + ), ), Expanded( child: Text( orderModel.totalGuest.toString(), textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], ), - Padding(padding: const EdgeInsets.symmetric(vertical: 14), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)), + Padding( + padding: const EdgeInsets.symmetric(vertical: 14), + child: MySeparator( + color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + ), + ), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -244,7 +393,14 @@ class DineInBookingScreen extends StatelessWidget { Expanded( child: Text( orderModel.vendor!.location.toString(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart index 96da285..a8dcaf3 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart @@ -8,7 +8,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../../../controllers/theme_controller.dart'; @@ -27,8 +27,17 @@ class BookTableScreen extends StatelessWidget { appBar: AppBar( centerTitle: false, titleSpacing: 0, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - title: Text("Book Table".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + title: Text( + "Book Table".tr(), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), + ), ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -37,25 +46,55 @@ class BookTableScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 12, + ), child: Row( children: [ Expanded( child: Text( "Numbers of Guests".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ), Container( height: Responsive.height(4, context), decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(200), side: BorderSide(color: isDark ? AppThemeData.grey600 : AppThemeData.grey300)), + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(200), + side: BorderSide( + color: + isDark + ? AppThemeData.grey600 + : AppThemeData.grey300, + ), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 5), + padding: const EdgeInsets.symmetric( + horizontal: 5, + ), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, @@ -69,7 +108,9 @@ class BookTableScreen extends StatelessWidget { child: const Icon(Icons.remove), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Text( controller.noOfQuantity.toString(), textAlign: TextAlign.start, @@ -79,7 +120,10 @@ class BookTableScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), ), @@ -87,7 +131,10 @@ class BookTableScreen extends StatelessWidget { onTap: () { controller.noOfQuantity.value += 1; }, - child: Icon(Icons.add, color: AppThemeData.primary300), + child: Icon( + Icons.add, + color: AppThemeData.primary300, + ), ), ], ), @@ -99,7 +146,13 @@ class BookTableScreen extends StatelessWidget { ), const SizedBox(height: 10), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( @@ -107,12 +160,22 @@ class BookTableScreen extends StatelessWidget { children: [ Text( "When are you visiting?".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), SizedBox( height: 120, child: ListView.builder( - padding: const EdgeInsets.symmetric(horizontal: 8), + padding: const EdgeInsets.symmetric( + horizontal: 8, + ), physics: const BouncingScrollPhysics(), itemCount: controller.dateList.length, scrollDirection: Axis.horizontal, @@ -120,11 +183,17 @@ class BookTableScreen extends StatelessWidget { return Stack( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 2.0, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 2.0, + vertical: 8, + ), child: GestureDetector( onTap: () { - controller.selectedDate.value = controller.dateList[index].date; - controller.timeSet(controller.dateList[index].date); + controller.selectedDate.value = + controller.dateList[index].date; + controller.timeSet( + controller.dateList[index].date, + ); }, child: Obx( () => Container( @@ -135,41 +204,93 @@ class BookTableScreen extends StatelessWidget { side: BorderSide( width: 1, color: - controller.selectedDate.value == controller.dateList[index].date - ? AppThemeData.primary300 + controller + .selectedDate + .value == + controller + .dateList[index] + .date + ? AppThemeData + .primary300 : isDark ? AppThemeData.grey800 - : AppThemeData.grey100, + : AppThemeData + .grey100, ), - borderRadius: BorderRadius.circular(8), + borderRadius: + BorderRadius.circular(8), ), ), child: Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all( + 8.0, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Text( - Constant.calculateDifference(controller.dateList[index].date.toDate()) == 0 + Constant.calculateDifference( + controller + .dateList[index] + .date + .toDate(), + ) == + 0 ? "Today".tr() - : Constant.calculateDifference(controller.dateList[index].date.toDate()) == 1 + : Constant.calculateDifference( + controller + .dateList[index] + .date + .toDate(), + ) == + 1 ? "Tomorrow".tr() - : DateFormat('EEE').format(controller.dateList[index].date.toDate()), + : DateFormat( + 'EEE', + ).format( + controller + .dateList[index] + .date + .toDate(), + ), style: TextStyle( fontSize: 12, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + fontFamily: + AppThemeData.regular, + fontWeight: + FontWeight.w500, ), ), Text( - DateFormat('d MMM').format(controller.dateList[index].date.toDate()).toString(), + DateFormat('d MMM') + .format( + controller + .dateList[index] + .date + .toDate(), + ) + .toString(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -185,8 +306,10 @@ class BookTableScreen extends StatelessWidget { right: 0, child: Center( child: RoundedButtonFill( - borderRadius: 10.r, - title: "${controller.dateList[index].discountPer}%".tr(), + borderRadius: 10.r, + title: + "${controller.dateList[index].discountPer}%" + .tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, width: 12, @@ -203,30 +326,69 @@ class BookTableScreen extends StatelessWidget { const SizedBox(height: 10), Text( "Select time slot and scroll to see offers".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( decoration: ShapeDecoration( - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: isDark ? AppThemeData.grey600 : AppThemeData.grey300), borderRadius: BorderRadius.circular(12)), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey600 + : AppThemeData.grey300, + ), + borderRadius: BorderRadius.circular(12), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 5, + ), child: Wrap( spacing: 5.0, children: [ ...controller.timeSlotList.map( (timeSlotList) => InputChip( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30), + ), side: BorderSide.none, - backgroundColor: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + backgroundColor: + isDark + ? AppThemeData.grey800 + : AppThemeData.grey100, selectedColor: AppThemeData.primary300, - labelStyle: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + labelStyle: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), label: Text( - DateFormat('hh:mm a').format(timeSlotList.time!), + DateFormat( + 'hh:mm a', + ).format(timeSlotList.time!), style: TextStyle( color: - controller.selectedTimeSlot.value == DateFormat('hh:mm a').format(timeSlotList.time!) + controller + .selectedTimeSlot + .value == + DateFormat( + 'hh:mm a', + ).format( + timeSlotList.time!, + ) ? AppThemeData.grey50 : isDark ? AppThemeData.grey400 @@ -236,11 +398,22 @@ class BookTableScreen extends StatelessWidget { ), ), showCheckmark: false, - selected: controller.selectedTimeSlot.value == DateFormat('hh:mm a').format(timeSlotList.time!), + selected: + controller.selectedTimeSlot.value == + DateFormat( + 'hh:mm a', + ).format(timeSlotList.time!), onSelected: (value) { - controller.selectedTimeSlot.value = DateFormat('hh:mm a').format(timeSlotList.time!); - controller.selectedTimeDiscount.value = timeSlotList.discountPer!; - controller.selectedTimeDiscountType.value = timeSlotList.discountType!; + controller + .selectedTimeSlot + .value = DateFormat( + 'hh:mm a', + ).format(timeSlotList.time!); + controller.selectedTimeDiscount.value = + timeSlotList.discountPer!; + controller + .selectedTimeDiscountType + .value = timeSlotList.discountType!; }, ), ), @@ -258,55 +431,120 @@ class BookTableScreen extends StatelessWidget { Expanded( child: Text( "Special Occasion".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), ), InkWell( onTap: () { controller.selectedOccasion.value = ""; }, - child: Text("Clear".tr(), style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500)), + child: Text( + "Clear".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), + ), ), ], ), const SizedBox(height: 10), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - for (int i = 0; i < controller.occasionList[i].length; i++) + for ( + int i = 0; + i < controller.occasionList[i].length; + i++ + ) ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 0.0, vertical: 0.0), - visualDensity: const VisualDensity(horizontal: 0, vertical: -4), + contentPadding: const EdgeInsets.symmetric( + horizontal: 0.0, + vertical: 0.0, + ), + visualDensity: const VisualDensity( + horizontal: 0, + vertical: -4, + ), dense: true, title: Text( //'${controller.occasionList[i]}'.tr(), - controller.getLocalizedOccasion(controller.occasionList[i]), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + controller.getLocalizedOccasion( + controller.occasionList[i], + ), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), leading: Radio( - visualDensity: const VisualDensity(horizontal: 0, vertical: -4), + visualDensity: const VisualDensity( + horizontal: 0, + vertical: -4, + ), value: controller.occasionList[i], groupValue: controller.selectedOccasion.value, activeColor: AppThemeData.primary300, onChanged: (value) { - controller.selectedOccasion.value = controller.occasionList[i]; + controller.selectedOccasion.value = + controller.occasionList[i]; }, ), ), ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 0.0, vertical: 0.0), - visualDensity: const VisualDensity(horizontal: 0, vertical: -4), + contentPadding: const EdgeInsets.symmetric( + horizontal: 0.0, + vertical: 0.0, + ), + visualDensity: const VisualDensity( + horizontal: 0, + vertical: -4, + ), dense: true, title: Text( 'Is this your first visit?'.tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), leading: Checkbox( - visualDensity: const VisualDensity(horizontal: 0, vertical: -4), + visualDensity: const VisualDensity( + horizontal: 0, + vertical: -4, + ), value: controller.firstVisit.value, activeColor: AppThemeData.primary300, onChanged: (value) { @@ -321,22 +559,44 @@ class BookTableScreen extends StatelessWidget { const SizedBox(height: 10), Text( "Personal Details".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ ClipOval( child: NetworkImageWidget( - imageUrl: Constant.userModel!.profilePictureURL.toString(), + imageUrl: + Constant.userModel!.profilePictureURL + .toString(), width: 50, height: 50, - errorWidget: Image.asset(Constant.userPlaceHolder, fit: BoxFit.cover, width: 50, height: 50), + errorWidget: Image.asset( + Constant.userPlaceHolder, + fit: BoxFit.cover, + width: 50, + height: 50, + ), ), ), const SizedBox(width: 10), @@ -345,11 +605,27 @@ class BookTableScreen extends StatelessWidget { children: [ Text( Constant.userModel!.fullName(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), Text( "${Constant.userModel!.email}", - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ], ), @@ -360,10 +636,20 @@ class BookTableScreen extends StatelessWidget { const SizedBox(height: 10), Text( "Additional Requests".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), - TextFieldWidget(controller: controller.additionRequestController.value, hintText: 'Add message here....'.tr(), maxLine: 5), + TextFieldWidget( + controller: controller.additionRequestController.value, + hintText: 'Add message here....'.tr(), + maxLine: 5, + ), const SizedBox(height: 20), ], ), @@ -375,7 +661,7 @@ class BookTableScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Book Now".tr(), height: 5.5, color: AppThemeData.primary300, diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart index 19c048e..3912671 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart @@ -13,7 +13,7 @@ import '../restaurant_details_screen/restaurant_details_screen.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:url_launcher/url_launcher.dart'; import '../review_list_screen/review_list_screen.dart'; import 'book_table_screen.dart'; @@ -30,7 +30,10 @@ class DineInDetailsScreen extends StatelessWidget { builder: (controller) { return Scaffold( body: NestedScrollView( - headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { + headerSliverBuilder: ( + BuildContext context, + bool innerBoxIsScrolled, + ) { return [ SliverAppBar( expandedHeight: Responsive.height(30, context), @@ -44,26 +47,66 @@ class DineInDetailsScreen extends StatelessWidget { onTap: () { Get.back(); }, - child: Icon(Icons.arrow_back, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + child: Icon( + Icons.arrow_back, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), const Expanded(child: SizedBox()), InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == controller.vendorModel.value.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: controller.vendorModel.value.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == controller.vendorModel.value.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => + p0.restaurantId == + controller.vendorModel.value.id, + ) + .isNotEmpty) { + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: controller.vendorModel.value.id, + userId: FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => + item.restaurantId == + controller.vendorModel.value.id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: controller.vendorModel.value.id, userId: FireStoreUtils.getCurrentUid()); + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: controller.vendorModel.value.id, + userId: FireStoreUtils.getCurrentUid(), + ); controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == controller.vendorModel.value.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg", colorFilter: const ColorFilter.mode(AppThemeData.grey50, BlendMode.srcIn)) - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == + controller.vendorModel.value.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + colorFilter: const ColorFilter.mode( + AppThemeData.grey50, + BlendMode.srcIn, + ), + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ], @@ -71,18 +114,28 @@ class DineInDetailsScreen extends StatelessWidget { flexibleSpace: FlexibleSpaceBar( background: Stack( children: [ - controller.vendorModel.value.photos == null || controller.vendorModel.value.photos!.isEmpty + controller.vendorModel.value.photos == null || + controller.vendorModel.value.photos!.isEmpty ? Stack( children: [ NetworkImageWidget( - imageUrl: controller.vendorModel.value.photo.toString(), + imageUrl: + controller.vendorModel.value.photo + .toString(), fit: BoxFit.cover, width: Responsive.width(100, context), height: Responsive.height(40, context), ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), Colors.black]), + gradient: LinearGradient( + begin: const Alignment(0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + Colors.black, + ], + ), ), ), ], @@ -91,20 +144,34 @@ class DineInDetailsScreen extends StatelessWidget { physics: const BouncingScrollPhysics(), controller: controller.pageController.value, scrollDirection: Axis.horizontal, - itemCount: controller.vendorModel.value.photos!.length, + itemCount: + controller.vendorModel.value.photos!.length, padEnds: false, pageSnapping: true, onPageChanged: (value) { controller.currentPage.value = value; }, itemBuilder: (BuildContext context, int index) { - String image = controller.vendorModel.value.photos![index]; + String image = + controller.vendorModel.value.photos![index]; return Stack( children: [ - NetworkImageWidget(imageUrl: image.toString(), fit: BoxFit.cover, width: Responsive.width(100, context), height: Responsive.height(40, context)), + NetworkImageWidget( + imageUrl: image.toString(), + fit: BoxFit.cover, + width: Responsive.width(100, context), + height: Responsive.height(40, context), + ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), Colors.black]), + gradient: LinearGradient( + begin: const Alignment(0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + Colors.black, + ], + ), ), ), ], @@ -118,17 +185,26 @@ class DineInDetailsScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - children: List.generate(controller.vendorModel.value.photos!.length, (index) { - return Obx( - () => Container( - margin: const EdgeInsets.only(right: 5), - alignment: Alignment.centerLeft, - height: 9, - width: 9, - decoration: BoxDecoration(shape: BoxShape.circle, color: controller.currentPage.value == index ? AppThemeData.primary300 : AppThemeData.grey300), - ), - ); - }), + children: List.generate( + controller.vendorModel.value.photos!.length, + (index) { + return Obx( + () => Container( + margin: const EdgeInsets.only(right: 5), + alignment: Alignment.centerLeft, + height: 9, + width: 9, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + controller.currentPage.value == index + ? AppThemeData.primary300 + : AppThemeData.grey300, + ), + ), + ); + }, + ), ), ), ], @@ -149,38 +225,64 @@ class DineInDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.vendorModel.value.title.toString(), + controller.vendorModel.value.title + .toString(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( fontSize: 22, overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), SizedBox( - width: Responsive.width(78, context), + width: Responsive.width( + 78, + context, + ), child: Text( - controller.vendorModel.value.location.toString(), + controller + .vendorModel + .value + .location + .toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, color: isDark ? AppThemeData.grey400 : AppThemeData.grey400), + style: TextStyle( + fontFamily: + AppThemeData.medium, + fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey400, + ), ), ), ], @@ -190,21 +292,59 @@ class DineInDetailsScreen extends StatelessWidget { children: [ Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(120), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), + padding: + const EdgeInsets.symmetric( + horizontal: 12, + vertical: 4, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( Constant.calculateReview( - reviewCount: controller.vendorModel.value.reviewsCount!.toStringAsFixed(0), - reviewSum: controller.vendorModel.value.reviewsSum.toString(), + reviewCount: controller + .vendorModel + .value + .reviewsCount! + .toStringAsFixed(0), + reviewSum: + controller + .vendorModel + .value + .reviewsSum + .toString(), + ), + style: TextStyle( + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), ), ], ), @@ -213,11 +353,28 @@ class DineInDetailsScreen extends StatelessWidget { const SizedBox(height: 5), InkWell( onTap: () { - Get.to(const ReviewListScreen(), arguments: {"vendorModel": controller.vendorModel.value}); + Get.to( + const ReviewListScreen(), + arguments: { + "vendorModel": + controller + .vendorModel + .value, + }, + ); }, child: Text( "${controller.vendorModel.value.reviewsCount} ${'Ratings'.tr()}", - style: TextStyle(decoration: TextDecoration.underline, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700, fontFamily: AppThemeData.regular), + style: TextStyle( + decoration: + TextDecoration.underline, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + fontFamily: + AppThemeData.regular, + ), ), ), ], @@ -227,7 +384,9 @@ class DineInDetailsScreen extends StatelessWidget { Row( children: [ Text( - controller.isOpen.value ? "Open".tr() : "Close".tr(), + controller.isOpen.value + ? "Open".tr() + : "Close".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -235,13 +394,31 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: controller.isOpen.value ? AppThemeData.success400 : AppThemeData.danger300, + color: + controller.isOpen.value + ? AppThemeData.success400 + : AppThemeData.danger300, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), + child: Icon( + Icons.circle, + size: 5, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, ), ), - Padding(padding: const EdgeInsets.symmetric(horizontal: 10), child: Icon(Icons.circle, size: 5, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500)), InkWell( onTap: () { - timeShowBottomSheet(context, controller); + timeShowBottomSheet( + context, + controller, + ); }, child: Text( "View Timings".tr(), @@ -249,18 +426,36 @@ class DineInDetailsScreen extends StatelessWidget { maxLines: 1, style: TextStyle( fontSize: 14, - decoration: TextDecoration.underline, - decorationColor: AppThemeData.ecommerce300, + decoration: + TextDecoration.underline, + decorationColor: + AppThemeData.ecommerce300, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, + color: + isDark + ? AppThemeData.ecommerce300 + : AppThemeData.ecommerce300, ), ), ), - Padding(padding: const EdgeInsets.symmetric(horizontal: 10), child: Icon(Icons.circle, size: 5, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500)), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), + child: Icon( + Icons.circle, + size: 5, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), + ), Text( - "${Constant.amountShow(amount: controller.vendorModel.value.restaurantCost)} ${'for two'.tr()}".tr(), + "${Constant.amountShow(amount: controller.vendorModel.value.restaurantCost)} ${'for two'.tr()}" + .tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -268,13 +463,17 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, ), ), ], ), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ const SizedBox(height: 20), Text( @@ -286,62 +485,123 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), InkWell( onTap: () { if (Constant.userModel == null) { - ShowToastDialog.showToast("Please log in to the application. You are not logged in.".tr()); + ShowToastDialog.showToast( + "Please log in to the application. You are not logged in." + .tr(), + ); } else { - Get.to(const BookTableScreen(), arguments: {"vendorModel": controller.vendorModel.value}); + Get.to( + const BookTableScreen(), + arguments: { + "vendorModel": + controller + .vendorModel + .value, + }, + ); } }, child: Container( height: 80, clipBehavior: Clip.antiAlias, decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), - borderRadius: BorderRadius.circular(16), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + ), + borderRadius: + BorderRadius.circular(16), ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), + ), + child: Image.asset( + "assets/images/ic_table.gif", ), - child: Image.asset("assets/images/ic_table.gif"), ), const SizedBox(width: 10), Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( "Table Booking".tr(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), Text( - "Quick Conformations".tr(), + "Quick Conformations" + .tr(), style: TextStyle( fontSize: 12, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w500, ), ), ], @@ -356,52 +616,109 @@ class DineInDetailsScreen extends StatelessWidget { const SizedBox(height: 10), InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": controller.vendorModel.value}); + Get.to( + const RestaurantDetailsScreen(), + arguments: { + "vendorModel": + controller.vendorModel.value, + }, + ); }, child: Container( height: 80, clipBehavior: Clip.antiAlias, decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), - borderRadius: BorderRadius.circular(16), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + ), + borderRadius: + BorderRadius.circular(16), ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all(4), + child: Image.asset( + "assets/images/food_delivery.gif", + ), ), - child: Padding(padding: const EdgeInsets.all(4), child: Image.asset("assets/images/food_delivery.gif")), ), const SizedBox(width: 10), Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( - "Available food delivery".tr(), + "Available food delivery" + .tr(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), Text( "in 30-45 mins.".tr(), style: TextStyle( fontSize: 12, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w500, ), ), ], @@ -415,10 +732,20 @@ class DineInDetailsScreen extends StatelessWidget { ), ], ), - controller.vendorModel.value.restaurantMenuPhotos == null || controller.vendorModel.value.restaurantMenuPhotos!.isEmpty + controller + .vendorModel + .value + .restaurantMenuPhotos == + null || + controller + .vendorModel + .value + .restaurantMenuPhotos! + .isEmpty ? const SizedBox() : Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ const SizedBox(height: 20), Text( @@ -430,28 +757,65 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), SizedBox( - height: Responsive.height(12, context), + height: Responsive.height( + 12, + context, + ), child: ListView.builder( - itemCount: controller.vendorModel.value.restaurantMenuPhotos!.length, + itemCount: + controller + .vendorModel + .value + .restaurantMenuPhotos! + .length, scrollDirection: Axis.horizontal, padding: EdgeInsets.zero, itemBuilder: (context, index) { return InkWell( onTap: () { - Get.to(FullScreenImageViewer(imageUrl: controller.vendorModel.value.restaurantMenuPhotos![index])); + Get.to( + FullScreenImageViewer( + imageUrl: + controller + .vendorModel + .value + .restaurantMenuPhotos![index], + ), + ); }, child: Padding( - padding: const EdgeInsets.all(6.0), + padding: + const EdgeInsets.all( + 6.0, + ), child: ClipRRect( - borderRadius: BorderRadius.circular(10), + borderRadius: + BorderRadius.circular( + 10, + ), child: NetworkImageWidget( - imageUrl: controller.vendorModel.value.restaurantMenuPhotos![index], - height: Responsive.height(12, context), - width: Responsive.height(12, context), + imageUrl: + controller + .vendorModel + .value + .restaurantMenuPhotos![index], + height: + Responsive.height( + 12, + context, + ), + width: + Responsive.height( + 12, + context, + ), fit: BoxFit.fill, ), ), @@ -464,7 +828,8 @@ class DineInDetailsScreen extends StatelessWidget { ), const SizedBox(height: 20), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Location, Timing & Costs".tr(), @@ -475,36 +840,64 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 20), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_location.svg"), + SvgPicture.asset( + "assets/icons/ic_location.svg", + ), const SizedBox(width: 14), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.vendorModel.value.location.toString(), + controller + .vendorModel + .value + .location + .toString(), textAlign: TextAlign.start, style: TextStyle( fontSize: 16, - fontFamily: AppThemeData.regular, + fontFamily: + AppThemeData.regular, fontWeight: FontWeight.w400, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, ), ), InkWell( onTap: () { launchUrl( Constant.createCoordinatesUrl( - controller.vendorModel.value.latitude ?? 0.0, - controller.vendorModel.value.longitude ?? 0.0, - controller.vendorModel.value.title, + controller + .vendorModel + .value + .latitude ?? + 0.0, + controller + .vendorModel + .value + .longitude ?? + 0.0, + controller + .vendorModel + .value + .title, ), ); }, @@ -513,9 +906,16 @@ class DineInDetailsScreen extends StatelessWidget { textAlign: TextAlign.start, style: TextStyle( fontSize: 16, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, ), ), ), @@ -526,21 +926,31 @@ class DineInDetailsScreen extends StatelessWidget { ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_alarm_clock.svg", height: 20), + SvgPicture.asset( + "assets/icons/ic_alarm_clock.svg", + height: 20, + ), const SizedBox(width: 14), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Timing".tr(), textAlign: TextAlign.start, style: TextStyle( fontSize: 16, - fontFamily: AppThemeData.regular, + fontFamily: + AppThemeData.regular, fontWeight: FontWeight.w400, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, ), ), InkWell( @@ -550,9 +960,15 @@ class DineInDetailsScreen extends StatelessWidget { textAlign: TextAlign.start, style: TextStyle( fontSize: 16, - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, ), ), ), @@ -562,25 +978,41 @@ class DineInDetailsScreen extends StatelessWidget { ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - Constant.currencyModel!.symbol.toString(), + Constant.currencyModel!.symbol + .toString(), textAlign: TextAlign.center, - style: TextStyle(fontSize: 24, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w400, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontSize: 24, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), const SizedBox(width: 20), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Cost for Two".tr(), textAlign: TextAlign.start, style: TextStyle( fontSize: 16, - fontFamily: AppThemeData.regular, + fontFamily: + AppThemeData.regular, fontWeight: FontWeight.w400, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, ), ), Text( @@ -588,9 +1020,15 @@ class DineInDetailsScreen extends StatelessWidget { textAlign: TextAlign.start, style: TextStyle( fontSize: 16, - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, ), ), ], @@ -601,7 +1039,8 @@ class DineInDetailsScreen extends StatelessWidget { ), const SizedBox(height: 20), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Cuisines".tr(), @@ -612,7 +1051,10 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), @@ -621,10 +1063,21 @@ class DineInDetailsScreen extends StatelessWidget { children: [ ...controller.tags.map( (tag) => FilterChip( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(30), + ), side: BorderSide.none, - backgroundColor: isDark ? AppThemeData.grey700 : AppThemeData.grey200, - labelStyle: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + backgroundColor: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + labelStyle: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), label: Text("$tag"), onSelected: (bool value) {}, ), @@ -646,12 +1099,17 @@ class DineInDetailsScreen extends StatelessWidget { ); } - Future timeShowBottomSheet(BuildContext context, DineInRestaurantDetailsController productModel) { + Future timeShowBottomSheet( + BuildContext context, + DineInRestaurantDetailsController productModel, + ) { return showModalBottomSheet( context: context, isScrollControlled: true, isDismissible: true, - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(30))), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(30)), + ), clipBehavior: Clip.antiAliasWithSaveLayer, builder: (context) => FractionallySizedBox( @@ -661,7 +1119,8 @@ class DineInDetailsScreen extends StatelessWidget { final themeController = Get.find(); final isDark = themeController.isDark.value; return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( @@ -673,7 +1132,15 @@ class DineInDetailsScreen extends StatelessWidget { width: 134, height: 5, margin: const EdgeInsets.only(bottom: 6), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey50 : AppThemeData.grey800, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(3))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey800, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(3), + ), + ), ), ), ), @@ -681,11 +1148,22 @@ class DineInDetailsScreen extends StatelessWidget { child: ListView.builder( shrinkWrap: true, physics: const BouncingScrollPhysics(), - itemCount: productModel.vendorModel.value.workingHours!.length, + itemCount: + productModel + .vendorModel + .value + .workingHours! + .length, itemBuilder: (context, dayIndex) { - WorkingHours workingHours = productModel.vendorModel.value.workingHours![dayIndex]; + WorkingHours workingHours = + productModel + .vendorModel + .value + .workingHours![dayIndex]; return Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -698,34 +1176,72 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), - workingHours.timeslot == null || workingHours.timeslot!.isEmpty + workingHours.timeslot == null || + workingHours.timeslot!.isEmpty ? const SizedBox() : ListView.builder( shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: workingHours.timeslot!.length, + physics: + const NeverScrollableScrollPhysics(), + itemCount: + workingHours.timeslot!.length, itemBuilder: (context, timeIndex) { - Timeslot timeSlotModel = workingHours.timeslot![timeIndex]; + Timeslot timeSlotModel = + workingHours + .timeslot![timeIndex]; return Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all( + 8.0, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Container( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(12)), - border: Border.all(color: isDark ? AppThemeData.grey400 : AppThemeData.grey200), + borderRadius: + const BorderRadius.all( + Radius.circular( + 12, + ), + ), + border: Border.all( + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey200, + ), ), child: Center( child: Text( - timeSlotModel.from.toString(), - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + timeSlotModel.from + .toString(), + style: TextStyle( + fontFamily: + AppThemeData + .medium, + fontSize: 14, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + ), ), ), ), @@ -733,15 +1249,42 @@ class DineInDetailsScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Container( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(12)), - border: Border.all(color: isDark ? AppThemeData.grey400 : AppThemeData.grey200), + borderRadius: + const BorderRadius.all( + Radius.circular( + 12, + ), + ), + border: Border.all( + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey200, + ), ), child: Center( child: Text( - timeSlotModel.to.toString(), - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + timeSlotModel.to + .toString(), + style: TextStyle( + fontFamily: + AppThemeData + .medium, + fontSize: 14, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + ), ), ), ), diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_restaurant_list_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_restaurant_list_screen.dart index e80c5a8..72ce204 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_restaurant_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_restaurant_list_screen.dart @@ -6,7 +6,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../widget/restaurant_image_view.dart'; @@ -119,40 +119,34 @@ class DineInRestaurantListScreen extends StatelessWidget { ) .isNotEmpty) { FavouriteModel - favouriteModel = - FavouriteModel( - restaurantId: - vendorModel.id, - userId: - FireStoreUtils - .getCurrentUid(), - ); + favouriteModel = FavouriteModel( + restaurantId: + vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); controller.favouriteList .removeWhere( (item) => item.restaurantId == vendorModel.id, ); - await FireStoreUtils - .removeFavouriteRestaurant( - favouriteModel, - ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { FavouriteModel - favouriteModel = - FavouriteModel( - restaurantId: - vendorModel.id, - userId: - FireStoreUtils - .getCurrentUid(), - ); + favouriteModel = FavouriteModel( + restaurantId: + vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); controller.favouriteList .add(favouriteModel); - await FireStoreUtils - .setFavouriteRestaurant( - favouriteModel, - ); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart index 11c9eeb..1fe7b07 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart @@ -14,7 +14,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:url_launcher/url_launcher.dart'; import '../../../controllers/theme_controller.dart'; import '../../../models/banner_model.dart'; diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart index 9d4054f..a33b906 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart @@ -5,8 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../home_screen/category_restaurant_screen.dart'; @@ -18,55 +17,79 @@ class ViewAllCategoryDineInScreen extends StatelessWidget { final themeController = Get.find(); final isDark = themeController.isDark.value; return GetX( - init: ViewAllCategoryController(), - builder: (controller) { - return Scaffold( - appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - centerTitle: false, - titleSpacing: 0, - title: Text( - "Categories".tr(), - style: TextStyle( - fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, - ), + init: ViewAllCategoryController(), + builder: (controller) { + return Scaffold( + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + title: Text( + "Categories".tr(), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, ), ), - body: controller.isLoading.value - ? Constant.loader() - : Padding( + ), + body: + controller.isLoading.value + ? Constant.loader() + : Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: GridView.builder( padding: EdgeInsets.zero, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 3.5 / 6, crossAxisSpacing: 6), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + childAspectRatio: 3.5 / 6, + crossAxisSpacing: 6, + ), itemCount: controller.vendorCategoryModel.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (context, index) { - VendorCategoryModel vendorCategoryModel = controller.vendorCategoryModel[index]; + VendorCategoryModel vendorCategoryModel = + controller.vendorCategoryModel[index]; return InkWell( onTap: () { - Get.to(const CategoryRestaurantScreen(), arguments: {"vendorCategoryModel": vendorCategoryModel, "dineIn": true}); + Get.to( + const CategoryRestaurantScreen(), + arguments: { + "vendorCategoryModel": vendorCategoryModel, + "dineIn": true, + }, + ); }, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: 4, + vertical: 6, + ), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, shape: RoundedRectangleBorder( side: BorderSide( width: 1, strokeAlign: BorderSide.strokeAlignOutside, - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + color: + isDark + ? AppThemeData.grey800 + : AppThemeData.grey100, ), borderRadius: BorderRadius.circular(100), ), ), child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ SizedBox( @@ -74,23 +97,31 @@ class ViewAllCategoryDineInScreen extends StatelessWidget { height: 60, child: ClipOval( child: NetworkImageWidget( - imageUrl: vendorCategoryModel.photo.toString(), + imageUrl: + vendorCategoryModel.photo + .toString(), fit: BoxFit.cover, ), ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: Text( '${vendorCategoryModel.title}', textAlign: TextAlign.center, maxLines: 2, style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, fontFamily: AppThemeData.medium, ), ), - ) + ), ], ), ), @@ -99,7 +130,8 @@ class ViewAllCategoryDineInScreen extends StatelessWidget { }, ), ), - ); - }); + ); + }, + ); } } diff --git a/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart b/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart index 33fa7e6..2811025 100644 --- a/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart +++ b/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart @@ -10,7 +10,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:image_picker/image_picker.dart'; import '../../../controllers/theme_controller.dart'; @@ -25,7 +25,12 @@ class EditProfileScreen extends StatelessWidget { init: EditProfileController(), builder: (controller) { return Scaffold( - appBar: AppBar(centerTitle: false, titleSpacing: 0, backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface), + appBar: AppBar( + centerTitle: false, + titleSpacing: 0, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + ), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -34,11 +39,24 @@ class EditProfileScreen extends StatelessWidget { children: [ Text( "Profile Information".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), Text( - "View and update your personal details, contact information, and preferences.".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + "View and update your personal details, contact information, and preferences." + .tr(), + style: TextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 20), Center( @@ -47,12 +65,25 @@ class EditProfileScreen extends StatelessWidget { controller.profileImage.isEmpty ? ClipRRect( borderRadius: BorderRadius.circular(60), - child: Image.asset(Constant.userPlaceHolder, height: Responsive.width(24, context), width: Responsive.width(24, context), fit: BoxFit.cover), + child: Image.asset( + Constant.userPlaceHolder, + height: Responsive.width(24, context), + width: Responsive.width(24, context), + fit: BoxFit.cover, + ), ) - : Constant().hasValidUrl(controller.profileImage.value) == false + : Constant().hasValidUrl( + controller.profileImage.value, + ) == + false ? ClipRRect( borderRadius: BorderRadius.circular(60), - child: Image.file(File(controller.profileImage.value), height: Responsive.width(24, context), width: Responsive.width(24, context), fit: BoxFit.cover), + child: Image.file( + File(controller.profileImage.value), + height: Responsive.width(24, context), + width: Responsive.width(24, context), + fit: BoxFit.cover, + ), ) : ClipRRect( borderRadius: BorderRadius.circular(60), @@ -61,7 +92,12 @@ class EditProfileScreen extends StatelessWidget { imageUrl: controller.profileImage.value, height: Responsive.width(24, context), width: Responsive.width(24, context), - errorWidget: Image.asset(Constant.userPlaceHolder, fit: BoxFit.cover, height: Responsive.width(24, context), width: Responsive.width(24, context)), + errorWidget: Image.asset( + Constant.userPlaceHolder, + fit: BoxFit.cover, + height: Responsive.width(24, context), + width: Responsive.width(24, context), + ), ), ), Positioned( @@ -80,13 +116,37 @@ class EditProfileScreen extends StatelessWidget { const SizedBox(height: 20), Row( children: [ - Expanded(child: TextFieldWidget(title: 'First Name'.tr(), controller: controller.firstNameController.value, hintText: 'First Name'.tr())), + Expanded( + child: TextFieldWidget( + title: 'First Name'.tr(), + controller: controller.firstNameController.value, + hintText: 'First Name'.tr(), + ), + ), const SizedBox(width: 10), - Expanded(child: TextFieldWidget(title: 'Last Name'.tr(), controller: controller.lastNameController.value, hintText: 'Last Name'.tr())), + Expanded( + child: TextFieldWidget( + title: 'Last Name'.tr(), + controller: controller.lastNameController.value, + hintText: 'Last Name'.tr(), + ), + ), ], ), - TextFieldWidget(title: 'Email'.tr(), textInputType: TextInputType.emailAddress, controller: controller.emailController.value, hintText: 'Email'.tr(), enable: false), - TextFieldWidget(title: 'Phone Number'.tr(), textInputType: TextInputType.emailAddress, controller: controller.phoneNumberController.value, hintText: 'Phone Number'.tr(), enable: false), + TextFieldWidget( + title: 'Email'.tr(), + textInputType: TextInputType.emailAddress, + controller: controller.emailController.value, + hintText: 'Email'.tr(), + enable: false, + ), + TextFieldWidget( + title: 'Phone Number'.tr(), + textInputType: TextInputType.emailAddress, + controller: controller.phoneNumberController.value, + hintText: 'Phone Number'.tr(), + enable: false, + ), ], ), ), @@ -97,7 +157,7 @@ class EditProfileScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Save Details".tr(), height: 5.5, color: AppThemeData.primary300, @@ -114,7 +174,10 @@ class EditProfileScreen extends StatelessWidget { ); } - Future buildBottomSheet(BuildContext context, EditProfileController controller) { + Future buildBottomSheet( + BuildContext context, + EditProfileController controller, + ) { return showModalBottomSheet( context: context, builder: (context) { @@ -125,7 +188,16 @@ class EditProfileScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Padding(padding: const EdgeInsets.only(top: 15), child: Text("please select".tr(), style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600))), + Padding( + padding: const EdgeInsets.only(top: 15), + child: Text( + "please select".tr(), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ), Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, @@ -135,8 +207,20 @@ class EditProfileScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - IconButton(onPressed: () => controller.pickFile(source: ImageSource.camera), icon: const Icon(Icons.camera_alt, size: 32)), - Padding(padding: const EdgeInsets.only(top: 3), child: Text("camera".tr(), style: const TextStyle())), + IconButton( + onPressed: + () => controller.pickFile( + source: ImageSource.camera, + ), + icon: const Icon(Icons.camera_alt, size: 32), + ), + Padding( + padding: const EdgeInsets.only(top: 3), + child: Text( + "camera".tr(), + style: const TextStyle(), + ), + ), ], ), ), @@ -146,8 +230,23 @@ class EditProfileScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - IconButton(onPressed: () => controller.pickFile(source: ImageSource.gallery), icon: const Icon(Icons.photo_library_sharp, size: 32)), - Padding(padding: const EdgeInsets.only(top: 3), child: Text("gallery".tr(), style: const TextStyle())), + IconButton( + onPressed: + () => controller.pickFile( + source: ImageSource.gallery, + ), + icon: const Icon( + Icons.photo_library_sharp, + size: 32, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 3), + child: Text( + "gallery".tr(), + style: const TextStyle(), + ), + ), ], ), ), diff --git a/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart b/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart index baa570c..4eb1bf0 100644 --- a/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart +++ b/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart @@ -12,7 +12,7 @@ import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; import '../../../widget/restaurant_image_view.dart'; @@ -30,12 +30,15 @@ class FavouriteScreen extends StatelessWidget { init: FavouriteController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, body: controller.isLoading.value ? Constant.loader() : Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: Column( children: [ Padding( @@ -45,7 +48,15 @@ class FavouriteScreen extends StatelessWidget { Expanded( child: Text( "Your Favourites, All in One Place".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), ), //SvgPicture.asset("assets/images/ic_favourite.svg"), @@ -57,22 +68,44 @@ class FavouriteScreen extends StatelessWidget { child: Constant.userModel == null ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - Image.asset("assets/images/login.gif", height: 120), + Image.asset( + "assets/images/login.gif", + height: 120, + ), const SizedBox(height: 12), Text( "Please Log In to Continue".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr(), + "You’re not logged in. Please sign in to access your account and explore all features." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -91,11 +124,19 @@ class FavouriteScreen extends StatelessWidget { : Column( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(120), + ), ), child: Padding( padding: const EdgeInsets.all(8.0), @@ -104,19 +145,50 @@ class FavouriteScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - controller.favouriteRestaurant.value = true; + controller + .favouriteRestaurant + .value = true; }, child: Container( decoration: - controller.favouriteRestaurant.value == false + controller + .favouriteRestaurant + .value == + false ? null - : ShapeDecoration(color: AppThemeData.grey900, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + : ShapeDecoration( + color: + AppThemeData + .grey900, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Text( - "Favourite Store".tr(), - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + "Favourite Store" + .tr(), + textAlign: + TextAlign.center, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ), @@ -125,28 +197,57 @@ class FavouriteScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - controller.favouriteRestaurant.value = false; + controller + .favouriteRestaurant + .value = false; }, child: Container( decoration: - controller.favouriteRestaurant.value == true + controller + .favouriteRestaurant + .value == + true ? null - : ShapeDecoration(color: AppThemeData.grey900, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + : ShapeDecoration( + color: + AppThemeData + .grey900, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Text( "Favourite Item".tr(), - textAlign: TextAlign.center, + textAlign: + TextAlign.center, style: TextStyle( - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData + .semiBold, color: - controller.favouriteRestaurant.value == true + controller + .favouriteRestaurant + .value == + true ? isDark - ? AppThemeData.grey400 - : AppThemeData.grey500 + ? AppThemeData + .grey400 + : AppThemeData + .grey500 : isDark - ? AppThemeData.primary300 - : AppThemeData.primary300, + ? AppThemeData + .primary300 + : AppThemeData + .primary300, ), ), ), @@ -161,79 +262,190 @@ class FavouriteScreen extends StatelessWidget { const SizedBox(height: 20), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 18), + padding: const EdgeInsets.symmetric( + horizontal: 18, + ), child: - controller.favouriteRestaurant.value - ? controller.favouriteVendorList.isEmpty - ? Constant.showEmptyView(message: "Favourite Store not found.".tr()) + controller + .favouriteRestaurant + .value + ? controller + .favouriteVendorList + .isEmpty + ? Constant.showEmptyView( + message: + "Favourite Store not found." + .tr(), + ) : ListView.builder( shrinkWrap: true, - padding: EdgeInsets.zero, - scrollDirection: Axis.vertical, - itemCount: controller.favouriteVendorList.length, - itemBuilder: (BuildContext context, int index) { - VendorModel vendorModel = controller.favouriteVendorList[index]; + padding: + EdgeInsets.zero, + scrollDirection: + Axis.vertical, + itemCount: + controller + .favouriteVendorList + .length, + itemBuilder: ( + BuildContext context, + int index, + ) { + VendorModel + vendorModel = + controller + .favouriteVendorList[index]; return InkWell( onTap: () { ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: { + "vendorModel": + vendorModel, + }, + ); // Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); }, child: Padding( - padding: const EdgeInsets.only(bottom: 20), + padding: + const EdgeInsets.only( + bottom: 20, + ), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + color: + isDark + ? AppThemeData + .grey900 + : AppThemeData + .grey50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 16, + ), + ), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular( + 16, + ), + topRight: Radius.circular( + 16, + ), + ), child: Stack( children: [ - RestaurantImageView(vendorModel: vendorModel), + RestaurantImageView( + vendorModel: + vendorModel, + ), Container( - height: Responsive.height(20, context), - width: Responsive.width(100, context), + height: Responsive.height( + 20, + context, + ), + width: Responsive.width( + 100, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), - end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + begin: const Alignment( + -0.00, + -1.00, + ), + end: const Alignment( + 0, + 1, + ), + colors: [ + Colors.black.withOpacity( + 0, + ), + const Color( + 0xFF111827, + ), + ], ), ), ), Positioned( - right: 10, - top: 10, + right: + 10, + top: + 10, child: InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty) { + if (controller.favouriteList + .where( + ( + p0, + ) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty) { FavouriteModel favouriteModel = FavouriteModel( - restaurantId: vendorModel.id, - userId: FireStoreUtils.getCurrentUid(), + restaurantId: + vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + ( + item, + ) => + item.restaurantId == + vendorModel.id, + ); + controller.favouriteVendorList.removeAt( + index, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, ); - controller.favouriteList.removeWhere((item) => item.restaurantId == vendorModel.id); - controller.favouriteVendorList.removeAt(index); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); } else { FavouriteModel favouriteModel = FavouriteModel( - restaurantId: vendorModel.id, - userId: FireStoreUtils.getCurrentUid(), + restaurantId: + vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.add( + favouriteModel, + ); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, ); - controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + ( + p0, + ) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -241,86 +453,171 @@ class FavouriteScreen extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(17.5, context)), + offset: Offset( + Responsive.width( + -3, + context, + ), + Responsive.height( + 17.5, + context, + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: const EdgeInsets.symmetric( + horizontal: + 10, + vertical: + 7, + ), decoration: BoxDecoration( - color: AppThemeData.success300, - borderRadius: BorderRadius.circular(120), // Optional + color: + AppThemeData.success300, + borderRadius: BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), + const SizedBox( + width: + 5, + ), Text( "Free Delivery".tr(), style: TextStyle( - fontSize: 14, - color: AppThemeData.success600, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontSize: + 14, + color: + AppThemeData.success600, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], ), ), - const SizedBox(width: 6), + const SizedBox( + width: + 6, + ), ], ), ), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: const EdgeInsets.symmetric( + horizontal: + 10, + vertical: + 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 120, + ), + ), ), child: Row( children: [ SvgPicture.asset( "assets/icons/ic_star.svg", - colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), + const SizedBox( + width: + 5, ), - const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", style: TextStyle( - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], ), ), - const SizedBox(width: 6), + const SizedBox( + width: + 6, + ), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: const EdgeInsets.symmetric( + horizontal: + 10, + vertical: + 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.ecommerce600 + : AppThemeData.ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 120, + ), + ), ), child: Row( children: [ SvgPicture.asset( "assets/icons/ic_map_distance.svg", - colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + AppThemeData.ecommerce300, + BlendMode.srcIn, + ), + ), + const SizedBox( + width: + 5, ), - const SizedBox(width: 5), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", style: TextStyle( - fontSize: 14, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontSize: + 14, + color: + isDark + ? AppThemeData.ecommerce300 + : AppThemeData.ecommerce300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -331,38 +628,64 @@ class FavouriteScreen extends StatelessWidget { ), ], ), - const SizedBox(height: 15), + const SizedBox( + height: + 15, + ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: + 16, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( vendorModel.title.toString(), - textAlign: TextAlign.start, - maxLines: 1, + textAlign: + TextAlign.start, + maxLines: + 1, style: TextStyle( - fontSize: 18, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontSize: + 18, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), Text( vendorModel.location.toString(), - textAlign: TextAlign.start, - maxLines: 1, + textAlign: + TextAlign.start, + maxLines: + 1, style: TextStyle( - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.medium, + fontWeight: + FontWeight.w500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], ), ), - const SizedBox(height: 10), + const SizedBox( + height: + 10, + ), ], ), ), @@ -370,114 +693,249 @@ class FavouriteScreen extends StatelessWidget { ); }, ) - : controller.favouriteFoodList.isEmpty - ? Constant.showEmptyView(message: "Favourite Item not found.".tr()) + : controller + .favouriteFoodList + .isEmpty + ? Constant.showEmptyView( + message: + "Favourite Item not found." + .tr(), + ) : ListView.builder( - itemCount: controller.favouriteFoodList.length, + itemCount: + controller + .favouriteFoodList + .length, shrinkWrap: true, padding: EdgeInsets.zero, - itemBuilder: (context, index) { - ProductModel productModel = controller.favouriteFoodList[index]; + itemBuilder: ( + context, + index, + ) { + ProductModel + productModel = + controller + .favouriteFoodList[index]; return FutureBuilder( - future: getPrice(productModel), - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + future: getPrice( + productModel, + ), + builder: ( + context, + snapshot, + ) { + if (snapshot + .connectionState == + ConnectionState + .waiting) { return Constant.loader(); } else { - if (snapshot.hasError) { - return Center(child: Text('${"error".tr()}: ${snapshot.error}')); - } else if (snapshot.data == null) { + if (snapshot + .hasError) { + return Center( + child: Text( + '${"error".tr()}: ${snapshot.error}', + ), + ); + } else if (snapshot + .data == + null) { return const SizedBox(); } else { - Map map = snapshot.data!; - String price = map['price']; - String disPrice = map['disPrice']; + Map< + String, + dynamic + > + map = + snapshot + .data!; + String price = + map['price']; + String disPrice = + map['disPrice']; return InkWell( onTap: () async { - await FireStoreUtils.getVendorById(productModel.vendorID.toString()).then((value) { - if (value != null) { + await FireStoreUtils.getVendorById( + productModel + .vendorID + .toString(), + ).then(( + value, + ) { + if (value != + null) { ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": value}); + Get.to( + const RestaurantDetailsScreen(), + arguments: { + "vendorModel": + value, + }, + ); // Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": value}); } }); }, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 5), + padding: + const EdgeInsets.symmetric( + vertical: + 5, + ), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 16, + ), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: + 14, + vertical: + 14, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ - productModel.nonveg == true - ? SvgPicture.asset("assets/icons/ic_nonveg.svg") - : SvgPicture.asset("assets/icons/ic_veg.svg"), - const SizedBox(width: 5), + productModel.nonveg == + true + ? SvgPicture.asset( + "assets/icons/ic_nonveg.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_veg.svg", + ), + const SizedBox( + width: + 5, + ), Text( - productModel.nonveg == true ? "Non Veg.".tr() : "Pure veg.".tr(), + productModel.nonveg == + true + ? "Non Veg.".tr() + : "Pure veg.".tr(), style: TextStyle( - color: productModel.nonveg == true ? AppThemeData.danger300 : AppThemeData.success400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + productModel.nonveg == + true + ? AppThemeData.danger300 + : AppThemeData.success400, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], ), - const SizedBox(height: 5), + const SizedBox( + height: + 5, + ), Text( productModel.name.toString(), style: TextStyle( - fontSize: 18, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontSize: + 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), - double.parse(disPrice) <= 0 + double.parse( + disPrice, + ) <= + 0 ? Text( - Constant.amountShow(amount: price), + Constant.amountShow( + amount: + price, + ), style: TextStyle( - fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontSize: + 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ) : Row( children: [ Text( - Constant.amountShow(amount: disPrice), + Constant.amountShow( + amount: + disPrice, + ), style: TextStyle( - fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontSize: + 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), - const SizedBox(width: 5), + const SizedBox( + width: + 5, + ), Text( - Constant.amountShow(amount: price), + Constant.amountShow( + amount: + price, + ), style: TextStyle( - fontSize: 14, - decoration: TextDecoration.lineThrough, - decorationColor: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - color: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontSize: + 14, + decoration: + TextDecoration.lineThrough, + decorationColor: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -486,83 +944,177 @@ class FavouriteScreen extends StatelessWidget { children: [ SvgPicture.asset( "assets/icons/ic_star.svg", - colorFilter: const ColorFilter.mode(AppThemeData.warning300, BlendMode.srcIn), + colorFilter: const ColorFilter.mode( + AppThemeData.warning300, + BlendMode.srcIn, + ), + ), + const SizedBox( + width: + 5, ), - const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: productModel.reviewsCount!.toStringAsFixed(0), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsCount!.toStringAsFixed(0)})", style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.regular, + fontWeight: + FontWeight.w500, ), ), ], ), Text( "${productModel.description}", - maxLines: 2, + maxLines: + 2, style: TextStyle( - overflow: TextOverflow.ellipsis, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w400, + overflow: + TextOverflow.ellipsis, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.regular, + fontWeight: + FontWeight.w400, ), ), ], ), ), - const SizedBox(width: 6), + const SizedBox( + width: + 6, + ), ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(16)), + borderRadius: const BorderRadius.all( + Radius.circular( + 16, + ), + ), child: Stack( children: [ NetworkImageWidget( - imageUrl: productModel.photo.toString(), - fit: BoxFit.cover, - height: Responsive.height(16, context), - width: Responsive.width(34, context), + imageUrl: + productModel.photo.toString(), + fit: + BoxFit.cover, + height: Responsive.height( + 16, + context, + ), + width: Responsive.width( + 34, + context, + ), ), Container( - height: Responsive.height(16, context), - width: Responsive.width(34, context), + height: Responsive.height( + 16, + context, + ), + width: Responsive.width( + 34, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), - end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + begin: const Alignment( + -0.00, + -1.00, + ), + end: const Alignment( + 0, + 1, + ), + colors: [ + Colors.black.withOpacity( + 0, + ), + const Color( + 0xFF111827, + ), + ], ), ), ), Positioned( - right: 10, - top: 10, + right: + 10, + top: + 10, child: InkWell( onTap: () async { - if (controller.favouriteItemList.where((p0) => p0.productId == productModel.id).isNotEmpty) { + if (controller.favouriteItemList + .where( + ( + p0, + ) => + p0.productId == + productModel.id, + ) + .isNotEmpty) { FavouriteItemModel favouriteModel = FavouriteItemModel( - productId: productModel.id, - storeId: productModel.vendorID, - userId: FireStoreUtils.getCurrentUid(), + productId: + productModel.id, + storeId: + productModel.vendorID, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList.removeWhere( + ( + item, + ) => + item.productId == + productModel.id, + ); + controller.favouriteFoodList.removeAt( + index, + ); + await FireStoreUtils.removeFavouriteItem( + favouriteModel, ); - controller.favouriteItemList.removeWhere((item) => item.productId == productModel.id); - controller.favouriteFoodList.removeAt(index); - await FireStoreUtils.removeFavouriteItem(favouriteModel); } else { FavouriteItemModel favouriteModel = FavouriteItemModel( - productId: productModel.id, - storeId: productModel.vendorID, - userId: FireStoreUtils.getCurrentUid(), + productId: + productModel.id, + storeId: + productModel.vendorID, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList.add( + favouriteModel, + ); + await FireStoreUtils.setFavouriteItem( + favouriteModel, ); - controller.favouriteItemList.add(favouriteModel); - await FireStoreUtils.setFavouriteItem(favouriteModel); } }, child: Obx( () => - controller.favouriteItemList.where((p0) => p0.productId == productModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteItemList + .where( + ( + p0, + ) => + p0.productId == + productModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -605,24 +1157,56 @@ class FavouriteScreen extends StatelessWidget { print(productModel.price); print(productModel.disPrice); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel.vendorID.toString()); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + productModel.vendorID.toString(), + ); if (productModel.itemAttribute != null) { if (productModel.itemAttribute!.attributes!.isNotEmpty) { for (var element in productModel.itemAttribute!.attributes!) { if (element.attributeOptions!.isNotEmpty) { - selectedVariants.add(productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString()); - selectedIndexVariants.add('${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}'); - selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + selectedVariants.add( + productModel + .itemAttribute! + .attributes![productModel.itemAttribute!.attributes!.indexOf( + element, + )] + .attributeOptions![0] + .toString(), + ); + selectedIndexVariants.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', + ); + selectedIndexArray.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { - price = Constant.productCommissionPrice(vendorModel!, productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0'); + if (productModel.itemAttribute!.variants! + .where((element) => element.variantSku == selectedVariants.join('-')) + .isNotEmpty) { + price = Constant.productCommissionPrice( + vendorModel!, + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == selectedVariants.join('-'), + ) + .first + .variantPrice ?? + '0', + ); disPrice = Constant.productCommissionPrice(vendorModel, '0'); } } else { - price = Constant.productCommissionPrice(vendorModel!, productModel.price.toString()); - disPrice = Constant.productCommissionPrice(vendorModel, productModel.disPrice.toString()); + price = Constant.productCommissionPrice( + vendorModel!, + productModel.price.toString(), + ); + disPrice = Constant.productCommissionPrice( + vendorModel, + productModel.disPrice.toString(), + ); } return {'price': price, 'disPrice': disPrice}; diff --git a/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart b/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart index e70da70..cc6bef3 100644 --- a/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart +++ b/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart @@ -5,8 +5,7 @@ import 'package:customer/themes/text_field_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -21,14 +20,31 @@ class ForgotPasswordScreen extends StatelessWidget { init: ForgotPasswordController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Forgot Password".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 22, fontFamily: AppThemeData.semiBold)), - Text("No worries!! We’ll send you reset instructions".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.regular)), + Text( + "Forgot Password".tr(), + style: TextStyle( + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), + Text( + "No worries!! We’ll send you reset instructions".tr(), + style: TextStyle( + color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.regular, + ), + ), const SizedBox(height: 32), TextFieldWidget( title: 'Email Address'.tr(), @@ -36,7 +52,13 @@ class ForgotPasswordScreen extends StatelessWidget { hintText: 'Enter email address'.tr(), prefix: Padding( padding: const EdgeInsets.all(12), - child: SvgPicture.asset("assets/icons/ic_mail.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey300 : AppThemeData.grey600, BlendMode.srcIn)), + child: SvgPicture.asset( + "assets/icons/ic_mail.svg", + colorFilter: ColorFilter.mode( + isDark ? AppThemeData.grey300 : AppThemeData.grey600, + BlendMode.srcIn, + ), + ), ), ), const SizedBox(height: 32), @@ -45,8 +67,12 @@ class ForgotPasswordScreen extends StatelessWidget { color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { - if (controller.emailEditingController.value.text.trim().isEmpty) { - ShowToastDialog.showToast("Please enter valid email".tr()); + if (controller.emailEditingController.value.text + .trim() + .isEmpty) { + ShowToastDialog.showToast( + "Please enter valid email".tr(), + ); } else { controller.forgotPassword(); } diff --git a/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart index d4f2197..921276d 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart @@ -12,7 +12,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; import 'history_gift_card.dart'; @@ -29,13 +29,18 @@ class GiftCardScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( "Customize Gift Card".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), actions: [ InkWell( @@ -69,26 +74,54 @@ class GiftCardScreen extends StatelessWidget { itemCount: controller.giftCardList.length, onPageChanged: (value) { controller.selectedPageIndex.value = value; - controller.selectedGiftCard.value = controller.giftCardList[controller.selectedPageIndex.value]; + controller.selectedGiftCard.value = + controller.giftCardList[controller + .selectedPageIndex + .value]; - controller.messageController.value.text = controller.giftCardList[controller.selectedPageIndex.value].message.toString(); + controller.messageController.value.text = + controller + .giftCardList[controller + .selectedPageIndex + .value] + .message + .toString(); }, scrollDirection: Axis.horizontal, controller: controller.pageController, itemBuilder: (context, index) { - GiftCardsModel giftCardModel = controller.giftCardList[index]; + GiftCardsModel giftCardModel = + controller.giftCardList[index]; return InkWell( onTap: () { - controller.selectedGiftCard.value = giftCardModel; - controller.messageController.value.text = controller.selectedGiftCard.value.message.toString(); + controller.selectedGiftCard.value = + giftCardModel; + controller.messageController.value.text = + controller + .selectedGiftCard + .value + .message + .toString(); }, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), border: Border.all(color: AppThemeData.primary300)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border.all( + color: AppThemeData.primary300, + ), + ), child: ClipRRect( borderRadius: BorderRadius.circular(10), - child: NetworkImageWidget(imageUrl: giftCardModel.image.toString(), width: Responsive.width(80, context), fit: BoxFit.cover), + child: NetworkImageWidget( + imageUrl: + giftCardModel.image.toString(), + width: Responsive.width(80, context), + fit: BoxFit.cover, + ), ), ), ), @@ -101,14 +134,32 @@ class GiftCardScreen extends StatelessWidget { title: 'Choose an amount'.tr(), controller: controller.amountController.value, hintText: 'Enter gift card amount'.tr(), - textInputType: const TextInputType.numberWithOptions(signed: true, decimal: true), + textInputType: + const TextInputType.numberWithOptions( + signed: true, + decimal: true, + ), textInputAction: TextInputAction.done, - inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]'))], + inputFormatters: [ + FilteringTextInputFormatter.allow( + RegExp('[0-9]'), + ), + ], prefix: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 14, + ), child: Text( Constant.currencyModel!.symbol.tr(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontSize: 18), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontSize: 18, + ), ), ), onchange: (value) { @@ -126,17 +177,25 @@ class GiftCardScreen extends StatelessWidget { return Obx( () => InkWell( onTap: () { - controller.selectedAmount.value = controller.amountList[index]; - controller.amountController.value.text = controller.amountList[index]; + controller.selectedAmount.value = + controller.amountList[index]; + controller.amountController.value.text = + controller.amountList[index]; }, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 5), + padding: const EdgeInsets.symmetric( + horizontal: 5, + ), child: Container( decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(40)), + borderRadius: const BorderRadius.all( + Radius.circular(40), + ), border: Border.all( color: - controller.selectedAmount == controller.amountList[index] + controller.selectedAmount == + controller + .amountList[index] ? AppThemeData.primary300 : isDark ? AppThemeData.grey400 @@ -144,11 +203,24 @@ class GiftCardScreen extends StatelessWidget { ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Center( child: Text( - Constant.amountShow(amount: controller.amountList[index]), - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + Constant.amountShow( + amount: + controller + .amountList[index], + ), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ), ), @@ -160,7 +232,12 @@ class GiftCardScreen extends StatelessWidget { ), ), const SizedBox(height: 40), - TextFieldWidget(title: 'Add Message (Optional)'.tr(), controller: controller.messageController.value, hintText: 'Add message here....'.tr(), maxLine: 6), + TextFieldWidget( + title: 'Add Message (Optional)'.tr(), + controller: controller.messageController.value, + hintText: 'Add message here....'.tr(), + maxLine: 6, + ), ], ), ), @@ -179,7 +256,10 @@ class GiftCardScreen extends StatelessWidget { onPress: () async { if (controller.amountController.value.text.isNotEmpty) { if (Constant.userModel == null) { - ShowToastDialog.showToast("Please log in to the application. You are not logged in.".tr()); + ShowToastDialog.showToast( + "Please log in to the application. You are not logged in." + .tr(), + ); } else { giftCardBottomSheet(context, controller); } @@ -195,12 +275,17 @@ class GiftCardScreen extends StatelessWidget { ); } - Future giftCardBottomSheet(BuildContext context, GiftCardController controller) { + Future giftCardBottomSheet( + BuildContext context, + GiftCardController controller, + ) { return showModalBottomSheet( context: context, isScrollControlled: true, isDismissible: true, - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(30))), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(30)), + ), clipBehavior: Clip.antiAliasWithSaveLayer, builder: (context) => FractionallySizedBox( @@ -213,7 +298,10 @@ class GiftCardScreen extends StatelessWidget { () => Scaffold( body: SingleChildScrollView( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, @@ -221,17 +309,34 @@ class GiftCardScreen extends StatelessWidget { const SizedBox(height: 20), ClipRRect( borderRadius: BorderRadius.circular(10), - child: NetworkImageWidget(imageUrl: controller.selectedGiftCard.value.image.toString(), height: Responsive.height(20, context), width: Responsive.width(100, context)), + child: NetworkImageWidget( + imageUrl: + controller.selectedGiftCard.value.image + .toString(), + height: Responsive.height(20, context), + width: Responsive.width(100, context), + ), ), const SizedBox(height: 10), Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Container( padding: const EdgeInsets.all(8), - decoration: ShapeDecoration(color: AppThemeData.ecommerce50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), + decoration: ShapeDecoration( + color: AppThemeData.ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), child: Text( - 'Complete payment and share this e-gift card with loved ones using any app'.tr(), - style: TextStyle(color: AppThemeData.ecommerce300, fontSize: 14, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + 'Complete payment and share this e-gift card with loved ones using any app' + .tr(), + style: TextStyle( + color: AppThemeData.ecommerce300, + fontSize: 14, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ), ), @@ -241,48 +346,114 @@ class GiftCardScreen extends StatelessWidget { Text( "Bill Details".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Column( children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Sub Total".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( - Constant.amountShow(amount: controller.amountController.value.text), + Constant.amountShow( + amount: + controller + .amountController + .value + .text, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Grand Total".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( - Constant.amountShow(amount: controller.amountController.value.text), + Constant.amountShow( + amount: + controller + .amountController + .value + .text, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -295,9 +466,17 @@ class GiftCardScreen extends StatelessWidget { const SizedBox(height: 20), Center( child: Text( - "${'Gift Card expire'.tr()} ${controller.selectedGiftCard.value.expiryDay} ${'days after purchase'.tr()}".tr(), + "${'Gift Card expire'.tr()} ${controller.selectedGiftCard.value.expiryDay} ${'days after purchase'.tr()}" + .tr(), textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey500 : AppThemeData.grey400), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + ), ), ), ], @@ -305,12 +484,17 @@ class GiftCardScreen extends StatelessWidget { ), ), bottomNavigationBar: Container( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "${'Pay'.tr()} ${Constant.amountShow(amount: controller.amountController.value.text)}", + title: + "${'Pay'.tr()} ${Constant.amountShow(amount: controller.amountController.value.text)}", height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, diff --git a/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart b/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart index 1322201..6d92fb3 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart @@ -4,7 +4,7 @@ import 'package:customer/models/gift_cards_order_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../widget/my_separator.dart'; @@ -19,7 +19,12 @@ class HistoryGiftCard extends StatelessWidget { init: HistoryGiftCardController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + ), body: controller.isLoading.value ? Constant.loader() @@ -27,61 +32,114 @@ class HistoryGiftCard extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 16), child: controller.giftCardsOrderList.isEmpty - ? Constant.showEmptyView(message: "Purchased Gift card not found".tr()) + ? Constant.showEmptyView( + message: "Purchased Gift card not found".tr(), + ) : ListView.builder( itemCount: controller.giftCardsOrderList.length, shrinkWrap: true, itemBuilder: (context, index) { - GiftCardsOrderModel giftCardOrderModel = controller.giftCardsOrderList[index]; + GiftCardsOrderModel giftCardOrderModel = + controller.giftCardsOrderList[index]; return Container( - margin: const EdgeInsets.symmetric(vertical: 4), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + margin: const EdgeInsets.symmetric( + vertical: 4, + ), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(10), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Text( - giftCardOrderModel.giftTitle.toString(), + giftCardOrderModel.giftTitle + .toString(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w500, ), ), ), Text( - Constant.amountShow(amount: giftCardOrderModel.price.toString()), + Constant.amountShow( + amount: + giftCardOrderModel.price + .toString(), + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w500, ), ), ], ), const SizedBox(height: 10), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 10), Row( children: [ Expanded( child: Text( "Gift Code".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData + .grey600, + fontFamily: + AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), ), Text( - giftCardOrderModel.giftCode.toString().replaceAllMapped(RegExp(r".{4}"), (match) => "${match.group(0)} "), + giftCardOrderModel.giftCode + .toString() + .replaceAllMapped( + RegExp(r".{4}"), + (match) => + "${match.group(0)} ", + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w500, ), ), @@ -93,16 +151,33 @@ class HistoryGiftCard extends StatelessWidget { Expanded( child: Text( "Gift Pin".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData + .grey600, + fontFamily: + AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), ), - giftCardOrderModel.isPasswordShow == true + giftCardOrderModel.isPasswordShow == + true ? Text( - giftCardOrderModel.giftPin.toString(), + giftCardOrderModel.giftPin + .toString(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w500, ), ) @@ -110,60 +185,107 @@ class HistoryGiftCard extends StatelessWidget { "****", style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w500, ), ), const SizedBox(width: 10), - giftCardOrderModel.isPasswordShow == true + giftCardOrderModel.isPasswordShow == + true ? InkWell( onTap: () { - controller.updateList(index); + controller.updateList( + index, + ); controller.update(); }, - child: const Icon(Icons.visibility_off), + child: const Icon( + Icons.visibility_off, + ), ) : InkWell( onTap: () { - controller.updateList(index); + controller.updateList( + index, + ); controller.update(); }, - child: const Icon(Icons.remove_red_eye), + child: const Icon( + Icons.remove_red_eye, + ), ), ], ), const SizedBox(height: 10), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 10), Row( children: [ InkWell( onTap: () { controller.share( - giftCardOrderModel.giftCode.toString(), - giftCardOrderModel.giftPin.toString(), - giftCardOrderModel.message.toString(), - giftCardOrderModel.price.toString(), - giftCardOrderModel.expireDate!, + giftCardOrderModel.giftCode + .toString(), + giftCardOrderModel.giftPin + .toString(), + giftCardOrderModel.message + .toString(), + giftCardOrderModel.price + .toString(), + giftCardOrderModel + .expireDate!, ); }, child: Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 6, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + color: + isDark + ? AppThemeData.grey700 + : AppThemeData + .grey200, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), ), child: Row( - mainAxisSize: MainAxisSize.min, + mainAxisSize: + MainAxisSize.min, children: [ Text( 'Share'.tr(), style: TextStyle( - color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, fontSize: 14, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, height: 0.11, ), ), @@ -175,11 +297,20 @@ class HistoryGiftCard extends StatelessWidget { ), const Expanded(child: SizedBox()), Text( - giftCardOrderModel.redeem == true ? "Redeemed".tr() : "Not Redeem".tr(), + giftCardOrderModel.redeem == true + ? "Redeemed".tr() + : "Not Redeem".tr(), style: TextStyle( fontSize: 16, - color: giftCardOrderModel.redeem == true ? AppThemeData.success400 : AppThemeData.danger300, - fontFamily: AppThemeData.semiBold, + color: + giftCardOrderModel.redeem == + true + ? AppThemeData + .success400 + : AppThemeData + .danger300, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w500, ), ), diff --git a/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart index 0096cda..04bb55f 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart @@ -11,8 +11,7 @@ import 'package:easy_localization/easy_localization.dart'; import '../../../controllers/theme_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; import '../dash_board_screens/dash_board_screen.dart'; @@ -28,7 +27,12 @@ class RedeemGiftCardScreen extends StatelessWidget { init: RedeemGiftCardController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + ), body: InkWell( onTap: () { FocusScope.of(context).unfocus(); @@ -40,11 +44,24 @@ class RedeemGiftCardScreen extends StatelessWidget { children: [ Text( "Redeem Gift Card".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), Text( - "Enter your gift card code to enjoy discounts and special offers on your orders.".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + "Enter your gift card code to enjoy discounts and special offers on your orders." + .tr(), + style: TextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 20), TextFieldWidget( @@ -52,14 +69,20 @@ class RedeemGiftCardScreen extends StatelessWidget { controller: controller.giftCodeController.value, hintText: 'Enter gift code'.tr(), textInputType: TextInputType.number, - prefix: Padding(padding: const EdgeInsets.all(10), child: SvgPicture.asset("assets/icons/ic_gift_code.svg")), + prefix: Padding( + padding: const EdgeInsets.all(10), + child: SvgPicture.asset("assets/icons/ic_gift_code.svg"), + ), ), TextFieldWidget( title: 'Gift Pin'.tr(), controller: controller.giftPinController.value, hintText: 'Enter gift pin'.tr(), textInputType: TextInputType.number, - prefix: Padding(padding: const EdgeInsets.all(10), child: SvgPicture.asset("assets/icons/ic_gift_pin.svg")), + prefix: Padding( + padding: const EdgeInsets.all(10), + child: SvgPicture.asset("assets/icons/ic_gift_pin.svg"), + ), ), ], ), @@ -83,45 +106,73 @@ class RedeemGiftCardScreen extends StatelessWidget { ShowToastDialog.showToast("Please Enter Gift Pin".tr()); } else { ShowToastDialog.showLoader("Please wait...".tr()); - await FireStoreUtils.checkRedeemCode(controller.giftCodeController.value.text.replaceAll(" ", "")).then((value) async { + await FireStoreUtils.checkRedeemCode( + controller.giftCodeController.value.text.replaceAll( + " ", + "", + ), + ).then((value) async { if (value != null) { GiftCardsOrderModel giftCodeModel = value; if (giftCodeModel.redeem == true) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Gift voucher already redeemed".tr()); - } else if (giftCodeModel.giftPin != controller.giftPinController.value.text) { + ShowToastDialog.showToast( + "Gift voucher already redeemed".tr(), + ); + } else if (giftCodeModel.giftPin != + controller.giftPinController.value.text) { ShowToastDialog.closeLoader(); ShowToastDialog.showToast("Gift Pin Invalid".tr()); - } else if (giftCodeModel.expireDate!.toDate().isBefore(DateTime.now())) { + } else if (giftCodeModel.expireDate!.toDate().isBefore( + DateTime.now(), + )) { ShowToastDialog.closeLoader(); ShowToastDialog.showToast("Gift Voucher expire".tr()); } else { giftCodeModel.redeem = true; - WalletTransactionModel transactionModel = WalletTransactionModel( - id: Constant.getUuid(), - amount: double.parse(giftCodeModel.price.toString()), - date: Timestamp.now(), - paymentMethod: "Wallet", - transactionUser: "user", - userId: FireStoreUtils.getCurrentUid(), - isTopup: true, - note: "Gift Voucher", - paymentStatus: "success", - ); + WalletTransactionModel transactionModel = + WalletTransactionModel( + id: Constant.getUuid(), + amount: double.parse( + giftCodeModel.price.toString(), + ), + date: Timestamp.now(), + paymentMethod: "Wallet", + transactionUser: "user", + userId: FireStoreUtils.getCurrentUid(), + isTopup: true, + note: "Gift Voucher", + paymentStatus: "success", + ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction( + transactionModel, + ).then((value) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: giftCodeModel.price.toString(), userId: FireStoreUtils.getCurrentUid()).then((value) async { - await FireStoreUtils.sendTopUpMail(paymentMethod: "Gift Voucher", amount: giftCodeModel.price.toString(), tractionId: transactionModel.id.toString()); - await FireStoreUtils.placeGiftCardOrder(giftCodeModel).then((value) { + await FireStoreUtils.updateUserWallet( + amount: giftCodeModel.price.toString(), + userId: FireStoreUtils.getCurrentUid(), + ).then((value) async { + await FireStoreUtils.sendTopUpMail( + paymentMethod: "Gift Voucher", + amount: giftCodeModel.price.toString(), + tractionId: transactionModel.id.toString(), + ); + await FireStoreUtils.placeGiftCardOrder( + giftCodeModel, + ).then((value) { ShowToastDialog.closeLoader(); if (Constant.walletSetting == true) { Get.offAll(const DashBoardScreen()); - DashBoardController controller = Get.put(DashBoardController()); + DashBoardController controller = Get.put( + DashBoardController(), + ); controller.selectedIndex.value = 2; } - ShowToastDialog.showToast("Voucher redeem successfully".tr()); + ShowToastDialog.showToast( + "Voucher redeem successfully".tr(), + ); }); }); } diff --git a/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart index 9297be8..7309bca 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart @@ -6,7 +6,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; import '../wallet_screen/wallet_screen.dart'; @@ -22,12 +22,22 @@ class SelectGiftPaymentScreen extends StatelessWidget { init: GiftCardController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Payment Option".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Payment Option".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -38,7 +48,12 @@ class SelectGiftPaymentScreen extends StatelessWidget { Text( "Preferred Payment".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), const SizedBox(height: 10), if (controller.walletSettingModel.value.isEnabled == true) @@ -47,17 +62,39 @@ class SelectGiftPaymentScreen extends StatelessWidget { children: [ Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), - shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 20, offset: Offset(0, 0), spreadRadius: 0)], + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + shadows: const [ + BoxShadow( + color: Color(0x07000000), + blurRadius: 20, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), ], ), @@ -67,40 +104,143 @@ class SelectGiftPaymentScreen extends StatelessWidget { Text( "Other Payment Options".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), const SizedBox(height: 10), ], ), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), - shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 20, offset: Offset(0, 0), spreadRadius: 0)], + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + shadows: const [ + BoxShadow( + color: Color(0x07000000), + blurRadius: 20, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.flutterWaveModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.paytmModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.paytmModel.value.isEnabled == true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -110,7 +250,13 @@ class SelectGiftPaymentScreen extends StatelessWidget { ), ), bottomNavigationBar: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, borderRadius: const BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ), + ), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), child: Padding( padding: const EdgeInsets.only(bottom: 20), @@ -121,38 +267,89 @@ class SelectGiftPaymentScreen extends StatelessWidget { textColor: AppThemeData.grey50, fontSizes: 16, onPress: () async { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.amountController.value.text, context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.amountController.value.text, + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name) { controller.placeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.amountController.value.text), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.amountController.value.text, orderId: result.id); - } - }); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.amountController.value.text, + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr(), + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: controller.amountController.value.text, + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast("Please select payment method".tr()); + ShowToastDialog.showToast( + "Please select payment method".tr(), + ); } }, ), @@ -163,7 +360,12 @@ class SelectGiftPaymentScreen extends StatelessWidget { ); } - Obx cardDecoration(GiftCardController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + GiftCardController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -176,8 +378,16 @@ class SelectGiftPaymentScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -188,12 +398,32 @@ class SelectGiftPaymentScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: controller.userModel.value.walletAmount == null ? '0.0' : controller.userModel.value.walletAmount.toString()), + Constant.amountShow( + amount: + controller.userModel.value.walletAmount == null + ? '0.0' + : controller.userModel.value.walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -202,14 +432,20 @@ class SelectGiftPaymentScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart index 80ffc28..56c5e78 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart @@ -6,7 +6,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../widget/restaurant_image_view.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -22,7 +22,12 @@ class CategoryRestaurantScreen extends StatelessWidget { init: CategoryRestaurantController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + ), body: controller.isLoading.value ? Constant.loader() @@ -34,33 +39,62 @@ class CategoryRestaurantScreen extends StatelessWidget { shrinkWrap: true, itemCount: controller.allNearestRestaurant.length, itemBuilder: (context, index) { - VendorModel vendorModel = controller.allNearestRestaurant[index]; + VendorModel vendorModel = + controller.allNearestRestaurant[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + ), child: Stack( children: [ - RestaurantImageView(vendorModel: vendorModel), + RestaurantImageView( + vendorModel: vendorModel, + ), Container( - height: Responsive.height(20, context), - width: Responsive.width(100, context), + height: Responsive.height( + 20, + context, + ), + width: Responsive.width( + 100, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), + begin: const Alignment( + -0.00, + -1.00, + ), end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], ), ), ), @@ -68,28 +102,60 @@ class CategoryRestaurantScreen extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(17.5, context)), + offset: Offset( + Responsive.width(-3, context), + Responsive.height(17.5, context), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: BoxDecoration( - color: AppThemeData.success300, - borderRadius: BorderRadius.circular(120), // Optional + color: + AppThemeData + .success300, + borderRadius: + BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), + const SizedBox( + width: 5, + ), Text( "Free Delivery".tr(), - style: TextStyle(fontSize: 14, color: AppThemeData.success600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 14, + color: + AppThemeData + .success600, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, + ), ), ], ), @@ -100,22 +166,52 @@ class CategoryRestaurantScreen extends StatelessWidget { ), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .primary600 + : AppThemeData + .primary50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -125,22 +221,52 @@ class CategoryRestaurantScreen extends StatelessWidget { const SizedBox(width: 6), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .ecommerce600 + : AppThemeData + .ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg", colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .ecommerce300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -154,9 +280,12 @@ class CategoryRestaurantScreen extends StatelessWidget { ), const SizedBox(height: 15), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( vendorModel.title.toString(), @@ -166,7 +295,10 @@ class CategoryRestaurantScreen extends StatelessWidget { fontSize: 18, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), Text( @@ -177,7 +309,10 @@ class CategoryRestaurantScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart index 05059fb..22ef568 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart @@ -9,7 +9,7 @@ import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -25,13 +25,18 @@ class DiscountRestaurantListScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( controller.title.value, textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), body: @@ -47,24 +52,60 @@ class DiscountRestaurantListScreen extends StatelessWidget { CouponModel offerModel = controller.couponList[index]; return InkWell( onTap: () { - Get.to(RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), bottomLeft: Radius.circular(16)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + bottomLeft: Radius.circular(16), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: vendorModel.photo.toString(), fit: BoxFit.cover, height: Responsive.height(16, context), width: Responsive.width(28, context)), + NetworkImageWidget( + imageUrl: + vendorModel.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height( + 16, + context, + ), + width: Responsive.width(28, context), + ), Container( - height: Responsive.height(16, context), + height: Responsive.height( + 16, + context, + ), width: Responsive.width(28, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), const Color(0xFF111827)]), + gradient: LinearGradient( + begin: const Alignment( + -0.00, + -1.00, + ), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), Positioned( @@ -72,16 +113,37 @@ class DiscountRestaurantListScreen extends StatelessWidget { left: 10, child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(120), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 4, + ), child: Text( "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".toUpperCase().tr() : " off".toUpperCase().tr()}", textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ), ), @@ -91,9 +153,12 @@ class DiscountRestaurantListScreen extends StatelessWidget { ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ @@ -104,19 +169,45 @@ class DiscountRestaurantListScreen extends StatelessWidget { maxLines: 1, style: TextStyle( fontSize: 18, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, ), ), ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, + ), ), ], ), @@ -124,18 +215,33 @@ class DiscountRestaurantListScreen extends StatelessWidget { ), const SizedBox(height: 5), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Icon(Icons.location_on, size: 18, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600), + Icon( + Icons.location_on, + size: 18, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + ), const SizedBox(width: 5), Expanded( child: Text( - vendorModel.location.toString(), + vendorModel.location + .toString(), style: TextStyle( - fontFamily: AppThemeData.medium, + fontFamily: + AppThemeData.medium, fontWeight: FontWeight.w500, fontSize: 12, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey400, ), ), ), @@ -143,19 +249,45 @@ class DiscountRestaurantListScreen extends StatelessWidget { ), const SizedBox(height: 5), Container( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, child: DottedBorder( - options: RoundedRectDottedBorderOptions( - radius: const Radius.circular(6), - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - strokeWidth: 1, - ), + options: + RoundedRectDottedBorderOptions( + radius: + const Radius.circular( + 6, + ), + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + strokeWidth: 1, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 2), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 2, + ), child: Text( "${offerModel.code}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ), diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart index f8c9af2..03adfec 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart @@ -29,7 +29,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:latlong2/latlong.dart' as location; import 'package:url_launcher/url_launcher.dart'; @@ -705,7 +705,8 @@ class HomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - "New Arrivals".tr(), + "New Arrivals" + .tr(), textAlign: TextAlign .start, diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart index 27ccd52..7641c69 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart @@ -28,7 +28,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:url_launcher/url_launcher.dart'; import '../../../controllers/theme_controller.dart'; import '../../../models/banner_model.dart'; @@ -57,11 +57,13 @@ class HomeScreenTwo extends StatelessWidget { init: FoodHomeController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, body: controller.isLoading.value ? Constant.loader() - : Constant.isZoneAvailable == false || controller.allNearestRestaurant.isEmpty + : Constant.isZoneAvailable == false || + controller.allNearestRestaurant.isEmpty ? Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( @@ -70,12 +72,30 @@ class HomeScreenTwo extends StatelessWidget { children: [ Image.asset("assets/images/location.gif", height: 120), const SizedBox(height: 12), - Text("No Store Found in Your Area".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "No Store Found in Your Area".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "Currently, there are no available store in your zone. Try changing your location to find nearby options.".tr(), + "Currently, there are no available store in your zone. Try changing your location to find nearby options." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -92,16 +112,21 @@ class HomeScreenTwo extends StatelessWidget { ), ) : Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: controller.isListView.value == false ? const MapView() : Column( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ @@ -109,98 +134,215 @@ class HomeScreenTwo extends StatelessWidget { onTap: () { Get.back(); }, - child: Icon(Icons.arrow_back, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, size: 20), + child: Icon( + Icons.arrow_back, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + size: 20, + ), ), const SizedBox(width: 10), Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Constant.userModel == null ? InkWell( onTap: () { - Get.offAll(const LoginScreen()); + Get.offAll( + const LoginScreen(), + ); }, child: Text( "Login".tr(), - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 12), + textAlign: + TextAlign.center, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 12, + ), ), ) : Text( - Constant.userModel!.fullName(), - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 12), + Constant.userModel! + .fullName(), + textAlign: + TextAlign.center, + style: TextStyle( + fontFamily: + AppThemeData.medium, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 12, + ), ), InkWell( onTap: () async { - if (Constant.userModel != null) { - Get.to(AddressListScreen())!.then((value) { + if (Constant.userModel != + null) { + Get.to( + AddressListScreen(), + )!.then((value) { if (value != null) { - ShippingAddress shippingAddress = value; - Constant.selectedLocation = shippingAddress; + ShippingAddress + shippingAddress = + value; + Constant.selectedLocation = + shippingAddress; controller.getData(); } }); } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait..." + .tr(), + ); // ✅ declare once for whole method - ShippingAddress shippingAddress = ShippingAddress(); + ShippingAddress + shippingAddress = + ShippingAddress(); try { await Geolocator.requestPermission(); await Geolocator.getCurrentPosition(); ShowToastDialog.closeLoader(); - if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); - if (result != null) { - final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; - final address = firstPlace.address; + if (Constant + .selectedMapType == + 'osm') { + final result = + await Get.to( + () => + MapPickerPage(), + ); + if (result != + null) { + final firstPlace = + result; + final lat = + firstPlace + .coordinates + .latitude; + final lng = + firstPlace + .coordinates + .longitude; + final address = + firstPlace + .address; - shippingAddress.addressAs = "Home"; - shippingAddress.locality = address.toString(); - shippingAddress.location = UserLocation(latitude: lat, longitude: lng); - Constant.selectedLocation = shippingAddress; - controller.getData(); + shippingAddress + .addressAs = + "Home"; + shippingAddress + .locality = + address + .toString(); + shippingAddress + .location = + UserLocation( + latitude: + lat, + longitude: + lng, + ); + Constant.selectedLocation = + shippingAddress; + controller + .getData(); Get.back(); } } else { - Get.to(LocationPickerScreen())!.then((value) async { - if (value != null) { - SelectedLocationModel selectedLocationModel = value; + Get.to( + LocationPickerScreen(), + )!.then(( + value, + ) async { + if (value != + null) { + SelectedLocationModel + selectedLocationModel = + value; - shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation( - latitude: selectedLocationModel.latLng!.latitude, - longitude: selectedLocationModel.latLng!.longitude, + shippingAddress + .addressAs = + "Home"; + shippingAddress + .location = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, ); - shippingAddress.locality = "Picked from Map"; // You can reverse-geocode + shippingAddress + .locality = + "Picked from Map"; // You can reverse-geocode - Constant.selectedLocation = shippingAddress; - controller.getData(); + Constant.selectedLocation = + shippingAddress; + controller + .getData(); } }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { - Placemark placeMark = valuePlaceMaker[0]; - shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation(latitude: 19.228825, longitude: 72.854118); - String currentLocation = + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then(( + valuePlaceMaker, + ) { + Placemark + placeMark = + valuePlaceMaker[0]; + shippingAddress + .addressAs = + "Home"; + shippingAddress + .location = + UserLocation( + latitude: + 19.228825, + longitude: + 72.854118, + ); + String + currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; - shippingAddress.locality = currentLocation; + shippingAddress + .locality = + currentLocation; }); - Constant.selectedLocation = shippingAddress; + Constant.selectedLocation = + shippingAddress; ShowToastDialog.closeLoader(); - controller.getData(); + controller + .getData(); } }, context: context, @@ -209,19 +351,36 @@ class HomeScreenTwo extends StatelessWidget { }, child: Text.rich( maxLines: 1, - overflow: TextOverflow.ellipsis, + overflow: + TextOverflow.ellipsis, TextSpan( children: [ TextSpan( - text: Constant.selectedLocation.getFullAddress(), + text: + Constant + .selectedLocation + .getFullAddress(), style: TextStyle( - fontFamily: AppThemeData.medium, - overflow: TextOverflow.ellipsis, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: + AppThemeData + .medium, + overflow: + TextOverflow + .ellipsis, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, fontSize: 14, ), ), - WidgetSpan(child: SvgPicture.asset("assets/icons/ic_down.svg")), + WidgetSpan( + child: SvgPicture.asset( + "assets/icons/ic_down.svg", + ), + ), ], ), ), @@ -232,16 +391,28 @@ class HomeScreenTwo extends StatelessWidget { const SizedBox(width: 5), InkWell( onTap: () async { - (await Get.to(const CartScreen())); + (await Get.to( + const CartScreen(), + )); controller.getCartData(); }, child: ClipOval( child: Container( - padding: const EdgeInsets.all(8.0), - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + padding: const EdgeInsets.all( + 8.0, + ), + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, child: SvgPicture.asset( "assets/icons/ic_shoping_cart.svg", - colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey50 : AppThemeData.grey900, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + BlendMode.srcIn, + ), ), ), ), @@ -251,16 +422,39 @@ class HomeScreenTwo extends StatelessWidget { const SizedBox(height: 10), InkWell( onTap: () { - Get.to(const SearchScreen(), arguments: {"vendorList": controller.allNearestRestaurant}); + Get.to( + const SearchScreen(), + arguments: { + "vendorList": + controller + .allNearestRestaurant, + }, + ); }, child: TextFieldWidget( hintText: - Constant.sectionConstantModel?.name?.toLowerCase().contains('restaurants') == true - ? 'Search the dish, foo and more...'.tr() - : 'Search the store, item and more...'.tr(), + Constant + .sectionConstantModel + ?.name + ?.toLowerCase() + .contains( + 'restaurants', + ) == + true + ? 'Search the dish, foo and more...' + .tr() + : 'Search the store, item and more...' + .tr(), controller: null, enable: false, - prefix: Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: SvgPicture.asset("assets/icons/ic_search.svg")), + prefix: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), + child: SvgPicture.asset( + "assets/icons/ic_search.svg", + ), + ), ), ), const SizedBox(height: 5), @@ -271,64 +465,185 @@ class HomeScreenTwo extends StatelessWidget { child: SingleChildScrollView( child: Column( children: [ - controller.bannerModel.isEmpty ? const SizedBox() : Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: BannerView(controller: controller)), + controller.bannerModel.isEmpty + ? const SizedBox() + : Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), + child: BannerView( + controller: controller, + ), + ), const SizedBox(height: 20), - Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: CategoryView(controller: controller)), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), + child: CategoryView( + controller: controller, + ), + ), controller.couponRestaurantList.isEmpty ? const SizedBox() - : Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: Column(children: [const SizedBox(height: 20), OfferView(controller: controller)])), - controller.storyList.isEmpty || Constant.storyEnable == false + : Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), + child: Column( + children: [ + const SizedBox(height: 20), + OfferView( + controller: controller, + ), + ], + ), + ), + controller.storyList.isEmpty || + Constant.storyEnable == false ? const SizedBox() - : Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: Column(children: [const SizedBox(height: 20), StoryView(controller: controller)])), + : Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), + child: Column( + children: [ + const SizedBox(height: 20), + StoryView( + controller: controller, + ), + ], + ), + ), Visibility( - visible: Constant.isEnableAdsFeature == true, + visible: + Constant.isEnableAdsFeature == + true, child: - controller.advertisementList.isEmpty + controller + .advertisementList + .isEmpty ? const SizedBox() : Column( children: [ - const SizedBox(height: 20), + const SizedBox( + height: 20, + ), Container( - margin: const EdgeInsets.symmetric(horizontal: 16), - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), - decoration: BoxDecoration(borderRadius: BorderRadius.circular(20), color: AppThemeData.primary300.withAlpha(40)), + margin: + const EdgeInsets.symmetric( + horizontal: 16, + ), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 16, + ), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 20, + ), + color: AppThemeData + .primary300 + .withAlpha(40), + ), child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Row( children: [ Expanded( child: Text( - "Highlights for you".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + "Highlights for you" + .tr(), + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + fontSize: + 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), InkWell( onTap: () { - Get.to(AllAdvertisementScreen())?.then((value) { - controller.getFavouriteRestaurant(); + Get.to( + AllAdvertisementScreen(), + )?.then(( + value, + ) { + controller + .getFavouriteRestaurant(); }); }, child: Text( - "See all".tr(), - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + "See all" + .tr(), + textAlign: + TextAlign + .center, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ], ), - const SizedBox(height: 16), + const SizedBox( + height: 16, + ), SizedBox( height: 220, child: ListView.builder( - physics: const BouncingScrollPhysics(), - scrollDirection: Axis.horizontal, - itemCount: controller.advertisementList.length >= 10 ? 10 : controller.advertisementList.length, - padding: EdgeInsets.all(0), - itemBuilder: (BuildContext context, int index) { - return AdvertisementHomeCard(controller: controller, model: controller.advertisementList[index]); + physics: + const BouncingScrollPhysics(), + scrollDirection: + Axis.horizontal, + itemCount: + controller.advertisementList.length >= + 10 + ? 10 + : controller + .advertisementList + .length, + padding: + EdgeInsets.all( + 0, + ), + itemBuilder: ( + BuildContext + context, + int index, + ) { + return AdvertisementHomeCard( + controller: + controller, + model: + controller + .advertisementList[index], + ); }, ), ), @@ -338,7 +653,16 @@ class HomeScreenTwo extends StatelessWidget { ], ), ), - controller.allNearestRestaurant.isEmpty ? const SizedBox() : Column(children: [const SizedBox(height: 20), RestaurantView(controller: controller)]), + controller.allNearestRestaurant.isEmpty + ? const SizedBox() + : Column( + children: [ + const SizedBox(height: 20), + RestaurantView( + controller: controller, + ), + ], + ), ], ), ), @@ -346,18 +670,29 @@ class HomeScreenTwo extends StatelessWidget { ], ), ), - floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, + floatingActionButtonLocation: + FloatingActionButtonLocation.centerFloat, floatingActionButton: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, borderRadius: const BorderRadius.all(Radius.circular(30))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + borderRadius: const BorderRadius.all(Radius.circular(30)), + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), child: Row( mainAxisSize: MainAxisSize.min, children: [ Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, borderRadius: const BorderRadius.all(Radius.circular(30))), + decoration: BoxDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + borderRadius: const BorderRadius.all(Radius.circular(30)), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( children: [ InkWell( @@ -366,12 +701,22 @@ class HomeScreenTwo extends StatelessWidget { }, child: ClipOval( child: Container( - decoration: BoxDecoration(color: controller.isListView.value ? AppThemeData.primary300 : null), + decoration: BoxDecoration( + color: + controller.isListView.value + ? AppThemeData.primary300 + : null, + ), child: Padding( padding: const EdgeInsets.all(8.0), child: SvgPicture.asset( "assets/icons/ic_view_grid_list.svg", - colorFilter: ColorFilter.mode(controller.isListView.value ? AppThemeData.grey50 : AppThemeData.grey500, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + controller.isListView.value + ? AppThemeData.grey50 + : AppThemeData.grey500, + BlendMode.srcIn, + ), ), ), ), @@ -384,12 +729,22 @@ class HomeScreenTwo extends StatelessWidget { }, child: ClipOval( child: Container( - decoration: BoxDecoration(color: controller.isListView.value == false ? AppThemeData.primary300 : null), + decoration: BoxDecoration( + color: + controller.isListView.value == false + ? AppThemeData.primary300 + : null, + ), child: Padding( padding: const EdgeInsets.all(8.0), child: SvgPicture.asset( "assets/icons/ic_map_draw.svg", - colorFilter: ColorFilter.mode(controller.isListView.value == false ? AppThemeData.grey50 : AppThemeData.grey500, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + controller.isListView.value == false + ? AppThemeData.grey50 + : AppThemeData.grey500, + BlendMode.srcIn, + ), ), ), ), @@ -406,10 +761,23 @@ class HomeScreenTwo extends StatelessWidget { }, child: ClipOval( child: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + ), child: Padding( padding: const EdgeInsets.all(10), - child: SvgPicture.asset("assets/icons/ic_scan_code.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey400 : AppThemeData.grey500, BlendMode.srcIn)), + child: SvgPicture.asset( + "assets/icons/ic_scan_code.svg", + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + BlendMode.srcIn, + ), + ), ), ), ), @@ -421,15 +789,30 @@ class HomeScreenTwo extends StatelessWidget { value: controller.selectedOrderTypeValue.value.tr(), icon: const Icon(Icons.keyboard_arrow_down), items: - ['Delivery'.tr(), 'TakeAway'.tr()].map((String value) { + ['Delivery'.tr(), 'TakeAway'.tr()].map(( + String value, + ) { return DropdownMenuItem( value: value, - child: Text(value.tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + child: Text( + value.tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), + ), ); }).toList(), onChanged: (value) async { if (cartItem.isEmpty) { - await Preferences.setString(Preferences.foodDeliveryType, value!); + await Preferences.setString( + Preferences.foodDeliveryType, + value!, + ); controller.selectedOrderTypeValue.value = value; controller.getData(); } else { @@ -438,11 +821,16 @@ class HomeScreenTwo extends StatelessWidget { builder: (BuildContext context) { return CustomDialogBox( title: "Alert".tr(), - descriptions: "Do you really want to change the delivery option? Your cart will be empty.".tr(), + descriptions: + "Do you really want to change the delivery option? Your cart will be empty." + .tr(), positiveString: "Ok".tr(), negativeString: "Cancel".tr(), positiveClick: () async { - await Preferences.setString(Preferences.foodDeliveryType, value!); + await Preferences.setString( + Preferences.foodDeliveryType, + value!, + ); controller.selectedOrderTypeValue.value = value; controller.getData(); DatabaseHelper.instance.deleteAllCartProducts(); @@ -480,7 +868,10 @@ class CategoryView extends StatelessWidget { final themeController = Get.find(); final isDark = themeController.isDark.value; return Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10), child: Column( @@ -494,7 +885,19 @@ class CategoryView extends StatelessWidget { children: [ Row( children: [ - Expanded(child: Text("Our Categories".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18))), + Expanded( + child: Text( + "Our Categories".tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 18, + ), + ), + ), InkWell( onTap: () { Get.to(const ViewAllCategoryScreen()); @@ -502,15 +905,28 @@ class CategoryView extends StatelessWidget { child: Text( "See all".tr(), textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 14), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontSize: 14, + ), ), ), ], ), GradientText( 'Best Servings Food'.tr(), - style: TextStyle(fontSize: 24, fontFamily: 'Inter Tight', fontWeight: FontWeight.w800), - gradient: LinearGradient(colors: [Color(0xFF3961F1), Color(0xFF11D0EA)]), + style: TextStyle( + fontSize: 24, + fontFamily: 'Inter Tight', + fontWeight: FontWeight.w800, + ), + gradient: LinearGradient( + colors: [Color(0xFF3961F1), Color(0xFF11D0EA)], + ), ), ], ), @@ -518,23 +934,52 @@ class CategoryView extends StatelessWidget { const SizedBox(height: 10), GridView.builder( padding: EdgeInsets.zero, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 5 / 6), - itemCount: controller.vendorCategoryModel.length >= 8 ? 8 : controller.vendorCategoryModel.length, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + childAspectRatio: 5 / 6, + ), + itemCount: + controller.vendorCategoryModel.length >= 8 + ? 8 + : controller.vendorCategoryModel.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (context, index) { - VendorCategoryModel vendorCategoryModel = controller.vendorCategoryModel[index]; + VendorCategoryModel vendorCategoryModel = + controller.vendorCategoryModel[index]; return InkWell( onTap: () { - Get.to(const CategoryRestaurantScreen(), arguments: {"vendorCategoryModel": vendorCategoryModel, "dineIn": false}); + Get.to( + const CategoryRestaurantScreen(), + arguments: { + "vendorCategoryModel": vendorCategoryModel, + "dineIn": false, + }, + ); }, child: Column( children: [ - ClipOval(child: SizedBox(width: 60, height: 60, child: NetworkImageWidget(imageUrl: vendorCategoryModel.photo.toString(), fit: BoxFit.cover))), + ClipOval( + child: SizedBox( + width: 60, + height: 60, + child: NetworkImageWidget( + imageUrl: vendorCategoryModel.photo.toString(), + fit: BoxFit.cover, + ), + ), + ), Text( "${vendorCategoryModel.title}", textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 12), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 12, + ), ), ], ), @@ -558,7 +1003,10 @@ class OfferView extends StatelessWidget { final themeController = Get.find(); final isDark = themeController.isDark.value; return Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10), child: Column( @@ -572,26 +1020,55 @@ class OfferView extends StatelessWidget { children: [ Row( children: [ - Expanded(child: Text("Large Discounts".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18))), + Expanded( + child: Text( + "Large Discounts".tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 18, + ), + ), + ), InkWell( onTap: () { Get.to( const DiscountRestaurantListScreen(), - arguments: {"vendorList": controller.couponRestaurantList, "couponList": controller.couponList, "title": "Discounts Restaurants"}, + arguments: { + "vendorList": controller.couponRestaurantList, + "couponList": controller.couponList, + "title": "Discounts Restaurants", + }, ); }, child: Text( "See all".tr(), textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 14), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontSize: 14, + ), ), ), ], ), GradientText( 'Save Upto 50% Off'.tr(), - style: TextStyle(fontSize: 24, fontFamily: 'Inter Tight', fontWeight: FontWeight.w800), - gradient: LinearGradient(colors: [Color(0xFF39F1C5), Color(0xFF97EA11)]), + style: TextStyle( + fontSize: 24, + fontFamily: 'Inter Tight', + fontWeight: FontWeight.w800, + ), + gradient: LinearGradient( + colors: [Color(0xFF39F1C5), Color(0xFF97EA11)], + ), ), ], ), @@ -604,47 +1081,82 @@ class OfferView extends StatelessWidget { shrinkWrap: true, scrollDirection: Axis.horizontal, physics: const BouncingScrollPhysics(), - itemCount: controller.couponRestaurantList.length >= 15 ? 15 : controller.couponRestaurantList.length, + itemCount: + controller.couponRestaurantList.length >= 15 + ? 15 + : controller.couponRestaurantList.length, itemBuilder: (context, index) { - VendorModel vendorModel = controller.couponRestaurantList[index]; + VendorModel vendorModel = + controller.couponRestaurantList[index]; CouponModel offerModel = controller.couponList[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(right: 10), child: SizedBox( width: Responsive.width(34, context), child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: vendorModel.photo.toString(), fit: BoxFit.cover, height: Responsive.height(100, context), width: Responsive.width(100, context)), + NetworkImageWidget( + imageUrl: vendorModel.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height(100, context), + width: Responsive.width(100, context), + ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), AppThemeData.grey900]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + AppThemeData.grey900, + ], + ), ), ), Align( alignment: Alignment.bottomCenter, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Text( vendorModel.title.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(fontSize: 18, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontSize: 18, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), const SizedBox(height: 5), RoundedButtonFill( title: "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".tr() : "off".tr()}", - color: Colors.primaries[Random().nextInt(Colors.primaries.length)], + color: + Colors.primaries[Random().nextInt( + Colors.primaries.length, + )], textColor: AppThemeData.grey50, width: 20, height: 3.5, @@ -696,17 +1208,30 @@ class BannerView extends StatelessWidget { onTap: () async { if (bannerModel.redirect_type == "store") { ShowToastDialog.showLoader("Please wait...".tr()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(bannerModel.redirect_id.toString()); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + bannerModel.redirect_id.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "product") { ShowToastDialog.showLoader("Please wait...".tr()); - ProductModel? productModel = await FireStoreUtils.getProductById(bannerModel.redirect_id.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel!.vendorID.toString()); + ProductModel? productModel = + await FireStoreUtils.getProductById( + bannerModel.redirect_id.toString(), + ); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + productModel!.vendorID.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "external_link") { final uri = Uri.parse(bannerModel.redirect_id.toString()); if (await canLaunchUrl(uri)) { @@ -718,7 +1243,13 @@ class BannerView extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.only(right: 14), - child: ClipRRect(borderRadius: const BorderRadius.all(Radius.circular(12)), child: NetworkImageWidget(imageUrl: bannerModel.photo.toString(), fit: BoxFit.cover)), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(12)), + child: NetworkImageWidget( + imageUrl: bannerModel.photo.toString(), + fit: BoxFit.cover, + ), + ), ), ); }, @@ -738,7 +1269,13 @@ class StoryView extends StatelessWidget { final isDark = themeController.isDark.value; return Container( height: Responsive.height(32, context), - decoration: const BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(20)), image: DecorationImage(image: AssetImage("assets/images/story_bg.png"), fit: BoxFit.cover)), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(20)), + image: DecorationImage( + image: AssetImage("assets/images/story_bg.png"), + fit: BoxFit.cover, + ), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -747,11 +1284,33 @@ class StoryView extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row(children: [Expanded(child: Text("Stories".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 18)))]), + Row( + children: [ + Expanded( + child: Text( + "Stories".tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontSize: 18, + ), + ), + ), + ], + ), GradientText( 'Best Food Stories Ever'.tr(), - style: TextStyle(fontSize: 24, fontFamily: 'Inter Tight', fontWeight: FontWeight.w800), - gradient: LinearGradient(colors: [Color(0xFFF1C839), Color(0xFFEA1111)]), + style: TextStyle( + fontSize: 24, + fontFamily: 'Inter Tight', + fontWeight: FontWeight.w800, + ), + gradient: LinearGradient( + colors: [Color(0xFFF1C839), Color(0xFFEA1111)], + ), ), ], ), @@ -769,56 +1328,116 @@ class StoryView extends StatelessWidget { padding: const EdgeInsets.only(right: 10), child: InkWell( onTap: () { - Navigator.of(context).push(MaterialPageRoute(builder: (context) => MoreStories(storyList: controller.storyList, index: index))); + Navigator.of(context).push( + MaterialPageRoute( + builder: + (context) => MoreStories( + storyList: controller.storyList, + index: index, + ), + ), + ); }, child: SizedBox( width: 134, child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: storyModel.videoThumbnail.toString(), fit: BoxFit.cover, height: Responsive.height(100, context), width: Responsive.width(100, context)), + NetworkImageWidget( + imageUrl: storyModel.videoThumbnail.toString(), + fit: BoxFit.cover, + height: Responsive.height(100, context), + width: Responsive.width(100, context), + ), Container(color: Colors.black.withOpacity(0.30)), Padding( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 8, + ), child: FutureBuilder( - future: FireStoreUtils.getVendorById(storyModel.vendorID.toString()), + future: FireStoreUtils.getVendorById( + storyModel.vendorID.toString(), + ), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == + ConnectionState.waiting) { return Constant.loader(); } else { if (snapshot.hasError) { - return Center(child: Text('${"Error".tr()}: ${snapshot.error}')); + return Center( + child: Text( + '${"Error".tr()}: ${snapshot.error}', + ), + ); } else if (snapshot.data == null) { return const SizedBox(); } else { - VendorModel vendorModel = snapshot.data!; + VendorModel vendorModel = + snapshot.data!; return Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - ClipOval(child: NetworkImageWidget(imageUrl: vendorModel.photo.toString(), width: 30, height: 30, fit: BoxFit.cover)), + ClipOval( + child: NetworkImageWidget( + imageUrl: + vendorModel.photo + .toString(), + width: 30, + height: 30, + fit: BoxFit.cover, + ), + ), const SizedBox(width: 4), Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - vendorModel.title.toString(), + vendorModel.title + .toString(), textAlign: TextAlign.center, maxLines: 1, - style: const TextStyle(color: Colors.white, fontSize: 12, overflow: TextOverflow.ellipsis, fontWeight: FontWeight.w700), + style: const TextStyle( + color: Colors.white, + fontSize: 12, + overflow: + TextOverflow.ellipsis, + fontWeight: + FontWeight.w700, + ), ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg"), + SvgPicture.asset( + "assets/icons/ic_star.svg", + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum!.toStringAsFixed(0))} ${'reviews'.tr()}", - textAlign: TextAlign.center, + textAlign: + TextAlign.center, maxLines: 1, - style: const TextStyle(color: AppThemeData.warning300, fontSize: 10, overflow: TextOverflow.ellipsis, fontWeight: FontWeight.w700), + style: const TextStyle( + color: + AppThemeData + .warning300, + fontSize: 10, + overflow: + TextOverflow + .ellipsis, + fontWeight: + FontWeight.w700, + ), ), ], ), @@ -870,15 +1489,38 @@ class RestaurantView extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), child: Row( children: [ - Expanded(child: Text("Best Restaurants".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18))), + Expanded( + child: Text( + "Best Restaurants".tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontSize: 18, + ), + ), + ), InkWell( onTap: () { - Get.to(const RestaurantListScreen(), arguments: {"vendorList": controller.allNearestRestaurant, "title": "Best Restaurants"}); + Get.to( + const RestaurantListScreen(), + arguments: { + "vendorList": controller.allNearestRestaurant, + "title": "Best Restaurants", + }, + ); }, child: Text( "See all".tr(), textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 14), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontSize: 14, + ), ), ), ], @@ -894,36 +1536,65 @@ class RestaurantView extends StatelessWidget { scrollDirection: Axis.vertical, itemCount: controller.allNearestRestaurant.length, itemBuilder: (BuildContext context, int index) { - VendorModel vendorModel = controller.allNearestRestaurant[index]; + VendorModel vendorModel = + controller.allNearestRestaurant[index]; List tempList = []; List discountAmountTempList = []; for (var element in controller.couponList) { - if (vendorModel.id == element.vendorID && element.expiresAt!.toDate().isAfter(DateTime.now())) { + if (vendorModel.id == element.vendorID && + element.expiresAt!.toDate().isAfter(DateTime.now())) { tempList.add(element); - discountAmountTempList.add(double.parse(element.discount.toString())); + discountAmountTempList.add( + double.parse(element.discount.toString()), + ); } } return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(16)), + borderRadius: const BorderRadius.all( + Radius.circular(16), + ), child: Stack( children: [ - NetworkImageWidget(height: Responsive.height(14, context), width: Responsive.width(30, context), imageUrl: vendorModel.photo.toString(), fit: BoxFit.cover), + NetworkImageWidget( + height: Responsive.height(14, context), + width: Responsive.width(30, context), + imageUrl: vendorModel.photo.toString(), + fit: BoxFit.cover, + ), Container( height: Responsive.height(14, context), width: Responsive.width(30, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), const Color(0xFF111827)]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), discountAmountTempList.isEmpty @@ -933,31 +1604,47 @@ class RestaurantView extends StatelessWidget { left: 0, right: 0, child: Padding( - padding: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only( + bottom: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Text( "Upto".tr(), textAlign: TextAlign.center, maxLines: 1, style: TextStyle( - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.regular, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.regular, fontWeight: FontWeight.w900, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, ), ), Text( - discountAmountTempList.reduce(min).toString() + "% OFF".tr(), + discountAmountTempList + .reduce(min) + .toString() + + "% OFF".tr(), textAlign: TextAlign.center, maxLines: 1, style: TextStyle( fontSize: 18, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, ), ), ], @@ -977,7 +1664,15 @@ class RestaurantView extends StatelessWidget { vendorModel.title.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(fontSize: 18, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontSize: 18, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( vendorModel.location.toString(), @@ -987,7 +1682,10 @@ class RestaurantView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), const SizedBox(height: 5), @@ -996,18 +1694,31 @@ class RestaurantView extends StatelessWidget { child: Row( children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg", width: 18), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + width: 18, + ), const SizedBox(width: 5), Text( "Free Delivery".tr(), style: TextStyle( - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey400, ), ), const SizedBox(width: 10), @@ -1017,8 +1728,18 @@ class RestaurantView extends StatelessWidget { Row( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: SvgPicture.asset("assets/icons/ic_star.svg", width: 18, colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), + child: SvgPicture.asset( + "assets/icons/ic_star.svg", + width: 18, + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), ), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", @@ -1028,7 +1749,10 @@ class RestaurantView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], @@ -1036,8 +1760,18 @@ class RestaurantView extends StatelessWidget { Row( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Icon(Icons.circle, size: 5, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), + child: Icon( + Icons.circle, + size: 5, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", @@ -1047,7 +1781,10 @@ class RestaurantView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart index d6282a4..0b80cd0 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart @@ -8,8 +8,7 @@ import 'package:easy_localization/easy_localization.dart'; import '../../../controllers/theme_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../service/fire_store_utils.dart'; import '../../../widget/restaurant_image_view.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -26,13 +25,18 @@ class RestaurantListScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( controller.title.value, textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), body: @@ -44,35 +48,64 @@ class RestaurantListScreen extends StatelessWidget { shrinkWrap: true, itemCount: controller.vendorSearchList.length, itemBuilder: (context, index) { - VendorModel vendorModel = controller.vendorSearchList[index]; + VendorModel vendorModel = + controller.vendorSearchList[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel})?.then((v) { + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + )?.then((v) { controller.getFavouriteRestaurant(); }); }, child: Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + ), child: Stack( children: [ - RestaurantImageView(vendorModel: vendorModel), + RestaurantImageView( + vendorModel: vendorModel, + ), Container( - height: Responsive.height(20, context), - width: Responsive.width(100, context), + height: Responsive.height( + 20, + context, + ), + width: Responsive.width( + 100, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), + begin: const Alignment( + -0.00, + -1.00, + ), end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], ), ), ), @@ -81,21 +114,60 @@ class RestaurantListScreen extends StatelessWidget { top: 10, child: InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == vendorModel.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty) { + FavouriteModel + favouriteModel = FavouriteModel( + restaurantId: + vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList + .removeWhere( + (item) => + item.restaurantId == + vendorModel.id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + FavouriteModel + favouriteModel = FavouriteModel( + restaurantId: + vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList + .add(favouriteModel); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == + vendorModel + .id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -103,28 +175,60 @@ class RestaurantListScreen extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(17.5, context)), + offset: Offset( + Responsive.width(-3, context), + Responsive.height(17.5, context), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: BoxDecoration( - color: AppThemeData.success300, - borderRadius: BorderRadius.circular(120), // Optional + color: + AppThemeData + .success300, + borderRadius: + BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), + const SizedBox( + width: 5, + ), Text( "Free Delivery".tr(), - style: TextStyle(fontSize: 14, color: AppThemeData.carRent600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 14, + color: + AppThemeData + .carRent600, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, + ), ), ], ), @@ -134,22 +238,51 @@ class RestaurantListScreen extends StatelessWidget { ), ), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .primary600 + : AppThemeData + .primary50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -157,22 +290,51 @@ class RestaurantListScreen extends StatelessWidget { ), const SizedBox(width: 6), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .ecommerce600 + : AppThemeData + .ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg", colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .ecommerce300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -185,9 +347,12 @@ class RestaurantListScreen extends StatelessWidget { ), const SizedBox(height: 15), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( vendorModel.title.toString(), @@ -197,7 +362,10 @@ class RestaurantListScreen extends StatelessWidget { fontSize: 18, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), Text( @@ -208,7 +376,10 @@ class RestaurantListScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart b/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart index 5536d29..6850c56 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart @@ -8,7 +8,7 @@ import 'package:customer/widget/story_view/utils.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../service/fire_store_utils.dart'; import '../../../widget/story_view/widgets/story_view.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -71,9 +71,15 @@ class MoreStoriesState extends State { StoryView( key: ValueKey(widget.index), storyItems: - List.generate(widget.storyList[widget.index].videoUrl.length, (i) { - return StoryItem.pageVideo(widget.storyList[widget.index].videoUrl[i], controller: storyController); - }).toList(), + List.generate( + widget.storyList[widget.index].videoUrl.length, + (i) { + return StoryItem.pageVideo( + widget.storyList[widget.index].videoUrl[i], + controller: storyController, + ); + }, + ).toList(), onComplete: () { debugPrint("--------->"); debugPrint(widget.storyList.length.toString()); @@ -96,15 +102,23 @@ class MoreStoriesState extends State { }, ), Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top + 30, left: 16, right: 16), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top + 30, + left: 16, + right: 16, + ), child: FutureBuilder( - future: FireStoreUtils.getVendorById(widget.storyList[widget.index].vendorID.toString()), + future: FireStoreUtils.getVendorById( + widget.storyList[widget.index].vendorID.toString(), + ), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return SizedBox(); } else { if (snapshot.hasError) { - return Center(child: Text('${"Error".tr()}: ${snapshot.error}')); + return Center( + child: Text('${"Error".tr()}: ${snapshot.error}'), + ); return Center(child: Text('Error: ${snapshot.error}')); } else if (snapshot.data == null) { return const SizedBox(); @@ -112,13 +126,23 @@ class MoreStoriesState extends State { VendorModel vendorModel = snapshot.data!; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - ClipOval(child: NetworkImageWidget(imageUrl: vendorModel.photo.toString(), width: 50, height: 50, fit: BoxFit.cover)), + ClipOval( + child: NetworkImageWidget( + imageUrl: vendorModel.photo.toString(), + width: 50, + height: 50, + fit: BoxFit.cover, + ), + ), const SizedBox(width: 10), Expanded( child: Column( @@ -129,17 +153,29 @@ class MoreStoriesState extends State { vendorModel.title.toString(), textAlign: TextAlign.center, maxLines: 1, - style: const TextStyle(color: Colors.white, fontSize: 16, overflow: TextOverflow.ellipsis, fontWeight: FontWeight.w700), + style: const TextStyle( + color: Colors.white, + fontSize: 16, + overflow: TextOverflow.ellipsis, + fontWeight: FontWeight.w700, + ), ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg"), + SvgPicture.asset( + "assets/icons/ic_star.svg", + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} ${'reviews'.tr()}", textAlign: TextAlign.center, maxLines: 1, - style: const TextStyle(color: AppThemeData.warning300, fontSize: 12, overflow: TextOverflow.ellipsis, fontWeight: FontWeight.w700), + style: const TextStyle( + color: AppThemeData.warning300, + fontSize: 12, + overflow: TextOverflow.ellipsis, + fontWeight: FontWeight.w700, + ), ), ], ), @@ -152,8 +188,17 @@ class MoreStoriesState extends State { }, child: Container( padding: const EdgeInsets.all(10.0), - decoration: BoxDecoration(borderRadius: BorderRadius.circular(30), color: Colors.grey), - child: SvgPicture.asset("assets/icons/ic_close.svg", colorFilter: ColorFilter.mode(AppThemeData.grey800, BlendMode.srcIn)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30), + color: Colors.grey, + ), + child: SvgPicture.asset( + "assets/icons/ic_close.svg", + colorFilter: ColorFilter.mode( + AppThemeData.grey800, + BlendMode.srcIn, + ), + ), ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart index 06b516e..665f863 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart @@ -5,8 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import 'category_restaurant_screen.dart'; @@ -22,10 +21,19 @@ class ViewAllCategoryScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Categories".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), + title: Text( + "Categories".tr(), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), + ), ), body: controller.isLoading.value @@ -34,38 +42,84 @@ class ViewAllCategoryScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 16), child: GridView.builder( padding: EdgeInsets.zero, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 3.5 / 6, crossAxisSpacing: 6), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + childAspectRatio: 3.5 / 6, + crossAxisSpacing: 6, + ), itemCount: controller.vendorCategoryModel.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (context, index) { - VendorCategoryModel vendorCategoryModel = controller.vendorCategoryModel[index]; + VendorCategoryModel vendorCategoryModel = + controller.vendorCategoryModel[index]; return InkWell( onTap: () { - Get.to(const CategoryRestaurantScreen(), arguments: {"vendorCategoryModel": vendorCategoryModel, "dineIn": false}); + Get.to( + const CategoryRestaurantScreen(), + arguments: { + "vendorCategoryModel": vendorCategoryModel, + "dineIn": false, + }, + ); }, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: 4, + vertical: 6, + ), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, strokeAlign: BorderSide.strokeAlignOutside, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100), + side: BorderSide( + width: 1, + strokeAlign: BorderSide.strokeAlignOutside, + color: + isDark + ? AppThemeData.grey800 + : AppThemeData.grey100, + ), borderRadius: BorderRadius.circular(100), ), ), child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ - SizedBox(width: 60, height: 60, child: ClipOval(child: NetworkImageWidget(imageUrl: vendorCategoryModel.photo.toString(), fit: BoxFit.cover))), + SizedBox( + width: 60, + height: 60, + child: ClipOval( + child: NetworkImageWidget( + imageUrl: + vendorCategoryModel.photo + .toString(), + fit: BoxFit.cover, + ), + ), + ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: Text( '${vendorCategoryModel.title}', textAlign: TextAlign.center, maxLines: 2, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 12), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 12, + ), ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart index 9bf1d32..7c561fd 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart @@ -4,7 +4,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart' as gmap; import '../../../controllers/theme_controller.dart'; @@ -24,17 +24,44 @@ class LiveTrackingScreen extends StatelessWidget { } return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text("Live Tracking".tr()), centerTitle: false), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + title: Text("Live Tracking".tr()), + centerTitle: false, + ), body: Constant.selectedMapType == 'osm' ? flutterMap.FlutterMap( mapController: controller.osmMapController, - options: flutterMap.MapOptions(initialCenter: controller.driverCurrent.value, initialZoom: 14), + options: flutterMap.MapOptions( + initialCenter: controller.driverCurrent.value, + initialZoom: 14, + ), children: [ - flutterMap.TileLayer(urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: 'felix.fondex.uz'), - if (controller.routePoints.isNotEmpty) flutterMap.PolylineLayer(polylines: [flutterMap.Polyline(points: controller.routePoints, strokeWidth: 5.0, color: Colors.blue)]), - flutterMap.MarkerLayer(markers: controller.orderModel.value.id == null ? [] : controller.osmMarkers), + flutterMap.TileLayer( + urlTemplate: + 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: 'felix.fondex.uz', + ), + if (controller.routePoints.isNotEmpty) + flutterMap.PolylineLayer( + polylines: [ + flutterMap.Polyline( + points: controller.routePoints, + strokeWidth: 5.0, + color: Colors.blue, + ), + ], + ), + flutterMap.MarkerLayer( + markers: + controller.orderModel.value.id == null + ? [] + : controller.osmMarkers, + ), ], ) : gmap.GoogleMap( @@ -43,11 +70,18 @@ class LiveTrackingScreen extends StatelessWidget { }, myLocationEnabled: true, zoomControlsEnabled: false, - polylines: Set.of(controller.polyLines.values), + polylines: Set.of( + controller.polyLines.values, + ), markers: Set.of(controller.markers.values), initialCameraPosition: gmap.CameraPosition( zoom: 14, - target: gmap.LatLng(controller.driverUserModel.value.location?.latitude ?? 0.0, controller.driverUserModel.value.location?.longitude ?? 0.0), + target: gmap.LatLng( + controller.driverUserModel.value.location?.latitude ?? + 0.0, + controller.driverUserModel.value.location?.longitude ?? + 0.0, + ), ), ), ); diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart index ead2ca4..d322880 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart @@ -11,7 +11,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:timelines_plus/timelines_plus.dart'; import '../../../controllers/theme_controller.dart'; @@ -33,12 +33,22 @@ class OrderDetailsScreen extends StatelessWidget { init: OrderDetailsController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Order Details".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Order Details".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: controller.isLoading.value @@ -57,19 +67,38 @@ class OrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Order'.tr()} ${Constant.orderId(orderId: controller.orderModel.value.id.toString())}".tr(), + "${'Order'.tr()} ${Constant.orderId(orderId: controller.orderModel.value.id.toString())}" + .tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), ), RoundedButtonFill( - title: controller.orderModel.value.status.toString().tr(), - color: Constant.statusColor(status: controller.orderModel.value.status.toString()), + title: + controller.orderModel.value.status + .toString() + .tr(), + color: Constant.statusColor( + status: + controller.orderModel.value.status + .toString(), + ), width: 32, height: 4.5, - textColor: Constant.statusText(status: controller.orderModel.value.status.toString()), + textColor: Constant.statusText( + status: + controller.orderModel.value.status + .toString(), + ), onPress: () async {}, ), ], @@ -77,73 +106,177 @@ class OrderDetailsScreen extends StatelessWidget { const SizedBox(height: 14), controller.orderModel.value.takeAway == true ? Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${controller.orderModel.value.vendor!.title}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), Text( "${controller.orderModel.value.vendor!.location}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + ), ), ], ), ), - controller.orderModel.value.status == Constant.orderPlaced || - controller.orderModel.value.status == Constant.orderRejected || - controller.orderModel.value.status == Constant.orderCompleted + controller.orderModel.value.status == + Constant.orderPlaced || + controller + .orderModel + .value + .status == + Constant.orderRejected || + controller + .orderModel + .value + .status == + Constant.orderCompleted ? const SizedBox() : InkWell( onTap: () { - Constant.makePhoneCall(controller.orderModel.value.vendor!.phonenumber.toString()); + Constant.makePhoneCall( + controller + .orderModel + .value + .vendor! + .phonenumber + .toString(), + ); }, child: Container( width: 42, height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_phone_call.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_phone_call.svg")), ), ), const SizedBox(width: 10), - controller.orderModel.value.status == Constant.orderPlaced || - controller.orderModel.value.status == Constant.orderRejected || - controller.orderModel.value.status == Constant.orderCompleted + controller.orderModel.value.status == + Constant.orderPlaced || + controller + .orderModel + .value + .status == + Constant.orderRejected || + controller + .orderModel + .value + .status == + Constant.orderCompleted ? const SizedBox() : InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); - UserModel? customer = await FireStoreUtils.getUserProfile(controller.orderModel.value.authorID.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(controller.orderModel.value.vendor!.author.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(restaurantUser!.vendorID.toString()); + UserModel? customer = + await FireStoreUtils.getUserProfile( + controller + .orderModel + .value + .authorID + .toString(), + ); + UserModel? restaurantUser = + await FireStoreUtils.getUserProfile( + controller + .orderModel + .value + .vendor! + .author + .toString(), + ); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + restaurantUser!.vendorID + .toString(), + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": customer!.fullName(), - "restaurantName": vendorModel!.title, - "orderId": controller.orderModel.value.id, - "restaurantId": restaurantUser.id, + "customerName": + customer!.fullName(), + "restaurantName": + vendorModel!.title, + "orderId": + controller + .orderModel + .value + .id, + "restaurantId": + restaurantUser.id, "customerId": customer.id, - "customerProfileImage": customer.profilePictureURL, - "restaurantProfileImage": vendorModel.photo, - "token": restaurantUser.fcmToken, + "customerProfileImage": + customer + .profilePictureURL, + "restaurantProfileImage": + vendorModel.photo, + "token": + restaurantUser.fcmToken, "chatType": "restaurant", }, ); @@ -153,11 +286,29 @@ class OrderDetailsScreen extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_wechat.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_wechat.svg")), ), ), ], @@ -165,15 +316,26 @@ class OrderDetailsScreen extends StatelessWidget { ), ) : Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( children: [ Timeline.tileBuilder( shrinkWrap: true, padding: EdgeInsets.zero, - physics: const NeverScrollableScrollPhysics(), + physics: + const NeverScrollableScrollPhysics(), theme: TimelineThemeData( nodePosition: 0, // indicatorPosition: 0, @@ -181,81 +343,219 @@ class OrderDetailsScreen extends StatelessWidget { builder: TimelineTileBuilder.connected( contentsAlign: ContentsAlign.basic, indicatorBuilder: (context, index) { - return SvgPicture.asset("assets/icons/ic_location.svg"); + return SvgPicture.asset( + "assets/icons/ic_location.svg", + ); }, - connectorBuilder: (context, index, connectorType) { - return const DashedLineConnector(color: AppThemeData.grey300, gap: 3); + connectorBuilder: ( + context, + index, + connectorType, + ) { + return const DashedLineConnector( + color: AppThemeData.grey300, + gap: 3, + ); }, contentsBuilder: (context, index) { return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: index == 0 ? Row( children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( "${controller.orderModel.value.vendor!.title}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + fontSize: + 16, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), Text( "${controller.orderModel.value.vendor!.location}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600), + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + fontSize: + 14, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + ), ), ], ), ), - controller.orderModel.value.status == Constant.orderPlaced || - controller.orderModel.value.status == Constant.orderRejected || - controller.orderModel.value.status == Constant.orderCompleted + controller + .orderModel + .value + .status == + Constant + .orderPlaced || + controller + .orderModel + .value + .status == + Constant + .orderRejected || + controller + .orderModel + .value + .status == + Constant + .orderCompleted ? const SizedBox() : InkWell( onTap: () { - Constant.makePhoneCall(controller.orderModel.value.vendor!.phonenumber.toString()); + Constant.makePhoneCall( + controller + .orderModel + .value + .vendor! + .phonenumber + .toString(), + ); }, child: Container( width: 42, height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: + 1, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_phone_call.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_phone_call.svg")), ), ), - const SizedBox(width: 10), - controller.orderModel.value.status == Constant.orderPlaced || - controller.orderModel.value.status == Constant.orderRejected || - controller.orderModel.value.status == Constant.orderCompleted + const SizedBox( + width: 10, + ), + controller + .orderModel + .value + .status == + Constant + .orderPlaced || + controller + .orderModel + .value + .status == + Constant + .orderRejected || + controller + .orderModel + .value + .status == + Constant + .orderCompleted ? const SizedBox() : InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait..." + .tr(), + ); - UserModel? customer = await FireStoreUtils.getUserProfile(controller.orderModel.value.authorID.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(controller.orderModel.value.vendor!.author.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(restaurantUser!.vendorID.toString()); + UserModel? + customer = await FireStoreUtils.getUserProfile( + controller + .orderModel + .value + .authorID + .toString(), + ); + UserModel? + restaurantUser = await FireStoreUtils.getUserProfile( + controller + .orderModel + .value + .vendor! + .author + .toString(), + ); + VendorModel? + vendorModel = await FireStoreUtils.getVendorById( + restaurantUser! + .vendorID + .toString(), + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": customer!.fullName(), - "restaurantName": vendorModel!.title, - "orderId": controller.orderModel.value.id, - "restaurantId": restaurantUser.id, - "customerId": customer.id, - "customerProfileImage": customer.profilePictureURL, - "restaurantProfileImage": vendorModel.photo, - "token": restaurantUser.fcmToken, - "chatType": "restaurant", + "customerName": + customer! + .fullName(), + "restaurantName": + vendorModel! + .title, + "orderId": + controller + .orderModel + .value + .id, + "restaurantId": + restaurantUser + .id, + "customerId": + customer + .id, + "customerProfileImage": + customer + .profilePictureURL, + "restaurantProfileImage": + vendorModel + .photo, + "token": + restaurantUser + .fcmToken, + "chatType": + "restaurant", }, ); }, @@ -264,27 +564,75 @@ class OrderDetailsScreen extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: + 1, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_wechat.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_wechat.svg")), ), ), ], ) : Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( "${controller.orderModel.value.address!.addressAs}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), Text( - controller.orderModel.value.address!.getFullAddress(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600), + controller + .orderModel + .value + .address! + .getFullAddress(), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + fontSize: 14, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + ), ), ], ), @@ -293,93 +641,215 @@ class OrderDetailsScreen extends StatelessWidget { itemCount: 2, ), ), - controller.orderModel.value.status == Constant.orderRejected + controller.orderModel.value.status == + Constant.orderRejected ? const SizedBox() : Column( children: [ - Padding(padding: const EdgeInsets.symmetric(vertical: 10), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)), - controller.orderModel.value.status == Constant.orderCompleted && controller.orderModel.value.driver != null + Padding( + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), + child: MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData + .grey200, + ), + ), + controller + .orderModel + .value + .status == + Constant + .orderCompleted && + controller + .orderModel + .value + .driver != + null ? Row( children: [ - SvgPicture.asset("assets/icons/ic_check_small.svg"), + SvgPicture.asset( + "assets/icons/ic_check_small.svg", + ), const SizedBox(width: 5), Text( - controller.orderModel.value.driver!.fullName(), - textAlign: TextAlign.right, + controller + .orderModel + .value + .driver! + .fullName(), + textAlign: + TextAlign.right, style: TextStyle( - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w500, fontSize: 14, ), ), const SizedBox(width: 5), Text( "Order Delivered.".tr(), - textAlign: TextAlign.right, + textAlign: + TextAlign.right, style: TextStyle( - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, + fontFamily: + AppThemeData + .regular, + fontWeight: + FontWeight.w500, fontSize: 14, ), ), ], ) - : controller.orderModel.value.status == Constant.orderAccepted || controller.orderModel.value.status == Constant.driverPending + : controller + .orderModel + .value + .status == + Constant + .orderAccepted || + controller + .orderModel + .value + .status == + Constant.driverPending ? Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ - SvgPicture.asset("assets/icons/ic_timer.svg"), + SvgPicture.asset( + "assets/icons/ic_timer.svg", + ), const SizedBox(width: 5), Expanded( child: Text( "${'Your Order has been Preparing and assign to the driver'.tr()}\n${'Preparation Time'.tr()} ${controller.orderModel.value.estimatedTimeToPrepare}" .tr(), - textAlign: TextAlign.start, + textAlign: + TextAlign.start, style: TextStyle( - color: isDark ? AppThemeData.warning400 : AppThemeData.warning400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .warning400 + : AppThemeData + .warning400, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w500, fontSize: 14, ), ), ), ], ) - : controller.orderModel.value.driver != null + : controller + .orderModel + .value + .driver != + null ? Row( children: [ ClipOval( child: NetworkImageWidget( - imageUrl: controller.orderModel.value.author!.profilePictureURL.toString(), + imageUrl: + controller + .orderModel + .value + .author! + .profilePictureURL + .toString(), fit: BoxFit.cover, - height: Responsive.height(5, context), - width: Responsive.width(10, context), + height: + Responsive.height( + 5, + context, + ), + width: + Responsive.width( + 10, + context, + ), ), ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( - controller.orderModel.value.driver!.fullName().toString(), - textAlign: TextAlign.start, + controller + .orderModel + .value + .driver! + .fullName() + .toString(), + textAlign: + TextAlign + .start, style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, fontSize: 16, ), ), Text( - controller.orderModel.value.driver!.email.toString(), - textAlign: TextAlign.start, + controller + .orderModel + .value + .driver! + .email + .toString(), + textAlign: + TextAlign + .start, style: TextStyle( - color: isDark ? AppThemeData.success400 : AppThemeData.success400, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w400, + color: + isDark + ? AppThemeData + .success400 + : AppThemeData + .success400, + fontFamily: + AppThemeData + .regular, + fontWeight: + FontWeight + .w400, fontSize: 12, ), ), @@ -388,42 +858,104 @@ class OrderDetailsScreen extends StatelessWidget { ), InkWell( onTap: () { - Constant.makePhoneCall(controller.orderModel.value.driver!.phoneNumber.toString()); + Constant.makePhoneCall( + controller + .orderModel + .value + .driver! + .phoneNumber + .toString(), + ); }, child: Container( width: 42, height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_phone_call.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_phone_call.svg")), ), ), const SizedBox(width: 10), InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait..." + .tr(), + ); - UserModel? customer = await FireStoreUtils.getUserProfile(controller.orderModel.value.authorID.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(controller.orderModel.value.driverID.toString()); + UserModel? customer = + await FireStoreUtils.getUserProfile( + controller + .orderModel + .value + .authorID + .toString(), + ); + UserModel? + restaurantUser = + await FireStoreUtils.getUserProfile( + controller + .orderModel + .value + .driverID + .toString(), + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": customer!.fullName(), - "restaurantName": restaurantUser!.fullName(), - "orderId": controller.orderModel.value.id, - "restaurantId": restaurantUser.id, - "customerId": customer.id, - "customerProfileImage": customer.profilePictureURL, - "restaurantProfileImage": restaurantUser.profilePictureURL, - "token": restaurantUser.fcmToken, - "chatType": "Driver", + "customerName": + customer! + .fullName(), + "restaurantName": + restaurantUser! + .fullName(), + "orderId": + controller + .orderModel + .value + .id, + "restaurantId": + restaurantUser + .id, + "customerId": + customer.id, + "customerProfileImage": + customer + .profilePictureURL, + "restaurantProfileImage": + restaurantUser + .profilePictureURL, + "token": + restaurantUser + .fcmToken, + "chatType": + "Driver", }, ); }, @@ -432,11 +964,30 @@ class OrderDetailsScreen extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_wechat.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_wechat.svg")), ), ), ], @@ -453,44 +1004,100 @@ class OrderDetailsScreen extends StatelessWidget { Text( "Your Order".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), const SizedBox(height: 10), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: ListView.separated( shrinkWrap: true, padding: EdgeInsets.zero, - itemCount: controller.orderModel.value.products!.length, + itemCount: + controller + .orderModel + .value + .products! + .length, physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { - CartProductModel cartProductModel = controller.orderModel.value.products![index]; + CartProductModel cartProductModel = + controller + .orderModel + .value + .products![index]; return Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(14)), + borderRadius: + const BorderRadius.all( + Radius.circular(14), + ), child: Stack( children: [ NetworkImageWidget( - imageUrl: cartProductModel.photo.toString(), - height: Responsive.height(8, context), - width: Responsive.width(16, context), + imageUrl: + cartProductModel.photo + .toString(), + height: Responsive.height( + 8, + context, + ), + width: Responsive.width( + 16, + context, + ), fit: BoxFit.cover, ), Container( - height: Responsive.height(8, context), - width: Responsive.width(16, context), + height: Responsive.height( + 8, + context, + ), + width: Responsive.width( + 16, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), - end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + begin: const Alignment( + -0.00, + -1.00, + ), + end: const Alignment( + 0, + 1, + ), + colors: [ + Colors.black + .withOpacity(0), + const Color(0xFF111827), + ], ), ), ), @@ -500,69 +1107,173 @@ class OrderDetailsScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Text( "${cartProductModel.name}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ), Text( "x ${cartProductModel.quantity}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ], ), - double.parse(cartProductModel.discountPrice == null || cartProductModel.discountPrice!.isEmpty ? "0.0" : cartProductModel.discountPrice.toString()) <= 0 + double.parse( + cartProductModel.discountPrice == + null || + cartProductModel + .discountPrice! + .isEmpty + ? "0.0" + : cartProductModel + .discountPrice + .toString(), + ) <= + 0 ? Text( - Constant.amountShow(amount: cartProductModel.price), + Constant.amountShow( + amount: + cartProductModel + .price, + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ) : Row( children: [ Text( - Constant.amountShow(amount: cartProductModel.discountPrice.toString()), + Constant.amountShow( + amount: + cartProductModel + .discountPrice + .toString(), + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), - const SizedBox(width: 5), + const SizedBox( + width: 5, + ), Text( - Constant.amountShow(amount: cartProductModel.price), + Constant.amountShow( + amount: + cartProductModel + .price, + ), style: TextStyle( fontSize: 14, - decoration: TextDecoration.lineThrough, - decorationColor: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - color: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + decoration: + TextDecoration + .lineThrough, + decorationColor: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + color: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), ], ), Align( - alignment: Alignment.centerRight, + alignment: + Alignment.centerRight, child: RoundedButtonFill( title: "Rate us".tr(), height: 3.8, width: 20, - color: isDark ? AppThemeData.warning300 : AppThemeData.warning300, - textColor: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData + .warning300 + : AppThemeData + .warning300, + textColor: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, onPress: () async { - Get.to(const RateProductScreen(), arguments: {"orderModel": controller.orderModel.value, "productId": cartProductModel.id}); + Get.to( + const RateProductScreen(), + arguments: { + "orderModel": + controller + .orderModel + .value, + "productId": + cartProductModel + .id, + }, + ); }, ), ), @@ -571,63 +1282,149 @@ class OrderDetailsScreen extends StatelessWidget { ), ], ), - cartProductModel.variantInfo == null || cartProductModel.variantInfo!.variantOptions!.isEmpty + cartProductModel.variantInfo == null || + cartProductModel + .variantInfo! + .variantOptions! + .isEmpty ? Container() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Variants".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), const SizedBox(height: 5), Wrap( spacing: 6.0, runSpacing: 6.0, children: - List.generate(cartProductModel.variantInfo!.variantOptions!.length, (i) { - return Container( - decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), - child: Text( - "${cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)} : ${cartProductModel.variantInfo!.variantOptions![cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)]}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey500 : AppThemeData.grey400), + List.generate( + cartProductModel + .variantInfo! + .variantOptions! + .length, + (i) { + return Container( + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), ), - ), - ); - }).toList(), + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: + 16, + vertical: 5, + ), + child: Text( + "${cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)} : ${cartProductModel.variantInfo!.variantOptions![cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)]}", + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + ), + ), + ), + ); + }, + ).toList(), ), ], ), ), - cartProductModel.extras == null || cartProductModel.extras!.isEmpty + cartProductModel.extras == null || + cartProductModel.extras!.isEmpty ? const SizedBox() : Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Text( "Addons".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( Constant.amountShow( - amount: (double.parse(cartProductModel.extrasPrice.toString()) * double.parse(cartProductModel.quantity.toString())).toString(), + amount: + (double.parse( + cartProductModel + .extrasPrice + .toString(), + ) * + double.parse( + cartProductModel + .quantity + .toString(), + )) + .toString(), ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontSize: 16, + ), ), ], ), @@ -635,22 +1432,56 @@ class OrderDetailsScreen extends StatelessWidget { spacing: 6.0, runSpacing: 6.0, children: - List.generate(cartProductModel.extras!.length, (i) { - return Container( - decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), - child: Text( - cartProductModel.extras![i].toString(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey500 : AppThemeData.grey400), + List.generate( + cartProductModel + .extras! + .length, + (i) { + return Container( + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), ), - ), - ); - }).toList(), + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: + 16, + vertical: 5, + ), + child: Text( + cartProductModel + .extras![i] + .toString(), + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + ), + ), + ), + ); + }, + ).toList(), ), ], ), @@ -658,7 +1489,17 @@ class OrderDetailsScreen extends StatelessWidget { ); }, separatorBuilder: (context, index) { - return Padding(padding: const EdgeInsets.symmetric(vertical: 10), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)); + return Padding( + padding: const EdgeInsets.symmetric( + vertical: 10, + ), + child: MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + ); }, ), ), @@ -692,30 +1533,67 @@ class OrderDetailsScreen extends StatelessWidget { Text( "Bill Details".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Column( children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Item totals".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - Constant.amountShow(amount: controller.subTotal.value.toString()), + Constant.amountShow( + amount: + controller.subTotal.value + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -723,67 +1601,160 @@ class OrderDetailsScreen extends StatelessWidget { controller.orderModel.value.takeAway == true ? const SizedBox() : Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Delivery Fee".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), - (controller.orderModel.value.vendor?.isSelfDelivery == true) - ? Text('Free Delivery'.tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: AppThemeData.success400, fontSize: 16)) + (controller + .orderModel + .value + .vendor + ?.isSelfDelivery == + true) + ? Text( + 'Free Delivery'.tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + AppThemeData.success400, + fontSize: 16, + ), + ) : Text( Constant.amountShow( amount: - controller.orderModel.value.deliveryCharge == null || controller.orderModel.value.deliveryCharge!.isEmpty + controller + .orderModel + .value + .deliveryCharge == + null || + controller + .orderModel + .value + .deliveryCharge! + .isEmpty ? "0.0" - : controller.orderModel.value.deliveryCharge.toString(), + : controller + .orderModel + .value + .deliveryCharge + .toString(), ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Coupon Discount".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( "- (${Constant.amountShow(amount: controller.orderModel.value.discount.toString())})", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.danger300 : AppThemeData.danger300, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.danger300 + : AppThemeData.danger300, + fontSize: 16, + ), ), ], ), - controller.orderModel.value.specialDiscount != null && controller.orderModel.value.specialDiscount!['special_discount'] != null + controller.orderModel.value.specialDiscount != + null && + controller + .orderModel + .value + .specialDiscount!['special_discount'] != + null ? Column( children: [ const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Special Discount".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( "- (${Constant.amountShow(amount: controller.specialDiscountAmount.value.toString())})", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.danger300 : AppThemeData.danger300, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .danger300 + : AppThemeData + .danger300, + fontSize: 16, + ), ), ], ), @@ -791,50 +1762,110 @@ class OrderDetailsScreen extends StatelessWidget { ) : const SizedBox(), const SizedBox(height: 10), - controller.orderModel.value.takeAway == true || controller.orderModel.value.vendor?.isSelfDelivery == true + controller.orderModel.value.takeAway == + true || + controller + .orderModel + .value + .vendor + ?.isSelfDelivery == + true ? const SizedBox() : Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Delivery Tips".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ], ), ), Text( - Constant.amountShow(amount: controller.orderModel.value.tipAmount.toString()), + Constant.amountShow( + amount: + controller + .orderModel + .value + .tipAmount + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 10), ListView.builder( - itemCount: controller.orderModel.value.taxSetting!.length, + itemCount: + controller + .orderModel + .value + .taxSetting! + .length, shrinkWrap: true, padding: EdgeInsets.zero, - physics: const NeverScrollableScrollPhysics(), + physics: + const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { - TaxModel taxModel = controller.orderModel.value.taxSetting![index]; + TaxModel taxModel = + controller + .orderModel + .value + .taxSetting![index]; return Padding( - padding: const EdgeInsets.symmetric(vertical: 5), + padding: const EdgeInsets.symmetric( + vertical: 5, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "${taxModel.title.toString()} (${taxModel.type == "fix" ? Constant.amountShow(amount: taxModel.tax) : "${taxModel.tax}%"})", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( @@ -842,13 +1873,33 @@ class OrderDetailsScreen extends StatelessWidget { amount: Constant.calculateTax( amount: - (controller.subTotal.value - double.parse(controller.orderModel.value.discount.toString()) - controller.specialDiscountAmount.value) + (controller + .subTotal + .value - + double.parse( + controller + .orderModel + .value + .discount + .toString(), + ) - + controller + .specialDiscountAmount + .value) .toString(), taxModel: taxModel, ).toString(), ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -857,19 +1908,38 @@ class OrderDetailsScreen extends StatelessWidget { ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "To Pay".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - Constant.amountShow(amount: controller.totalAmount.value.toString()), + Constant.amountShow( + amount: + controller.totalAmount.value + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -881,37 +1951,72 @@ class OrderDetailsScreen extends StatelessWidget { Text( "Order Details".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Column( children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Delivery type".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - controller.orderModel.value.takeAway == true + controller.orderModel.value.takeAway == + true ? "TakeAway".tr() - : controller.orderModel.value.scheduleTime == null + : controller + .orderModel + .value + .scheduleTime == + null ? "Standard".tr() : "Schedule".tr(), textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, color: - controller.orderModel.value.scheduleTime != null + controller + .orderModel + .value + .scheduleTime != + null ? AppThemeData.primary300 : isDark ? AppThemeData.grey50 @@ -923,60 +2028,121 @@ class OrderDetailsScreen extends StatelessWidget { ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Payment Method".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - controller.orderModel.value.paymentMethod.toString(), + controller + .orderModel + .value + .paymentMethod + .toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Date and Time".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - Constant.timestampToDateTime(controller.orderModel.value.createdAt!), + Constant.timestampToDateTime( + controller + .orderModel + .value + .createdAt!, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Phone Number".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ], ), ), Text( - controller.orderModel.value.author!.phoneNumber.toString(), + controller + .orderModel + .value + .author! + .phoneNumber + .toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -986,7 +2152,8 @@ class OrderDetailsScreen extends StatelessWidget { ), ), const SizedBox(height: 20), - controller.orderModel.value.notes == null || controller.orderModel.value.notes!.isEmpty + controller.orderModel.value.notes == null || + controller.orderModel.value.notes!.isEmpty ? const SizedBox() : Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -994,18 +2161,44 @@ class OrderDetailsScreen extends StatelessWidget { Text( "Remarks".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Text( - controller.orderModel.value.notes.toString(), + controller.orderModel.value.notes + .toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ), ), @@ -1017,22 +2210,35 @@ class OrderDetailsScreen extends StatelessWidget { ), bottomNavigationBar: controller.orderModel.value.status == Constant.orderShipped || - controller.orderModel.value.status == Constant.orderInTransit || - controller.orderModel.value.status == Constant.orderCompleted + controller.orderModel.value.status == + Constant.orderInTransit || + controller.orderModel.value.status == + Constant.orderCompleted ? Container( color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), child: Padding( padding: const EdgeInsets.only(bottom: 20), child: - controller.orderModel.value.status == Constant.orderShipped || controller.orderModel.value.status == Constant.orderInTransit + controller.orderModel.value.status == + Constant.orderShipped || + controller.orderModel.value.status == + Constant.orderInTransit ? RoundedButtonFill( title: "Track Order".tr(), height: 5.5, color: AppThemeData.warning300, textColor: AppThemeData.grey900, onPress: () async { - Get.to(const LiveTrackingScreen(), arguments: {"orderModel": controller.orderModel.value}); + Get.to( + const LiveTrackingScreen(), + arguments: { + "orderModel": controller.orderModel.value, + }, + ); }, ) : RoundedButtonFill( @@ -1041,9 +2247,17 @@ class OrderDetailsScreen extends StatelessWidget { color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { - for (var element in controller.orderModel.value.products!) { - controller.addToCart(cartProductModel: element); - ShowToastDialog.showToast("Item Added In a cart".tr()); + for (var element + in controller + .orderModel + .value + .products!) { + controller.addToCart( + cartProductModel: element, + ); + ShowToastDialog.showToast( + "Item Added In a cart".tr(), + ); } }, ), diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart index 871c7c4..5853553 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart @@ -8,7 +8,7 @@ import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; import '../../../widget/my_separator.dart'; @@ -28,7 +28,9 @@ class OrderScreen extends StatelessWidget { builder: (controller) { return Scaffold( body: Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: controller.isLoading.value ? Constant.loader() @@ -41,12 +43,30 @@ class OrderScreen extends StatelessWidget { children: [ Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), - Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "Please Log In to Continue".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr(), + "You’re not logged in. Please sign in to access your account and explore all features." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -72,15 +92,32 @@ class OrderScreen extends StatelessWidget { children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "My Order".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), Text( - "Keep track your delivered, In Progress and Rejected item all in just one place.".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + "Keep track your delivered, In Progress and Rejected item all in just one place." + .tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ], ), @@ -91,26 +128,51 @@ class OrderScreen extends StatelessWidget { const SizedBox(height: 10), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( children: [ Container( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 10), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + padding: const EdgeInsets.symmetric( + vertical: 6, + horizontal: 10, + ), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey800 + : AppThemeData.grey100, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 120, + ), + ), + ), child: TabBar( indicator: BoxDecoration( - borderRadius: BorderRadius.circular(50), // Creates border + borderRadius: BorderRadius.circular( + 50, + ), // Creates border color: AppThemeData.primary300, ), labelColor: AppThemeData.grey50, isScrollable: true, tabAlignment: TabAlignment.start, indicatorWeight: 0.5, - unselectedLabelColor: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + unselectedLabelColor: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, dividerColor: Colors.transparent, indicatorSize: TabBarIndicatorSize.tab, tabs: [ - Padding(padding: const EdgeInsets.symmetric(horizontal: 18), child: Tab(text: 'All'.tr())), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 18, + ), + child: Tab(text: 'All'.tr()), + ), Tab(text: 'In Progress'.tr()), Tab(text: 'Delivered'.tr()), Tab(text: 'Cancelled'.tr()), @@ -123,72 +185,134 @@ class OrderScreen extends StatelessWidget { child: TabBarView( children: [ controller.allList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr()) + ? Constant.showEmptyView( + message: "Order Not Found".tr(), + ) : RefreshIndicator( - onRefresh: () => controller.getOrder(), + onRefresh: + () => controller.getOrder(), child: ListView.builder( - itemCount: controller.allList.length, + itemCount: + controller.allList.length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - OrderModel orderModel = controller.allList[index]; - return itemView(isDark, context, orderModel, controller); + OrderModel orderModel = + controller.allList[index]; + return itemView( + isDark, + context, + orderModel, + controller, + ); }, ), ), controller.inProgressList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr()) + ? Constant.showEmptyView( + message: "Order Not Found".tr(), + ) : RefreshIndicator( - onRefresh: () => controller.getOrder(), + onRefresh: + () => controller.getOrder(), child: ListView.builder( - itemCount: controller.inProgressList.length, + itemCount: + controller + .inProgressList + .length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - OrderModel orderModel = controller.inProgressList[index]; - return itemView(isDark, context, orderModel, controller); + OrderModel orderModel = + controller + .inProgressList[index]; + return itemView( + isDark, + context, + orderModel, + controller, + ); }, ), ), controller.deliveredList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr()) + ? Constant.showEmptyView( + message: "Order Not Found".tr(), + ) : RefreshIndicator( - onRefresh: () => controller.getOrder(), + onRefresh: + () => controller.getOrder(), child: ListView.builder( - itemCount: controller.deliveredList.length, + itemCount: + controller + .deliveredList + .length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - OrderModel orderModel = controller.deliveredList[index]; - return itemView(isDark, context, orderModel, controller); + OrderModel orderModel = + controller + .deliveredList[index]; + return itemView( + isDark, + context, + orderModel, + controller, + ); }, ), ), controller.cancelledList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr()) + ? Constant.showEmptyView( + message: "Order Not Found".tr(), + ) : RefreshIndicator( - onRefresh: () => controller.getOrder(), + onRefresh: + () => controller.getOrder(), child: ListView.builder( - itemCount: controller.cancelledList.length, + itemCount: + controller + .cancelledList + .length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - OrderModel orderModel = controller.cancelledList[index]; - return itemView(isDark, context, orderModel, controller); + OrderModel orderModel = + controller + .cancelledList[index]; + return itemView( + isDark, + context, + orderModel, + controller, + ); }, ), ), controller.rejectedList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr()) + ? Constant.showEmptyView( + message: "Order Not Found".tr(), + ) : RefreshIndicator( - onRefresh: () => controller.getOrder(), + onRefresh: + () => controller.getOrder(), child: ListView.builder( - itemCount: controller.rejectedList.length, + itemCount: + controller + .rejectedList + .length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - OrderModel orderModel = controller.rejectedList[index]; - return itemView(isDark, context, orderModel, controller); + OrderModel orderModel = + controller + .rejectedList[index]; + return itemView( + isDark, + context, + orderModel, + controller, + ); }, ), ), @@ -208,11 +332,21 @@ class OrderScreen extends StatelessWidget { ); } - Padding itemView(isDark, BuildContext context, OrderModel orderModel, OrderController controller) { + Padding itemView( + isDark, + BuildContext context, + OrderModel orderModel, + OrderController controller, + ) { return Padding( padding: const EdgeInsets.symmetric(vertical: 5), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( @@ -223,12 +357,24 @@ class OrderScreen extends StatelessWidget { borderRadius: const BorderRadius.all(Radius.circular(16)), child: Stack( children: [ - NetworkImageWidget(imageUrl: orderModel.vendor!.photo.toString(), fit: BoxFit.cover, height: Responsive.height(10, context), width: Responsive.width(20, context)), + NetworkImageWidget( + imageUrl: orderModel.vendor!.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height(10, context), + width: Responsive.width(20, context), + ), Container( height: Responsive.height(10, context), width: Responsive.width(20, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, 1.00), end: const Alignment(0, -1), colors: [Colors.black.withOpacity(0), AppThemeData.grey900]), + gradient: LinearGradient( + begin: const Alignment(0.00, 1.00), + end: const Alignment(0, -1), + colors: [ + Colors.black.withOpacity(0), + AppThemeData.grey900, + ], + ), ), ), ], @@ -242,17 +388,39 @@ class OrderScreen extends StatelessWidget { Text( orderModel.status.toString(), textAlign: TextAlign.right, - style: TextStyle(color: Constant.statusColor(status: orderModel.status.toString()), fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500, fontSize: 12), + style: TextStyle( + color: Constant.statusColor( + status: orderModel.status.toString(), + ), + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + fontSize: 12, + ), ), const SizedBox(height: 5), Text( orderModel.vendor!.title.toString(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w400), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 5), Text( Constant.timestampToDateTime(orderModel.createdAt!), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ], ), @@ -272,23 +440,55 @@ class OrderScreen extends StatelessWidget { Expanded( child: Text( "${cartProduct.quantity} x ${cartProduct.name.toString()}", - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ), Text( Constant.amountShow( amount: - double.parse(cartProduct.discountPrice.toString()) <= 0 - ? (double.parse('${cartProduct.price ?? 0}') * double.parse('${cartProduct.quantity ?? 0}')).toString() - : (double.parse('${cartProduct.discountPrice ?? 0}') * double.parse('${cartProduct.quantity ?? 0}')).toString(), + double.parse( + cartProduct.discountPrice.toString(), + ) <= + 0 + ? (double.parse('${cartProduct.price ?? 0}') * + double.parse( + '${cartProduct.quantity ?? 0}', + )) + .toString() + : (double.parse( + '${cartProduct.discountPrice ?? 0}', + ) * + double.parse( + '${cartProduct.quantity ?? 0}', + )) + .toString(), + ), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, ), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), ], ); }, ), - Padding(padding: const EdgeInsets.symmetric(vertical: 14), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)), + Padding( + padding: const EdgeInsets.symmetric(vertical: 14), + child: MySeparator( + color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + ), + ), Row( children: [ orderModel.status == Constant.orderCompleted @@ -297,26 +497,48 @@ class OrderScreen extends StatelessWidget { onTap: () { for (var element in orderModel.products!) { controller.addToCart(cartProductModel: element); - ShowToastDialog.showToast("Item Added In a cart".tr()); + ShowToastDialog.showToast( + "Item Added In a cart".tr(), + ); } }, child: Text( "Reorder".tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, fontSize: 16), + style: TextStyle( + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + fontSize: 16, + ), ), ), ) - : orderModel.status == Constant.orderShipped || orderModel.status == Constant.orderInTransit + : orderModel.status == Constant.orderShipped || + orderModel.status == Constant.orderInTransit ? Expanded( child: InkWell( onTap: () { - Get.to(const LiveTrackingScreen(), arguments: {"orderModel": orderModel}); + Get.to( + const LiveTrackingScreen(), + arguments: {"orderModel": orderModel}, + ); }, child: Text( "Track Order".tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, fontSize: 16), + style: TextStyle( + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + fontSize: 16, + ), ), ), ) @@ -324,13 +546,24 @@ class OrderScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - Get.to(const OrderDetailsScreen(), arguments: {"orderModel": orderModel}); + Get.to( + const OrderDetailsScreen(), + arguments: {"orderModel": orderModel}, + ); // Get.off(const OrderPlacingScreen(), arguments: {"orderModel": orderModel}); }, child: Text( "View Details".tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, fontSize: 16), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + fontSize: 16, + ), ), ), ), diff --git a/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart b/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart index 81933b3..f725837 100644 --- a/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart +++ b/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart @@ -24,7 +24,7 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:share_plus/share_plus.dart'; import '../terms_and_condition/terms_and_condition_screen.dart'; @@ -44,7 +44,9 @@ class ProfileScreen extends StatelessWidget { return controller.isLoading.value ? Constant.loader() : Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -53,41 +55,106 @@ class ProfileScreen extends StatelessWidget { children: [ Text( "My Profile".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), Text( - "Manage your personal information, preferences, and settings all in one place.".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + "Manage your personal information, preferences, and settings all in one place." + .tr(), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 20), Text( "General Information".tr(), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, + ), child: Column( children: [ Constant.userModel == null ? const SizedBox() - : cardDecoration(isDark, controller, "assets/images/ic_profile.svg", "Profile Information".tr(), () { - Get.to(const EditProfileScreen()); - }), - if (Constant.sectionConstantModel!.dineInActive == true) - cardDecoration(isDark, controller, "assets/images/ic_dinin.svg", "Dine-In".tr(), () { - Get.to(const DineInScreen()); - }), - cardDecoration(isDark, controller, "assets/images/ic_gift.svg", "Gift Card".tr(), () { - Get.to(const GiftCardScreen()); - }), + : cardDecoration( + isDark, + controller, + "assets/images/ic_profile.svg", + "Profile Information".tr(), + () { + Get.to(const EditProfileScreen()); + }, + ), + if (Constant + .sectionConstantModel! + .dineInActive == + true) + cardDecoration( + isDark, + controller, + "assets/images/ic_dinin.svg", + "Dine-In".tr(), + () { + Get.to(const DineInScreen()); + }, + ), + cardDecoration( + isDark, + controller, + "assets/images/ic_gift.svg", + "Gift Card".tr(), + () { + Get.to(const GiftCardScreen()); + }, + ), if (Constant.isCashbackActive == true) - cardDecoration(isDark, controller, "assets/icons/ic_cashback_Offer.svg", "Cashback Offers".tr(), () { - Get.to(const CashbackOffersListScreen()); - }), + cardDecoration( + isDark, + controller, + "assets/icons/ic_cashback_Offer.svg", + "Cashback Offers".tr(), + () { + Get.to( + const CashbackOffersListScreen(), + ); + }, + ), ], ), ), @@ -99,19 +166,46 @@ class ProfileScreen extends StatelessWidget { children: [ Text( "Bookings Information".tr(), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Column( children: [ - cardDecoration(isDark, controller, "assets/icons/ic_dinin_order.svg", "Dine-In Booking".tr(), () { - Get.to(const DineInBookingScreen()); - }), + cardDecoration( + isDark, + controller, + "assets/icons/ic_dinin_order.svg", + "Dine-In Booking".tr(), + () { + Get.to( + const DineInBookingScreen(), + ); + }, + ), ], ), ), @@ -122,20 +216,51 @@ class ProfileScreen extends StatelessWidget { const SizedBox(height: 10), Text( "Preferences".tr(), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, + ), child: Column( children: [ - cardDecoration(isDark, controller, "assets/icons/ic_change_language.svg", "Change Language".tr(), () { - Get.to(const ChangeLanguageScreen()); - }), - cardDecoration(isDark, controller, "assets/icons/ic_light_dark.svg", "Dark Mode".tr(), () {}), + cardDecoration( + isDark, + controller, + "assets/icons/ic_change_language.svg", + "Change Language".tr(), + () { + Get.to(const ChangeLanguageScreen()); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_light_dark.svg", + "Dark Mode".tr(), + () {}, + ), ], ), ), @@ -143,31 +268,69 @@ class ProfileScreen extends StatelessWidget { const SizedBox(height: 10), Text( "Social".tr(), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, + ), child: Column( children: [ Constant.userModel == null ? const SizedBox() - : cardDecoration(isDark, controller, "assets/icons/ic_refer.svg", "Refer a Friend".tr(), () { - Get.to(const ReferFriendScreen()); - }), - cardDecoration(isDark, controller, "assets/icons/ic_share.svg", "Share app".tr(), () { - Share.share( - '${'Check out Foodie, your ultimate food delivery application!'.tr()} \n\n${'Google Play:'.tr()} ${Constant.googlePlayLink} \n\n${'App Store:'.tr()} ${Constant.appStoreLink}', - subject: 'Look what I made!'.tr(), - ); - }), - cardDecoration(isDark, controller, "assets/icons/ic_rate.svg", "Rate the app".tr(), () { - final InAppReview inAppReview = InAppReview.instance; - inAppReview.requestReview(); - }), + : cardDecoration( + isDark, + controller, + "assets/icons/ic_refer.svg", + "Refer a Friend".tr(), + () { + Get.to(const ReferFriendScreen()); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_share.svg", + "Share app".tr(), + () { + Share.share( + '${'Check out Foodie, your ultimate food delivery application!'.tr()} \n\n${'Google Play:'.tr()} ${Constant.googlePlayLink} \n\n${'App Store:'.tr()} ${Constant.appStoreLink}', + subject: 'Look what I made!'.tr(), + ); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_rate.svg", + "Rate the app".tr(), + () { + final InAppReview inAppReview = + InAppReview.instance; + inAppReview.requestReview(); + }, + ), ], ), ), @@ -180,28 +343,75 @@ class ProfileScreen extends StatelessWidget { children: [ Text( "Communication".tr(), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, + ), child: Column( children: [ - cardDecoration(isDark, controller, "assets/icons/ic_restaurant_chat.svg", "Store Inbox".tr(), () { - Get.to(const RestaurantInboxScreen()); - }), - cardDecoration(isDark, controller, "assets/icons/ic_restaurant_driver.svg", "Driver Inbox".tr(), () { - Get.to(const DriverInboxScreen()); - }), - cardDecoration(isDark, controller, "assets/icons/ic_restaurant_chat.svg", "Provider Inbox".tr(), () { - Get.to(const ProviderInboxScreen()); - }), - cardDecoration(isDark, controller, "assets/icons/ic_restaurant_driver.svg", "Worker Inbox".tr(), () { - Get.to(const WorkerInboxScreen()); - }), + cardDecoration( + isDark, + controller, + "assets/icons/ic_restaurant_chat.svg", + "Store Inbox".tr(), + () { + Get.to( + const RestaurantInboxScreen(), + ); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_restaurant_driver.svg", + "Driver Inbox".tr(), + () { + Get.to(const DriverInboxScreen()); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_restaurant_chat.svg", + "Provider Inbox".tr(), + () { + Get.to( + const ProviderInboxScreen(), + ); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_restaurant_driver.svg", + "Worker Inbox".tr(), + () { + Get.to(const WorkerInboxScreen()); + }, + ), ], ), ), @@ -209,21 +419,63 @@ class ProfileScreen extends StatelessWidget { const SizedBox(height: 10), ], ), - Text("Legal".tr(), style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500)), + Text( + "Legal".tr(), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), + ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, + ), child: Column( children: [ - cardDecoration(isDark, controller, "assets/icons/ic_privacy_policy.svg", "Privacy Policy".tr(), () { - Get.to(const TermsAndConditionScreen(type: "privacy")); - }), - cardDecoration(isDark, controller, "assets/icons/ic_tearm_condition.svg", "Terms and Conditions".tr(), () { - Get.to(const TermsAndConditionScreen(type: "termAndCondition")); - }), + cardDecoration( + isDark, + controller, + "assets/icons/ic_privacy_policy.svg", + "Privacy Policy".tr(), + () { + Get.to( + const TermsAndConditionScreen( + type: "privacy", + ), + ); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_tearm_condition.svg", + "Terms and Conditions".tr(), + () { + Get.to( + const TermsAndConditionScreen( + type: "termAndCondition", + ), + ); + }, + ), ], ), ), @@ -232,39 +484,74 @@ class ProfileScreen extends StatelessWidget { const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 6, + ), child: Column( children: [ Constant.userModel == null - ? cardDecoration(isDark, controller, "assets/icons/ic_logout.svg", "Log In".tr(), () { - Get.offAll(const LoginScreen()); - }) - : cardDecoration(isDark, controller, "assets/icons/ic_logout.svg", "Log out".tr(), () { - showDialog( - context: context, - builder: (BuildContext context) { - return CustomDialogBox( - title: "Log out".tr(), - descriptions: "Are you sure you want to log out? You will need to enter your credentials to log back in.".tr(), - positiveString: "Log out".tr(), - negativeString: "Cancel".tr(), - positiveClick: () async { - Constant.userModel!.fcmToken = ""; - await FireStoreUtils.updateUser(Constant.userModel!); - Constant.userModel = null; - await FirebaseAuth.instance.signOut(); - Get.offAll(const LoginScreen()); - }, - negativeClick: () { - Get.back(); - }, - img: Image.asset('assets/images/ic_logout.gif', height: 50, width: 50), - ); - }, - ); - }), + ? cardDecoration( + isDark, + controller, + "assets/icons/ic_logout.svg", + "Log In".tr(), + () { + Get.offAll(const LoginScreen()); + }, + ) + : cardDecoration( + isDark, + controller, + "assets/icons/ic_logout.svg", + "Log out".tr(), + () { + showDialog( + context: context, + builder: (BuildContext context) { + return CustomDialogBox( + title: "Log out".tr(), + descriptions: + "Are you sure you want to log out? You will need to enter your credentials to log back in." + .tr(), + positiveString: "Log out".tr(), + negativeString: "Cancel".tr(), + positiveClick: () async { + Constant.userModel!.fcmToken = + ""; + await FireStoreUtils.updateUser( + Constant.userModel!, + ); + Constant.userModel = null; + await FirebaseAuth.instance + .signOut(); + Get.offAll( + const LoginScreen(), + ); + }, + negativeClick: () { + Get.back(); + }, + img: Image.asset( + 'assets/images/ic_logout.gif', + height: 50, + width: 50, + ), + ); + }, + ); + }, + ), ], ), ), @@ -273,7 +560,9 @@ class ProfileScreen extends StatelessWidget { Constant.userModel == null ? const SizedBox() : Padding( - padding: const EdgeInsets.symmetric(vertical: 20), + padding: const EdgeInsets.symmetric( + vertical: 20, + ), child: InkWell( onTap: () { showDialog( @@ -281,40 +570,66 @@ class ProfileScreen extends StatelessWidget { builder: (BuildContext context) { return CustomDialogBox( title: "Delete Account".tr(), - descriptions: "Are you sure you want to delete your account? This action is irreversible and will permanently remove all your data.".tr(), + descriptions: + "Are you sure you want to delete your account? This action is irreversible and will permanently remove all your data." + .tr(), positiveString: "Delete".tr(), negativeString: "Cancel".tr(), positiveClick: () async { - ShowToastDialog.showLoader("Please wait...".tr()); - await controller.deleteUserFromServer(); - await FireStoreUtils.deleteUser().then((value) { + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); + await controller + .deleteUserFromServer(); + await FireStoreUtils.deleteUser().then(( + value, + ) { ShowToastDialog.closeLoader(); if (value == true) { - ShowToastDialog.showToast("Account deleted successfully".tr()); + ShowToastDialog.showToast( + "Account deleted successfully" + .tr(), + ); Get.offAll(const LoginScreen()); } else { - ShowToastDialog.showToast("Contact Administrator".tr()); + ShowToastDialog.showToast( + "Contact Administrator".tr(), + ); } }); }, negativeClick: () { Get.back(); }, - img: Image.asset('assets/icons/delete_dialog.gif', height: 50, width: 50), + img: Image.asset( + 'assets/icons/delete_dialog.gif', + height: 50, + width: 50, + ), ); }, ); }, child: Row( mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_delete.svg"), + SvgPicture.asset( + "assets/icons/ic_delete.svg", + ), const SizedBox(width: 10), Text( "Delete Account".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.danger300 : AppThemeData.danger300), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.danger300 + : AppThemeData.danger300, + ), ), ], ), @@ -324,7 +639,14 @@ class ProfileScreen extends StatelessWidget { child: Text( "V : ${Constant.appVersion}", textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), ], @@ -338,7 +660,13 @@ class ProfileScreen extends StatelessWidget { ); } - Padding cardDecoration(bool isDark, MyProfileController controller, String image, String title, Function()? onPress) { + Padding cardDecoration( + bool isDark, + MyProfileController controller, + String image, + String title, + Function()? onPress, + ) { return Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: InkWell( @@ -348,7 +676,18 @@ class ProfileScreen extends StatelessWidget { }, child: Row( children: [ - SvgPicture.asset(image, colorFilter: title == "Log In".tr() || title == "Cashbacks".tr() ? const ColorFilter.mode(AppThemeData.success500, BlendMode.srcIn) : null, height: 24, width: 24), + SvgPicture.asset( + image, + colorFilter: + title == "Log In".tr() || title == "Cashbacks".tr() + ? const ColorFilter.mode( + AppThemeData.success500, + BlendMode.srcIn, + ) + : null, + height: 24, + width: 24, + ), const SizedBox(width: 10), Expanded( child: Text( @@ -362,16 +701,28 @@ class ProfileScreen extends StatelessWidget { ? AppThemeData.danger300 : title == "Log In".tr() ? AppThemeData.success500 - : (isDark ? AppThemeData.grey100 : AppThemeData.grey800), + : (isDark + ? AppThemeData.grey100 + : AppThemeData.grey800), ), ), ), title == "Dark Mode".tr() ? Transform.scale( scale: 0.8, - child: Obx(() => CupertinoSwitch(value: controller.isDarkModeSwitch.value, activeTrackColor: AppThemeData.primary300, onChanged: controller.toggleDarkMode)), + child: Obx( + () => CupertinoSwitch( + value: controller.isDarkModeSwitch.value, + activeTrackColor: AppThemeData.primary300, + onChanged: controller.toggleDarkMode, + ), + ), ) - : Icon(Icons.keyboard_arrow_right, color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700), + : Icon( + Icons.keyboard_arrow_right, + color: + isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, + ), ], ), ), diff --git a/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart b/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart index 840a7d1..3dfc208 100644 --- a/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart +++ b/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart @@ -10,7 +10,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:image_picker/image_picker.dart'; import '../../../controllers/theme_controller.dart'; @@ -27,33 +27,75 @@ class RateProductScreen extends StatelessWidget { init: RateProductController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Rate the item".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Rate the item".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: SingleChildScrollView( child: Column( children: [ Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 20, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Rate for".tr(), style: TextStyle(color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.medium)), Text( - "${controller.productModel.value.name}".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 18, fontFamily: AppThemeData.semiBold), + "Rate for".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.medium, + ), + ), + Text( + "${controller.productModel.value.name}" + .tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 18, + fontFamily: AppThemeData.semiBold, + ), ), const SizedBox(height: 10), RatingBar.builder( @@ -62,42 +104,109 @@ class RateProductScreen extends StatelessWidget { direction: Axis.horizontal, itemCount: 5, itemSize: 26, - unratedColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, - itemPadding: const EdgeInsets.symmetric(horizontal: 6.0), - itemBuilder: (context, _) => const Icon(Icons.star, color: AppThemeData.warning300), + unratedColor: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + itemPadding: const EdgeInsets.symmetric( + horizontal: 6.0, + ), + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: AppThemeData.warning300, + ), onRatingUpdate: (double rate) { controller.ratings.value = rate; }, ), - Padding(padding: const EdgeInsets.symmetric(vertical: 20), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 20, + ), + child: MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + ), ListView.builder( - itemCount: controller.reviewAttributeList.length, + itemCount: + controller.reviewAttributeList.length, shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), + physics: + const NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (context, index) { return Padding( - padding: const EdgeInsets.symmetric(vertical: 2), + padding: const EdgeInsets.symmetric( + vertical: 2, + ), child: Row( children: [ Expanded( child: Text( - controller.reviewAttributeList[index].title.toString(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16, fontFamily: AppThemeData.semiBold), + controller + .reviewAttributeList[index] + .title + .toString(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData + .grey900, + fontSize: 16, + fontFamily: + AppThemeData.semiBold, + ), ), ), RatingBar.builder( initialRating: - controller.ratingModel.value.id == null ? 0.0 : controller.ratingModel.value.reviewAttributes?[controller.reviewAttributeList[index].id] ?? 0.0, + controller + .ratingModel + .value + .id == + null + ? 0.0 + : controller + .ratingModel + .value + .reviewAttributes?[controller + .reviewAttributeList[index] + .id] ?? + 0.0, minRating: 1, direction: Axis.horizontal, itemCount: 5, itemSize: 18, - unratedColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, - itemPadding: const EdgeInsets.symmetric(horizontal: 2.0), - itemBuilder: (context, _) => const Icon(Icons.star, color: AppThemeData.warning300), + unratedColor: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + itemPadding: + const EdgeInsets.symmetric( + horizontal: 2.0, + ), + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: + AppThemeData.warning300, + ), onRatingUpdate: (double rate) { - controller.reviewAttribute.addEntries([MapEntry(controller.reviewAttributeList[index].id.toString(), rate)]); + controller.reviewAttribute + .addEntries([ + MapEntry( + controller + .reviewAttributeList[index] + .id + .toString(), + rate, + ), + ]); }, ), ], @@ -110,34 +219,72 @@ class RateProductScreen extends StatelessWidget { options: RoundedRectDottedBorderOptions( radius: const Radius.circular(12), dashPattern: const [6, 6, 6, 6], - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, ), child: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, borderRadius: const BorderRadius.all(Radius.circular(12))), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + borderRadius: const BorderRadius.all( + Radius.circular(12), + ), + ), child: SizedBox( height: Responsive.height(20, context), width: Responsive.width(90, context), child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, children: [ - SvgPicture.asset('assets/icons/ic_folder.svg'), + SvgPicture.asset( + 'assets/icons/ic_folder.svg', + ), const SizedBox(height: 10), Text( - "Choose a image and upload here".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.medium, fontSize: 16), + "Choose a image and upload here" + .tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontFamily: AppThemeData.medium, + fontSize: 16, + ), ), const SizedBox(height: 5), - Text("JPEG, PNG".tr(), style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700, fontFamily: AppThemeData.regular)), + Text( + "JPEG, PNG".tr(), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + fontFamily: + AppThemeData.regular, + ), + ), const SizedBox(height: 10), RoundedButtonFill( title: "Brows Image".tr(), color: AppThemeData.primary50, width: 30, height: 5, - textColor: AppThemeData.primary300, + textColor: + AppThemeData.primary300, onPress: () async { - buildBottomSheet(context, controller); + buildBottomSheet( + context, + controller, + ); }, ), ], @@ -154,21 +301,54 @@ class RateProductScreen extends StatelessWidget { children: [ Expanded( child: ListView.builder( - itemCount: controller.images.length, + itemCount: + controller.images.length, shrinkWrap: true, - scrollDirection: Axis.horizontal, + scrollDirection: + Axis.horizontal, // physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { return Padding( - padding: const EdgeInsets.symmetric(horizontal: 5), + padding: + const EdgeInsets.symmetric( + horizontal: 5, + ), child: Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: + const BorderRadius.all( + Radius.circular( + 10, + ), + ), child: - (controller.images[index] is XFile) - ? Image.file(File((controller.images[index] as XFile).path), fit: BoxFit.cover, width: 80, height: 80) - : NetworkImageWidget(imageUrl: controller.images[index]?.toString() ?? '', fit: BoxFit.cover, width: 80, height: 80), + (controller.images[index] + is XFile) + ? Image.file( + File( + (controller.images[index] + as XFile) + .path, + ), + fit: + BoxFit + .cover, + width: 80, + height: 80, + ) + : NetworkImageWidget( + imageUrl: + controller + .images[index] + ?.toString() ?? + '', + fit: + BoxFit + .cover, + width: 80, + height: 80, + ), // controller.images[index].runtimeType == XFile // ? Image.file(File(controller.images[index].path), fit: BoxFit.cover, width: 80, height: 80) // : NetworkImageWidget(imageUrl: controller.images[index], fit: BoxFit.cover, width: 80, height: 80), @@ -180,9 +360,19 @@ class RateProductScreen extends StatelessWidget { right: 0, child: InkWell( onTap: () { - controller.images.removeAt(index); + controller.images + .removeAt( + index, + ); }, - child: const Icon(Icons.remove_circle, size: 28, color: AppThemeData.danger300), + child: const Icon( + Icons + .remove_circle, + size: 28, + color: + AppThemeData + .danger300, + ), ), ), ], @@ -199,26 +389,49 @@ class RateProductScreen extends StatelessWidget { options: RoundedRectDottedBorderOptions( radius: const Radius.circular(12), dashPattern: const [6, 6, 6, 6], - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, ), child: TextFormField( keyboardType: TextInputType.text, - textCapitalization: TextCapitalization.sentences, - controller: controller.commentController.value, + textCapitalization: + TextCapitalization.sentences, + controller: + controller.commentController.value, maxLines: 4, textInputAction: TextInputAction.done, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + ), decoration: InputDecoration( - errorStyle: const TextStyle(color: Colors.red), + errorStyle: const TextStyle( + color: Colors.red, + ), filled: true, - fillColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + fillColor: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, disabledBorder: InputBorder.none, focusedBorder: InputBorder.none, enabledBorder: InputBorder.none, errorBorder: InputBorder.none, border: InputBorder.none, hintText: "Type comment".tr(), - hintStyle: TextStyle(fontSize: 14, color: isDark ? AppThemeData.grey600 : AppThemeData.grey400, fontFamily: AppThemeData.regular), + hintStyle: TextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.grey600 + : AppThemeData.grey400, + fontFamily: AppThemeData.regular, + ), ), ), ), @@ -251,7 +464,10 @@ class RateProductScreen extends StatelessWidget { ); } - Future buildBottomSheet(BuildContext context, RateProductController controller) { + Future buildBottomSheet( + BuildContext context, + RateProductController controller, + ) { return showModalBottomSheet( context: context, builder: (context) { @@ -266,7 +482,15 @@ class RateProductScreen extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(top: 15), - child: Text("Please Select".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.bold, fontSize: 16)), + child: Text( + "Please Select".tr(), + style: TextStyle( + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.bold, + fontSize: 16, + ), + ), ), Row( mainAxisAlignment: MainAxisAlignment.center, @@ -277,8 +501,17 @@ class RateProductScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - IconButton(onPressed: () => controller.pickFile(source: ImageSource.camera), icon: const Icon(Icons.camera_alt, size: 32)), - Padding(padding: const EdgeInsets.only(top: 3), child: Text("Camera".tr())), + IconButton( + onPressed: + () => controller.pickFile( + source: ImageSource.camera, + ), + icon: const Icon(Icons.camera_alt, size: 32), + ), + Padding( + padding: const EdgeInsets.only(top: 3), + child: Text("Camera".tr()), + ), ], ), ), @@ -288,8 +521,20 @@ class RateProductScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - IconButton(onPressed: () => controller.pickFile(source: ImageSource.gallery), icon: const Icon(Icons.photo_library_sharp, size: 32)), - Padding(padding: const EdgeInsets.only(top: 3), child: Text("Gallery".tr())), + IconButton( + onPressed: + () => controller.pickFile( + source: ImageSource.gallery, + ), + icon: const Icon( + Icons.photo_library_sharp, + size: 32, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 3), + child: Text("Gallery".tr()), + ), ], ), ), diff --git a/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart b/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart index c8a1bbd..799ae8c 100644 --- a/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart +++ b/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart @@ -7,7 +7,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:share_plus/share_plus.dart'; import '../../../controllers/theme_controller.dart'; @@ -30,9 +30,16 @@ class ReferFriendScreen extends StatelessWidget { : Container( width: Responsive.width(100, context), height: Responsive.height(100, context), - decoration: const BoxDecoration(image: DecorationImage(image: AssetImage("assets/images/refer_friend.png"), fit: BoxFit.fill)), + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/refer_friend.png"), + fit: BoxFit.fill, + ), + ), child: Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( @@ -42,30 +49,56 @@ class ReferFriendScreen extends StatelessWidget { onTap: () { Get.back(); }, - child: const Icon(Icons.arrow_back, color: AppThemeData.grey50), + child: const Icon( + Icons.arrow_back, + color: AppThemeData.grey50, + ), ), Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ const SizedBox(height: 60), - Center(child: SvgPicture.asset("assets/images/referal_top.svg")), + Center( + child: SvgPicture.asset( + "assets/images/referal_top.svg", + ), + ), const SizedBox(height: 10), Text( "Refer your friend and earn".tr(), - style: TextStyle(fontSize: 22, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 22, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), const SizedBox(width: 4), Text( "${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount)} ${'Each🎉'.tr()}", - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 32), Text( "Invite Friends & Businesses".tr(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.ecommerce100 : AppThemeData.ecommerceDark100, + color: + isDark + ? AppThemeData.ecommerce100 + : AppThemeData.ecommerceDark100, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500, ), @@ -75,25 +108,60 @@ class ReferFriendScreen extends StatelessWidget { "${'Invite your friends to sign up with Foodie using your code, and you’ll earn'.tr()} ${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount)} ${'after their Success the first order! 💸🍔'.tr()}" .tr(), textAlign: TextAlign.center, - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 40), Container( decoration: ShapeDecoration( - gradient: const LinearGradient(begin: Alignment(0.00, -1.00), end: Alignment(0, 1), colors: [Color(0xFF271366), Color(0xFF4826B2)]), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), - shadows: const [BoxShadow(color: Color(0x14FFFFFF), blurRadius: 120, offset: Offset(0, 0), spreadRadius: 0)], + gradient: const LinearGradient( + begin: Alignment(0.00, -1.00), + end: Alignment(0, 1), + colors: [ + Color(0xFF271366), + Color(0xFF4826B2), + ], + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + shadows: const [ + BoxShadow( + color: Color(0x14FFFFFF), + blurRadius: 120, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 80, vertical: 16), + padding: const EdgeInsets.symmetric( + horizontal: 80, + vertical: 16, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Text( - controller.referralModel.value.referralCode.toString(), + controller + .referralModel + .value + .referralCode + .toString(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.ecommerce100 : AppThemeData.ecommerceDark100, + color: + isDark + ? AppThemeData.ecommerce100 + : AppThemeData + .ecommerceDark100, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500, ), @@ -101,34 +169,74 @@ class ReferFriendScreen extends StatelessWidget { const SizedBox(width: 10), InkWell( onTap: () { - Clipboard.setData(ClipboardData(text: controller.referralModel.value.referralCode.toString())); - ShowToastDialog.showToast("Copied".tr()); + Clipboard.setData( + ClipboardData( + text: + controller + .referralModel + .value + .referralCode + .toString(), + ), + ); + ShowToastDialog.showToast( + "Copied".tr(), + ); }, - child: const Icon(Icons.copy, color: AppThemeData.ecommerce100), + child: const Icon( + Icons.copy, + color: AppThemeData.ecommerce100, + ), ), ], ), ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 40), + padding: const EdgeInsets.symmetric( + horizontal: 40, + ), child: Row( children: [ - Expanded(child: Divider(thickness: 1, color: isDark ? AppThemeData.ecommerce100 : AppThemeData.ecommerceDark100)), + Expanded( + child: Divider( + thickness: 1, + color: + isDark + ? AppThemeData.ecommerce100 + : AppThemeData + .ecommerceDark100, + ), + ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 30), + padding: const EdgeInsets.symmetric( + horizontal: 20, + vertical: 30, + ), child: Text( "or".tr(), textAlign: TextAlign.center, style: TextStyle( - color: isDark ? AppThemeData.ecommerce100 : AppThemeData.ecommerceDark100, + color: + isDark + ? AppThemeData.ecommerce100 + : AppThemeData + .ecommerceDark100, fontSize: 12, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, ), ), ), - Expanded(child: Divider(color: isDark ? AppThemeData.ecommerce100 : AppThemeData.ecommerceDark100)), + Expanded( + child: Divider( + color: + isDark + ? AppThemeData.ecommerce100 + : AppThemeData + .ecommerceDark100, + ), + ), ], ), ), diff --git a/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart b/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart index 5f6f69e..0112d26 100644 --- a/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart @@ -17,8 +17,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -52,14 +51,32 @@ class RestaurantDetailsScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text('${cartItem.length} ${"items".tr()}', style: TextStyle(fontFamily: AppThemeData.medium, color: AppThemeData.grey50, fontSize: 16)), - Text('View Cart'.tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: AppThemeData.grey50, fontSize: 16, fontWeight: FontWeight.bold)), + Text( + '${cartItem.length} ${"items".tr()}', + style: TextStyle( + fontFamily: AppThemeData.medium, + color: AppThemeData.grey50, + fontSize: 16, + ), + ), + Text( + 'View Cart'.tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: AppThemeData.grey50, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), ], ), ), ), body: NestedScrollView( - headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { + headerSliverBuilder: ( + BuildContext context, + bool innerBoxIsScrolled, + ) { return [ SliverAppBar( expandedHeight: Responsive.height(30, context), @@ -73,24 +90,48 @@ class RestaurantDetailsScreen extends StatelessWidget { onTap: () { Get.back(); }, - child: Icon(Icons.arrow_back, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + child: Icon( + Icons.arrow_back, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), const Expanded(child: SizedBox()), Visibility( - visible: (controller.vendorModel.value.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (controller.vendorModel.value.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: BoxDecoration( color: AppThemeData.primary300, - borderRadius: BorderRadius.circular(120), // Optional + borderRadius: BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), const SizedBox(width: 5), - Text("Free Delivery".tr(), style: TextStyle(fontSize: 14, color: AppThemeData.carRent600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600)), + Text( + "Free Delivery".tr(), + style: TextStyle( + fontSize: 14, + color: AppThemeData.carRent600, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), + ), ], ), ), @@ -100,21 +141,55 @@ class RestaurantDetailsScreen extends StatelessWidget { ), InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == controller.vendorModel.value.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: controller.vendorModel.value.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == controller.vendorModel.value.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => + p0.restaurantId == + controller.vendorModel.value.id, + ) + .isNotEmpty) { + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: controller.vendorModel.value.id, + userId: FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => + item.restaurantId == + controller.vendorModel.value.id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: controller.vendorModel.value.id, userId: FireStoreUtils.getCurrentUid()); + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: controller.vendorModel.value.id, + userId: FireStoreUtils.getCurrentUid(), + ); controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == controller.vendorModel.value.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg", colorFilter: const ColorFilter.mode(AppThemeData.grey50, BlendMode.srcIn)) - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == + controller.vendorModel.value.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + colorFilter: const ColorFilter.mode( + AppThemeData.grey50, + BlendMode.srcIn, + ), + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), const SizedBox(width: 10), @@ -128,16 +203,30 @@ class RestaurantDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, ), ), - badgeStyle: badges.BadgeStyle(shape: badges.BadgeShape.circle, badgeColor: AppThemeData.ecommerce300), + badgeStyle: badges.BadgeStyle( + shape: badges.BadgeShape.circle, + badgeColor: AppThemeData.ecommerce300, + ), child: InkWell( onTap: () { Get.to(const CartScreen()); }, child: ClipOval( - child: SvgPicture.asset("assets/icons/ic_shoping_cart.svg", width: 24, height: 24, colorFilter: const ColorFilter.mode(AppThemeData.grey50, BlendMode.srcIn)), + child: SvgPicture.asset( + "assets/icons/ic_shoping_cart.svg", + width: 24, + height: 24, + colorFilter: const ColorFilter.mode( + AppThemeData.grey50, + BlendMode.srcIn, + ), + ), ), ), ), @@ -147,18 +236,28 @@ class RestaurantDetailsScreen extends StatelessWidget { flexibleSpace: FlexibleSpaceBar( background: Stack( children: [ - controller.vendorModel.value.photos == null || controller.vendorModel.value.photos!.isEmpty + controller.vendorModel.value.photos == null || + controller.vendorModel.value.photos!.isEmpty ? Stack( children: [ NetworkImageWidget( - imageUrl: controller.vendorModel.value.photo.toString(), + imageUrl: + controller.vendorModel.value.photo + .toString(), fit: BoxFit.cover, width: Responsive.width(100, context), height: Responsive.height(40, context), ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), Colors.black]), + gradient: LinearGradient( + begin: const Alignment(0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + Colors.black, + ], + ), ), ), ], @@ -167,18 +266,32 @@ class RestaurantDetailsScreen extends StatelessWidget { physics: const BouncingScrollPhysics(), controller: controller.pageController.value, scrollDirection: Axis.horizontal, - itemCount: controller.vendorModel.value.photos!.length, + itemCount: + controller.vendorModel.value.photos!.length, padEnds: false, pageSnapping: true, allowImplicitScrolling: true, itemBuilder: (BuildContext context, int index) { - String image = controller.vendorModel.value.photos![index]; + String image = + controller.vendorModel.value.photos![index]; return Stack( children: [ - NetworkImageWidget(imageUrl: image.toString(), fit: BoxFit.cover, width: Responsive.width(100, context), height: Responsive.height(40, context)), + NetworkImageWidget( + imageUrl: image.toString(), + fit: BoxFit.cover, + width: Responsive.width(100, context), + height: Responsive.height(40, context), + ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), Colors.black]), + gradient: LinearGradient( + begin: const Alignment(0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + Colors.black, + ], + ), ), ), ], @@ -192,17 +305,26 @@ class RestaurantDetailsScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - children: List.generate(controller.vendorModel.value.photos!.length, (index) { - return Obx( - () => Container( - margin: const EdgeInsets.only(right: 5), - alignment: Alignment.centerLeft, - height: 9, - width: 9, - decoration: BoxDecoration(shape: BoxShape.circle, color: controller.currentPage.value == index ? AppThemeData.primary300 : AppThemeData.grey300), - ), - ); - }), + children: List.generate( + controller.vendorModel.value.photos!.length, + (index) { + return Obx( + () => Container( + margin: const EdgeInsets.only(right: 5), + alignment: Alignment.centerLeft, + height: 9, + width: 9, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + controller.currentPage.value == index + ? AppThemeData.primary300 + : AppThemeData.grey300, + ), + ), + ); + }, + ), ), ), ], @@ -223,38 +345,64 @@ class RestaurantDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.vendorModel.value.title.toString(), + controller.vendorModel.value.title + .toString(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( fontSize: 22, overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), SizedBox( - width: Responsive.width(78, context), + width: Responsive.width( + 78, + context, + ), child: Text( - controller.vendorModel.value.location.toString(), + controller + .vendorModel + .value + .location + .toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, color: isDark ? AppThemeData.grey400 : AppThemeData.grey400), + style: TextStyle( + fontFamily: + AppThemeData.medium, + fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey400, + ), ), ), ], @@ -264,21 +412,60 @@ class RestaurantDetailsScreen extends StatelessWidget { children: [ Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(120), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), + padding: + const EdgeInsets.symmetric( + horizontal: 12, + vertical: 4, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( Constant.calculateReview( - reviewCount: controller.vendorModel.value.reviewsCount.toString(), - reviewSum: controller.vendorModel.value.reviewsSum.toString(), + reviewCount: + controller + .vendorModel + .value + .reviewsCount + .toString(), + reviewSum: + controller + .vendorModel + .value + .reviewsSum + .toString(), + ), + style: TextStyle( + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), ), ], ), @@ -286,23 +473,45 @@ class RestaurantDetailsScreen extends StatelessWidget { ), InkWell( onTap: () { - Get.to(const ReviewListScreen(), arguments: {"vendorModel": controller.vendorModel.value}); + Get.to( + const ReviewListScreen(), + arguments: { + "vendorModel": + controller + .vendorModel + .value, + }, + ); }, child: Text( "${controller.vendorModel.value.reviewsCount} ${'Ratings'.tr()}", - style: TextStyle(decoration: TextDecoration.underline, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700, fontFamily: AppThemeData.regular), + style: TextStyle( + decoration: + TextDecoration.underline, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + fontFamily: + AppThemeData.regular, + ), ), ), ], ), ], ), - Constant.sectionConstantModel!.serviceTypeFlag == "ecommerce-service" + Constant + .sectionConstantModel! + .serviceTypeFlag == + "ecommerce-service" ? SizedBox() : Row( children: [ Text( - controller.isOpen.value ? "Open".tr() : "Close".tr(), + controller.isOpen.value + ? "Open".tr() + : "Close".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -310,16 +519,41 @@ class RestaurantDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: controller.isOpen.value ? AppThemeData.success400 : AppThemeData.danger300, + color: + controller.isOpen.value + ? AppThemeData.success400 + : AppThemeData.danger300, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), + child: Icon( + Icons.circle, + size: 5, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, ), ), - Padding(padding: const EdgeInsets.symmetric(horizontal: 10), child: Icon(Icons.circle, size: 5, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500)), InkWell( onTap: () { - if (controller.vendorModel.value.workingHours!.isEmpty) { - ShowToastDialog.showToast("Timing is not added by store".tr()); + if (controller + .vendorModel + .value + .workingHours! + .isEmpty) { + ShowToastDialog.showToast( + "Timing is not added by store" + .tr(), + ); } else { - timeShowBottomSheet(context, controller); + timeShowBottomSheet( + context, + controller, + ); } }, child: Text( @@ -328,24 +562,45 @@ class RestaurantDetailsScreen extends StatelessWidget { maxLines: 1, style: TextStyle( fontSize: 14, - decoration: TextDecoration.underline, - decorationColor: AppThemeData.ecommerce300, + decoration: + TextDecoration.underline, + decorationColor: + AppThemeData.ecommerce300, overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, ), ), ), ], ), - controller.vendorModel.value.dineInActive == true || (controller.vendorModel.value.openDineTime != null && controller.vendorModel.value.openDineTime!.isNotEmpty) + controller.vendorModel.value.dineInActive == + true || + (controller + .vendorModel + .value + .openDineTime != + null && + controller + .vendorModel + .value + .openDineTime! + .isNotEmpty) ? Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ const SizedBox(height: 20), Text( - "Also applicable on table booking".tr(), + "Also applicable on table booking" + .tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -353,52 +608,106 @@ class RestaurantDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), InkWell( onTap: () { - Get.to(const DineInDetailsScreen(), arguments: {"vendorModel": controller.vendorModel.value}); + Get.to( + const DineInDetailsScreen(), + arguments: { + "vendorModel": + controller + .vendorModel + .value, + }, + ); }, child: Container( height: 80, clipBehavior: Clip.antiAlias, decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), - borderRadius: BorderRadius.circular(16), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey900 + : AppThemeData + .grey50, + ), + borderRadius: + BorderRadius.circular(16), ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - Image.asset("assets/images/ic_table.gif"), + Image.asset( + "assets/images/ic_table.gif", + ), const SizedBox(width: 10), Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( - "Table Booking".tr(), + "Table Booking" + .tr(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), Text( - "Quick Conformations".tr(), + "Quick Conformations" + .tr(), style: TextStyle( fontSize: 12, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight + .w500, ), ), ], @@ -415,7 +724,8 @@ class RestaurantDetailsScreen extends StatelessWidget { controller.couponList.isEmpty ? const SizedBox() : Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ const SizedBox(height: 20), Text( @@ -427,11 +737,16 @@ class RestaurantDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), - CouponListView(controller: controller), + CouponListView( + controller: controller, + ), ], ), const SizedBox(height: 20), @@ -444,26 +759,42 @@ class RestaurantDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), TextFieldWidget( - controller: controller.searchEditingController.value, - hintText: 'Search the item and more...'.tr(), + controller: + controller + .searchEditingController + .value, + hintText: + 'Search the item and more...'.tr(), onchange: (value) { controller.searchProduct(value); }, - prefix: Padding(padding: const EdgeInsets.all(12), child: SvgPicture.asset("assets/icons/ic_search.svg")), + prefix: Padding( + padding: const EdgeInsets.all(12), + child: SvgPicture.asset( + "assets/icons/ic_search.svg", + ), + ), ), const SizedBox(height: 10), - Constant.sectionConstantModel!.isProductDetails == false + Constant + .sectionConstantModel! + .isProductDetails == + false ? SizedBox() : Row( children: [ InkWell( onTap: () { - if (controller.isVag.value == true) { + if (controller.isVag.value == + true) { controller.isVag.value = false; } else { controller.isVag.value = true; @@ -471,30 +802,83 @@ class RestaurantDetailsScreen extends StatelessWidget { controller.filterRecord(); }, child: Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: + const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), decoration: controller.isVag.value ? ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: AppThemeData.primary300), borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .primary600 + : AppThemeData + .primary50, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + AppThemeData + .primary300, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), ) : ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), ), ), child: Row( mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_veg.svg", height: 20, width: 20), + SvgPicture.asset( + "assets/icons/ic_veg.svg", + height: 20, + width: 20, + ), const SizedBox(width: 8), Text( 'Veg'.tr(), - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, + ), ), ], ), @@ -503,38 +887,94 @@ class RestaurantDetailsScreen extends StatelessWidget { const SizedBox(width: 10), InkWell( onTap: () { - if (controller.isNonVag.value == true) { - controller.isNonVag.value = false; + if (controller.isNonVag.value == + true) { + controller.isNonVag.value = + false; } else { - controller.isNonVag.value = true; + controller.isNonVag.value = + true; } controller.filterRecord(); }, child: Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: + const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), decoration: controller.isNonVag.value ? ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: AppThemeData.primary300), borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .primary600 + : AppThemeData + .primary50, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + AppThemeData + .primary300, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), ) : ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), ), ), child: Row( mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_nonveg.svg", height: 20, width: 20), + SvgPicture.asset( + "assets/icons/ic_nonveg.svg", + height: 20, + width: 20, + ), const SizedBox(width: 8), Text( 'Non Veg'.tr(), - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, + ), ), ], ), @@ -631,12 +1071,17 @@ class RestaurantDetailsScreen extends StatelessWidget { ); } - Future timeShowBottomSheet(BuildContext context, RestaurantDetailsController productModel) { + Future timeShowBottomSheet( + BuildContext context, + RestaurantDetailsController productModel, + ) { return showModalBottomSheet( context: context, isScrollControlled: true, isDismissible: true, - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(30))), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(30)), + ), clipBehavior: Clip.antiAliasWithSaveLayer, builder: (context) => FractionallySizedBox( @@ -646,7 +1091,8 @@ class RestaurantDetailsScreen extends StatelessWidget { final themeController = Get.find(); final isDark = themeController.isDark.value; return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( @@ -658,7 +1104,15 @@ class RestaurantDetailsScreen extends StatelessWidget { width: 134, height: 5, margin: const EdgeInsets.only(bottom: 6), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey50 : AppThemeData.grey800, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(3))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey800, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(3), + ), + ), ), ), ), @@ -666,11 +1120,22 @@ class RestaurantDetailsScreen extends StatelessWidget { child: ListView.builder( shrinkWrap: true, physics: const BouncingScrollPhysics(), - itemCount: productModel.vendorModel.value.workingHours!.length, + itemCount: + productModel + .vendorModel + .value + .workingHours! + .length, itemBuilder: (context, dayIndex) { - WorkingHours workingHours = productModel.vendorModel.value.workingHours![dayIndex]; + WorkingHours workingHours = + productModel + .vendorModel + .value + .workingHours![dayIndex]; return Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -683,34 +1148,72 @@ class RestaurantDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), - workingHours.timeslot == null || workingHours.timeslot!.isEmpty + workingHours.timeslot == null || + workingHours.timeslot!.isEmpty ? const SizedBox() : ListView.builder( shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: workingHours.timeslot!.length, + physics: + const NeverScrollableScrollPhysics(), + itemCount: + workingHours.timeslot!.length, itemBuilder: (context, timeIndex) { - Timeslot timeSlotModel = workingHours.timeslot![timeIndex]; + Timeslot timeSlotModel = + workingHours + .timeslot![timeIndex]; return Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all( + 8.0, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Container( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(12)), - border: Border.all(color: isDark ? AppThemeData.grey400 : AppThemeData.grey200), + borderRadius: + const BorderRadius.all( + Radius.circular( + 12, + ), + ), + border: Border.all( + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey200, + ), ), child: Center( child: Text( - timeSlotModel.from.toString(), - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + timeSlotModel.from + .toString(), + style: TextStyle( + fontFamily: + AppThemeData + .medium, + fontSize: 14, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + ), ), ), ), @@ -718,15 +1221,42 @@ class RestaurantDetailsScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Container( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(12)), - border: Border.all(color: isDark ? AppThemeData.grey400 : AppThemeData.grey200), + borderRadius: + const BorderRadius.all( + Radius.circular( + 12, + ), + ), + border: Border.all( + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey200, + ), ), child: Center( child: Text( - timeSlotModel.to.toString(), - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + timeSlotModel.to + .toString(), + style: TextStyle( + fontFamily: + AppThemeData + .medium, + fontSize: 14, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + ), ), ), ), @@ -775,10 +1305,19 @@ class CouponListView extends StatelessWidget { clipBehavior: Clip.antiAlias, decoration: ShapeDecoration( color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100), borderRadius: BorderRadius.circular(16)), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + ), + borderRadius: BorderRadius.circular(16), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: SizedBox( width: Responsive.width(80, context), child: Row( @@ -786,11 +1325,28 @@ class CouponListView extends StatelessWidget { children: [ Container( width: 60, - decoration: const BoxDecoration(image: DecorationImage(image: AssetImage("assets/images/offer_gif.gif"), fit: BoxFit.fill)), + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/offer_gif.gif"), + fit: BoxFit.fill, + ), + ), child: Center( child: Text( - offerModel.discountType == "Fix Price" ? Constant.amountShow(amount: offerModel.discount) : "${offerModel.discount}%", - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, fontSize: 12), + offerModel.discountType == "Fix Price" + ? Constant.amountShow( + amount: offerModel.discount, + ) + : "${offerModel.discount}%", + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + fontSize: 12, + ), ), ), ), @@ -801,11 +1357,21 @@ class CouponListView extends StatelessWidget { children: [ Text( offerModel.description.toString(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), InkWell( onTap: () { - Clipboard.setData(ClipboardData(text: offerModel.code.toString())).then((value) { + Clipboard.setData( + ClipboardData(text: offerModel.code.toString()), + ).then((value) { ShowToastDialog.showToast("Copied".tr()); }); }, @@ -813,15 +1379,36 @@ class CouponListView extends StatelessWidget { children: [ Text( offerModel.code.toString(), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), const SizedBox(width: 5), SvgPicture.asset("assets/icons/ic_copy.svg"), - const SizedBox(height: 10, child: VerticalDivider()), + const SizedBox( + height: 10, + child: VerticalDivider(), + ), const SizedBox(width: 5), Text( - Constant.timestampToDateTime(offerModel.expiresAt!), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + Constant.timestampToDateTime( + offerModel.expiresAt!, + ), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), @@ -858,7 +1445,8 @@ class ProductListView extends StatelessWidget { itemCount: controller.vendorCategoryList.length, physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { - VendorCategoryModel vendorCategoryModel = controller.vendorCategoryList[index]; + VendorCategoryModel vendorCategoryModel = + controller.vendorCategoryList[index]; return ExpansionTile( childrenPadding: EdgeInsets.zero, tilePadding: EdgeInsets.zero, @@ -866,17 +1454,33 @@ class ProductListView extends StatelessWidget { initiallyExpanded: true, title: Text( "${vendorCategoryModel.title.toString()} (${controller.productList.where((p0) => p0.categoryID == vendorCategoryModel.id).toList().length})", - style: TextStyle(fontSize: 18, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontSize: 18, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), children: [ Obx( () => ListView.builder( - itemCount: controller.productList.where((p0) => p0.categoryID == vendorCategoryModel.id).toList().length, + itemCount: + controller.productList + .where( + (p0) => p0.categoryID == vendorCategoryModel.id, + ) + .toList() + .length, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (context, index) { - ProductModel productModel = controller.productList.where((p0) => p0.categoryID == vendorCategoryModel.id).toList()[index]; + ProductModel productModel = + controller.productList + .where( + (p0) => p0.categoryID == vendorCategoryModel.id, + ) + .toList()[index]; String price = "0.0"; String disPrice = "0.0"; @@ -885,24 +1489,61 @@ class ProductListView extends StatelessWidget { List selectedIndexArray = []; if (productModel.itemAttribute != null) { if (productModel.itemAttribute!.attributes!.isNotEmpty) { - for (var element in productModel.itemAttribute!.attributes!) { + for (var element + in productModel.itemAttribute!.attributes!) { if (element.attributeOptions!.isNotEmpty) { - selectedVariants.add(productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString()); - selectedIndexVariants.add('${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}'); - selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + selectedVariants.add( + productModel + .itemAttribute! + .attributes![productModel + .itemAttribute! + .attributes! + .indexOf(element)] + .attributeOptions![0] + .toString(), + ); + selectedIndexVariants.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', + ); + selectedIndexArray.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { + if (productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + selectedVariants.join('-'), + ) + .isNotEmpty) { price = Constant.productCommissionPrice( controller.vendorModel.value, - productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0', + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + selectedVariants.join('-'), + ) + .first + .variantPrice ?? + '0', ); disPrice = "0"; } } else { - price = Constant.productCommissionPrice(controller.vendorModel.value, productModel.price.toString()); - disPrice = double.parse(productModel.disPrice.toString()) <= 0 ? "0" : Constant.productCommissionPrice(controller.vendorModel.value, productModel.disPrice.toString()); + price = Constant.productCommissionPrice( + controller.vendorModel.value, + productModel.price.toString(), + ); + disPrice = + double.parse(productModel.disPrice.toString()) <= 0 + ? "0" + : Constant.productCommissionPrice( + controller.vendorModel.value, + productModel.disPrice.toString(), + ); } return Padding( padding: const EdgeInsets.only(bottom: 20), @@ -915,16 +1556,30 @@ class ProductListView extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Constant.sectionConstantModel!.isProductDetails == false + Constant + .sectionConstantModel! + .isProductDetails == + false ? SizedBox() : Row( children: [ - productModel.nonveg == true ? SvgPicture.asset("assets/icons/ic_nonveg.svg") : SvgPicture.asset("assets/icons/ic_veg.svg"), + productModel.nonveg == true + ? SvgPicture.asset( + "assets/icons/ic_nonveg.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_veg.svg", + ), const SizedBox(width: 5), Text( - productModel.nonveg == true ? "Non Veg.".tr() : "Pure veg.".tr(), + productModel.nonveg == true + ? "Non Veg.".tr() + : "Pure veg.".tr(), style: TextStyle( - color: productModel.nonveg == true ? AppThemeData.danger300 : AppThemeData.success400, + color: + productModel.nonveg == true + ? AppThemeData.danger300 + : AppThemeData.success400, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, ), @@ -934,27 +1589,58 @@ class ProductListView extends StatelessWidget { const SizedBox(height: 5), Text( productModel.name.toString(), - style: TextStyle(fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), double.parse(disPrice) <= 0 ? Text( Constant.amountShow(amount: price), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ) : Row( children: [ Text( Constant.amountShow(amount: disPrice), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), const SizedBox(width: 5), Text( Constant.amountShow(amount: price), style: TextStyle( fontSize: 14, - decoration: TextDecoration.lineThrough, - decorationColor: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - color: isDark ? AppThemeData.grey500 : AppThemeData.grey400, + decoration: + TextDecoration.lineThrough, + decorationColor: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, ), @@ -963,11 +1649,24 @@ class ProductListView extends StatelessWidget { ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: const ColorFilter.mode(AppThemeData.warning300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: const ColorFilter.mode( + AppThemeData.warning300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: productModel.reviewsCount!.toStringAsFixed(0), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsCount!.toStringAsFixed(0)})", - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), ], ), @@ -976,7 +1675,10 @@ class ProductListView extends StatelessWidget { maxLines: 2, style: TextStyle( overflow: TextOverflow.ellipsis, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400, ), @@ -987,13 +1689,24 @@ class ProductListView extends StatelessWidget { showDialog( context: context, builder: (BuildContext context) { - return infoDialog(controller, isDark, productModel); + return infoDialog( + controller, + isDark, + productModel, + ); }, ); }, child: Row( children: [ - Icon(Icons.info, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, size: 18), + Icon( + Icons.info, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + size: 18, + ), const SizedBox(width: 8), Text( "Info".tr(), @@ -1001,7 +1714,10 @@ class ProductListView extends StatelessWidget { style: TextStyle( overflow: TextOverflow.ellipsis, fontSize: 16, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400, ), @@ -1013,15 +1729,29 @@ class ProductListView extends StatelessWidget { ), ), ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(16)), + borderRadius: const BorderRadius.all( + Radius.circular(16), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: productModel.photo.toString(), fit: BoxFit.cover, height: Responsive.height(16, context), width: Responsive.width(34, context)), + NetworkImageWidget( + imageUrl: productModel.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height(16, context), + width: Responsive.width(34, context), + ), Container( height: Responsive.height(16, context), width: Responsive.width(34, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), const Color(0xFF111827)]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), Positioned( @@ -1029,159 +1759,381 @@ class ProductListView extends StatelessWidget { top: 10, child: InkWell( onTap: () async { - if (controller.favouriteItemList.where((p0) => p0.productId == productModel.id).isNotEmpty) { - FavouriteItemModel favouriteModel = FavouriteItemModel( + if (controller.favouriteItemList + .where( + (p0) => + p0.productId == productModel.id, + ) + .isNotEmpty) { + FavouriteItemModel + favouriteModel = FavouriteItemModel( productId: productModel.id, - storeId: controller.vendorModel.value.id, - userId: FireStoreUtils.getCurrentUid(), + storeId: + controller.vendorModel.value.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList + .removeWhere( + (item) => + item.productId == + productModel.id, + ); + await FireStoreUtils.removeFavouriteItem( + favouriteModel, ); - controller.favouriteItemList.removeWhere((item) => item.productId == productModel.id); - await FireStoreUtils.removeFavouriteItem(favouriteModel); } else { - FavouriteItemModel favouriteModel = FavouriteItemModel( + FavouriteItemModel + favouriteModel = FavouriteItemModel( productId: productModel.id, - storeId: controller.vendorModel.value.id, - userId: FireStoreUtils.getCurrentUid(), + storeId: + controller.vendorModel.value.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList.add( + favouriteModel, ); - controller.favouriteItemList.add(favouriteModel); - await FireStoreUtils.setFavouriteItem(favouriteModel); + await FireStoreUtils.setFavouriteItem( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteItemList.where((p0) => p0.productId == productModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteItemList + .where( + (p0) => + p0.productId == + productModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), - controller.isOpen.value == false || Constant.userModel == null + controller.isOpen.value == false || + Constant.userModel == null ? const SizedBox() : Positioned( bottom: 10, left: 20, right: 20, child: - selectedVariants.isNotEmpty || (productModel.addOnsTitle != null && productModel.addOnsTitle!.isNotEmpty) + selectedVariants.isNotEmpty || + (productModel.addOnsTitle != + null && + productModel + .addOnsTitle! + .isNotEmpty) ? RoundedButtonFill( title: "Add".tr(), width: 10, height: 4, - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - textColor: AppThemeData.primary300, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + textColor: + AppThemeData.primary300, onPress: () async { - controller.selectedVariants.clear(); - controller.selectedIndexVariants.clear(); - controller.selectedIndexArray.clear(); - controller.selectedAddOns.clear(); + controller.selectedVariants + .clear(); + controller + .selectedIndexVariants + .clear(); + controller.selectedIndexArray + .clear(); + controller.selectedAddOns + .clear(); controller.quantity.value = 1; - if (productModel.itemAttribute != null) { - if (productModel.itemAttribute!.attributes!.isNotEmpty) { - for (var element in productModel.itemAttribute!.attributes!) { - if (element.attributeOptions!.isNotEmpty) { + if (productModel + .itemAttribute != + null) { + if (productModel + .itemAttribute! + .attributes! + .isNotEmpty) { + for (var element + in productModel + .itemAttribute! + .attributes!) { + if (element + .attributeOptions! + .isNotEmpty) { controller.selectedVariants.add( - productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString(), + productModel + .itemAttribute! + .attributes![productModel + .itemAttribute! + .attributes! + .indexOf( + element, + )] + .attributeOptions![0] + .toString(), ); - controller.selectedIndexVariants.add( - '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', - ); - controller.selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + controller + .selectedIndexVariants + .add( + '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', + ); + controller + .selectedIndexArray + .add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - final bool productIsInList = cartItem.any( + final bool + productIsInList = cartItem.any( (product) => product.id == "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", ); if (productIsInList) { - CartProductModel element = cartItem.firstWhere( - (product) => - product.id == - "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", - ); - controller.quantity.value = element.quantity!; - if (element.extras != null) { - for (var element in element.extras!) { - controller.selectedAddOns.add(element); + CartProductModel element = + cartItem.firstWhere( + (product) => + product.id == + "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", + ); + controller + .quantity + .value = + element.quantity!; + if (element.extras != + null) { + for (var element + in element + .extras!) { + controller + .selectedAddOns + .add(element); } } } } else { - if (cartItem.where((product) => product.id == "${productModel.id}").isNotEmpty) { - CartProductModel element = cartItem.firstWhere((product) => product.id == "${productModel.id}"); - controller.quantity.value = element.quantity!; - if (element.extras != null) { - for (var element in element.extras!) { - controller.selectedAddOns.add(element); + if (cartItem + .where( + (product) => + product.id == + "${productModel.id}", + ) + .isNotEmpty) { + CartProductModel element = + cartItem.firstWhere( + (product) => + product.id == + "${productModel.id}", + ); + controller + .quantity + .value = + element.quantity!; + if (element.extras != + null) { + for (var element + in element + .extras!) { + controller + .selectedAddOns + .add(element); } } } } controller.update(); - controller.calculatePrice(productModel); - productDetailsBottomSheet(context, productModel); + controller.calculatePrice( + productModel, + ); + productDetailsBottomSheet( + context, + productModel, + ); }, ) : Obx( () => - cartItem.where((p0) => p0.id == productModel.id).isNotEmpty + cartItem + .where( + (p0) => + p0.id == + productModel + .id, + ) + .isNotEmpty ? Container( - width: Responsive.width(100, context), - height: Responsive.height(4, context), + width: + Responsive.width( + 100, + context, + ), + height: + Responsive.height( + 4, + context, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(200)), + color: + isDark + ? AppThemeData + .grey900 + : AppThemeData + .grey50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 200, + ), + ), ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .center, children: [ InkWell( onTap: () { controller.addToCart( - productModel: productModel, - price: price, - discountPrice: disPrice, - isIncrement: false, - quantity: cartItem.where((p0) => p0.id == productModel.id).first.quantity! - 1, + productModel: + productModel, + price: + price, + discountPrice: + disPrice, + isIncrement: + false, + quantity: + cartItem + .where( + ( + p0, + ) => + p0.id == + productModel.id, + ) + .first + .quantity! - + 1, ); }, - child: Icon(Icons.remove, color: isDark ? AppThemeData.grey50 : AppThemeData.greyDark50), + child: Icon( + Icons.remove, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .greyDark50, + ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 14), + padding: + const EdgeInsets.symmetric( + horizontal: + 14, + ), child: Text( - cartItem.where((p0) => p0.id == productModel.id).first.quantity.toString(), - textAlign: TextAlign.start, + cartItem + .where( + (p0) => + p0.id == + productModel.id, + ) + .first + .quantity + .toString(), + textAlign: + TextAlign + .start, maxLines: 1, style: TextStyle( - fontSize: 16, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + fontSize: + 16, + overflow: + TextOverflow + .ellipsis, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight + .w500, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), ), InkWell( onTap: () { - if ((cartItem.where((p0) => p0.id == productModel.id).first.quantity ?? 0) < (productModel.quantity ?? 0) || - (productModel.quantity ?? 0) == -1) { + if ((cartItem + .where( + ( + p0, + ) => + p0.id == + productModel.id, + ) + .first + .quantity ?? + 0) < + (productModel.quantity ?? + 0) || + (productModel.quantity ?? + 0) == + -1) { controller.addToCart( - productModel: productModel, - price: price, - discountPrice: disPrice, - isIncrement: true, - quantity: cartItem.where((p0) => p0.id == productModel.id).first.quantity! + 1, + productModel: + productModel, + price: + price, + discountPrice: + disPrice, + isIncrement: + true, + quantity: + cartItem + .where( + ( + p0, + ) => + p0.id == + productModel.id, + ) + .first + .quantity! + + 1, ); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock" + .tr(), + ); } }, - child: Icon(Icons.add, color: isDark ? AppThemeData.grey50 : AppThemeData.greyDark50), + child: Icon( + Icons.add, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .greyDark50, + ), ), ], ), @@ -1190,13 +2142,39 @@ class ProductListView extends StatelessWidget { title: "Add".tr(), width: 10, height: 4, - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - textColor: AppThemeData.primary300, + color: + isDark + ? AppThemeData + .grey900 + : AppThemeData + .grey50, + textColor: + AppThemeData + .primary300, onPress: () async { - if (1 <= (productModel.quantity ?? 0) || (productModel.quantity ?? 0) == -1) { - controller.addToCart(productModel: productModel, price: price, discountPrice: disPrice, isIncrement: true, quantity: 1); + if (1 <= + (productModel + .quantity ?? + 0) || + (productModel + .quantity ?? + 0) == + -1) { + controller.addToCart( + productModel: + productModel, + price: price, + discountPrice: + disPrice, + isIncrement: + true, + quantity: 1, + ); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock" + .tr(), + ); } }, ), @@ -1218,12 +2196,17 @@ class ProductListView extends StatelessWidget { ); } - Future productDetailsBottomSheet(BuildContext context, ProductModel productModel) { + Future productDetailsBottomSheet( + BuildContext context, + ProductModel productModel, + ) { return showModalBottomSheet( context: context, isScrollControlled: true, isDismissible: true, - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(30))), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(30)), + ), clipBehavior: Clip.antiAliasWithSaveLayer, builder: (context) => FractionallySizedBox( @@ -1237,7 +2220,11 @@ class ProductListView extends StatelessWidget { ); } - Dialog infoDialog(RestaurantDetailsController controller, isDark, ProductModel productModel) { + Dialog infoDialog( + RestaurantDetailsController controller, + isDark, + ProductModel productModel, + ) { return Dialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), insetPadding: const EdgeInsets.all(10), @@ -1260,17 +2247,33 @@ class ProductListView extends StatelessWidget { Text( "Product Information's".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.bold, fontWeight: FontWeight.w700, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.bold, + fontWeight: FontWeight.w700, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), Text( productModel.description.toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), ), - productModel.grams == 0 && Constant.sectionConstantModel!.isProductDetails == false + productModel.grams == 0 && + Constant.sectionConstantModel!.isProductDetails == false ? SizedBox.shrink() : Padding( padding: const EdgeInsets.only(bottom: 10), @@ -1281,18 +2284,33 @@ class ProductListView extends StatelessWidget { child: Text( "Gram".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( productModel.grams.toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.bold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), ), - productModel.calories == 0 && Constant.sectionConstantModel!.isProductDetails == false + productModel.calories == 0 && + Constant.sectionConstantModel!.isProductDetails == false ? SizedBox.shrink() : Padding( padding: const EdgeInsets.only(bottom: 10), @@ -1303,18 +2321,33 @@ class ProductListView extends StatelessWidget { child: Text( "Calories".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( productModel.calories.toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.bold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), ), - productModel.proteins == 0 && Constant.sectionConstantModel!.isProductDetails == false + productModel.proteins == 0 && + Constant.sectionConstantModel!.isProductDetails == false ? SizedBox.shrink() : Padding( padding: const EdgeInsets.only(bottom: 10), @@ -1325,18 +2358,33 @@ class ProductListView extends StatelessWidget { child: Text( "Proteins".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( productModel.proteins.toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.bold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), ), - productModel.fats == 0 && Constant.sectionConstantModel!.isProductDetails == false + productModel.fats == 0 && + Constant.sectionConstantModel!.isProductDetails == false ? SizedBox.shrink() : Padding( padding: const EdgeInsets.only(bottom: 10), @@ -1347,19 +2395,34 @@ class ProductListView extends StatelessWidget { child: Text( "Fats".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( productModel.fats.toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.bold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), ), - productModel.productSpecification != null && productModel.productSpecification!.isNotEmpty + productModel.productSpecification != null && + productModel.productSpecification!.isNotEmpty ? Padding( padding: const EdgeInsets.only(top: 10), child: Column( @@ -1368,11 +2431,20 @@ class ProductListView extends StatelessWidget { Text( "Specification".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w700, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w700, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), SizedBox(height: 8), ListView.builder( - itemCount: productModel.productSpecification!.length, + itemCount: + productModel.productSpecification!.length, shrinkWrap: true, padding: EdgeInsets.zero, physics: const NeverScrollableScrollPhysics(), @@ -1383,14 +2455,30 @@ class ProductListView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - productModel.productSpecification!.keys.elementAt(index), + productModel.productSpecification!.keys + .elementAt(index), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), Text( - productModel.productSpecification!.values.elementAt(index), + productModel.productSpecification!.values + .elementAt(index), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.bold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -1411,13 +2499,28 @@ class ProductListView extends StatelessWidget { Text( "Brand".tr(), textAlign: TextAlign.start, - style: TextStyle(fontWeight: FontWeight.w700, fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontWeight: FontWeight.w700, + fontFamily: AppThemeData.bold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), SizedBox(height: 5), Text( controller.getBrandName(productModel.brandId!), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -1454,7 +2557,8 @@ class ProductDetailsView extends StatelessWidget { init: RestaurantDetailsController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, body: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -1463,19 +2567,36 @@ class ProductDetailsView extends StatelessWidget { Container( color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(16)), + borderRadius: const BorderRadius.all( + Radius.circular(16), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: productModel.photo.toString(), height: Responsive.height(11, context), width: Responsive.width(22, context), fit: BoxFit.cover), + NetworkImageWidget( + imageUrl: productModel.photo.toString(), + height: Responsive.height(11, context), + width: Responsive.width(22, context), + fit: BoxFit.cover, + ), Container( height: Responsive.height(11, context), width: Responsive.width(22, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), const Color(0xFF111827)]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), ], @@ -1498,36 +2619,76 @@ class ProductDetailsView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), ), InkWell( onTap: () async { - if (controller.favouriteItemList.where((p0) => p0.productId == productModel.id).isNotEmpty) { - FavouriteItemModel favouriteModel = FavouriteItemModel( + if (controller.favouriteItemList + .where( + (p0) => + p0.productId == productModel.id, + ) + .isNotEmpty) { + FavouriteItemModel + favouriteModel = FavouriteItemModel( productId: productModel.id, - storeId: controller.vendorModel.value.id, - userId: FireStoreUtils.getCurrentUid(), + storeId: + controller.vendorModel.value.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList + .removeWhere( + (item) => + item.productId == + productModel.id, + ); + await FireStoreUtils.removeFavouriteItem( + favouriteModel, ); - controller.favouriteItemList.removeWhere((item) => item.productId == productModel.id); - await FireStoreUtils.removeFavouriteItem(favouriteModel); } else { - FavouriteItemModel favouriteModel = FavouriteItemModel( + FavouriteItemModel + favouriteModel = FavouriteItemModel( productId: productModel.id, - storeId: controller.vendorModel.value.id, - userId: FireStoreUtils.getCurrentUid(), + storeId: + controller.vendorModel.value.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList.add( + favouriteModel, ); - controller.favouriteItemList.add(favouriteModel); - await FireStoreUtils.setFavouriteItem(favouriteModel); + await FireStoreUtils.setFavouriteItem( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteItemList.where((p0) => p0.productId == productModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg", colorFilter: const ColorFilter.mode(AppThemeData.grey500, BlendMode.srcIn)), + controller.favouriteItemList + .where( + (p0) => + p0.productId == + productModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + colorFilter: + const ColorFilter.mode( + AppThemeData.grey500, + BlendMode.srcIn, + ), + ), ), ), ], @@ -1535,7 +2696,15 @@ class ProductDetailsView extends StatelessWidget { Text( productModel.description.toString(), textAlign: TextAlign.start, - style: TextStyle(fontSize: 12, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontSize: 12, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), @@ -1545,7 +2714,8 @@ class ProductDetailsView extends StatelessWidget { ), ), const SizedBox(height: 10), - productModel.itemAttribute == null || productModel.itemAttribute!.attributes!.isEmpty + productModel.itemAttribute == null || + productModel.itemAttribute!.attributes!.isEmpty ? const SizedBox() : ListView.builder( itemCount: productModel.itemAttribute!.attributes!.length, @@ -1555,129 +2725,275 @@ class ProductDetailsView extends StatelessWidget { itemBuilder: (context, index) { String title = ""; for (var element in controller.attributesList) { - if (productModel.itemAttribute!.attributes![index].attributeId == element.id) { + if (productModel + .itemAttribute! + .attributes![index] + .attributeId == + element.id) { title = element.title.toString(); } } return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 5, + ), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - productModel.itemAttribute!.attributes![index].attributeOptions!.isNotEmpty + productModel + .itemAttribute! + .attributes![index] + .attributeOptions! + .isNotEmpty ? Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Text( title, style: TextStyle( fontSize: 16, overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Text( - "Required • Select any 1 option".tr(), + "Required • Select any 1 option" + .tr(), style: TextStyle( fontSize: 12, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, ), ), ), - const Padding(padding: EdgeInsets.symmetric(vertical: 10), child: Divider()), + const Padding( + padding: EdgeInsets.symmetric( + vertical: 10, + ), + child: Divider(), + ), ], ) : Offstage(), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Wrap( spacing: 6.0, runSpacing: 6.0, children: - List.generate(productModel.itemAttribute!.attributes![index].attributeOptions!.length, (i) { - return InkWell( - onTap: () async { - if (controller.selectedIndexVariants.where((element) => element.contains('$index _')).isEmpty) { - controller.selectedVariants.insert(index, productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()); - controller.selectedIndexVariants.add('$index _${productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()}'); - controller.selectedIndexArray.add('${index}_$i'); - } else { - controller.selectedIndexArray.remove( - '${index}_${productModel.itemAttribute!.attributes![index].attributeOptions?.indexOf(controller.selectedIndexVariants.where((element) => element.contains('$index _')).first.replaceAll('$index _', ''))}', - ); - controller.selectedVariants.removeAt(index); - controller.selectedIndexVariants.remove(controller.selectedIndexVariants.where((element) => element.contains('$index _')).first); - controller.selectedVariants.insert(index, productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()); - controller.selectedIndexVariants.add('$index _${productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()}'); - controller.selectedIndexArray.add('${index}_$i'); - } + List.generate( + productModel + .itemAttribute! + .attributes![index] + .attributeOptions! + .length, + (i) { + return InkWell( + onTap: () async { + if (controller + .selectedIndexVariants + .where( + (element) => + element.contains( + '$index _', + ), + ) + .isEmpty) { + controller.selectedVariants + .insert( + index, + productModel + .itemAttribute! + .attributes![index] + .attributeOptions![i] + .toString(), + ); + controller + .selectedIndexVariants + .add( + '$index _${productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()}', + ); + controller + .selectedIndexArray + .add('${index}_$i'); + } else { + controller + .selectedIndexArray + .remove( + '${index}_${productModel.itemAttribute!.attributes![index].attributeOptions?.indexOf(controller.selectedIndexVariants.where((element) => element.contains('$index _')).first.replaceAll('$index _', ''))}', + ); + controller.selectedVariants + .removeAt(index); + controller + .selectedIndexVariants + .remove( + controller + .selectedIndexVariants + .where( + ( + element, + ) => element + .contains( + '$index _', + ), + ) + .first, + ); + controller.selectedVariants + .insert( + index, + productModel + .itemAttribute! + .attributes![index] + .attributeOptions![i] + .toString(), + ); + controller + .selectedIndexVariants + .add( + '$index _${productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()}', + ); + controller + .selectedIndexArray + .add('${index}_$i'); + } - final bool productIsInList = cartItem.any( - (product) => - product.id == - "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", - ); - if (productIsInList) { - CartProductModel element = cartItem.firstWhere( + final bool + productIsInList = cartItem.any( (product) => product.id == "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", ); - controller.quantity.value = element.quantity!; - } else { - controller.quantity.value = 1; - } + if (productIsInList) { + CartProductModel + element = cartItem.firstWhere( + (product) => + product.id == + "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", + ); + controller.quantity.value = + element.quantity!; + } else { + controller.quantity.value = + 1; + } - controller.update(); - controller.calculatePrice(productModel); - }, - child: Chip( - shape: const RoundedRectangleBorder(side: BorderSide(color: Colors.transparent), borderRadius: BorderRadius.all(Radius.circular(20))), - label: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - productModel.itemAttribute!.attributes![index].attributeOptions![i].toString(), - style: TextStyle( - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, - color: - controller.selectedVariants.contains(productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()) - ? Colors.white - : isDark - ? AppThemeData.greyDark800 - : AppThemeData.grey800, + controller.update(); + controller.calculatePrice( + productModel, + ); + }, + child: Chip( + shape: + const RoundedRectangleBorder( + side: BorderSide( + color: + Colors + .transparent, + ), + borderRadius: + BorderRadius.all( + Radius.circular( + 20, + ), + ), ), - ), - ], + label: Row( + mainAxisSize: + MainAxisSize.min, + children: [ + Text( + productModel + .itemAttribute! + .attributes![index] + .attributeOptions![i] + .toString(), + style: TextStyle( + overflow: + TextOverflow + .ellipsis, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w500, + color: + controller.selectedVariants.contains( + productModel + .itemAttribute! + .attributes![index] + .attributeOptions![i] + .toString(), + ) + ? Colors.white + : isDark + ? AppThemeData + .greyDark800 + : AppThemeData + .grey800, + ), + ), + ], + ), + backgroundColor: + controller.selectedVariants.contains( + productModel + .itemAttribute! + .attributes![index] + .attributeOptions![i] + .toString(), + ) + ? AppThemeData + .primary300 + : isDark + ? AppThemeData.grey800 + : AppThemeData + .grey100, + elevation: 6.0, + padding: const EdgeInsets.all( + 8.0, + ), ), - backgroundColor: - controller.selectedVariants.contains(productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()) - ? AppThemeData.primary300 - : isDark - ? AppThemeData.grey800 - : AppThemeData.grey100, - elevation: 6.0, - padding: const EdgeInsets.all(8.0), - ), - ); - }).toList(), + ); + }, + ).toList(), ), ), ], @@ -1687,19 +3003,33 @@ class ProductDetailsView extends StatelessWidget { ); }, ), - productModel.addOnsTitle == null || productModel.addOnsTitle!.isEmpty + productModel.addOnsTitle == null || + productModel.addOnsTitle!.isEmpty ? const SizedBox() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 5, + ), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 12), + padding: const EdgeInsets.symmetric( + horizontal: 12, + ), child: Text( "Addons".tr(), style: TextStyle( @@ -1707,21 +3037,32 @@ class ProductDetailsView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), ), - const Padding(padding: EdgeInsets.symmetric(vertical: 10), child: Divider()), + const Padding( + padding: EdgeInsets.symmetric(vertical: 10), + child: Divider(), + ), ListView.builder( itemCount: productModel.addOnsTitle!.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - String title = productModel.addOnsTitle![index]; - String price = productModel.addOnsPrice![index]; + String title = + productModel.addOnsTitle![index]; + String price = + productModel.addOnsPrice![index]; return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( children: [ Expanded( @@ -1734,12 +3075,21 @@ class ProductDetailsView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), ), Text( - Constant.amountShow(amount: Constant.productCommissionPrice(controller.vendorModel.value, price)), + Constant.amountShow( + amount: + Constant.productCommissionPrice( + controller.vendorModel.value, + price, + ), + ), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -1747,7 +3097,10 @@ class ProductDetailsView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), const SizedBox(width: 10), @@ -1756,14 +3109,18 @@ class ProductDetailsView extends StatelessWidget { height: 24.0, width: 24.0, child: Checkbox( - value: controller.selectedAddOns.contains(title), - activeColor: AppThemeData.primary300, + value: controller.selectedAddOns + .contains(title), + activeColor: + AppThemeData.primary300, onChanged: (value) { if (value != null) { if (value == true) { - controller.selectedAddOns.add(title); + controller.selectedAddOns + .add(title); } else { - controller.selectedAddOns.remove(title); + controller.selectedAddOns + .remove(title); } controller.update(); } @@ -1795,7 +3152,15 @@ class ProductDetailsView extends StatelessWidget { child: Container( width: Responsive.width(100, context), height: Responsive.height(5.5, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(200))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(200), + ), + ), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, @@ -1807,7 +3172,13 @@ class ProductDetailsView extends StatelessWidget { controller.update(); } }, - child: Icon(Icons.remove, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + child: Icon( + Icons.remove, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -1820,32 +3191,58 @@ class ProductDetailsView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), ), InkWell( onTap: () { if (productModel.itemAttribute == null) { - if (controller.quantity.value < (productModel.quantity ?? 0) || (productModel.quantity ?? 0) == -1) { + if (controller.quantity.value < + (productModel.quantity ?? 0) || + (productModel.quantity ?? 0) == -1) { controller.quantity.value += 1; controller.update(); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock".tr(), + ); } } else { int totalQuantity = int.parse( - productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantQuantity.toString(), + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + controller.selectedVariants.join( + '-', + ), + ) + .first + .variantQuantity + .toString(), ); - if (controller.quantity.value < totalQuantity || totalQuantity == -1) { + if (controller.quantity.value < totalQuantity || + totalQuantity == -1) { controller.quantity.value += 1; controller.update(); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock".tr(), + ); } } }, - child: Icon(Icons.add, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + child: Icon( + Icons.add, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), ], ), @@ -1855,7 +3252,9 @@ class ProductDetailsView extends StatelessWidget { Expanded( flex: 2, child: RoundedButtonFill( - title: "${'Add item'.tr()} ${Constant.amountShow(amount: controller.calculatePrice(productModel))}".tr(), + title: + "${'Add item'.tr()} ${Constant.amountShow(amount: controller.calculatePrice(productModel))}" + .tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -1864,36 +3263,94 @@ class ProductDetailsView extends StatelessWidget { if (productModel.itemAttribute == null) { await controller.addToCart( productModel: productModel, - price: Constant.productCommissionPrice(controller.vendorModel.value, productModel.price.toString()), - discountPrice: double.parse(productModel.disPrice.toString()) <= 0 ? "0" : Constant.productCommissionPrice(controller.vendorModel.value, productModel.disPrice.toString()), + price: Constant.productCommissionPrice( + controller.vendorModel.value, + productModel.price.toString(), + ), + discountPrice: + double.parse( + productModel.disPrice.toString(), + ) <= + 0 + ? "0" + : Constant.productCommissionPrice( + controller.vendorModel.value, + productModel.disPrice.toString(), + ), isIncrement: true, quantity: controller.quantity.value, ); } else { String variantPrice = "0"; - if (productModel.itemAttribute!.variants!.any((e) => e.variantSku == controller.selectedVariants.join('-'))) { + if (productModel.itemAttribute!.variants!.any( + (e) => + e.variantSku == + controller.selectedVariants.join('-'), + )) { variantPrice = Constant.productCommissionPrice( controller.vendorModel.value, - productModel.itemAttribute!.variants!.firstWhere((e) => e.variantSku == controller.selectedVariants.join('-')).variantPrice ?? '0', + productModel.itemAttribute!.variants! + .firstWhere( + (e) => + e.variantSku == + controller.selectedVariants.join( + '-', + ), + ) + .variantPrice ?? + '0', ); } Map mapData = {}; - for (var element in productModel.itemAttribute!.attributes!) { + for (var element + in productModel.itemAttribute!.attributes!) { mapData.addEntries([ MapEntry( - controller.attributesList.firstWhere((e) => e.id == element.attributeId).title.toString(), - controller.selectedVariants[productModel.itemAttribute!.attributes!.indexOf(element)], + controller.attributesList + .firstWhere( + (e) => e.id == element.attributeId, + ) + .title + .toString(), + controller.selectedVariants[productModel + .itemAttribute! + .attributes! + .indexOf(element)], ), ]); } VariantInfo variantInfo = VariantInfo( - variantPrice: productModel.itemAttribute!.variants!.firstWhere((e) => e.variantSku == controller.selectedVariants.join('-')).variantPrice ?? '0', + variantPrice: + productModel.itemAttribute!.variants! + .firstWhere( + (e) => + e.variantSku == + controller.selectedVariants.join('-'), + ) + .variantPrice ?? + '0', variantSku: controller.selectedVariants.join('-'), variantOptions: mapData, - variantImage: productModel.itemAttribute!.variants!.firstWhere((e) => e.variantSku == controller.selectedVariants.join('-')).variantImage ?? '', - variantId: productModel.itemAttribute!.variants!.firstWhere((e) => e.variantSku == controller.selectedVariants.join('-')).variantId ?? '0', + variantImage: + productModel.itemAttribute!.variants! + .firstWhere( + (e) => + e.variantSku == + controller.selectedVariants.join('-'), + ) + .variantImage ?? + '', + variantId: + productModel.itemAttribute!.variants! + .firstWhere( + (e) => + e.variantSku == + controller.selectedVariants.join('-'), + ) + .variantId ?? + '0', ); await controller.addToCart( diff --git a/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart b/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart index 3cbab3d..27fa696 100644 --- a/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart @@ -11,8 +11,7 @@ import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../service/fire_store_utils.dart'; import '../chat_screens/full_screen_image_viewer.dart'; @@ -27,12 +26,22 @@ class ReviewListScreen extends StatelessWidget { init: ReviewListController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Reviews".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Reviews".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: controller.isLoading.value @@ -40,7 +49,10 @@ class ReviewListScreen extends StatelessWidget { : controller.ratingList.isEmpty ? Constant.showEmptyView(message: "No Review found".tr()) : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: ListView.builder( itemCount: controller.ratingList.length, itemBuilder: (context, index) { @@ -49,21 +61,54 @@ class ReviewListScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 5), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), borderRadius: BorderRadius.circular(12)), + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + borderRadius: BorderRadius.circular(12), + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(ratingModel.uname.toString(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18, fontFamily: AppThemeData.semiBold)), + Text( + ratingModel.uname.toString(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 18, + fontFamily: AppThemeData.semiBold, + ), + ), Visibility( visible: ratingModel.productId != null, child: FutureBuilder( - future: FireStoreUtils.fireStore.collection(CollectionName.vendorProducts).doc(ratingModel.productId?.split('~').first).get(), + future: + FireStoreUtils.fireStore + .collection( + CollectionName.vendorProducts, + ) + .doc( + ratingModel.productId + ?.split('~') + .first, + ) + .get(), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == + ConnectionState.waiting) { return const Text(''); } else { if (snapshot.hasError) { @@ -71,10 +116,21 @@ class ReviewListScreen extends StatelessWidget { } else if (snapshot.data == null) { return const Text(''); } else if (snapshot.data != null) { - ProductModel model = ProductModel.fromJson(snapshot.data!.data()!); + ProductModel model = + ProductModel.fromJson( + snapshot.data!.data()!, + ); return Text( '${'Rate for'.tr()} - ${model.name ?? ''}', - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 14, fontFamily: AppThemeData.semiBold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 14, + fontFamily: + AppThemeData.semiBold, + ), ); } else { return const Text(''); @@ -91,50 +147,101 @@ class ReviewListScreen extends StatelessWidget { direction: Axis.horizontal, itemCount: 5, itemSize: 18, - itemPadding: const EdgeInsets.symmetric(horizontal: 2.0), - itemBuilder: (context, _) => const Icon(Icons.star, color: AppThemeData.warning300), + itemPadding: const EdgeInsets.symmetric( + horizontal: 2.0, + ), + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: AppThemeData.warning300, + ), unratedColor: AppThemeData.grey400, onRatingUpdate: (double rate) {}, ), const SizedBox(height: 5), Visibility( - visible: ratingModel.comment != '' && ratingModel.comment != null, + visible: + ratingModel.comment != '' && + ratingModel.comment != null, child: Text( ratingModel.comment.toString(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16, fontFamily: AppThemeData.medium), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + fontFamily: AppThemeData.medium, + ), ), ), const SizedBox(height: 5), Visibility( - visible: ratingModel.reviewAttributes != null, + visible: + ratingModel.reviewAttributes != null, child: ListView.builder( - itemCount: ratingModel.reviewAttributes!.length, + itemCount: + ratingModel.reviewAttributes!.length, shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), + physics: + const NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (context, index) { - String key = ratingModel.reviewAttributes!.keys.elementAt(index); - dynamic value = ratingModel.reviewAttributes![key]; + String key = ratingModel + .reviewAttributes! + .keys + .elementAt(index); + dynamic value = + ratingModel.reviewAttributes![key]; return Padding( - padding: const EdgeInsets.symmetric(vertical: 2), + padding: const EdgeInsets.symmetric( + vertical: 2, + ), child: Row( children: [ FutureBuilder( - future: FireStoreUtils.fireStore.collection(CollectionName.reviewAttributes).doc(key).get(), + future: + FireStoreUtils.fireStore + .collection( + CollectionName + .reviewAttributes, + ) + .doc(key) + .get(), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot + .connectionState == + ConnectionState.waiting) { return const Text(''); } else { if (snapshot.hasError) { return const Text(''); - } else if (snapshot.data == null) { + } else if (snapshot.data == + null) { return const Text(''); } else { - ReviewAttributeModel model = ReviewAttributeModel.fromJson(snapshot.data!.data()!); + ReviewAttributeModel + model = + ReviewAttributeModel.fromJson( + snapshot.data! + .data()!, + ); return Expanded( child: Text( - model.title.toString(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16, fontFamily: AppThemeData.semiBold), + model.title + .toString(), + style: TextStyle( + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 16, + fontFamily: + AppThemeData + .semiBold, + ), ), ); } @@ -143,15 +250,29 @@ class ReviewListScreen extends StatelessWidget { ), RatingBar.builder( ignoreGestures: true, - initialRating: value == null ? 0.0 : value ?? 0.0, + initialRating: + value == null + ? 0.0 + : value ?? 0.0, minRating: 1, direction: Axis.horizontal, itemCount: 5, itemSize: 15, - unratedColor: AppThemeData.grey400, - itemPadding: const EdgeInsets.symmetric(horizontal: 2.0), - itemBuilder: (context, _) => const Icon(Icons.star, color: AppThemeData.warning300), - onRatingUpdate: (double rate) {}, + unratedColor: + AppThemeData.grey400, + itemPadding: + const EdgeInsets.symmetric( + horizontal: 2.0, + ), + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: + AppThemeData + .warning300, + ), + onRatingUpdate: + (double rate) {}, ), ], ), @@ -169,16 +290,33 @@ class ReviewListScreen extends StatelessWidget { itemBuilder: (context, index) { return InkWell( onTap: () { - Get.to(FullScreenImageViewer(imageUrl: ratingModel.photos?[index])); + Get.to( + FullScreenImageViewer( + imageUrl: + ratingModel + .photos?[index], + ), + ); }, child: Padding( - padding: const EdgeInsets.all(6.0), + padding: const EdgeInsets.all( + 6.0, + ), child: ClipRRect( - borderRadius: BorderRadius.circular(10), + borderRadius: + BorderRadius.circular(10), child: NetworkImageWidget( - imageUrl: ratingModel.photos?[index], - height: Responsive.height(9, context), - width: Responsive.height(8, context), + imageUrl: + ratingModel + .photos?[index], + height: Responsive.height( + 9, + context, + ), + width: Responsive.height( + 8, + context, + ), fit: BoxFit.fill, ), ), @@ -189,8 +327,17 @@ class ReviewListScreen extends StatelessWidget { ), const SizedBox(height: 5), Text( - Constant.timestampToDateTime(ratingModel.createdAt!), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 14, fontFamily: AppThemeData.medium), + Constant.timestampToDateTime( + ratingModel.createdAt!, + ), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 14, + fontFamily: AppThemeData.medium, + ), ), ], ), diff --git a/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart b/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart index 8d13806..2a63623 100644 --- a/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart +++ b/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart @@ -3,7 +3,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:qr_code_dart_scan/qr_code_dart_scan.dart'; import '../../../controllers/theme_controller.dart'; @@ -24,8 +24,17 @@ class ScanQrCodeScreen extends StatelessWidget { appBar: AppBar( centerTitle: false, titleSpacing: 0, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - title: Text("Scan QR Code".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + title: Text( + "Scan QR Code".tr(), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), + ), ), body: QRCodeDartScanView( // enable scan invert qr code ( default = false) @@ -35,15 +44,21 @@ class ScanQrCodeScreen extends StatelessWidget { Get.back(); ShowToastDialog.showLoader("Please wait...".tr()); if (controller.allNearestRestaurant.isNotEmpty) { - if (controller.allNearestRestaurant.where((vendor) => vendor.id == result.text).isEmpty) { + if (controller.allNearestRestaurant + .where((vendor) => vendor.id == result.text) + .isEmpty) { ShowToastDialog.closeLoader(); ShowToastDialog.showToast("Store is not available".tr()); return; } - VendorModel storeModel = controller.allNearestRestaurant.firstWhere((vendor) => vendor.id == result.text); + VendorModel storeModel = controller.allNearestRestaurant + .firstWhere((vendor) => vendor.id == result.text); ShowToastDialog.closeLoader(); Get.back(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": storeModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": storeModel}, + ); } else { Get.back(); ShowToastDialog.showToast("Store is not available".tr()); diff --git a/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart b/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart index c7d6acd..0968a8b 100644 --- a/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart +++ b/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart @@ -10,8 +10,7 @@ import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../service/fire_store_utils.dart'; import '../../../widget/restaurant_image_view.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -28,21 +27,40 @@ class SearchScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( - Constant.sectionConstantModel?.name?.toLowerCase().contains('restaurants') == true ? "Find your favorite products and nearby stores" : "Search Item & Store".tr(), + Constant.sectionConstantModel?.name?.toLowerCase().contains( + 'restaurants', + ) == + true + ? "Find your favorite products and nearby stores" + : "Search Item & Store".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), bottom: PreferredSize( preferredSize: const Size.fromHeight(55), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: TextFieldWidget( - hintText: Constant.sectionConstantModel?.name?.toLowerCase().contains('restaurants') == true ? 'Find your favorite products and nearby stores'.tr() : 'Search the store and item'.tr(), - prefix: Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: SvgPicture.asset("assets/icons/ic_search.svg")), + hintText: + Constant.sectionConstantModel?.name + ?.toLowerCase() + .contains('restaurants') == + true + ? 'Find your favorite products and nearby stores'.tr() + : 'Search the store and item'.tr(), + prefix: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: SvgPicture.asset("assets/icons/ic_search.svg"), + ), controller: null, onchange: (value) { controller.onSearchTextChanged(value); @@ -55,7 +73,10 @@ class SearchScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -68,9 +89,19 @@ class SearchScreen extends StatelessWidget { Text( "Store".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), + ), + const Padding( + padding: EdgeInsets.symmetric(vertical: 10), + child: Divider(), ), - const Padding(padding: EdgeInsets.symmetric(vertical: 10), child: Divider()), ], ), ListView.builder( @@ -78,33 +109,74 @@ class SearchScreen extends StatelessWidget { physics: const NeverScrollableScrollPhysics(), itemCount: controller.vendorSearchList.length, itemBuilder: (context, index) { - VendorModel vendorModel = controller.vendorSearchList[index]; + VendorModel vendorModel = + controller.vendorSearchList[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: + const BorderRadius.only( + topLeft: Radius.circular( + 16, + ), + topRight: Radius.circular( + 16, + ), + ), child: Stack( children: [ - RestaurantImageView(vendorModel: vendorModel), + RestaurantImageView( + vendorModel: vendorModel, + ), Container( - height: Responsive.height(20, context), - width: Responsive.width(100, context), + height: Responsive.height( + 20, + context, + ), + width: Responsive.width( + 100, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), - end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + begin: const Alignment( + -0.00, + -1.00, + ), + end: const Alignment( + 0, + 1, + ), + colors: [ + Colors.black + .withOpacity(0), + const Color( + 0xFF111827, + ), + ], ), ), ), @@ -112,53 +184,124 @@ class SearchScreen extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(17.5, context)), + offset: Offset( + Responsive.width(-3, context), + Responsive.height( + 17.5, + context, + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: BoxDecoration( - color: AppThemeData.success300, - borderRadius: BorderRadius.circular(120), // Optional + color: + AppThemeData + .success300, + borderRadius: + BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), + const SizedBox( + width: 5, + ), Text( - "Free Delivery".tr(), - style: TextStyle(fontSize: 14, color: AppThemeData.success300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + "Free Delivery" + .tr(), + style: TextStyle( + fontSize: 14, + color: + AppThemeData + .success300, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, + ), ), ], ), ), - const SizedBox(width: 6), + const SizedBox( + width: 6, + ), ], ), ), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .primary600 + : AppThemeData + .primary50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode.srcIn, + ), + ), + const SizedBox( + width: 5, + ), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -166,22 +309,54 @@ class SearchScreen extends StatelessWidget { ), const SizedBox(width: 6), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .ecommerce600 + : AppThemeData + .ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg", colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn)), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .ecommerce300, + BlendMode.srcIn, + ), + ), + const SizedBox( + width: 5, + ), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -194,9 +369,12 @@ class SearchScreen extends StatelessWidget { ), const SizedBox(height: 15), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( vendorModel.title.toString(), @@ -204,9 +382,15 @@ class SearchScreen extends StatelessWidget { maxLines: 1, style: TextStyle( fontSize: 18, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData + .grey900, ), ), Text( @@ -214,10 +398,16 @@ class SearchScreen extends StatelessWidget { textAlign: TextAlign.start, maxLines: 1, style: TextStyle( - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey400, ), ), ], @@ -239,9 +429,19 @@ class SearchScreen extends StatelessWidget { Text( "Items".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), + ), + const Padding( + padding: EdgeInsets.symmetric(vertical: 10), + child: Divider(), ), - const Padding(padding: EdgeInsets.symmetric(vertical: 10), child: Divider()), ], ), ListView.builder( @@ -249,15 +449,19 @@ class SearchScreen extends StatelessWidget { physics: const NeverScrollableScrollPhysics(), itemCount: controller.productSearchList.length, itemBuilder: (context, index) { - ProductModel productModel = controller.productSearchList[index]; + ProductModel productModel = + controller.productSearchList[index]; return FutureBuilder( future: getPrice(productModel), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == + ConnectionState.waiting) { return Constant.loader(); } else { if (snapshot.hasError) { - return Center(child: Text('Error: ${snapshot.error}')); + return Center( + child: Text('Error: ${snapshot.error}'), + ); } else if (snapshot.data == null) { return const SizedBox(); } else { @@ -266,36 +470,79 @@ class SearchScreen extends StatelessWidget { String disPrice = map['disPrice']; return InkWell( onTap: () async { - await FireStoreUtils.getVendorById(productModel.vendorID.toString()).then((value) { + await FireStoreUtils.getVendorById( + productModel.vendorID.toString(), + ).then((value) { if (value != null) { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": value}); + Get.to( + const RestaurantDetailsScreen(), + arguments: { + "vendorModel": value, + }, + ); } }); }, child: Padding( - padding: const EdgeInsets.only(bottom: 20), + padding: const EdgeInsets.only( + bottom: 20, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Constant.sectionConstantModel!.isProductDetails == false + Constant + .sectionConstantModel! + .isProductDetails == + false ? SizedBox() - : productModel.nonveg == true || productModel.veg == true + : productModel.nonveg == + true || + productModel.veg == + true ? Row( children: [ - productModel.nonveg == true ? SvgPicture.asset("assets/icons/ic_nonveg.svg") : SvgPicture.asset("assets/icons/ic_veg.svg"), - const SizedBox(width: 5), + productModel.nonveg == + true + ? SvgPicture.asset( + "assets/icons/ic_nonveg.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_veg.svg", + ), + const SizedBox( + width: 5, + ), Text( - productModel.nonveg == true ? "Non Veg.".tr() : "Pure veg.".tr(), + productModel.nonveg == + true + ? "Non Veg." + .tr() + : "Pure veg." + .tr(), style: TextStyle( - color: productModel.nonveg == true ? AppThemeData.danger300 : AppThemeData.success400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + productModel.nonveg == + true + ? AppThemeData + .danger300 + : AppThemeData + .success400, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), ], @@ -303,56 +550,129 @@ class SearchScreen extends StatelessWidget { : SizedBox(), const SizedBox(height: 5), Text( - productModel.name.toString(), + productModel.name + .toString(), style: TextStyle( fontSize: 18, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), double.parse(disPrice) <= 0 ? Text( - Constant.amountShow(amount: price), + Constant.amountShow( + amount: price, + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ) : Row( children: [ Text( - Constant.amountShow(amount: disPrice), + Constant.amountShow( + amount: + disPrice, + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), - const SizedBox(width: 5), + const SizedBox( + width: 5, + ), Text( - Constant.amountShow(amount: price), + Constant.amountShow( + amount: price, + ), style: TextStyle( fontSize: 14, - decoration: TextDecoration.lineThrough, - decorationColor: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - color: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + decoration: + TextDecoration + .lineThrough, + decorationColor: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + color: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), ], ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: const ColorFilter.mode(AppThemeData.warning300, BlendMode.srcIn)), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + const ColorFilter.mode( + AppThemeData + .warning300, + BlendMode.srcIn, + ), + ), + const SizedBox( + width: 5, + ), Text( "${Constant.calculateReview(reviewCount: productModel.reviewsCount!.toStringAsFixed(0), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsCount!.toStringAsFixed(0)})", - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .regular, + fontWeight: + FontWeight.w500, + ), ), ], ), @@ -360,33 +680,73 @@ class SearchScreen extends StatelessWidget { "${productModel.description}", maxLines: 2, style: TextStyle( - overflow: TextOverflow.ellipsis, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w400, + overflow: + TextOverflow + .ellipsis, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .regular, + fontWeight: + FontWeight.w400, ), ), ], ), ), ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(16)), + borderRadius: + const BorderRadius.all( + Radius.circular(16), + ), child: Stack( children: [ NetworkImageWidget( - imageUrl: productModel.photo.toString(), + imageUrl: + productModel.photo + .toString(), fit: BoxFit.cover, - height: Responsive.height(16, context), - width: Responsive.width(34, context), + height: Responsive.height( + 16, + context, + ), + width: Responsive.width( + 34, + context, + ), ), Container( - height: Responsive.height(16, context), - width: Responsive.width(34, context), + height: Responsive.height( + 16, + context, + ), + width: Responsive.width( + 34, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), - end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + begin: + const Alignment( + -0.00, + -1.00, + ), + end: const Alignment( + 0, + 1, + ), + colors: [ + Colors.black + .withOpacity(0), + const Color( + 0xFF111827, + ), + ], ), ), ), @@ -423,24 +783,56 @@ class SearchScreen extends StatelessWidget { print(productModel.price); print(productModel.disPrice); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel.vendorID.toString()); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + productModel.vendorID.toString(), + ); if (productModel.itemAttribute != null) { if (productModel.itemAttribute!.attributes!.isNotEmpty) { for (var element in productModel.itemAttribute!.attributes!) { if (element.attributeOptions!.isNotEmpty) { - selectedVariants.add(productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString()); - selectedIndexVariants.add('${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}'); - selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + selectedVariants.add( + productModel + .itemAttribute! + .attributes![productModel.itemAttribute!.attributes!.indexOf( + element, + )] + .attributeOptions![0] + .toString(), + ); + selectedIndexVariants.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', + ); + selectedIndexArray.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { - price = Constant.productCommissionPrice(vendorModel!, productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0'); + if (productModel.itemAttribute!.variants! + .where((element) => element.variantSku == selectedVariants.join('-')) + .isNotEmpty) { + price = Constant.productCommissionPrice( + vendorModel!, + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == selectedVariants.join('-'), + ) + .first + .variantPrice ?? + '0', + ); disPrice = Constant.productCommissionPrice(vendorModel, '0'); } } else { - price = Constant.productCommissionPrice(vendorModel!, productModel.price.toString()); - disPrice = Constant.productCommissionPrice(vendorModel, productModel.disPrice.toString()); + price = Constant.productCommissionPrice( + vendorModel!, + productModel.price.toString(), + ); + disPrice = Constant.productCommissionPrice( + vendorModel, + productModel.disPrice.toString(), + ); } return {'price': price, 'disPrice': disPrice}; diff --git a/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart b/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart index a23577b..f1ded87 100644 --- a/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart +++ b/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:flutter_html/flutter_html.dart'; import '../../../controllers/theme_controller.dart'; @@ -26,18 +26,39 @@ class TermsAndConditionScreen extends StatelessWidget { onTap: () { Get.back(); }, - child: Icon(Icons.chevron_left_outlined, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + child: Icon( + Icons.chevron_left_outlined, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), title: Text( type == "privacy" ? "Privacy Policy".tr() : "Terms & Conditions".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.bold, fontSize: 18), + style: TextStyle( + color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + fontFamily: AppThemeData.bold, + fontSize: 18, + ), ), elevation: 0, - bottom: PreferredSize(preferredSize: const Size.fromHeight(4.0), child: Container(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, height: 4.0)), + bottom: PreferredSize( + preferredSize: const Size.fromHeight(4.0), + child: Container( + color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + height: 4.0, + ), + ), ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10), - child: SingleChildScrollView(child: Html(shrinkWrap: true, data: type == "privacy" ? Constant.privacyPolicy : Constant.termsAndConditions)), + child: SingleChildScrollView( + child: Html( + shrinkWrap: true, + data: + type == "privacy" + ? Constant.privacyPolicy + : Constant.termsAndConditions, + ), + ), ), ); } diff --git a/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart b/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart index a59d6ee..6178b1d 100644 --- a/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart @@ -9,7 +9,7 @@ import 'package:customer/themes/text_field_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -25,10 +25,19 @@ class PaymentListScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Top up Wallet".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), + title: Text( + "Top up Wallet".tr(), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), + ), ), body: SingleChildScrollView( child: Column( @@ -40,40 +49,152 @@ class PaymentListScreen extends StatelessWidget { title: 'Amount'.tr(), hintText: 'Enter Amount'.tr(), controller: controller.topUpAmountController.value, - textInputType: const TextInputType.numberWithOptions(decimal: true, signed: true), - prefix: Padding(padding: const EdgeInsets.all(12.0), child: Text(Constant.currencyModel!.symbol.toString(), style: const TextStyle(fontSize: 20, color: AppThemeData.grey800))), - inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]'))], + textInputType: const TextInputType.numberWithOptions( + decimal: true, + signed: true, + ), + prefix: Padding( + padding: const EdgeInsets.all(12.0), + child: Text( + Constant.currencyModel!.symbol.toString(), + style: const TextStyle( + fontSize: 20, + color: AppThemeData.grey800, + ), + ), + ), + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp('[0-9]')), + ], ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Text( "Select Top up Options".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Container( - decoration: BoxDecoration(borderRadius: const BorderRadius.all(Radius.circular(20)), color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(20)), + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + ), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), + ), + Visibility( + visible: + controller.payStackModel.value.isEnable == true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), - Visibility(visible: controller.orangeMoneyModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png")), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -96,40 +217,101 @@ class PaymentListScreen extends StatelessWidget { if (controller.topUpAmountController.value.text.isEmpty) { ShowToastDialog.showToast("Please Enter Amount".tr()); } else { - if (double.parse(controller.topUpAmountController.value.text) >= double.parse(Constant.minimumAmountToDeposit.toString())) { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.topUpAmountController.value.text, context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.topUpAmountController.value.text), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.topUpAmountController.value.text, orderId: result.id); - } - }); + if (double.parse( + controller.topUpAmountController.value.text, + ) >= + double.parse( + Constant.minimumAmountToDeposit.toString(), + )) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.topUpAmountController.value.text, + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.topUpAmountController.value.text, + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr(), + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: + controller + .topUpAmountController + .value + .text, + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast("Please select payment method".tr()); + ShowToastDialog.showToast( + "Please select payment method".tr(), + ); } } else { - ShowToastDialog.showToast("${'Please Enter minimum amount of'.tr()} ${Constant.amountShow(amount: Constant.minimumAmountToDeposit)}"); + ShowToastDialog.showToast( + "${'Please Enter minimum amount of'.tr()} ${Constant.amountShow(amount: Constant.minimumAmountToDeposit)}", + ); } } }, @@ -141,7 +323,12 @@ class PaymentListScreen extends StatelessWidget { ); } - Obx cardDecoration(WalletController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + WalletController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), @@ -154,22 +341,35 @@ class PaymentListScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), + child: Image.asset(image), + ), ), const SizedBox(width: 10), Expanded( child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart b/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart index 959eb23..ffa4627 100644 --- a/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart +++ b/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart @@ -23,7 +23,7 @@ import '../../rental_service/rental_order_details_screen.dart'; import '../order_list_screen/order_details_screen.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class WalletScreen extends StatelessWidget { const WalletScreen({super.key}); @@ -36,7 +36,8 @@ class WalletScreen extends StatelessWidget { init: WalletController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, body: controller.isLoading.value ? Constant.loader() @@ -49,12 +50,30 @@ class WalletScreen extends StatelessWidget { children: [ Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), - Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "Please Log In to Continue".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr(), + "You’re not logged in. Please sign in to access your account and explore all features." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -71,7 +90,9 @@ class WalletScreen extends StatelessWidget { ), ) : Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: Column( children: [ Column( @@ -79,20 +100,39 @@ class WalletScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Row( children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "My Wallet".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), Text( - "Keep track of your balance, transactions, and payment methods all in one place.".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + "Keep track of your balance, transactions, and payment methods all in one place." + .tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ], ), @@ -102,34 +142,66 @@ class WalletScreen extends StatelessWidget { ), const SizedBox(height: 20), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Container( decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(20)), - image: DecorationImage(image: AssetImage("assets/images/wallet.png"), fit: BoxFit.fill), + borderRadius: BorderRadius.all( + Radius.circular(20), + ), + image: DecorationImage( + image: AssetImage( + "assets/images/wallet.png", + ), + fit: BoxFit.fill, + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), child: Column( children: [ Text( "My Wallet".tr(), maxLines: 1, style: TextStyle( - color: isDark ? AppThemeData.primary100 : AppThemeData.primary100, + color: + isDark + ? AppThemeData.primary100 + : AppThemeData.primary100, fontSize: 16, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.regular, ), ), Text( - Constant.amountShow(amount: controller.userModel.value.walletAmount.toString()), + Constant.amountShow( + amount: + controller + .userModel + .value + .walletAmount + .toString(), + ), maxLines: 1, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 40, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontSize: 40, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), Padding( - padding: const EdgeInsets.symmetric(horizontal: 80), + padding: const EdgeInsets.symmetric( + horizontal: 80, + ), child: RoundedButtonFill( title: "Top up".tr(), color: AppThemeData.warning300, @@ -149,15 +221,30 @@ class WalletScreen extends StatelessWidget { Expanded( child: controller.walletTransactionList.isEmpty - ? Constant.showEmptyView(message: "Transaction not found".tr()) + ? Constant.showEmptyView( + message: "Transaction not found".tr(), + ) : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: ListView.builder( padding: EdgeInsets.zero, - itemCount: controller.walletTransactionList.length, + itemCount: + controller + .walletTransactionList + .length, itemBuilder: (context, index) { - WalletTransactionModel walletTractionModel = controller.walletTransactionList[index]; - return transactionCard(controller, isDark, walletTractionModel); + WalletTransactionModel + walletTractionModel = + controller + .walletTransactionList[index]; + return transactionCard( + controller, + isDark, + walletTractionModel, + ); }, ), ), @@ -170,32 +257,54 @@ class WalletScreen extends StatelessWidget { ); } - Column transactionCard(WalletController controller, isDark, WalletTransactionModel transactionModel) { + Column transactionCard( + WalletController controller, + isDark, + WalletTransactionModel transactionModel, + ) { return Column( children: [ InkWell( onTap: () async { final orderId = transactionModel.orderId.toString(); - final orderData = await FireStoreUtils.getOrderByIdFromAllCollections(orderId); + final orderData = + await FireStoreUtils.getOrderByIdFromAllCollections(orderId); if (orderData != null) { final collection = orderData['collection_name']; switch (collection) { case CollectionName.parcelOrders: - Get.to(const ParcelOrderDetails(), arguments: ParcelOrderModel.fromJson(orderData)); + Get.to( + const ParcelOrderDetails(), + arguments: ParcelOrderModel.fromJson(orderData), + ); break; case CollectionName.providerOrders: - Get.to(const OnDemandOrderDetailsScreen(), arguments: OnProviderOrderModel.fromJson(orderData)); + Get.to( + const OnDemandOrderDetailsScreen(), + arguments: OnProviderOrderModel.fromJson(orderData), + ); break; case CollectionName.rentalOrders: - Get.to(() => RentalOrderDetailsScreen(), arguments: RentalOrderModel.fromJson(orderData)); + Get.to( + () => RentalOrderDetailsScreen(), + arguments: RentalOrderModel.fromJson(orderData), + ); break; case CollectionName.rides: - Get.to(const CabOrderDetails(), arguments: {"cabOrderModel": CabOrderModel.fromJson(orderData)}); + Get.to( + const CabOrderDetails(), + arguments: { + "cabOrderModel": CabOrderModel.fromJson(orderData), + }, + ); break; case CollectionName.vendorOrders: - Get.to(const OrderDetailsScreen(), arguments: {"orderModel": OrderModel.fromJson(orderData)}); + Get.to( + const OrderDetailsScreen(), + arguments: {"orderModel": OrderModel.fromJson(orderData)}, + ); break; default: ShowToastDialog.showToast("Order details not available".tr()); @@ -220,14 +329,31 @@ class WalletScreen extends StatelessWidget { children: [ Container( decoration: ShapeDecoration( - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100), borderRadius: BorderRadius.circular(8)), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey800 + : AppThemeData.grey100, + ), + borderRadius: BorderRadius.circular(8), + ), ), child: Padding( padding: const EdgeInsets.all(16), child: transactionModel.isTopup == false - ? SvgPicture.asset("assets/icons/ic_debit.svg", height: 16, width: 16) - : SvgPicture.asset("assets/icons/ic_credit.svg", height: 16, width: 16), + ? SvgPicture.asset( + "assets/icons/ic_debit.svg", + height: 16, + width: 16, + ) + : SvgPicture.asset( + "assets/icons/ic_credit.svg", + height: 16, + width: 16, + ), ), ), const SizedBox(width: 10), @@ -240,19 +366,44 @@ class WalletScreen extends StatelessWidget { Expanded( child: Text( transactionModel.note.toString(), - style: TextStyle(fontSize: 16, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + style: TextStyle( + fontSize: 16, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), ), Text( - Constant.amountShow(amount: transactionModel.amount.toString()), - style: TextStyle(fontSize: 16, fontFamily: AppThemeData.medium, color: transactionModel.isTopup == true ? AppThemeData.success400 : AppThemeData.danger300), + Constant.amountShow( + amount: transactionModel.amount.toString(), + ), + style: TextStyle( + fontSize: 16, + fontFamily: AppThemeData.medium, + color: + transactionModel.isTopup == true + ? AppThemeData.success400 + : AppThemeData.danger300, + ), ), ], ), const SizedBox(height: 2), Text( Constant.timestampToDateTime(transactionModel.date!), - style: TextStyle(fontSize: 12, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700), + style: TextStyle( + fontSize: 12, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + ), ), ], ), @@ -261,10 +412,30 @@ class WalletScreen extends StatelessWidget { ), ), ), - Padding(padding: const EdgeInsets.symmetric(vertical: 5), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)), + Padding( + padding: const EdgeInsets.symmetric(vertical: 5), + child: MySeparator( + color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + ), + ), ], ); } } -enum PaymentGateway {payme, click, payFast, mercadoPago, paypal, stripe, flutterWave, payStack, razorpay, cod, wallet, midTrans, orangeMoney, xendit } +enum PaymentGateway { + payme, + click, + payFast, + mercadoPago, + paypal, + stripe, + flutterWave, + payStack, + razorpay, + cod, + wallet, + midTrans, + orangeMoney, + xendit, +} diff --git a/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart b/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart index e693647..1f87e22 100644 --- a/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart +++ b/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/assets.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/on_boarding_controller.dart'; import '../../themes/app_them_data.dart'; import '../../utils/network_image_widget.dart'; @@ -25,7 +25,10 @@ class OnboardingScreen extends StatelessWidget { Image.asset(AppAssets.onBoardingBG, fit: BoxFit.cover), SafeArea( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 15, + vertical: 20, + ), child: Column( children: [ const SizedBox(height: 20), @@ -35,8 +38,18 @@ class OnboardingScreen extends StatelessWidget { text: TextSpan( style: AppThemeData.regularTextStyle(fontSize: 14), children: [ - TextSpan(text: "${controller.currentPage.value + 1}", style: AppThemeData.regularTextStyle(color: AppThemeData.grey800)), - TextSpan(text: "/$pageCount", style: AppThemeData.regularTextStyle(color: AppThemeData.grey400)), + TextSpan( + text: "${controller.currentPage.value + 1}", + style: AppThemeData.regularTextStyle( + color: AppThemeData.grey800, + ), + ), + TextSpan( + text: "/$pageCount", + style: AppThemeData.regularTextStyle( + color: AppThemeData.grey400, + ), + ), ], ), ), @@ -52,11 +65,28 @@ class OnboardingScreen extends StatelessWidget { return SingleChildScrollView( child: Column( children: [ - Text(item.title ?? '', style: AppThemeData.boldTextStyle(color: AppThemeData.grey900), textAlign: TextAlign.center), + Text( + item.title ?? '', + style: AppThemeData.boldTextStyle( + color: AppThemeData.grey900, + ), + textAlign: TextAlign.center, + ), const SizedBox(height: 5), - Text(item.description ?? '', style: AppThemeData.boldTextStyle(color: AppThemeData.grey500, fontSize: 14), textAlign: TextAlign.center), + Text( + item.description ?? '', + style: AppThemeData.boldTextStyle( + color: AppThemeData.grey500, + fontSize: 14, + ), + textAlign: TextAlign.center, + ), const SizedBox(height: 40), - NetworkImageWidget(imageUrl: item.image ?? '', width: double.infinity, height: 500), + NetworkImageWidget( + imageUrl: item.image ?? '', + width: double.infinity, + height: 500, + ), ], ), ); @@ -74,7 +104,14 @@ class OnboardingScreen extends StatelessWidget { ) : Row( children: [ - Expanded(child: RoundedButtonFill(title: "Skip".tr(), onPress: () => _finish(), color: AppThemeData.grey50, textColor: AppThemeData.grey900)), + Expanded( + child: RoundedButtonFill( + title: "Skip".tr(), + onPress: () => _finish(), + color: AppThemeData.grey50, + textColor: AppThemeData.grey900, + ), + ), const SizedBox(width: 20), Expanded( child: RoundedButtonFill( diff --git a/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart b/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart index 527dfbf..e9fe212 100644 --- a/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart +++ b/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart @@ -11,7 +11,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class FavouriteOndemandScreen extends StatelessWidget { const FavouriteOndemandScreen({super.key}); @@ -24,7 +24,8 @@ class FavouriteOndemandScreen extends StatelessWidget { init: FavouriteOndemmandController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: AppThemeData.onDemand300, @@ -33,7 +34,15 @@ class FavouriteOndemandScreen extends StatelessWidget { child: Row( children: [ const SizedBox(width: 10), - Text("Favourite Services".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey900 : AppThemeData.grey900, fontSize: 20)), + Text( + "Favourite Services".tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey900, + fontSize: 20, + ), + ), ], ), ), @@ -50,12 +59,30 @@ class FavouriteOndemandScreen extends StatelessWidget { children: [ Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), - Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "Please Log In to Continue".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr(), + "You’re not logged in. Please sign in to access your account and explore all features." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -72,10 +99,15 @@ class FavouriteOndemandScreen extends StatelessWidget { ), ) : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: controller.lstFav.isEmpty - ? Constant.showEmptyView(message: "Favourite Service not found.".tr()) + ? Constant.showEmptyView( + message: "Favourite Service not found.".tr(), + ) : ListView.builder( shrinkWrap: true, padding: EdgeInsets.zero, @@ -83,86 +115,231 @@ class FavouriteOndemandScreen extends StatelessWidget { physics: const BouncingScrollPhysics(), itemCount: controller.lstFav.length, itemBuilder: (context, index) { - return FutureBuilder>( - future: FireStoreUtils.getCurrentProviderService(controller.lstFav[index]), + return FutureBuilder< + List + >( + future: + FireStoreUtils.getCurrentProviderService( + controller.lstFav[index], + ), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator()); + if (snapshot.connectionState == + ConnectionState.waiting) { + return const Center( + child: CircularProgressIndicator(), + ); } - if (!snapshot.hasData || snapshot.data == null || snapshot.data!.isEmpty) { + if (!snapshot.hasData || + snapshot.data == null || + snapshot.data!.isEmpty) { return const SizedBox(); // or a placeholder widget } - final provider = snapshot.data!.first; // safer way than [0] + final provider = + snapshot + .data! + .first; // safer way than [0] return GestureDetector( onTap: () { - Get.to(() => OnDemandDetailsScreen(), arguments: {'providerModel': provider}); + Get.to( + () => OnDemandDetailsScreen(), + arguments: { + 'providerModel': provider, + }, + ); }, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 5), + padding: const EdgeInsets.symmetric( + vertical: 5, + ), child: Container( - height: MediaQuery.of(context).size.height * 0.16, + height: + MediaQuery.of( + context, + ).size.height * + 0.16, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.grey500 : Colors.grey.shade100, width: 1), - color: isDark ? AppThemeData.grey900 : Colors.white, + borderRadius: BorderRadius.circular( + 10, + ), + border: Border.all( + color: + isDark + ? AppThemeData.grey500 + : Colors.grey.shade100, + width: 1, + ), + color: + isDark + ? AppThemeData.grey900 + : Colors.white, ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(bottomLeft: Radius.circular(10), topLeft: Radius.circular(10)), + borderRadius: + const BorderRadius.only( + bottomLeft: + Radius.circular(10), + topLeft: Radius.circular( + 10, + ), + ), child: CachedNetworkImage( - imageUrl: provider.photos.isNotEmpty ? provider.photos.first : Constant.placeHolderImage, - height: MediaQuery.of(context).size.height * 0.16, + imageUrl: + provider.photos.isNotEmpty + ? provider + .photos + .first + : Constant + .placeHolderImage, + height: + MediaQuery.of( + context, + ).size.height * + 0.16, width: 110, fit: BoxFit.cover, - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover), + placeholder: + (context, url) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), + errorWidget: + ( + context, + url, + error, + ) => Image.network( + Constant + .placeHolderImage, + fit: BoxFit.cover, + ), ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Expanded( child: Text( - provider.title ?? "", + provider.title ?? + "", maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, color: isDark ? Colors.white : Colors.black), + overflow: + TextOverflow + .ellipsis, + style: TextStyle( + fontSize: 18, + fontWeight: + FontWeight + .bold, + color: + isDark + ? Colors + .white + : Colors + .black, + ), ), ), Obx( () => GestureDetector( - onTap: () => controller.toggleFavourite(provider), + onTap: + () => controller + .toggleFavourite( + provider, + ), child: Icon( - controller.lstFav.where((element) => element.service_id == provider.id).isNotEmpty ? Icons.favorite : Icons.favorite_border, + controller + .lstFav + .where( + ( + element, + ) => + element.service_id == + provider.id, + ) + .isNotEmpty + ? Icons + .favorite + : Icons + .favorite_border, size: 24, color: - controller.lstFav.where((element) => element.service_id == provider.id).isNotEmpty - ? AppThemeData.primary300 - : (isDark ? Colors.white38 : Colors.black38), + controller + .lstFav + .where( + ( + element, + ) => + element.service_id == + provider.id, + ) + .isNotEmpty + ? AppThemeData + .primary300 + : (isDark + ? Colors.white38 + : Colors.black38), ), ), ), ], ), - FutureBuilder( - future: controller.getCategory(provider.categoryId ?? ""), + FutureBuilder< + CategoryModel? + >( + future: controller + .getCategory( + provider.categoryId ?? + "", + ), builder: (ctx, snap) { - if (!snap.hasData) return const SizedBox(); - return Text(snap.data?.title ?? "", style: TextStyle(fontSize: 14, color: isDark ? Colors.white : Colors.black)); + if (!snap.hasData) + return const SizedBox(); + return Text( + snap.data?.title ?? + "", + style: TextStyle( + fontSize: 14, + color: + isDark + ? Colors + .white + : Colors + .black, + ), + ); }, ), - _buildPrice(provider, isDark: isDark), + _buildPrice( + provider, + isDark: isDark, + ), _buildRating(provider), ], ), @@ -176,79 +353,231 @@ class FavouriteOndemandScreen extends StatelessWidget { }, ); FutureBuilder>( - future: FireStoreUtils.getCurrentProviderService(controller.lstFav[index]), + future: + FireStoreUtils.getCurrentProviderService( + controller.lstFav[index], + ), builder: (context, snapshot) { return snapshot.data != null ? GestureDetector( onTap: () { - Get.to(() => OnDemandDetailsScreen(), arguments: {'providerModel': snapshot.data![0]}); + Get.to( + () => OnDemandDetailsScreen(), + arguments: { + 'providerModel': + snapshot.data![0], + }, + ); }, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 5), + padding: const EdgeInsets.symmetric( + vertical: 5, + ), child: Container( - height: MediaQuery.of(context).size.height * 0.16, + height: + MediaQuery.of( + context, + ).size.height * + 0.16, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.grey500 : Colors.grey.shade100, width: 1), - color: isDark ? AppThemeData.grey900 : Colors.white, + borderRadius: + BorderRadius.circular(10), + border: Border.all( + color: + isDark + ? AppThemeData.grey500 + : Colors + .grey + .shade100, + width: 1, + ), + color: + isDark + ? AppThemeData.grey900 + : Colors.white, ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(bottomLeft: Radius.circular(10), topLeft: Radius.circular(10)), + borderRadius: + const BorderRadius.only( + bottomLeft: + Radius.circular( + 10, + ), + topLeft: + Radius.circular( + 10, + ), + ), child: CachedNetworkImage( - imageUrl: snapshot.data![0].photos.isNotEmpty ? snapshot.data![0].photos[0] : Constant.placeHolderImage, - height: MediaQuery.of(context).size.height * 0.16, + imageUrl: + snapshot + .data![0] + .photos + .isNotEmpty + ? snapshot + .data![0] + .photos[0] + : Constant + .placeHolderImage, + height: + MediaQuery.of( + context, + ).size.height * + 0.16, width: 110, fit: BoxFit.cover, - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover), + placeholder: + ( + context, + url, + ) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), + errorWidget: + ( + context, + url, + error, + ) => Image.network( + Constant + .placeHolderImage, + fit: BoxFit.cover, + ), ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Expanded( child: Text( - snapshot.data![0].title ?? "", + snapshot + .data![0] + .title ?? + "", maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, color: isDark ? Colors.white : Colors.black), + overflow: + TextOverflow + .ellipsis, + style: TextStyle( + fontSize: + 18, + fontWeight: + FontWeight + .bold, + color: + isDark + ? Colors.white + : Colors.black, + ), ), ), Obx( () => GestureDetector( - onTap: () => controller.toggleFavourite(snapshot.data![0]), + onTap: + () => controller.toggleFavourite( + snapshot + .data![0], + ), child: Icon( - controller.lstFav.where((element) => element.service_id == snapshot.data![0].id).isNotEmpty - ? Icons.favorite - : Icons.favorite_border, + controller + .lstFav + .where( + ( + element, + ) => + element.service_id == + snapshot.data![0].id, + ) + .isNotEmpty + ? Icons + .favorite + : Icons + .favorite_border, size: 24, color: - controller.lstFav.where((element) => element.service_id == snapshot.data![0].id).isNotEmpty + controller.lstFav + .where( + ( + element, + ) => + element.service_id == + snapshot.data![0].id, + ) + .isNotEmpty ? AppThemeData.primary300 - : (isDark ? Colors.white38 : Colors.black38), + : (isDark + ? Colors.white38 + : Colors.black38), ), ), ), ], ), - FutureBuilder( - future: controller.getCategory(snapshot.data![0].categoryId ?? ""), - builder: (ctx, snap) { - if (!snap.hasData) return const SizedBox(); - return Text(snap.data?.title ?? "", style: TextStyle(fontSize: 14, color: isDark ? Colors.white : Colors.black)); + FutureBuilder< + CategoryModel? + >( + future: controller + .getCategory( + snapshot + .data![0] + .categoryId ?? + "", + ), + builder: ( + ctx, + snap, + ) { + if (!snap.hasData) + return const SizedBox(); + return Text( + snap + .data + ?.title ?? + "", + style: TextStyle( + fontSize: 14, + color: + isDark + ? Colors + .white + : Colors + .black, + ), + ); }, ), - _buildPrice(snapshot.data![0], isDark: isDark), - _buildRating(snapshot.data![0]), + _buildPrice( + snapshot.data![0], + isDark: isDark, + ), + _buildRating( + snapshot.data![0], + ), ], ), ), @@ -272,20 +601,38 @@ class FavouriteOndemandScreen extends StatelessWidget { Widget _buildPrice(ProviderServiceModel provider, {bool isDark = false}) { if (provider.disPrice == "" || provider.disPrice == "0") { return Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', - style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), + provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: provider.price) + : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : AppThemeData.primary300, + ), ); } else { return Row( children: [ Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr()}', - style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), + provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: provider.disPrice ?? '0') + : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr()}', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : AppThemeData.primary300, + ), ), const SizedBox(width: 5), Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', - style: const TextStyle(fontSize: 12, color: Colors.grey, decoration: TextDecoration.lineThrough), + provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: provider.price) + : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', + style: const TextStyle( + fontSize: 12, + color: Colors.grey, + decoration: TextDecoration.lineThrough, + ), ), ], ); @@ -298,14 +645,24 @@ class FavouriteOndemandScreen extends StatelessWidget { rating = (provider.reviewsSum ?? 0) / (provider.reviewsCount ?? 1); } return Container( - decoration: BoxDecoration(color: AppThemeData.warning400, borderRadius: BorderRadius.circular(16)), + decoration: BoxDecoration( + color: AppThemeData.warning400, + borderRadius: BorderRadius.circular(16), + ), padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), child: Row( mainAxisSize: MainAxisSize.min, children: [ const Icon(Icons.star, size: 16, color: Colors.white), const SizedBox(width: 3), - Text(rating.toStringAsFixed(1), style: const TextStyle(letterSpacing: 0.5, fontSize: 12, color: Colors.white)), + Text( + rating.toStringAsFixed(1), + style: const TextStyle( + letterSpacing: 0.5, + fontSize: 12, + color: Colors.white, + ), + ), ], ), ); diff --git a/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart b/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart index 5b61b49..24eae6e 100644 --- a/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart +++ b/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart @@ -1,7 +1,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../../constant/constant.dart'; import '../../controllers/my_booking_on_demand_controller.dart'; @@ -24,13 +24,24 @@ class MyBookingOnDemandScreen extends StatelessWidget { builder: (controller) { return DefaultTabController( length: controller.tabTitles.length, - initialIndex: controller.tabTitles.indexOf(controller.selectedTab.value), + initialIndex: controller.tabTitles.indexOf( + controller.selectedTab.value, + ), child: Scaffold( appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: AppThemeData.primary300, centerTitle: false, - title: Padding(padding: const EdgeInsets.only(bottom: 10), child: Text("Booking History".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))), + title: Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text( + "Booking History".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), + ), bottom: PreferredSize( preferredSize: const Size.fromHeight(48), child: TabBar( @@ -41,8 +52,15 @@ class MyBookingOnDemandScreen extends StatelessWidget { labelColor: AppThemeData.grey900, unselectedLabelColor: AppThemeData.grey900, labelStyle: AppThemeData.boldTextStyle(fontSize: 16), - unselectedLabelStyle: AppThemeData.mediumTextStyle(fontSize: 16), - tabs: controller.tabTitles.map((title) => Tab(child: Center(child: Text(title)))).toList(), + unselectedLabelStyle: AppThemeData.mediumTextStyle( + fontSize: 16, + ), + tabs: + controller.tabTitles + .map( + (title) => Tab(child: Center(child: Text(title))), + ) + .toList(), ), ), ), @@ -55,78 +73,217 @@ class MyBookingOnDemandScreen extends StatelessWidget { final orders = controller.getOrdersForTab(title); if (orders.isEmpty) { - return Center(child: Text("No ride found".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center( + child: Text( + "No ride found".tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ); } return ListView.builder( padding: const EdgeInsets.all(16), itemCount: orders.length, itemBuilder: (context, index) { - OnProviderOrderModel onProviderOrder = orders[index]; - WorkerModel? worker = controller.getWorker(onProviderOrder.workerId); + OnProviderOrderModel onProviderOrder = + orders[index]; + WorkerModel? worker = controller.getWorker( + onProviderOrder.workerId, + ); return InkWell( onTap: () { - Get.to(() => OnDemandOrderDetailsScreen(), arguments: onProviderOrder); + Get.to( + () => OnDemandOrderDetailsScreen(), + arguments: onProviderOrder, + ); }, child: Container( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 5, + ), margin: const EdgeInsets.only(bottom: 15), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.grey500 : Colors.grey.shade100, width: 1), - color: isDark ? AppThemeData.grey500 : Colors.white, + border: Border.all( + color: + isDark + ? AppThemeData.grey500 + : Colors.grey.shade100, + width: 1, + ), + color: + isDark + ? AppThemeData.grey500 + : Colors.white, ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), child: CachedNetworkImage( - imageUrl: onProviderOrder.provider.photos.first, + imageUrl: + onProviderOrder + .provider + .photos + .first, height: 80, width: 80, imageBuilder: - (context, imageProvider) => - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover))), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), + ( + context, + imageProvider, + ) => Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 10, + ), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), errorWidget: - (context, url, error) => ClipRRect( - borderRadius: BorderRadius.circular(10), - child: Image.network(Constant.placeHolderImage, fit: BoxFit.cover, cacheHeight: 80, cacheWidth: 80), + ( + context, + url, + error, + ) => ClipRRect( + borderRadius: + BorderRadius.circular( + 10, + ), + child: Image.network( + Constant + .placeHolderImage, + fit: BoxFit.cover, + cacheHeight: 80, + cacheWidth: 80, + ), ), fit: BoxFit.cover, ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: + const EdgeInsets.symmetric( + horizontal: 20, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Container( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), - decoration: BoxDecoration(color: AppThemeData.info50, border: Border.all(color: AppThemeData.info300), borderRadius: BorderRadius.circular(12)), - child: Text(onProviderOrder.status, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.info500)), - ), - Padding( - padding: const EdgeInsets.only(top: 6), + padding: + const EdgeInsets.symmetric( + vertical: 6, + horizontal: 12, + ), + decoration: BoxDecoration( + color: + AppThemeData.info50, + border: Border.all( + color: + AppThemeData + .info300, + ), + borderRadius: + BorderRadius.circular( + 12, + ), + ), child: Text( - onProviderOrder.provider.title.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + onProviderOrder.status, + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + AppThemeData + .info500, + ), + ), + ), + Padding( + padding: + const EdgeInsets.only( + top: 6, + ), + child: Text( + onProviderOrder + .provider + .title + .toString(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), + ), + Padding( + padding: + const EdgeInsets.only( + top: 6, + ), + child: buildPriceText( + onProviderOrder, ), ), - Padding(padding: const EdgeInsets.only(top: 6), child: buildPriceText(onProviderOrder)), const SizedBox(height: 6), - if (onProviderOrder.status != Constant.orderCompleted && - onProviderOrder.status != Constant.orderCancelled && - onProviderOrder.otp != null && - onProviderOrder.otp!.isNotEmpty) + if (onProviderOrder + .status != + Constant + .orderCompleted && + onProviderOrder + .status != + Constant + .orderCancelled && + onProviderOrder.otp != + null && + onProviderOrder + .otp! + .isNotEmpty) Text( "${'OTP :'.tr()} ${onProviderOrder.otp}", - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), @@ -136,7 +293,12 @@ class MyBookingOnDemandScreen extends StatelessWidget { ), /// Bottom Details (Date, Provider, Worker) - buildBottomDetails(context, onProviderOrder, isDark, worker), + buildBottomDetails( + context, + onProviderOrder, + isDark, + worker, + ), ], ), ), @@ -152,37 +314,81 @@ class MyBookingOnDemandScreen extends StatelessWidget { } Widget buildPriceText(OnProviderOrderModel order) { - final hasDiscount = order.provider.disPrice != "" && order.provider.disPrice != "0"; - final price = hasDiscount ? order.provider.disPrice.toString() : order.provider.price.toString(); + final hasDiscount = + order.provider.disPrice != "" && order.provider.disPrice != "0"; + final price = + hasDiscount + ? order.provider.disPrice.toString() + : order.provider.price.toString(); return Text( - order.provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: price) : "${Constant.amountShow(amount: price)}/${'hr'.tr()}", - style: AppThemeData.mediumTextStyle(fontSize: 16, color: AppThemeData.primary300), + order.provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: price) + : "${Constant.amountShow(amount: price)}/${'hr'.tr()}", + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: AppThemeData.primary300, + ), ); } - Widget buildBottomDetails(BuildContext context, OnProviderOrderModel order, bool isDark, WorkerModel? worker) { + Widget buildBottomDetails( + BuildContext context, + OnProviderOrderModel order, + bool isDark, + WorkerModel? worker, + ) { return Container( margin: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.grey400 : AppThemeData.grey100, width: 1), + border: Border.all( + color: isDark ? AppThemeData.grey400 : AppThemeData.grey100, + width: 1, + ), color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, ), child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Column( children: [ - detailRow("Date & Time", DateFormat('dd-MMM-yyyy hh:mm a').format(order.scheduleDateTime!.toDate()), isDark), + detailRow( + "Date & Time", + DateFormat( + 'dd-MMM-yyyy hh:mm a', + ).format(order.scheduleDateTime!.toDate()), + isDark, + ), const Divider(thickness: 1), detailRow("Provider", order.provider.authorName.toString(), isDark), if (order.provider.priceUnit == "Hourly") ...[ - if (order.startTime != null) ...[const Divider(thickness: 1), detailRow("Start Time", DateFormat('dd-MMM-yyyy hh:mm a').format(order.startTime!.toDate()), isDark)], - if (order.endTime != null) ...[const Divider(thickness: 1), detailRow("End Time", DateFormat('dd-MMM-yyyy hh:mm a').format(order.endTime!.toDate()), isDark)], + if (order.startTime != null) ...[ + const Divider(thickness: 1), + detailRow( + "Start Time", + DateFormat( + 'dd-MMM-yyyy hh:mm a', + ).format(order.startTime!.toDate()), + isDark, + ), + ], + if (order.endTime != null) ...[ + const Divider(thickness: 1), + detailRow( + "End Time", + DateFormat( + 'dd-MMM-yyyy hh:mm a', + ).format(order.endTime!.toDate()), + isDark, + ), + ], ], - if (worker != null) ...[const Divider(thickness: 1), detailRow("Worker", worker.fullName().toString(), isDark)], + if (worker != null) ...[ + const Divider(thickness: 1), + detailRow("Worker", worker.fullName().toString(), isDark), + ], ], ), ), @@ -195,8 +401,20 @@ class MyBookingOnDemandScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(label.tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(value.tr(), style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + label.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + value.tr(), + style: AppThemeData.regularTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ), ); diff --git a/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart b/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart index d073c77..db6fa1b 100644 --- a/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart @@ -4,7 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../controllers/on_demand_booking_controller.dart'; @@ -42,12 +42,30 @@ class OnDemandBookingScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Book Service".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Book Service".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -58,13 +76,28 @@ class OnDemandBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ // Services Section - Text("Services".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Services".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(height: 10), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, ), padding: const EdgeInsets.all(8), child: Row( @@ -73,18 +106,60 @@ class OnDemandBookingScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(controller.provider.value?.title ?? '', style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + controller.provider.value?.title ?? '', + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(height: 5), - Text(controller.categoryTitle.value, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - if (controller.provider.value?.priceUnit == "Fixed") ...[ + Text( + controller.categoryTitle.value, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + if (controller.provider.value?.priceUnit == + "Fixed") ...[ const SizedBox(height: 20), Row( children: [ - GestureDetector(onTap: controller.decrementQuantity, child: Icon(Icons.remove_circle_outline, color: AppThemeData.primary300, size: 30)), + GestureDetector( + onTap: controller.decrementQuantity, + child: Icon( + Icons.remove_circle_outline, + color: AppThemeData.primary300, + size: 30, + ), + ), const SizedBox(width: 10), - Text('${controller.quantity.value}', style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + '${controller.quantity.value}', + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(width: 10), - GestureDetector(onTap: controller.incrementQuantity, child: Icon(Icons.add_circle_outline, color: AppThemeData.primary300, size: 30)), + GestureDetector( + onTap: controller.incrementQuantity, + child: Icon( + Icons.add_circle_outline, + color: AppThemeData.primary300, + size: 30, + ), + ), ], ), ], @@ -98,7 +173,15 @@ class OnDemandBookingScreen extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(20), color: Colors.grey.shade300, - image: controller.provider.value!.photos.isNotEmpty ? DecorationImage(image: NetworkImage(controller.provider.value?.photos.first), fit: BoxFit.cover) : null, + image: + controller.provider.value!.photos.isNotEmpty + ? DecorationImage( + image: NetworkImage( + controller.provider.value?.photos.first, + ), + fit: BoxFit.cover, + ) + : null, ), ), ], @@ -109,8 +192,14 @@ class OnDemandBookingScreen extends StatelessWidget { padding: const EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, ), child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -119,7 +208,16 @@ class OnDemandBookingScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Address".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Address".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), SizedBox(height: 5), InkWell( onTap: () async { @@ -127,20 +225,32 @@ class OnDemandBookingScreen extends StatelessWidget { Get.to(AddressListScreen())!.then((value) { if (value != null) { ShippingAddress shippingAddress = value; - if (Constant.checkZoneCheck(shippingAddress.location!.latitude ?? 0.0, shippingAddress.location!.longitude ?? 0.0)) { - controller.selectedAddress.value = shippingAddress; + if (Constant.checkZoneCheck( + shippingAddress.location!.latitude ?? + 0.0, + shippingAddress.location!.longitude ?? + 0.0, + )) { + controller.selectedAddress.value = + shippingAddress; controller.calculatePrice(); } else { - ShowToastDialog.showToast("Service not available in this area".tr()); + ShowToastDialog.showToast( + "Service not available in this area" + .tr(), + ); } } }); } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); - ShippingAddress shippingAddress = ShippingAddress(); + ShippingAddress shippingAddress = + ShippingAddress(); try { await Geolocator.requestPermission(); @@ -148,43 +258,81 @@ class OnDemandBookingScreen extends StatelessWidget { ShowToastDialog.closeLoader(); if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lat = + firstPlace.coordinates.latitude; + final lng = + firstPlace + .coordinates + .longitude; final address = firstPlace.address; shippingAddress.addressAs = "Home"; - shippingAddress.locality = address.toString(); - shippingAddress.location = UserLocation(latitude: lat, longitude: lng); + shippingAddress.locality = + address.toString(); + shippingAddress + .location = UserLocation( + latitude: lat, + longitude: lng, + ); - controller.selectedAddress.value = shippingAddress; + controller.selectedAddress.value = + shippingAddress; Get.back(); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); - shippingAddress.locality = "Picked from Map"; + shippingAddress.addressAs = + "Home"; + shippingAddress + .location = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, + ); + shippingAddress.locality = + "Picked from Map"; - controller.selectedAddress.value = shippingAddress; + controller.selectedAddress.value = + shippingAddress; } }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { - Placemark placeMark = valuePlaceMaker[0]; - shippingAddress.location = UserLocation(latitude: 19.228825, longitude: 72.854118); + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then((valuePlaceMaker) { + Placemark placeMark = + valuePlaceMaker[0]; + shippingAddress + .location = UserLocation( + latitude: 19.228825, + longitude: 72.854118, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; - shippingAddress.locality = currentLocation; + shippingAddress.locality = + currentLocation; }); - controller.selectedAddress.value = shippingAddress; + controller.selectedAddress.value = + shippingAddress; ShowToastDialog.closeLoader(); } }, @@ -193,10 +341,17 @@ class OnDemandBookingScreen extends StatelessWidget { } }, child: Text( - controller.selectedAddress.value.getFullAddress(), + controller.selectedAddress.value + .getFullAddress(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), ], @@ -206,7 +361,12 @@ class OnDemandBookingScreen extends StatelessWidget { ), ), const SizedBox(height: 15), - TextFieldWidget(title: "Description".tr(), hintText: "Enter Description".tr(), controller: controller.descriptionController.value, maxLine: 5), + TextFieldWidget( + title: "Description".tr(), + hintText: "Enter Description".tr(), + controller: controller.descriptionController.value, + maxLine: 5, + ), const SizedBox(height: 10), GestureDetector( onTap: () { @@ -220,13 +380,36 @@ class OnDemandBookingScreen extends StatelessWidget { buttonSingleColor: AppThemeData.primary300, buttonPadding: 10, buttonWidth: 70, - pickerTitle: Text("", style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - backgroundColor: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - pickerTextStyle: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + pickerTitle: Text( + "", + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + backgroundColor: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + pickerTextStyle: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), closeIconColor: isDark ? Colors.white : Colors.black, ).show(context); }, - child: TextFieldWidget(title: "Booking Date & Slot".tr(), hintText: "Choose Date and Time".tr(), controller: controller.dateTimeController.value, enable: false), + child: TextFieldWidget( + title: "Booking Date & Slot".tr(), + hintText: "Choose Date and Time".tr(), + controller: controller.dateTimeController.value, + enable: false, + ), ), const SizedBox(height: 15), controller.provider.value?.priceUnit == "Fixed" @@ -241,7 +424,14 @@ class OnDemandBookingScreen extends StatelessWidget { scrollDirection: Axis.horizontal, itemBuilder: (context, index) { final coupon = controller.couponList[index]; - return GestureDetector(onTap: () => controller.applyCoupon(coupon), child: buildOfferItem(controller, index, isDark)); + return GestureDetector( + onTap: () => controller.applyCoupon(coupon), + child: buildOfferItem( + controller, + index, + isDark, + ), + ); }, ), ) @@ -249,7 +439,16 @@ class OnDemandBookingScreen extends StatelessWidget { buildPromoCode(controller, isDark), Padding( padding: EdgeInsets.symmetric(vertical: 10), - child: Text("Price Detail".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + "Price Detail".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), priceTotalRow(controller, isDark), ], @@ -260,14 +459,23 @@ class OnDemandBookingScreen extends StatelessWidget { ), bottomNavigationBar: Padding( padding: const EdgeInsets.all(20.0), - child: RoundedButtonFill(title: "Confirm".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.confirmBooking(context)), + child: RoundedButtonFill( + title: "Confirm".tr(), + color: AppThemeData.primary300, + textColor: AppThemeData.grey50, + onPress: () => controller.confirmBooking(context), + ), ), ); }, ); } - Widget buildOfferItem(OnDemandBookingController controller, int index, bool isDark) { + Widget buildOfferItem( + OnDemandBookingController controller, + int index, + bool isDark, + ) { return Obx(() { final coupon = controller.couponList[index]; @@ -275,7 +483,11 @@ class OnDemandBookingScreen extends StatelessWidget { margin: const EdgeInsets.fromLTRB(7, 10, 7, 10), height: 85, child: DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(10), color: AppThemeData.primary300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(10), + color: AppThemeData.primary300, + ), child: Padding( padding: const EdgeInsets.fromLTRB(12, 5, 12, 0), child: Column( @@ -284,13 +496,26 @@ class OnDemandBookingScreen extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Image(image: AssetImage('assets/images/offer_icon.png'), height: 25, width: 25), + const Image( + image: AssetImage('assets/images/offer_icon.png'), + height: 25, + width: 25, + ), const SizedBox(width: 10), Container( margin: const EdgeInsets.only(top: 3), child: Text( - coupon.discountType == "Fix Price" ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr()}" : "${coupon.discount} ${'% Off'.tr()}", - style: TextStyle(fontWeight: FontWeight.bold, letterSpacing: 0.7, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + coupon.discountType == "Fix Price" + ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr()}" + : "${coupon.discount} ${'% Off'.tr()}", + style: TextStyle( + fontWeight: FontWeight.bold, + letterSpacing: 0.7, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), ], @@ -299,11 +524,36 @@ class OnDemandBookingScreen extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(coupon.code ?? '', style: const TextStyle(fontSize: 16, fontWeight: FontWeight.normal, letterSpacing: 0.5, color: Colors.orange)), - Container(margin: const EdgeInsets.only(left: 15, right: 15, top: 3), width: 1, color: AppThemeData.grey50), Text( - "valid till ".tr() + controller.getDate(coupon.expiresAt!.toDate().toString()), - style: TextStyle(letterSpacing: 0.5, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + coupon.code ?? '', + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.normal, + letterSpacing: 0.5, + color: Colors.orange, + ), + ), + Container( + margin: const EdgeInsets.only( + left: 15, + right: 15, + top: 3, + ), + width: 1, + color: AppThemeData.grey50, + ), + Text( + "valid till ".tr() + + controller.getDate( + coupon.expiresAt!.toDate().toString(), + ), + style: TextStyle( + letterSpacing: 0.5, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -321,7 +571,9 @@ class OnDemandBookingScreen extends StatelessWidget { margin: const EdgeInsets.only(top: 10, bottom: 13), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), + border: Border.all( + color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, + ), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, ), child: Padding( @@ -332,17 +584,37 @@ class OnDemandBookingScreen extends StatelessWidget { Expanded( child: Row( children: [ - Image.asset("assets/images/reedem.png", height: 50, width: 50), + Image.asset( + "assets/images/reedem.png", + height: 50, + width: 50, + ), const SizedBox(width: 10), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Promo Code".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), overflow: TextOverflow.ellipsis), + Text( + "Promo Code".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + overflow: TextOverflow.ellipsis, + ), const SizedBox(height: 5), Text( "Apply promo code".tr(), - style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), overflow: TextOverflow.ellipsis, ), ], @@ -353,7 +625,13 @@ class OnDemandBookingScreen extends StatelessWidget { ), FloatingActionButton( onPressed: () { - Get.bottomSheet(promoCodeSheet(controller, isDark), isScrollControlled: true, isDismissible: true, backgroundColor: Colors.transparent, enableDrag: true); + Get.bottomSheet( + promoCodeSheet(controller, isDark), + isScrollControlled: true, + isDismissible: true, + backgroundColor: Colors.transparent, + enableDrag: true, + ); }, mini: true, backgroundColor: Colors.blueGrey.shade50, @@ -371,7 +649,10 @@ class OnDemandBookingScreen extends StatelessWidget { return Container( padding: EdgeInsets.only(bottom: Get.height / 4.3, left: 25, right: 25), height: Get.height * 0.88, - decoration: BoxDecoration(color: Colors.transparent, border: Border.all(style: BorderStyle.none)), + decoration: BoxDecoration( + color: Colors.transparent, + border: Border.all(style: BorderStyle.none), + ), child: Column( children: [ InkWell( @@ -379,14 +660,21 @@ class OnDemandBookingScreen extends StatelessWidget { child: Container( height: 45, decoration: BoxDecoration( - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, width: 0.3), + border: Border.all( + color: + isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, + width: 0.3, + ), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, shape: BoxShape.circle, ), child: Center( child: Icon( Icons.close, - color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, // ✅ visible color + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, // ✅ visible color size: 28, ), ), @@ -395,40 +683,93 @@ class OnDemandBookingScreen extends StatelessWidget { const SizedBox(height: 25), Expanded( child: Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + ), alignment: Alignment.center, child: SingleChildScrollView( child: Column( children: [ - Container(padding: const EdgeInsets.only(top: 30), child: const Image(image: AssetImage('assets/images/redeem_coupon.png'), width: 100)), Container( - padding: const EdgeInsets.only(top: 20), - child: Text('Redeem Your Coupons'.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), - ), - Center( - child: Container( - padding: const EdgeInsets.only(top: 10, left: 22, right: 22), - child: Text("Voucher or Coupon code".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + padding: const EdgeInsets.only(top: 30), + child: const Image( + image: AssetImage('assets/images/redeem_coupon.png'), + width: 100, ), ), Container( - padding: const EdgeInsets.only(left: 20, right: 20, top: 20), + padding: const EdgeInsets.only(top: 20), + child: Text( + 'Redeem Your Coupons'.tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), + ), + ), + Center( + child: Container( + padding: const EdgeInsets.only( + top: 10, + left: 22, + right: 22, + ), + child: Text( + "Voucher or Coupon code".tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), + ), + Container( + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 20, + ), child: DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(12), color: AppThemeData.primary300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(12), + color: AppThemeData.primary300, + ), child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(12)), + borderRadius: const BorderRadius.all( + Radius.circular(12), + ), child: Container( padding: const EdgeInsets.all(20), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, alignment: Alignment.center, child: TextFormField( textAlign: TextAlign.center, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), controller: controller.couponTextController.value, decoration: InputDecoration( border: InputBorder.none, hintText: "Write Coupon Code".tr(), - hintStyle: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400), + hintStyle: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + ), ), ), ), @@ -436,21 +777,34 @@ class OnDemandBookingScreen extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.only(top: 30, bottom: 30, left: 15, right: 15), + padding: const EdgeInsets.only( + top: 30, + bottom: 30, + left: 15, + right: 15, + ), child: RoundedButtonFill( title: "REDEEM NOW".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () { - final inputCode = controller.couponTextController.value.text.trim().toLowerCase(); + final inputCode = + controller.couponTextController.value.text + .trim() + .toLowerCase(); - final matchingCoupon = controller.couponList.firstWhereOrNull((c) => c.code?.toLowerCase() == inputCode); + final matchingCoupon = controller.couponList + .firstWhereOrNull( + (c) => c.code?.toLowerCase() == inputCode, + ); if (matchingCoupon != null) { controller.applyCoupon(matchingCoupon); Get.back(); } else { - ShowToastDialog.showToast("Applied coupon not valid.".tr()); + ShowToastDialog.showToast( + "Applied coupon not valid.".tr(), + ); } }, ), @@ -470,14 +824,22 @@ class OnDemandBookingScreen extends StatelessWidget { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), + border: Border.all( + color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, + ), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, ), child: Column( children: [ const SizedBox(height: 5), - rowText("Price".tr(), Constant.amountShow(amount: controller.price.value.toString()), isDark), - controller.discountAmount.value != 0 ? const Divider() : const SizedBox(), + rowText( + "Price".tr(), + Constant.amountShow(amount: controller.price.value.toString()), + isDark, + ), + controller.discountAmount.value != 0 + ? const Divider() + : const SizedBox(), controller.discountAmount.value != 0 ? Padding( padding: const EdgeInsets.symmetric(horizontal: 10), @@ -490,19 +852,39 @@ class OnDemandBookingScreen extends StatelessWidget { children: [ Text( "${"Discount".tr()} ${controller.discountType.value == 'Percentage' || controller.discountType.value == 'Percent' ? "(${controller.discountLabel.value}%)" : "(${Constant.amountShow(amount: controller.discountLabel.value)})"}", - style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: TextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + controller.offerCode.value, + style: TextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), - Text(controller.offerCode.value, style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ), ), - Text("(-${Constant.amountShow(amount: controller.discountAmount.value.toString())})", style: const TextStyle(color: Colors.red)), + Text( + "(-${Constant.amountShow(amount: controller.discountAmount.value.toString())})", + style: const TextStyle(color: Colors.red), + ), ], ), ) : const SizedBox(), const Divider(), - rowText("SubTotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), + rowText( + "SubTotal".tr(), + Constant.amountShow(amount: controller.subTotal.value.toString()), + isDark, + ), const Divider(), ListView.builder( itemCount: Constant.taxList.length, @@ -513,19 +895,39 @@ class OnDemandBookingScreen extends StatelessWidget { return Column( children: [ Padding( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 8, + horizontal: 10, + ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text( "${taxModel.title} (${taxModel.type == "fix" ? Constant.amountShow(amount: taxModel.tax) : "${taxModel.tax}%"})", - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), Text( - Constant.amountShow(amount: Constant.getTaxValue(amount: controller.subTotal.value.toString(), taxModel: taxModel).toString()), - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: + Constant.getTaxValue( + amount: + controller.subTotal.value.toString(), + taxModel: taxModel, + ).toString(), + ), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -535,7 +937,13 @@ class OnDemandBookingScreen extends StatelessWidget { ); }, ), - rowText("Total Amount".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), + rowText( + "Total Amount".tr(), + Constant.amountShow( + amount: controller.totalAmount.value.toString(), + ), + isDark, + ), const SizedBox(height: 5), ], ), @@ -549,8 +957,18 @@ class OnDemandBookingScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(value.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title.tr(), + style: AppThemeData.mediumTextStyle( + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + value.tr(), + style: AppThemeData.mediumTextStyle( + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ), ); diff --git a/lib/screen_ui/on_demand_service/on_demand_category_screen.dart b/lib/screen_ui/on_demand_service/on_demand_category_screen.dart index 80daba8..a5e20c6 100644 --- a/lib/screen_ui/on_demand_service/on_demand_category_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_category_screen.dart @@ -2,7 +2,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:customer/screen_ui/on_demand_service/view_category_service_screen.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/on_demand_category_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -33,8 +33,20 @@ class OnDemandCategoryScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), @@ -42,12 +54,22 @@ class OnDemandCategoryScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Explore services".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), Text( - "Explore services tailored for you—quick, easy, and personalized.".tr(), + "Explore services".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), + Text( + "Explore services tailored for you—quick, easy, and personalized." + .tr(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), ), ], ), @@ -60,7 +82,10 @@ class OnDemandCategoryScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15), + padding: const EdgeInsets.symmetric( + vertical: 20, + horizontal: 15, + ), child: SingleChildScrollView( child: Column( children: [ @@ -71,9 +96,17 @@ class OnDemandCategoryScreen extends StatelessWidget { itemCount: controller.categories.length, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + ), itemBuilder: (context, index) { - return categoriesCell(context, controller.categories[index], index, isDark); + return categoriesCell( + context, + controller.categories[index], + index, + isDark, + ); }, ), ], @@ -85,16 +118,42 @@ class OnDemandCategoryScreen extends StatelessWidget { ); } - Widget categoriesCell(BuildContext context, CategoryModel category, int index, bool isDark) { + Widget categoriesCell( + BuildContext context, + CategoryModel category, + int index, + bool isDark, + ) { return GestureDetector( onTap: () { - Get.to(() => ViewCategoryServiceListScreen(), arguments: {'categoryId': category.id, 'categoryTitle': category.title}); + Get.to( + () => ViewCategoryServiceListScreen(), + arguments: { + 'categoryId': category.id, + 'categoryTitle': category.title, + }, + ); }, child: Column( children: [ - ClipRRect(borderRadius: BorderRadius.circular(12), child: CachedNetworkImage(imageUrl: category.image ?? "", height: 60, width: 60, fit: BoxFit.cover)), + ClipRRect( + borderRadius: BorderRadius.circular(12), + child: CachedNetworkImage( + imageUrl: category.image ?? "", + height: 60, + width: 60, + fit: BoxFit.cover, + ), + ), const SizedBox(height: 5), - Text(category.title ?? "", style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), textAlign: TextAlign.center), + Text( + category.title ?? "", + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + textAlign: TextAlign.center, + ), ], ), ); diff --git a/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart b/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart index 47b5f9a..60749e6 100644 --- a/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart @@ -5,8 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../controllers/on_demand_dashboard_controller.dart'; class OnDemandDashboardScreen extends StatelessWidget { @@ -27,12 +26,19 @@ class OnDemandDashboardScreen extends StatelessWidget { showUnselectedLabels: true, showSelectedLabels: true, selectedFontSize: 12, - selectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), - unselectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), + selectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), + unselectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), currentIndex: controller.selectedIndex.value, - backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - selectedItemColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - unselectedItemColor: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + backgroundColor: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + selectedItemColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, + unselectedItemColor: + isDark ? AppThemeData.grey300 : AppThemeData.grey600, onTap: (int index) { if (index == 0) { Get.put(CabDashboardController()); @@ -42,18 +48,72 @@ class OnDemandDashboardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_cab.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_fav.svg", + label: 'Favourites'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_booking_cab.svg", + label: 'My Bookings'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_cab.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_fav.svg", + label: 'Favourites'.tr(), + controller: controller, + ), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_wallet_cab.svg", label: 'Wallet'.tr(), controller: controller), - navigationBarItem(isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_booking_cab.svg", + label: 'My Bookings'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_wallet_cab.svg", + label: 'Wallet'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 4, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ], ), ); @@ -62,7 +122,13 @@ class OnDemandDashboardScreen extends StatelessWidget { }); } - BottomNavigationBarItem navigationBarItem(isDark, {required int index, required String label, required String assetIcon, required OnDemandDashboardController controller}) { + BottomNavigationBarItem navigationBarItem( + isDark, { + required int index, + required String label, + required String assetIcon, + required OnDemandDashboardController controller, + }) { return BottomNavigationBarItem( icon: Padding( padding: const EdgeInsets.symmetric(vertical: 5), diff --git a/lib/screen_ui/on_demand_service/on_demand_details_screen.dart b/lib/screen_ui/on_demand_service/on_demand_details_screen.dart index 31b8c6c..dcfbca1 100644 --- a/lib/screen_ui/on_demand_service/on_demand_details_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_details_screen.dart @@ -4,7 +4,7 @@ import 'package:customer/screen_ui/on_demand_service/provider_screen.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../../controllers/theme_controller.dart'; import '../../models/provider_serivce_model.dart'; @@ -25,7 +25,13 @@ class OnDemandDetailsScreen extends StatelessWidget { init: OnDemandDetailsController(), builder: (controller) { return Scaffold( - body: buildSliverScrollView(context, controller, controller.provider, controller.userModel, isDark), + body: buildSliverScrollView( + context, + controller, + controller.provider, + controller.userModel, + isDark, + ), bottomNavigationBar: controller.isOpen.value == false ? SizedBox() @@ -43,9 +49,20 @@ class OnDemandDetailsScreen extends StatelessWidget { if (Constant.userModel == null) { Get.offAll(const LoginScreen()); } else { - print("providerModel ::::::::${controller.provider.title ?? 'No provider'}"); - print("categoryTitle ::::::: ${controller.categoryTitle.value}"); - Get.to(() => OnDemandBookingScreen(), arguments: {'providerModel': controller.provider, 'categoryTitle': controller.categoryTitle.value}); + print( + "providerModel ::::::::${controller.provider.title ?? 'No provider'}", + ); + print( + "categoryTitle ::::::: ${controller.categoryTitle.value}", + ); + Get.to( + () => OnDemandBookingScreen(), + arguments: { + 'providerModel': controller.provider, + 'categoryTitle': + controller.categoryTitle.value, + }, + ); } }, ), @@ -57,7 +74,13 @@ class OnDemandDetailsScreen extends StatelessWidget { ); } - SingleChildScrollView buildSliverScrollView(BuildContext context, OnDemandDetailsController controller, ProviderServiceModel provider, user, isDark) { + SingleChildScrollView buildSliverScrollView( + BuildContext context, + OnDemandDetailsController controller, + ProviderServiceModel provider, + user, + isDark, + ) { final width = MediaQuery.of(context).size.width; final height = MediaQuery.of(context).size.height; @@ -68,21 +91,54 @@ class OnDemandDetailsScreen extends StatelessWidget { Stack( children: [ CachedNetworkImage( - imageUrl: provider.photos.isNotEmpty ? provider.photos.first : "", - placeholder: (context, url) => Center(child: CircularProgressIndicator(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.fitWidth), + imageUrl: + provider.photos.isNotEmpty ? provider.photos.first : "", + placeholder: + (context, url) => Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + AppThemeData.primary300, + ), + ), + ), + errorWidget: + (context, url, error) => Image.network( + Constant.placeHolderImage, + fit: BoxFit.fitWidth, + ), fit: BoxFit.fitWidth, width: width, height: height * 0.45, ), - Positioned(top: height * 0.05, left: width * 0.03, child: _circleButton(context, icon: Icons.arrow_back, onTap: () => Get.back())), + Positioned( + top: height * 0.05, + left: width * 0.03, + child: _circleButton( + context, + icon: Icons.arrow_back, + onTap: () => Get.back(), + ), + ), Positioned( top: height * 0.05, right: width * 0.03, child: Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(40), color: controller.isOpen.value ? Colors.green : Colors.red), - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - child: Text(controller.isOpen.value ? "Open".tr() : "Close".tr(), style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.white, fontSize: 14)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(40), + color: controller.isOpen.value ? Colors.green : Colors.red, + ), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), + child: Text( + controller.isOpen.value ? "Open".tr() : "Close".tr(), + style: const TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + fontSize: 14, + ), + ), ), ), ], @@ -105,27 +161,66 @@ class OnDemandDetailsScreen extends StatelessWidget { Expanded( child: Text( provider.title.toString(), - style: TextStyle(fontSize: 20, fontFamily: AppThemeData.regular, fontWeight: FontWeight.bold, color: isDark ? Colors.white : Colors.black), + style: TextStyle( + fontSize: 20, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : Colors.black, + ), ), ), Row( children: [ provider.disPrice == "" || provider.disPrice == "0" ? Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price ?? '0') : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr()}', - style: TextStyle(fontSize: 18, fontFamily: AppThemeData.regular, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), + provider.priceUnit == 'Fixed' + ? Constant.amountShow( + amount: provider.price ?? '0', + ) + : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr()}', + style: TextStyle( + fontSize: 18, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.bold, + color: + isDark + ? Colors.white + : AppThemeData.primary300, + ), ) : Row( children: [ Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') : '${Constant.amountShow(amount: provider.disPrice ?? '0')}/${'hr'.tr()}', - style: TextStyle(fontSize: 18, fontFamily: AppThemeData.regular, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), + provider.priceUnit == 'Fixed' + ? Constant.amountShow( + amount: provider.disPrice ?? '0', + ) + : '${Constant.amountShow(amount: provider.disPrice ?? '0')}/${'hr'.tr()}', + style: TextStyle( + fontSize: 18, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.bold, + color: + isDark + ? Colors.white + : AppThemeData.primary300, + ), ), Padding( padding: const EdgeInsets.only(left: 8.0), child: Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price ?? '0') : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr()}', - style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.grey, decoration: TextDecoration.lineThrough), + provider.priceUnit == 'Fixed' + ? Constant.amountShow( + amount: provider.price ?? '0', + ) + : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr()}', + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Colors.grey, + decoration: + TextDecoration.lineThrough, + ), ), ), ], @@ -139,23 +234,51 @@ class OnDemandDetailsScreen extends StatelessWidget { Expanded( child: Padding( padding: const EdgeInsets.symmetric(vertical: 5), - child: Text(categoryTitle, style: TextStyle(fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400, color: isDark ? Colors.white : Colors.black)), + child: Text( + categoryTitle, + style: TextStyle( + fontSize: 14, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + color: isDark ? Colors.white : Colors.black, + ), + ), ), ), Padding( padding: const EdgeInsets.only(left: 8.0), child: Row( children: [ - const Icon(Icons.star, size: 16, color: AppThemeData.warning400), + const Icon( + Icons.star, + size: 16, + color: AppThemeData.warning400, + ), const SizedBox(width: 3), Text( - provider.reviewsCount != 0 ? ((provider.reviewsSum ?? 0.0) / (provider.reviewsCount ?? 0.0)).toStringAsFixed(1) : '0', - style: const TextStyle(letterSpacing: 0.5, fontSize: 16, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: AppThemeData.warning400), + provider.reviewsCount != 0 + ? ((provider.reviewsSum ?? 0.0) / + (provider.reviewsCount ?? 0.0)) + .toStringAsFixed(1) + : '0', + style: const TextStyle( + letterSpacing: 0.5, + fontSize: 16, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + color: AppThemeData.warning400, + ), ), const SizedBox(width: 10), Text( "(${provider.reviewsCount} ${'Reviews'.tr()})", - style: TextStyle(letterSpacing: 0.5, fontSize: 16, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: isDark ? Colors.white : Colors.black), + style: TextStyle( + letterSpacing: 0.5, + fontSize: 16, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + color: isDark ? Colors.white : Colors.black, + ), ), ], ), @@ -168,18 +291,40 @@ class OnDemandDetailsScreen extends StatelessWidget { children: [ subCategoryTitle.isNotEmpty ? Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.primary300.withOpacity(0.20)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.primary300.withOpacity( + 0.20, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - child: Text(subCategoryTitle, style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, fontFamily: AppThemeData.regular, color: AppThemeData.primary300)), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), + child: Text( + subCategoryTitle, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + fontFamily: AppThemeData.regular, + color: AppThemeData.primary300, + ), + ), ), ) : Container(), const SizedBox(width: 10), Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: Colors.green.withOpacity(0.20)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.green.withOpacity(0.20), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: InkWell( onTap: () { showModalBottomSheet( @@ -188,10 +333,22 @@ class OnDemandDetailsScreen extends StatelessWidget { context: context, backgroundColor: Colors.transparent, enableDrag: true, - builder: (context) => showTiming(context, controller, isDark), + builder: + (context) => showTiming( + context, + controller, + isDark, + ), ); }, - child: Text("View Timing".tr(), style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.green, letterSpacing: 0.5)), + child: Text( + "View Timing".tr(), + style: const TextStyle( + fontWeight: FontWeight.bold, + color: Colors.green, + letterSpacing: 0.5, + ), + ), ), ), ), @@ -201,14 +358,22 @@ class OnDemandDetailsScreen extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Icon(Icons.location_on_outlined, color: isDark ? Colors.white : Colors.black, size: 20), + Icon( + Icons.location_on_outlined, + color: isDark ? Colors.white : Colors.black, + size: 20, + ), const SizedBox(width: 5), Expanded( child: Text( provider.address.toString(), maxLines: 2, overflow: TextOverflow.ellipsis, - style: TextStyle(fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400, color: isDark ? Colors.white : Colors.black), + style: TextStyle( + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + color: isDark ? Colors.white : Colors.black, + ), ), ), ], @@ -219,7 +384,11 @@ class OnDemandDetailsScreen extends StatelessWidget { _tabBar(controller), Obx(() { if (controller.tabString.value == "About") { - return aboutTabViewWidget(controller, controller.provider, isDark); + return aboutTabViewWidget( + controller, + controller.provider, + isDark, + ); } else if (controller.tabString.value == "Gallery") { return galleryTabViewWidget(controller); } else { @@ -237,14 +406,35 @@ class OnDemandDetailsScreen extends StatelessWidget { ); } - Widget _circleButton(BuildContext context, {required IconData icon, required VoidCallback onTap}) { + Widget _circleButton( + BuildContext context, { + required IconData icon, + required VoidCallback onTap, + }) { return ClipOval( - child: Container(color: Colors.black.withOpacity(0.7), child: InkWell(onTap: onTap, child: Padding(padding: const EdgeInsets.all(8.0), child: Icon(icon, size: 30, color: Colors.white)))), + child: Container( + color: Colors.black.withOpacity(0.7), + child: InkWell( + onTap: onTap, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Icon(icon, size: 30, color: Colors.white), + ), + ), + ), ); } Widget _tabBar(OnDemandDetailsController controller) { - return Obx(() => Row(children: [_tabItem("About", controller), _tabItem("Gallery", controller), _tabItem("Review", controller)])); + return Obx( + () => Row( + children: [ + _tabItem("About", controller), + _tabItem("Gallery", controller), + _tabItem("Review", controller), + ], + ), + ); } Widget _tabItem(String title, OnDemandDetailsController controller) { @@ -253,33 +443,67 @@ class OnDemandDetailsScreen extends StatelessWidget { child: Container( margin: const EdgeInsets.only(right: 10), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - decoration: BoxDecoration(color: controller.tabString.value == title ? AppThemeData.primary300 : Colors.grey.shade200, borderRadius: BorderRadius.circular(10)), - child: Text(title.tr(), style: TextStyle(fontWeight: FontWeight.bold, color: controller.tabString.value == title ? Colors.white : Colors.black)), + decoration: BoxDecoration( + color: + controller.tabString.value == title + ? AppThemeData.primary300 + : Colors.grey.shade200, + borderRadius: BorderRadius.circular(10), + ), + child: Text( + title.tr(), + style: TextStyle( + fontWeight: FontWeight.bold, + color: + controller.tabString.value == title + ? Colors.white + : Colors.black, + ), + ), ), ); } - Widget aboutTabViewWidget(OnDemandDetailsController controller, ProviderServiceModel providerModel, bool isDark) { + Widget aboutTabViewWidget( + OnDemandDetailsController controller, + ProviderServiceModel providerModel, + bool isDark, + ) { return Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text((providerModel.description ?? '').tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500)), + Text( + (providerModel.description ?? '').tr(), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontSize: 14, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), + ), const SizedBox(height: 10), Obx(() { final user = controller.userModel.value; if (user == null) return const SizedBox(); return InkWell( onTap: () { - Get.to(() => ProviderScreen(), arguments: {'providerId': user.id}); + Get.to( + () => ProviderScreen(), + arguments: {'providerId': user.id}, + ); }, child: Padding( padding: const EdgeInsets.symmetric(vertical: 2), child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.grey500 : Colors.grey.shade100, width: 1), + border: Border.all( + color: + isDark ? AppThemeData.grey500 : Colors.grey.shade100, + width: 1, + ), color: isDark ? AppThemeData.grey500 : Colors.white, ), child: Padding( @@ -289,30 +513,86 @@ class OnDemandDetailsScreen extends StatelessWidget { Expanded( child: Row( children: [ - CircleAvatar(radius: 30, backgroundImage: NetworkImage(user.profilePictureURL?.isNotEmpty == true ? user.profilePictureURL! : Constant.placeHolderImage)), + CircleAvatar( + radius: 30, + backgroundImage: NetworkImage( + user.profilePictureURL?.isNotEmpty == true + ? user.profilePictureURL! + : Constant.placeHolderImage, + ), + ), const SizedBox(width: 10), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(user.fullName(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14, fontWeight: FontWeight.bold)), + Text( + user.fullName(), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: AppThemeData.regular, + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), const SizedBox(height: 5), - Text(user.email ?? '', style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14)), + Text( + user.email ?? '', + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: AppThemeData.regular, + fontSize: 14, + ), + ), const SizedBox(height: 10), // Rating Box Container( - decoration: BoxDecoration(color: AppThemeData.warning400, borderRadius: BorderRadius.circular(16)), - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: AppThemeData.warning400, + borderRadius: BorderRadius.circular(16), + ), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.star, size: 16, color: Colors.white), + const Icon( + Icons.star, + size: 16, + color: Colors.white, + ), const SizedBox(width: 3), Text( - double.parse(user.reviewsCount.toString()) != 0 - ? (double.parse(user.reviewsSum.toString()) / double.parse(user.reviewsCount.toString())).toStringAsFixed(1) + double.parse( + user.reviewsCount + .toString(), + ) != + 0 + ? (double.parse( + user.reviewsSum + .toString(), + ) / + double.parse( + user.reviewsCount + .toString(), + )) + .toStringAsFixed(1) : '0', - style: const TextStyle(letterSpacing: 0.5, fontSize: 12, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: Colors.white), + style: const TextStyle( + letterSpacing: 0.5, + fontSize: 12, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + color: Colors.white, + ), ), ], ), @@ -348,7 +628,12 @@ class OnDemandDetailsScreen extends StatelessWidget { shrinkWrap: true, padding: EdgeInsets.zero, physics: const NeverScrollableScrollPhysics(), - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, mainAxisSpacing: 0, crossAxisSpacing: 8, mainAxisExtent: 180), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 0, + crossAxisSpacing: 8, + mainAxisExtent: 180, + ), itemBuilder: (context, index) { final imageUrl = photos[index]; return Padding( @@ -359,9 +644,29 @@ class OnDemandDetailsScreen extends StatelessWidget { imageUrl: imageUrl, height: 60, width: 60, - imageBuilder: (context, imageProvider) => Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover))), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover), + imageBuilder: + (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: AlwaysStoppedAnimation( + AppThemeData.primary300, + ), + ), + ), + errorWidget: + (context, url, error) => Image.network( + Constant.placeHolderImage, + fit: BoxFit.cover, + ), fit: BoxFit.cover, ), ), @@ -370,11 +675,24 @@ class OnDemandDetailsScreen extends StatelessWidget { ); } - Widget reviewTabViewWidget(OnDemandDetailsController controller, bool isDark) { + Widget reviewTabViewWidget( + OnDemandDetailsController controller, + bool isDark, + ) { final reviews = controller.ratingService; if (reviews.isEmpty) { - return SizedBox(height: 200, child: Center(child: Text("No review Found".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)))); + return SizedBox( + height: 200, + child: Center( + child: Text( + "No review Found".tr(), + style: AppThemeData.mediumTextStyle( + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + ), + ); } return ListView.builder( @@ -390,8 +708,17 @@ class OnDemandDetailsScreen extends StatelessWidget { clipBehavior: Clip.antiAlias, decoration: ShapeDecoration( color: isDark ? AppThemeData.grey700 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), - shadows: const [BoxShadow(color: Color(0x0A000000), blurRadius: 32, offset: Offset(0, 0), spreadRadius: 0)], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + shadows: const [ + BoxShadow( + color: Color(0x0A000000), + blurRadius: 32, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( padding: const EdgeInsets.all(8.0), @@ -401,26 +728,58 @@ class OnDemandDetailsScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(review.uname ?? '', style: TextStyle(fontSize: 16, letterSpacing: 1, fontWeight: FontWeight.w600, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - review.createdAt != null ? DateFormat('dd MMM').format(review.createdAt!.toDate()) : '', - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + review.uname ?? '', + style: TextStyle( + fontSize: 16, + letterSpacing: 1, + fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + review.createdAt != null + ? DateFormat( + 'dd MMM', + ).format(review.createdAt!.toDate()) + : '', + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), const SizedBox(height: 4), RatingBar.builder( - initialRating: double.tryParse(review.rating.toString()) ?? 0, + initialRating: + double.tryParse(review.rating.toString()) ?? 0, direction: Axis.horizontal, itemSize: 20, ignoreGestures: true, itemPadding: const EdgeInsets.symmetric(horizontal: 4.0), - itemBuilder: (context, _) => Icon(Icons.star, color: AppThemeData.primary300), + itemBuilder: + (context, _) => + Icon(Icons.star, color: AppThemeData.primary300), onRatingUpdate: (rate) {}, ), const Divider(), const SizedBox(height: 5), - Text(review.comment ?? '', style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + review.comment ?? '', + style: TextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ], ), ), @@ -430,31 +789,71 @@ class OnDemandDetailsScreen extends StatelessWidget { ); } - Widget showTiming(BuildContext context, OnDemandDetailsController controller, bool isDark) { + Widget showTiming( + BuildContext context, + OnDemandDetailsController controller, + bool isDark, + ) { final provider = controller.provider; return Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey300 : Colors.white, borderRadius: const BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey300 : Colors.white, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ), + ), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), - child: Text("Service Timing".tr(), style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, fontFamily: AppThemeData.regular, color: AppThemeData.primary300)), + child: Text( + "Service Timing".tr(), + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + fontFamily: AppThemeData.regular, + color: AppThemeData.primary300, + ), + ), ), Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), child: Row( children: [ - Expanded(child: _timeCard(context, "Start Time : ".tr(), provider.startTime.toString(), isDark)), + Expanded( + child: _timeCard( + context, + "Start Time : ".tr(), + provider.startTime.toString(), + isDark, + ), + ), const SizedBox(width: 10), - Expanded(child: _timeCard(context, "End Time : ".tr(), provider.endTime.toString(), isDark)), + Expanded( + child: _timeCard( + context, + "End Time : ".tr(), + provider.endTime.toString(), + isDark, + ), + ), ], ), ), Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), - child: Text("Service Days".tr(), style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, fontFamily: AppThemeData.regular, color: AppThemeData.primary300)), + child: Text( + "Service Days".tr(), + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + fontFamily: AppThemeData.regular, + color: AppThemeData.primary300, + ), + ), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -466,10 +865,30 @@ class OnDemandDetailsScreen extends StatelessWidget { .map( (day) => Card( elevation: 2, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6), side: BorderSide(color: isDark ? const Color(0XFF3c3a2e) : const Color(0XFFC3C5D1), width: 1)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6), + side: BorderSide( + color: + isDark + ? const Color(0XFF3c3a2e) + : const Color(0XFFC3C5D1), + width: 1, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 7, horizontal: 20), - child: Text(day, style: TextStyle(color: isDark ? const Color(0XFFa5a292) : const Color(0XFF5A5D6D))), + padding: const EdgeInsets.symmetric( + vertical: 7, + horizontal: 20, + ), + child: Text( + day, + style: TextStyle( + color: + isDark + ? const Color(0XFFa5a292) + : const Color(0XFF5A5D6D), + ), + ), ), ), ) @@ -482,16 +901,39 @@ class OnDemandDetailsScreen extends StatelessWidget { ); } - Widget _timeCard(BuildContext context, String title, String value, bool isDark) { + Widget _timeCard( + BuildContext context, + String title, + String value, + bool isDark, + ) { return Card( elevation: 2, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6), side: BorderSide(color: isDark ? const Color(0XFF3c3a2e) : const Color(0XFFC3C5D1), width: 1)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6), + side: BorderSide( + color: isDark ? const Color(0XFF3c3a2e) : const Color(0XFFC3C5D1), + width: 1, + ), + ), child: Padding( padding: const EdgeInsets.symmetric(vertical: 7, horizontal: 20), child: Row( children: [ - Text(title, style: TextStyle(color: isDark ? const Color(0XFFa5a292) : const Color(0XFF5A5D6D))), - Text(value, style: TextStyle(color: isDark ? const Color(0XFFa5a292) : const Color(0XFF5A5D6D))), + Text( + title, + style: TextStyle( + color: + isDark ? const Color(0XFFa5a292) : const Color(0XFF5A5D6D), + ), + ), + Text( + value, + style: TextStyle( + color: + isDark ? const Color(0XFFa5a292) : const Color(0XFF5A5D6D), + ), + ), ], ), ), diff --git a/lib/screen_ui/on_demand_service/on_demand_home_screen.dart b/lib/screen_ui/on_demand_service/on_demand_home_screen.dart index fbe5aa6..0fea656 100644 --- a/lib/screen_ui/on_demand_service/on_demand_home_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_home_screen.dart @@ -20,7 +20,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/on_demand_home_controller.dart'; import '../../models/category_model.dart'; import '../../models/provider_serivce_model.dart'; @@ -51,8 +51,20 @@ class OnDemandHomeScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: const BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: const Center(child: Padding(padding: EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: const Center( + child: Padding( + padding: EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), @@ -61,8 +73,23 @@ class OnDemandHomeScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Constant.userModel == null - ? InkWell(onTap: () => Get.offAll(const LoginScreen()), child: Text("Login".tr(), style: AppThemeData.boldTextStyle(color: AppThemeData.grey900, fontSize: 12))) - : Text(Constant.userModel!.fullName(), style: AppThemeData.boldTextStyle(color: AppThemeData.grey900, fontSize: 12)), + ? InkWell( + onTap: () => Get.offAll(const LoginScreen()), + child: Text( + "Login".tr(), + style: AppThemeData.boldTextStyle( + color: AppThemeData.grey900, + fontSize: 12, + ), + ), + ) + : Text( + Constant.userModel!.fullName(), + style: AppThemeData.boldTextStyle( + color: AppThemeData.grey900, + fontSize: 12, + ), + ), InkWell( onTap: () async { if (Constant.userModel != null) { @@ -76,10 +103,13 @@ class OnDemandHomeScreen extends StatelessWidget { } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); // ✅ declare it once here! - ShippingAddress shippingAddress = ShippingAddress(); + ShippingAddress shippingAddress = + ShippingAddress(); try { await Geolocator.requestPermission(); @@ -87,41 +117,72 @@ class OnDemandHomeScreen extends StatelessWidget { ShowToastDialog.closeLoader(); if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lat = + firstPlace.coordinates.latitude; + final lng = + firstPlace.coordinates.longitude; final address = firstPlace.address; shippingAddress.addressAs = "Home"; - shippingAddress.locality = address.toString(); - shippingAddress.location = UserLocation(latitude: lat, longitude: lng); - Constant.selectedLocation = shippingAddress; + shippingAddress.locality = + address.toString(); + shippingAddress.location = UserLocation( + latitude: lat, + longitude: lng, + ); + Constant.selectedLocation = + shippingAddress; controller.getData(); Get.back(); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); - shippingAddress.locality = "Picked from Map"; // You can reverse-geocode + shippingAddress + .location = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, + ); + shippingAddress.locality = + "Picked from Map"; // You can reverse-geocode - Constant.selectedLocation = shippingAddress; + Constant.selectedLocation = + shippingAddress; controller.getData(); } }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then((valuePlaceMaker) { Placemark placeMark = valuePlaceMaker[0]; - shippingAddress.location = UserLocation(latitude: 19.228825, longitude: 72.854118); + shippingAddress.location = UserLocation( + latitude: 19.228825, + longitude: 72.854118, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; - shippingAddress.locality = currentLocation; + shippingAddress.locality = + currentLocation; }); Constant.selectedLocation = shippingAddress; @@ -139,10 +200,21 @@ class OnDemandHomeScreen extends StatelessWidget { TextSpan( children: [ TextSpan( - text: Constant.selectedLocation.getFullAddress(), - style: TextStyle(fontFamily: AppThemeData.medium, overflow: TextOverflow.ellipsis, color: AppThemeData.grey900, fontSize: 14), + text: + Constant.selectedLocation + .getFullAddress(), + style: TextStyle( + fontFamily: AppThemeData.medium, + overflow: TextOverflow.ellipsis, + color: AppThemeData.grey900, + fontSize: 14, + ), + ), + WidgetSpan( + child: SvgPicture.asset( + "assets/icons/ic_down.svg", + ), ), - WidgetSpan(child: SvgPicture.asset("assets/icons/ic_down.svg")), ], ), ), @@ -157,7 +229,8 @@ class OnDemandHomeScreen extends StatelessWidget { body: controller.isLoading.value ? Constant.loader() - : Constant.isZoneAvailable == false || controller.providerList.isEmpty + : Constant.isZoneAvailable == false || + controller.providerList.isEmpty ? Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( @@ -166,12 +239,30 @@ class OnDemandHomeScreen extends StatelessWidget { children: [ Image.asset("assets/images/location.gif", height: 120), const SizedBox(height: 12), - Text("No Store Found in Your Area".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "No Store Found in Your Area".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "Currently, there are no available store in your zone. Try changing your location to find nearby options.".tr(), + "Currently, there are no available store in your zone. Try changing your location to find nearby options." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -188,7 +279,10 @@ class OnDemandHomeScreen extends StatelessWidget { ), ) : Padding( - padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15), + padding: const EdgeInsets.symmetric( + vertical: 20, + horizontal: 15, + ), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -199,42 +293,95 @@ class OnDemandHomeScreen extends StatelessWidget { height: MediaQuery.of(context).size.height * 0.12, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark600 : AppThemeData.greyDark600, width: 1), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.greyDark600, + width: 1, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: controller.categories.isEmpty - ? Constant.showEmptyView(message: "No Categories".tr()) + ? Constant.showEmptyView( + message: "No Categories".tr(), + ) : Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: ListView.builder( - itemCount: controller.categories.length > 3 ? 3 : controller.categories.length, + itemCount: + controller.categories.length > + 3 + ? 3 + : controller + .categories + .length, scrollDirection: Axis.horizontal, itemBuilder: (context, index) { - final category = controller.categories[index]; + final category = + controller + .categories[index]; return InkWell( onTap: () { - Get.to(() => ViewCategoryServiceListScreen(), arguments: {'categoryId': category.id, 'categoryTitle': category.title}); + Get.to( + () => + ViewCategoryServiceListScreen(), + arguments: { + 'categoryId': + category.id, + 'categoryTitle': + category.title, + }, + ); }, - child: CategoryView(category: category, index: index, isDark: isDark), + child: CategoryView( + category: category, + index: index, + isDark: isDark, + ), ); }, ), ), if (controller.categories.length > 3) Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ InkWell( onTap: () { - Get.to(() => const OnDemandCategoryScreen()); + Get.to( + () => + const OnDemandCategoryScreen(), + ); }, - child: ClipOval(child: Container(width: 50, height: 50, color: AppThemeData.grey200, child: const Center(child: Icon(Icons.chevron_right)))), + child: ClipOval( + child: Container( + width: 50, + height: 50, + color: + AppThemeData + .grey200, + child: const Center( + child: Icon( + Icons.chevron_right, + ), + ), + ), + ), ), const SizedBox(height: 5), SizedBox( @@ -242,9 +389,17 @@ class OnDemandHomeScreen extends StatelessWidget { child: Center( child: Text( "View All".tr(), - textAlign: TextAlign.center, + textAlign: + TextAlign.center, maxLines: 1, - style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), ), @@ -262,14 +417,28 @@ class OnDemandHomeScreen extends StatelessWidget { Expanded( child: Text( "Most Popular services".tr(), - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 18, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark ? Colors.white : Colors.black, + fontSize: 18, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w600, + ), ), ), InkWell( onTap: () { Get.to(() => ViewAllPopularServiceScreen()); }, - child: Text("View all".tr(), style: TextStyle(color: AppThemeData.primary300, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w600)), + child: Text( + "View all".tr(), + style: TextStyle( + color: AppThemeData.primary300, + fontSize: 14, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w600, + ), + ), ), ], ), @@ -280,9 +449,16 @@ class OnDemandHomeScreen extends StatelessWidget { shrinkWrap: true, padding: EdgeInsets.zero, physics: const NeverScrollableScrollPhysics(), - itemCount: controller.providerList.length >= 6 ? 6 : controller.providerList.length, + itemCount: + controller.providerList.length >= 6 + ? 6 + : controller.providerList.length, itemBuilder: (_, index) { - return ServiceView(provider: controller.providerList[index], controller: controller, isDark: isDark); + return ServiceView( + provider: controller.providerList[index], + controller: controller, + isDark: isDark, + ); }, ), ], @@ -334,7 +510,13 @@ class BannerView extends StatelessWidget { final banner = bannerList[index]; return ClipRRect( borderRadius: BorderRadius.circular(15), - child: SizedBox(width: MediaQuery.of(context).size.width * 0.8, child: NetworkImageWidget(imageUrl: banner.photo ?? '', fit: BoxFit.cover)), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.8, + child: NetworkImageWidget( + imageUrl: banner.photo ?? '', + fit: BoxFit.cover, + ), + ), ); }, ), @@ -344,7 +526,18 @@ class BannerView extends StatelessWidget { return Row( children: List.generate(bannerList.length, (index) { bool isSelected = currentPage.value == index; - return Expanded(child: Container(height: 4, decoration: BoxDecoration(color: isSelected ? AppThemeData.grey300 : AppThemeData.grey100, borderRadius: BorderRadius.circular(5)))); + return Expanded( + child: Container( + height: 4, + decoration: BoxDecoration( + color: + isSelected + ? AppThemeData.grey300 + : AppThemeData.grey100, + borderRadius: BorderRadius.circular(5), + ), + ), + ); }), ); }), @@ -358,7 +551,12 @@ class CategoryView extends StatelessWidget { final int index; final bool isDark; - const CategoryView({super.key, required this.category, required this.index, required this.isDark}); + const CategoryView({ + super.key, + required this.category, + required this.index, + required this.isDark, + }); @override Widget build(BuildContext context) { @@ -370,11 +568,21 @@ class CategoryView extends StatelessWidget { Container( height: 55, width: 55, - decoration: BoxDecoration(color: Constant.colorList[index % Constant.colorList.length], borderRadius: BorderRadius.circular(50)), + decoration: BoxDecoration( + color: Constant.colorList[index % Constant.colorList.length], + borderRadius: BorderRadius.circular(50), + ), child: ClipOval( child: Padding( padding: const EdgeInsets.all(14.0), - child: CachedNetworkImage(imageUrl: category.image.toString(), errorWidget: (_, __, ___) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover)), + child: CachedNetworkImage( + imageUrl: category.image.toString(), + errorWidget: + (_, __, ___) => Image.network( + Constant.placeHolderImage, + fit: BoxFit.cover, + ), + ), ), ), ), @@ -382,7 +590,15 @@ class CategoryView extends StatelessWidget { SizedBox( width: 70, child: Center( - child: Text(category.title ?? "", textAlign: TextAlign.center, maxLines: 1, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + category.title ?? "", + textAlign: TextAlign.center, + maxLines: 1, + style: AppThemeData.semiBoldTextStyle( + color: + isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ), ), ], @@ -396,40 +612,70 @@ class ServiceView extends StatelessWidget { final bool isDark; final OnDemandHomeController? controller; - const ServiceView({super.key, required this.provider, this.isDark = false, this.controller}); + const ServiceView({ + super.key, + required this.provider, + this.isDark = false, + this.controller, + }); @override Widget build(BuildContext context) { return GestureDetector( onTap: () { - Get.to(() => OnDemandDetailsScreen(), arguments: {'providerModel': provider}); + Get.to( + () => OnDemandDetailsScreen(), + arguments: {'providerModel': provider}, + ); }, child: Container( margin: const EdgeInsets.symmetric(vertical: 5), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.grey500 : Colors.grey.shade200), + border: Border.all( + color: isDark ? AppThemeData.grey500 : Colors.grey.shade200, + ), color: isDark ? AppThemeData.grey900 : Colors.white, ), child: Row( children: [ // --- Left Image --- ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(10), bottomLeft: Radius.circular(10)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10), + ), child: CachedNetworkImage( - imageUrl: provider.photos.isNotEmpty ? provider.photos[0] : Constant.placeHolderImage, + imageUrl: + provider.photos.isNotEmpty + ? provider.photos[0] + : Constant.placeHolderImage, width: 110, height: MediaQuery.of(context).size.height * 0.16, fit: BoxFit.cover, - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover), + placeholder: + (context, url) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: AlwaysStoppedAnimation( + AppThemeData.primary300, + ), + ), + ), + errorWidget: + (context, url, error) => Image.network( + Constant.placeHolderImage, + fit: BoxFit.cover, + ), ), ), // --- Right Content --- Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 10, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -442,17 +688,40 @@ class ServiceView extends StatelessWidget { provider.title ?? "", maxLines: 1, overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: isDark ? Colors.white : Colors.black), + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : Colors.black, + ), ), ), if (controller != null) Obx( () => GestureDetector( - onTap: () => controller!.toggleFavourite(provider), + onTap: + () => controller!.toggleFavourite(provider), child: Icon( - controller!.lstFav.where((element) => element.service_id == provider.id).isNotEmpty ? Icons.favorite : Icons.favorite_border, + controller!.lstFav + .where( + (element) => + element.service_id == provider.id, + ) + .isNotEmpty + ? Icons.favorite + : Icons.favorite_border, size: 24, - color: controller!.lstFav.where((element) => element.service_id == provider.id).isNotEmpty ? AppThemeData.primary300 : (isDark ? Colors.white38 : Colors.black38), + color: + controller!.lstFav + .where( + (element) => + element.service_id == + provider.id, + ) + .isNotEmpty + ? AppThemeData.primary300 + : (isDark + ? Colors.white38 + : Colors.black38), ), ), ), @@ -464,10 +733,18 @@ class ServiceView extends StatelessWidget { // Category if (controller != null) FutureBuilder( - future: controller!.getCategory(provider.categoryId ?? ""), + future: controller!.getCategory( + provider.categoryId ?? "", + ), builder: (ctx, snap) { if (!snap.hasData) return const SizedBox.shrink(); - return Text(snap.data?.title ?? "", style: TextStyle(fontSize: 13, color: isDark ? Colors.white70 : Colors.black54)); + return Text( + snap.data?.title ?? "", + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white70 : Colors.black54, + ), + ); }, ), @@ -493,21 +770,39 @@ class ServiceView extends StatelessWidget { Widget _buildPrice() { if (provider.disPrice == "" || provider.disPrice == "0") { return Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', - style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), + provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: provider.price) + : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : AppThemeData.primary300, + ), ); } else { return Row( children: [ Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr()}', - style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), + provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: provider.disPrice ?? '0') + : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr()}', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : AppThemeData.primary300, + ), ), const SizedBox(width: 6), Flexible( child: Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/hr', - style: const TextStyle(fontSize: 12, color: Colors.grey, decoration: TextDecoration.lineThrough), + provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: provider.price) + : '${Constant.amountShow(amount: provider.price ?? "0")}/hr', + style: const TextStyle( + fontSize: 12, + color: Colors.grey, + decoration: TextDecoration.lineThrough, + ), overflow: TextOverflow.ellipsis, ), ), @@ -522,11 +817,21 @@ class ServiceView extends StatelessWidget { rating = (provider.reviewsSum ?? 0) / (provider.reviewsCount ?? 1); } return Container( - decoration: BoxDecoration(color: AppThemeData.warning400, borderRadius: BorderRadius.circular(12)), + decoration: BoxDecoration( + color: AppThemeData.warning400, + borderRadius: BorderRadius.circular(12), + ), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), child: Row( mainAxisSize: MainAxisSize.min, - children: [const Icon(Icons.star, size: 14, color: Colors.white), const SizedBox(width: 3), Text(rating.toStringAsFixed(1), style: const TextStyle(fontSize: 12, color: Colors.white))], + children: [ + const Icon(Icons.star, size: 14, color: Colors.white), + const SizedBox(width: 3), + Text( + rating.toStringAsFixed(1), + style: const TextStyle(fontSize: 12, color: Colors.white), + ), + ], ), ); } diff --git a/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart b/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart index 95c1555..9db13d4 100644 --- a/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart @@ -2,7 +2,7 @@ import 'package:clipboard/clipboard.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../../controllers/on_demand_order_details_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -38,12 +38,30 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Order Details".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Order Details".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -56,63 +74,147 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - (controller.onProviderOrder.value?.status ?? '') == Constant.orderCancelled + (controller.onProviderOrder.value?.status ?? '') == + Constant.orderCancelled ? Container( width: MediaQuery.of(context).size.width, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Padding( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), + padding: EdgeInsets.symmetric( + vertical: 8, + horizontal: 8, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('Cancel Reason'.tr(), style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(controller.onProviderOrder.value?.reason ?? '', style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.danger300)), + Text( + 'Cancel Reason'.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + controller + .onProviderOrder + .value + ?.reason ?? + '', + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.danger300, + ), + ), ], ), ), ) : Container(), - (controller.onProviderOrder.value?.status ?? '') == Constant.orderCancelled ? SizedBox(height: 10) : SizedBox.shrink(), + (controller.onProviderOrder.value?.status ?? '') == + Constant.orderCancelled + ? SizedBox(height: 10) + : SizedBox.shrink(), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Padding( - padding: EdgeInsets.symmetric(vertical: 15, horizontal: 10), + padding: EdgeInsets.symmetric( + vertical: 15, + horizontal: 10, + ), child: Column( children: [ Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text('Booking ID'.tr(), style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + 'Booking ID'.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), InkWell( onTap: () { - FlutterClipboard.copy(controller.onProviderOrder.value?.id ?? '').then((value) { + FlutterClipboard.copy( + controller + .onProviderOrder + .value + ?.id ?? + '', + ).then((value) { SnackBar snackBar = SnackBar( content: Text( "Booking ID Copied".tr(), textAlign: TextAlign.center, - style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), backgroundColor: Colors.black38, ); - ScaffoldMessenger.of(context).showSnackBar(snackBar); + ScaffoldMessenger.of( + context, + ).showSnackBar(snackBar); }); }, - child: Text('# ${controller.onProviderOrder.value?.id ?? ''}', style: AppThemeData.mediumTextStyle(fontSize: 15, color: AppThemeData.primary300)), + child: Text( + '# ${controller.onProviderOrder.value?.id ?? ''}', + style: AppThemeData.mediumTextStyle( + fontSize: 15, + color: AppThemeData.primary300, + ), + ), ), ], ), SizedBox(height: 10), Text( "${'Booking Address :'.tr()} ${controller.onProviderOrder.value?.address?.getFullAddress()}", - style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -122,8 +224,16 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Row( children: [ @@ -136,8 +246,20 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { borderRadius: BorderRadius.circular(10), image: DecorationImage( image: NetworkImage( - (controller.onProviderOrder.value != null && controller.onProviderOrder.value!.provider.photos.isNotEmpty) - ? controller.onProviderOrder.value!.provider.photos.first + (controller.onProviderOrder.value != + null && + controller + .onProviderOrder + .value! + .provider + .photos + .isNotEmpty) + ? controller + .onProviderOrder + .value! + .provider + .photos + .first : Constant.placeHolderImage, ), fit: BoxFit.cover, @@ -152,23 +274,71 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 6), child: Text( - controller.onProviderOrder.value?.provider.title ?? "", - style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller + .onProviderOrder + .value + ?.provider + .title ?? + "", + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), Row( children: [ Padding( - padding: const EdgeInsets.only(top: 6), - child: Text('${'Date:'.tr()} ', style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + padding: const EdgeInsets.only( + top: 6, + ), + child: Text( + '${'Date:'.tr()} ', + style: + AppThemeData.regularTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), ), Padding( - padding: const EdgeInsets.only(top: 6), + padding: const EdgeInsets.only( + top: 6, + ), child: Text( - controller.onProviderOrder.value?.scheduleDateTime != null - ? DateFormat('dd-MMM-yyyy').format(controller.onProviderOrder.value!.scheduleDateTime!.toDate()) + controller + .onProviderOrder + .value + ?.scheduleDateTime != + null + ? DateFormat( + 'dd-MMM-yyyy', + ).format( + controller + .onProviderOrder + .value! + .scheduleDateTime! + .toDate(), + ) : "", - style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.regularTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), ], @@ -176,16 +346,51 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Row( children: [ Padding( - padding: const EdgeInsets.only(top: 6), - child: Text('${'Time:'.tr()} ', style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + padding: const EdgeInsets.only( + top: 6, + ), + child: Text( + '${'Time:'.tr()} ', + style: + AppThemeData.regularTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), ), Padding( - padding: const EdgeInsets.only(top: 6), + padding: const EdgeInsets.only( + top: 6, + ), child: Text( - controller.onProviderOrder.value?.scheduleDateTime != null - ? DateFormat('hh:mm a').format(controller.onProviderOrder.value!.scheduleDateTime!.toDate()) + controller + .onProviderOrder + .value + ?.scheduleDateTime != + null + ? DateFormat('hh:mm a').format( + controller + .onProviderOrder + .value! + .scheduleDateTime! + .toDate(), + ) : "", - style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.regularTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), ], @@ -196,23 +401,50 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ], ), ), - (controller.onProviderOrder.value?.status == Constant.orderAccepted || - controller.onProviderOrder.value?.status == Constant.orderAssigned || - controller.onProviderOrder.value?.status == Constant.orderOngoing || - controller.onProviderOrder.value?.status == Constant.orderCompleted) && - (controller.onProviderOrder.value?.workerId != null && controller.onProviderOrder.value!.workerId!.isNotEmpty) + (controller.onProviderOrder.value?.status == + Constant.orderAccepted || + controller.onProviderOrder.value?.status == + Constant.orderAssigned || + controller.onProviderOrder.value?.status == + Constant.orderOngoing || + controller.onProviderOrder.value?.status == + Constant.orderCompleted) && + (controller.onProviderOrder.value?.workerId != + null && + controller + .onProviderOrder + .value! + .workerId! + .isNotEmpty) ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.symmetric(vertical: 10), - child: Text('About Worker'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + 'About Worker'.tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Padding( padding: const EdgeInsets.all(8.0), @@ -226,35 +458,99 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { CircleAvatar( radius: 30, backgroundImage: NetworkImage( - controller.worker.value?.profilePictureURL.isNotEmpty == true ? controller.worker.value!.profilePictureURL : Constant.placeHolderImage, + controller + .worker + .value + ?.profilePictureURL + .isNotEmpty == + true + ? controller + .worker + .value! + .profilePictureURL + : Constant + .placeHolderImage, ), ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( - controller.worker.value?.fullName() ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14, fontWeight: FontWeight.bold), + controller + .worker + .value + ?.fullName() ?? + '', + style: TextStyle( + color: + isDark + ? Colors + .white + : Colors + .black, + fontFamily: + AppThemeData + .regular, + fontSize: 14, + fontWeight: + FontWeight.bold, + ), + ), + const SizedBox( + height: 5, ), - const SizedBox(height: 5), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Padding( - padding: const EdgeInsets.only(top: 3), - child: Icon(Icons.location_on_outlined, size: 15, color: isDark ? Colors.white : Colors.black), + padding: + const EdgeInsets.only( + top: 3, + ), + child: Icon( + Icons + .location_on_outlined, + size: 15, + color: + isDark + ? Colors + .white + : Colors + .black, + ), ), Expanded( child: Text( - controller.worker.value?.address ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14), + controller + .worker + .value + ?.address ?? + '', + style: TextStyle( + color: + isDark + ? Colors + .white + : Colors + .black, + fontFamily: + AppThemeData + .regular, + fontSize: 14, + ), ), ), ], ), - const SizedBox(height: 10), + const SizedBox( + height: 10, + ), ], ), ), @@ -264,19 +560,61 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { SizedBox(width: 10), // Rating Box Container( - decoration: BoxDecoration(color: AppThemeData.warning400, borderRadius: BorderRadius.circular(16)), - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: AppThemeData.warning400, + borderRadius: + BorderRadius.circular(16), + ), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.star, size: 16, color: Colors.white), + const Icon( + Icons.star, + size: 16, + color: Colors.white, + ), const SizedBox(width: 3), Text( - (controller.worker.value != null && double.parse(controller.worker.value!.reviewsCount.toString()) != 0) - ? (double.parse(controller.worker.value!.reviewsSum.toString()) / double.parse(controller.worker.value!.reviewsCount.toString())) + (controller.worker.value != + null && + double.parse( + controller + .worker + .value! + .reviewsCount + .toString(), + ) != + 0) + ? (double.parse( + controller + .worker + .value! + .reviewsSum + .toString(), + ) / + double.parse( + controller + .worker + .value! + .reviewsCount + .toString(), + )) .toStringAsFixed(1) : '0', - style: const TextStyle(letterSpacing: 0.5, fontSize: 12, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: Colors.white), + style: const TextStyle( + letterSpacing: 0.5, + fontSize: 12, + fontFamily: + AppThemeData.regular, + fontWeight: + FontWeight.w500, + color: Colors.white, + ), ), ], ), @@ -284,17 +622,40 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ], ), Visibility( - visible: controller.onProviderOrder.value?.status == Constant.orderCompleted ? true : false, + visible: + controller + .onProviderOrder + .value + ?.status == + Constant.orderCompleted + ? true + : false, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: SizedBox( - width: MediaQuery.of(context).size.width, + width: + MediaQuery.of( + context, + ).size.width, child: ElevatedButton( // onPressed: () async { // Get.to(() => OnDemandReviewScreen(), arguments: {'order': controller.onProviderOrder.value, 'reviewFor': "Worker"}); // }, onPressed: () async { - final result = await Get.to(() => OnDemandReviewScreen(), arguments: {'order': controller.onProviderOrder.value, 'reviewFor': "Worker"}); + final result = await Get.to( + () => + OnDemandReviewScreen(), + arguments: { + 'order': + controller + .onProviderOrder + .value, + 'reviewFor': "Worker", + }, + ); // If review was submitted successfully if (result == true) { @@ -302,33 +663,105 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { } }, - style: ElevatedButton.styleFrom(backgroundColor: Colors.orange, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), - child: Text('Add Review'.tr(), style: AppThemeData.regularTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + style: ElevatedButton.styleFrom( + backgroundColor: + Colors.orange, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 16, + ), + ), + ), + child: Text( + 'Add Review'.tr(), + style: + AppThemeData.regularTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), ), ), ), ), - controller.onProviderOrder.value?.status == Constant.orderAccepted || - controller.onProviderOrder.value?.status == Constant.orderOngoing || - controller.onProviderOrder.value?.status == Constant.orderAssigned + controller + .onProviderOrder + .value + ?.status == + Constant.orderAccepted || + controller + .onProviderOrder + .value + ?.status == + Constant.orderOngoing || + controller + .onProviderOrder + .value + ?.status == + Constant.orderAssigned ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, children: [ Expanded( child: ElevatedButton( onPressed: () async { - Constant.makePhoneCall(controller.worker.value!.phoneNumber.toString()); + Constant.makePhoneCall( + controller + .worker + .value! + .phoneNumber + .toString(), + ); }, - style: ElevatedButton.styleFrom(backgroundColor: Color(0xFFFF6839), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + style: ElevatedButton.styleFrom( + backgroundColor: Color( + 0xFFFF6839, + ), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 16, + ), + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .center, children: [ - Icon(Icons.call, color: AppThemeData.grey50), + Icon( + Icons.call, + color: + AppThemeData + .grey50, + ), SizedBox(width: 10), - Text('Call'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), + Text( + 'Call'.tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + AppThemeData + .grey50, + ), + ), ], ), ), @@ -337,32 +770,88 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Expanded( child: ElevatedButton( onPressed: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": Constant.userModel?.fullName(), - "restaurantName": "${controller.worker.value?.firstName ?? ''} ${controller.worker.value?.lastName ?? ''}", - "orderId": controller.onProviderOrder.value?.id, - "restaurantId": controller.worker.value?.id, - "customerId": Constant.userModel?.id, - "customerProfileImage": Constant.userModel?.profilePictureURL, - "restaurantProfileImage": controller.worker.value?.profilePictureURL, - "token": controller.worker.value?.fcmToken, - "chatType": 'worker', + "customerName": + Constant + .userModel + ?.fullName(), + "restaurantName": + "${controller.worker.value?.firstName ?? ''} ${controller.worker.value?.lastName ?? ''}", + "orderId": + controller + .onProviderOrder + .value + ?.id, + "restaurantId": + controller + .worker + .value + ?.id, + "customerId": + Constant + .userModel + ?.id, + "customerProfileImage": + Constant + .userModel + ?.profilePictureURL, + "restaurantProfileImage": + controller + .worker + .value + ?.profilePictureURL, + "token": + controller + .worker + .value + ?.fcmToken, + "chatType": + 'worker', }, ); }, - style: ElevatedButton.styleFrom(backgroundColor: AppThemeData.primary300, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + style: ElevatedButton.styleFrom( + backgroundColor: + AppThemeData + .primary300, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 16, + ), + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .center, children: [ - Icon(Icons.chat_bubble, color: AppThemeData.grey50), + Icon( + Icons.chat_bubble, + color: + AppThemeData + .grey50, + ), SizedBox(width: 10), - Text('Chat'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), + Text( + 'Chat'.tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + AppThemeData + .grey50, + ), + ), ], ), ), @@ -380,13 +869,30 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { : SizedBox(), Padding( padding: EdgeInsets.symmetric(vertical: 10), - child: Text("About provider".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + "About provider".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Padding( padding: const EdgeInsets.all(8.0), @@ -400,22 +906,56 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { CircleAvatar( radius: 30, backgroundImage: NetworkImage( - controller.providerUser.value?.profilePictureURL?.isNotEmpty == true ? controller.providerUser.value!.profilePictureURL! : Constant.placeHolderImage, + controller + .providerUser + .value + ?.profilePictureURL + ?.isNotEmpty == + true + ? controller + .providerUser + .value! + .profilePictureURL! + : Constant.placeHolderImage, ), ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.providerUser.value?.fullName() ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14, fontWeight: FontWeight.bold), + controller.providerUser.value + ?.fullName() ?? + '', + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: + AppThemeData.regular, + fontSize: 14, + fontWeight: FontWeight.bold, + ), ), const SizedBox(height: 5), Text( - controller.providerUser.value?.email ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14), + controller + .providerUser + .value + ?.email ?? + '', + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: + AppThemeData.regular, + fontSize: 14, + ), ), const SizedBox(height: 10), ], @@ -426,19 +966,57 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), // Rating Box Container( - decoration: BoxDecoration(color: AppThemeData.warning400, borderRadius: BorderRadius.circular(16)), - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: AppThemeData.warning400, + borderRadius: BorderRadius.circular(16), + ), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.star, size: 16, color: Colors.white), + const Icon( + Icons.star, + size: 16, + color: Colors.white, + ), const SizedBox(width: 3), Text( - (controller.providerUser.value != null && double.parse(controller.providerUser.value!.reviewsCount.toString()) != 0) - ? (double.parse(controller.providerUser.value!.reviewsSum.toString()) / double.parse(controller.providerUser.value!.reviewsCount.toString())) + (controller.providerUser.value != + null && + double.parse( + controller + .providerUser + .value! + .reviewsCount + .toString(), + ) != + 0) + ? (double.parse( + controller + .providerUser + .value! + .reviewsSum + .toString(), + ) / + double.parse( + controller + .providerUser + .value! + .reviewsCount + .toString(), + )) .toStringAsFixed(1) : '0', - style: const TextStyle(letterSpacing: 0.5, fontSize: 12, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: Colors.white), + style: const TextStyle( + letterSpacing: 0.5, + fontSize: 12, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + color: Colors.white, + ), ), ], ), @@ -446,86 +1024,251 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ], ), Visibility( - visible: controller.onProviderOrder.value?.status == Constant.orderCompleted ? true : false, + visible: + controller + .onProviderOrder + .value + ?.status == + Constant.orderCompleted + ? true + : false, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: SizedBox( width: MediaQuery.of(context).size.width, child: ElevatedButton( onPressed: () async { - final result = await Get.to(() => OnDemandReviewScreen(), arguments: {'order': controller.onProviderOrder.value, 'reviewFor': "Provider"}); + final result = await Get.to( + () => OnDemandReviewScreen(), + arguments: { + 'order': + controller + .onProviderOrder + .value, + 'reviewFor': "Provider", + }, + ); if (result == true) { await controller.getData(); } }, - style: ElevatedButton.styleFrom(backgroundColor: Colors.orange, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), - child: Text('Add Review'.tr(), style: AppThemeData.regularTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.orange, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 16, + ), + ), + ), + child: Text( + 'Add Review'.tr(), + style: AppThemeData.regularTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), ), ), ), - controller.onProviderOrder.value?.status == Constant.orderAccepted || - controller.onProviderOrder.value?.status == Constant.orderOngoing || - controller.onProviderOrder.value?.status == Constant.orderAssigned + controller.onProviderOrder.value?.status == + Constant.orderAccepted || + controller + .onProviderOrder + .value + ?.status == + Constant.orderOngoing || + controller + .onProviderOrder + .value + ?.status == + Constant.orderAssigned ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Expanded( child: ElevatedButton( onPressed: () async { - Constant.makePhoneCall(controller.providerUser.value!.phoneNumber.toString()); + Constant.makePhoneCall( + controller + .providerUser + .value! + .phoneNumber + .toString(), + ); }, - style: ElevatedButton.styleFrom(backgroundColor: Color(0xFFFF6839), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + style: ElevatedButton.styleFrom( + backgroundColor: Color( + 0xFFFF6839, + ), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(16), + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - Icon(Icons.call, color: AppThemeData.grey50), + Icon( + Icons.call, + color: AppThemeData.grey50, + ), SizedBox(width: 10), - Text('Call'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), + Text( + 'Call'.tr(), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + AppThemeData + .grey50, + ), + ), ], ), ), ), - if ((Constant.isSubscriptionModelApplied == false && Constant.sectionConstantModel?.adminCommision?.isEnabled == false) || - ((Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) && - controller.onProviderOrder.value?.provider.subscriptionPlan?.features?.chat == true)) + if ((Constant.isSubscriptionModelApplied == + false && + Constant + .sectionConstantModel + ?.adminCommision + ?.isEnabled == + false) || + ((Constant.isSubscriptionModelApplied == + true || + Constant + .sectionConstantModel + ?.adminCommision + ?.isEnabled == + true) && + controller + .onProviderOrder + .value + ?.provider + .subscriptionPlan + ?.features + ?.chat == + true)) const SizedBox(width: 10), - if ((Constant.isSubscriptionModelApplied == false && Constant.sectionConstantModel?.adminCommision?.isEnabled == false) || - ((Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) && - controller.onProviderOrder.value?.provider.subscriptionPlan?.features?.chat == true)) + if ((Constant.isSubscriptionModelApplied == + false && + Constant + .sectionConstantModel + ?.adminCommision + ?.isEnabled == + false) || + ((Constant.isSubscriptionModelApplied == + true || + Constant + .sectionConstantModel + ?.adminCommision + ?.isEnabled == + true) && + controller + .onProviderOrder + .value + ?.provider + .subscriptionPlan + ?.features + ?.chat == + true)) Expanded( child: ElevatedButton( onPressed: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": Constant.userModel?.fullName(), - "restaurantName": "${controller.providerUser.value?.firstName ?? ''} ${controller.providerUser.value?.lastName ?? ''}", - "orderId": controller.onProviderOrder.value?.id, - "restaurantId": controller.providerUser.value?.id, - "customerId": Constant.userModel?.id, - "customerProfileImage": Constant.userModel?.profilePictureURL, - "restaurantProfileImage": controller.providerUser.value?.profilePictureURL, - "token": controller.providerUser.value?.fcmToken, + "customerName": + Constant.userModel + ?.fullName(), + "restaurantName": + "${controller.providerUser.value?.firstName ?? ''} ${controller.providerUser.value?.lastName ?? ''}", + "orderId": + controller + .onProviderOrder + .value + ?.id, + "restaurantId": + controller + .providerUser + .value + ?.id, + "customerId": + Constant + .userModel + ?.id, + "customerProfileImage": + Constant + .userModel + ?.profilePictureURL, + "restaurantProfileImage": + controller + .providerUser + .value + ?.profilePictureURL, + "token": + controller + .providerUser + .value + ?.fcmToken, "chatType": 'Provider', }, ); }, - style: ElevatedButton.styleFrom(backgroundColor: AppThemeData.primary300, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + style: ElevatedButton.styleFrom( + backgroundColor: + AppThemeData.primary300, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 16, + ), + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - Icon(Icons.chat_bubble, color: AppThemeData.grey50), + Icon( + Icons.chat_bubble, + color: + AppThemeData.grey50, + ), SizedBox(width: 10), - Text('Chat'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), + Text( + 'Chat'.tr(), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + AppThemeData + .grey50, + ), + ), ], ), ), @@ -538,14 +1281,31 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), ), ), - (controller.onProviderOrder.value?.status != Constant.orderCompleted || controller.onProviderOrder.value?.status != Constant.orderCancelled) && - controller.onProviderOrder.value?.provider.priceUnit == "Fixed" + (controller.onProviderOrder.value?.status != + Constant.orderCompleted || + controller.onProviderOrder.value?.status != + Constant.orderCancelled) && + controller + .onProviderOrder + .value + ?.provider + .priceUnit == + "Fixed" ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.symmetric(vertical: 10), - child: Text("Price Detail".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + "Price Detail".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), priceTotalRow(controller, isDark), ], @@ -553,18 +1313,44 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { : Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - controller.onProviderOrder.value?.paymentStatus == false || controller.onProviderOrder.value?.extraPaymentStatus == false + controller + .onProviderOrder + .value + ?.paymentStatus == + false || + controller + .onProviderOrder + .value + ?.extraPaymentStatus == + false ? Column( children: [ controller.couponList.isNotEmpty ? SizedBox( height: 85, child: ListView.builder( - itemCount: controller.couponList.length, - scrollDirection: Axis.horizontal, + itemCount: + controller + .couponList + .length, + scrollDirection: + Axis.horizontal, itemBuilder: (context, index) { - final coupon = controller.couponList[index]; - return GestureDetector(onTap: () => controller.applyCoupon(coupon), child: buildOfferItem(controller, index, isDark)); + final coupon = + controller + .couponList[index]; + return GestureDetector( + onTap: + () => controller + .applyCoupon( + coupon, + ), + child: buildOfferItem( + controller, + index, + isDark, + ), + ); }, ), ) @@ -575,46 +1361,112 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { : Offstage(), Padding( padding: EdgeInsets.symmetric(vertical: 16), - child: Text("Price Detail".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + "Price Detail".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), priceTotalRow(controller, isDark), ], ), - controller.onProviderOrder.value?.extraCharges.toString() != "" + controller.onProviderOrder.value?.extraCharges + .toString() != + "" ? Container( margin: EdgeInsets.symmetric(vertical: 10), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Container( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 10), + padding: EdgeInsets.symmetric( + vertical: 8, + horizontal: 10, + ), child: Column( children: [ Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text("Total Extra Charges : ".tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500)), Text( - Constant.amountShow(amount: controller.onProviderOrder.value?.extraCharges.toString()), - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + "Total Extra Charges : ".tr(), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), + ), + Text( + Constant.amountShow( + amount: + controller + .onProviderOrder + .value + ?.extraCharges + .toString(), + ), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), ], ), SizedBox(height: 5), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text( "Extra charge Notes : ".tr(), - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), ), Text( - controller.onProviderOrder.value?.extraChargesDescription ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + controller + .onProviderOrder + .value + ?.extraChargesDescription ?? + '', + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), ], ), @@ -625,39 +1477,101 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { : SizedBox(), SizedBox(height: 10), Visibility( - visible: controller.onProviderOrder.value?.status == Constant.orderPlaced || controller.onProviderOrder.value?.newScheduleDateTime != null ? true : false, + visible: + controller.onProviderOrder.value?.status == + Constant.orderPlaced || + controller + .onProviderOrder + .value + ?.newScheduleDateTime != + null + ? true + : false, child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Padding( - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: Column( children: [ - controller.onProviderOrder.value?.newScheduleDateTime != null + controller + .onProviderOrder + .value + ?.newScheduleDateTime != + null ? Row( children: [ - Text("New Date : ".tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500)), Text( - DateFormat('dd-MMM-yyyy hh:mm a').format(controller.onProviderOrder.value!.newScheduleDateTime!.toDate()), - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + "New Date : ".tr(), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: + AppThemeData.regular, + fontWeight: FontWeight.w500, + ), + ), + Text( + DateFormat( + 'dd-MMM-yyyy hh:mm a', + ).format( + controller + .onProviderOrder + .value! + .newScheduleDateTime! + .toDate(), + ), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: + AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), ], ) : SizedBox(), - controller.onProviderOrder.value?.status == Constant.orderPlaced || controller.onProviderOrder.value?.status == Constant.orderAccepted + controller.onProviderOrder.value?.status == + Constant.orderPlaced || + controller + .onProviderOrder + .value + ?.status == + Constant.orderAccepted ? Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: RoundedButtonFill( title: "Cancel Booking".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () { - showCancelBookingDialog(controller, isDark); + showCancelBookingDialog( + controller, + isDark, + ); }, ), ) @@ -669,7 +1583,10 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), ), const SizedBox(height: 20), - controller.onProviderOrder.value?.extraPaymentStatus == false && controller.onProviderOrder.value?.status == Constant.orderOngoing + controller.onProviderOrder.value?.extraPaymentStatus == + false && + controller.onProviderOrder.value?.status == + Constant.orderOngoing ? Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: RoundedButtonFill( @@ -678,17 +1595,43 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { textColor: AppThemeData.grey50, onPress: () async { double finalTotalAmount = 0.0; - finalTotalAmount = double.parse(controller.onProviderOrder.value!.extraCharges.toString()); - Get.to(() => OnDemandPaymentScreen(), arguments: {'onDemandOrderModel': controller.onProviderOrder, 'totalAmount': finalTotalAmount, 'isExtra': true}); + finalTotalAmount = double.parse( + controller + .onProviderOrder + .value! + .extraCharges + .toString(), + ); + Get.to( + () => OnDemandPaymentScreen(), + arguments: { + 'onDemandOrderModel': + controller.onProviderOrder, + 'totalAmount': finalTotalAmount, + 'isExtra': true, + }, + ); }, ), ) : SizedBox(), - controller.onProviderOrder.value?.provider.priceUnit != "Fixed" && controller.onProviderOrder.value?.paymentStatus == false + controller.onProviderOrder.value?.provider.priceUnit != + "Fixed" && + controller + .onProviderOrder + .value + ?.paymentStatus == + false ? Visibility( - visible: controller.onProviderOrder.value?.status == Constant.orderOngoing ? true : false, + visible: + controller.onProviderOrder.value?.status == + Constant.orderOngoing + ? true + : false, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: RoundedButtonFill( title: 'Pay Now'.tr(), color: AppThemeData.primary300, @@ -697,13 +1640,46 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { double finalTotalAmount = 0.0; finalTotalAmount = controller.totalAmount.value + - double.parse(controller.onProviderOrder.value!.extraCharges!.isNotEmpty ? controller.onProviderOrder.value!.extraCharges.toString() : "0.0"); - controller.onProviderOrder.value?.discount = controller.discountAmount.toString(); - controller.onProviderOrder.value?.discountType = controller.discountType.toString(); - controller.onProviderOrder.value?.discountLabel = controller.discountLabel.toString(); - controller.onProviderOrder.value?.couponCode = controller.offerCode.toString(); + double.parse( + controller + .onProviderOrder + .value! + .extraCharges! + .isNotEmpty + ? controller + .onProviderOrder + .value! + .extraCharges + .toString() + : "0.0", + ); + controller.onProviderOrder.value?.discount = + controller.discountAmount.toString(); + controller + .onProviderOrder + .value + ?.discountType = + controller.discountType.toString(); + controller + .onProviderOrder + .value + ?.discountLabel = + controller.discountLabel.toString(); + controller + .onProviderOrder + .value + ?.couponCode = + controller.offerCode.toString(); - Get.to(() => OnDemandPaymentScreen(), arguments: {'onDemandOrderModel': controller.onProviderOrder, 'totalAmount': finalTotalAmount, 'isExtra': false}); + Get.to( + () => OnDemandPaymentScreen(), + arguments: { + 'onDemandOrderModel': + controller.onProviderOrder, + 'totalAmount': finalTotalAmount, + 'isExtra': false, + }, + ); }, ), ), @@ -717,7 +1693,11 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ); } - Widget buildOfferItem(OnDemandOrderDetailsController controller, int index, bool isDark) { + Widget buildOfferItem( + OnDemandOrderDetailsController controller, + int index, + bool isDark, + ) { return Obx(() { final coupon = controller.couponList[index]; @@ -725,7 +1705,11 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { margin: const EdgeInsets.fromLTRB(7, 10, 7, 10), height: 85, child: DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(10), color: AppThemeData.primary300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(10), + color: AppThemeData.primary300, + ), child: Padding( padding: const EdgeInsets.fromLTRB(12, 5, 12, 0), child: Column( @@ -734,13 +1718,26 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Image(image: AssetImage('assets/images/offer_icon.png'), height: 25, width: 25), + const Image( + image: AssetImage('assets/images/offer_icon.png'), + height: 25, + width: 25, + ), const SizedBox(width: 10), Container( margin: const EdgeInsets.only(top: 3), child: Text( - coupon.discountType == "Fix Price" ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr()}" : "${coupon.discount} ${'% Off'.tr()}", - style: TextStyle(fontWeight: FontWeight.bold, letterSpacing: 0.7, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + coupon.discountType == "Fix Price" + ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr()}" + : "${coupon.discount} ${'% Off'.tr()}", + style: TextStyle( + fontWeight: FontWeight.bold, + letterSpacing: 0.7, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), ], @@ -749,11 +1746,36 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(coupon.code ?? '', style: const TextStyle(fontSize: 16, fontWeight: FontWeight.normal, letterSpacing: 0.5, color: Colors.orange)), - Container(margin: const EdgeInsets.only(left: 15, right: 15, top: 3), width: 1, color: AppThemeData.grey50), Text( - "valid till ".tr() + controller.getDate(coupon.expiresAt!.toDate().toString()), - style: TextStyle(letterSpacing: 0.5, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + coupon.code ?? '', + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.normal, + letterSpacing: 0.5, + color: Colors.orange, + ), + ), + Container( + margin: const EdgeInsets.only( + left: 15, + right: 15, + top: 3, + ), + width: 1, + color: AppThemeData.grey50, + ), + Text( + "valid till ".tr() + + controller.getDate( + coupon.expiresAt!.toDate().toString(), + ), + style: TextStyle( + letterSpacing: 0.5, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -765,13 +1787,19 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { }); } - Widget buildPromoCode(OnDemandOrderDetailsController controller, bool isDark) { + Widget buildPromoCode( + OnDemandOrderDetailsController controller, + bool isDark, + ) { return GestureDetector( child: Container( margin: const EdgeInsets.only(top: 10, bottom: 13), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, width: 0.3), + border: Border.all( + color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, + width: 0.3, + ), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, ), child: Padding( @@ -782,17 +1810,37 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Expanded( child: Row( children: [ - Image.asset("assets/images/reedem.png", height: 50, width: 50), + Image.asset( + "assets/images/reedem.png", + height: 50, + width: 50, + ), const SizedBox(width: 10), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Promo Code".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), overflow: TextOverflow.ellipsis), + Text( + "Promo Code".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + overflow: TextOverflow.ellipsis, + ), const SizedBox(height: 5), Text( "Apply promo code".tr(), - style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), overflow: TextOverflow.ellipsis, ), ], @@ -803,7 +1851,13 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), FloatingActionButton( onPressed: () { - Get.bottomSheet(promoCodeSheet(controller, isDark), isScrollControlled: true, isDismissible: true, backgroundColor: Colors.transparent, enableDrag: true); + Get.bottomSheet( + promoCodeSheet(controller, isDark), + isScrollControlled: true, + isDismissible: true, + backgroundColor: Colors.transparent, + enableDrag: true, + ); }, mini: true, backgroundColor: Colors.blueGrey.shade50, @@ -817,11 +1871,17 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ); } - Widget promoCodeSheet(OnDemandOrderDetailsController controller, bool isDark) { + Widget promoCodeSheet( + OnDemandOrderDetailsController controller, + bool isDark, + ) { return Container( padding: EdgeInsets.only(bottom: Get.height / 4.3, left: 25, right: 25), height: Get.height * 0.88, - decoration: BoxDecoration(color: Colors.transparent, border: Border.all(style: BorderStyle.none)), + decoration: BoxDecoration( + color: Colors.transparent, + border: Border.all(style: BorderStyle.none), + ), child: Column( children: [ InkWell( @@ -829,50 +1889,114 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: Container( height: 45, decoration: BoxDecoration( - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, width: 0.3), + border: Border.all( + color: + isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, + width: 0.3, + ), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, shape: BoxShape.circle, ), - child: Center(child: Icon(Icons.close, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, size: 28)), + child: Center( + child: Icon( + Icons.close, + color: + isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + size: 28, + ), + ), ), ), const SizedBox(height: 25), Expanded( child: Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + ), alignment: Alignment.center, child: SingleChildScrollView( child: Column( children: [ - Container(padding: const EdgeInsets.only(top: 30), child: const Image(image: AssetImage('assets/images/redeem_coupon.png'), width: 100)), Container( - padding: const EdgeInsets.only(top: 20), - child: Text('Redeem Your Coupons'.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), - ), - Center( - child: Container( - padding: const EdgeInsets.only(top: 10, left: 22, right: 22), - child: Text("Voucher or Coupon code".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + padding: const EdgeInsets.only(top: 30), + child: const Image( + image: AssetImage('assets/images/redeem_coupon.png'), + width: 100, ), ), Container( - padding: const EdgeInsets.only(left: 20, right: 20, top: 20), + padding: const EdgeInsets.only(top: 20), + child: Text( + 'Redeem Your Coupons'.tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), + ), + ), + Center( + child: Container( + padding: const EdgeInsets.only( + top: 10, + left: 22, + right: 22, + ), + child: Text( + "Voucher or Coupon code".tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), + ), + Container( + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 20, + ), child: DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(12), color: AppThemeData.primary300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(12), + color: AppThemeData.primary300, + ), child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(12)), + borderRadius: const BorderRadius.all( + Radius.circular(12), + ), child: Container( padding: const EdgeInsets.all(20), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, alignment: Alignment.center, child: TextFormField( textAlign: TextAlign.center, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), controller: controller.couponTextController.value, decoration: InputDecoration( border: InputBorder.none, hintText: "Write Coupon Code".tr(), - hintStyle: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400), + hintStyle: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + ), ), ), ), @@ -880,27 +2004,47 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.only(top: 30, bottom: 30, left: 15, right: 15), + padding: const EdgeInsets.only( + top: 30, + bottom: 30, + left: 15, + right: 15, + ), child: RoundedButtonFill( title: "REDEEM NOW".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () { - final inputCode = controller.couponTextController.value.text.trim().toLowerCase(); + final inputCode = + controller.couponTextController.value.text + .trim() + .toLowerCase(); print("Entered code: $inputCode"); - print("Available coupons: ${controller.couponList.map((e) => e.code).toList()}"); + print( + "Available coupons: ${controller.couponList.map((e) => e.code).toList()}", + ); - final matchingCoupon = controller.couponList.firstWhereOrNull((c) => (c.code ?? '').trim().toLowerCase() == inputCode); + final matchingCoupon = controller.couponList + .firstWhereOrNull( + (c) => + (c.code ?? '').trim().toLowerCase() == + inputCode, + ); if (matchingCoupon != null) { print("✅ Coupon matched: ${matchingCoupon.code}"); controller.applyCoupon(matchingCoupon); - Future.delayed(const Duration(milliseconds: 300), () { - Get.back(); - }); + Future.delayed( + const Duration(milliseconds: 300), + () { + Get.back(); + }, + ); } else { print("❌ No matching coupon found"); - ShowToastDialog.showToast("Applied coupon not valid.".tr()); + ShowToastDialog.showToast( + "Applied coupon not valid.".tr(), + ); } }, ), @@ -920,7 +2064,9 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), + border: Border.all( + color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, + ), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, ), child: Column( @@ -929,12 +2075,15 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { rowText( "Price".tr(), //Constant.amountShow(amount: controller.price.value.toString()), - controller.onProviderOrder.value?.provider.disPrice == "" || controller.onProviderOrder.value?.provider.disPrice == "0" + controller.onProviderOrder.value?.provider.disPrice == "" || + controller.onProviderOrder.value?.provider.disPrice == "0" ? "${Constant.amountShow(amount: controller.onProviderOrder.value?.provider.price.toString())} × ${controller.onProviderOrder.value?.quantity.toStringAsFixed(2)} ${Constant.amountShow(amount: controller.price.value.toString())}" : "${Constant.amountShow(amount: controller.onProviderOrder.value?.provider.disPrice.toString())} × ${controller.onProviderOrder.value?.quantity.toStringAsFixed(2)} ${Constant.amountShow(amount: controller.price.value.toString())}", isDark, ), - controller.discountAmount.value != 0 ? const Divider() : const SizedBox(), + controller.discountAmount.value != 0 + ? const Divider() + : const SizedBox(), controller.discountAmount.value != 0 ? Padding( padding: const EdgeInsets.symmetric(horizontal: 10), @@ -947,19 +2096,39 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ Text( "${"Discount".tr()} ${controller.discountType.value == 'Percentage' || controller.discountType.value == 'Percent' ? "(${controller.discountLabel.value}%)" : "(${Constant.amountShow(amount: controller.discountLabel.value)})"}", - style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: TextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + controller.offerCode.value, + style: TextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), - Text(controller.offerCode.value, style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ), ), - Text("(-${Constant.amountShow(amount: controller.discountAmount.value.toString())})", style: const TextStyle(color: Colors.red)), + Text( + "(-${Constant.amountShow(amount: controller.discountAmount.value.toString())})", + style: const TextStyle(color: Colors.red), + ), ], ), ) : const SizedBox(), const Divider(), - rowText("SubTotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), + rowText( + "SubTotal".tr(), + Constant.amountShow(amount: controller.subTotal.value.toString()), + isDark, + ), const Divider(), ListView.builder( itemCount: Constant.taxList.length, @@ -970,19 +2139,39 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { return Column( children: [ Padding( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 8, + horizontal: 10, + ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text( "${taxModel.title} (${taxModel.type == "fix" ? Constant.amountShow(amount: taxModel.tax) : "${taxModel.tax}%"})", - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), Text( - Constant.amountShow(amount: Constant.getTaxValue(amount: controller.subTotal.value.toString(), taxModel: taxModel).toString()), - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: + Constant.getTaxValue( + amount: + controller.subTotal.value.toString(), + taxModel: taxModel, + ).toString(), + ), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -993,7 +2182,13 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { }, ), // Total Amount - rowText("Total Amount".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), + rowText( + "Total Amount".tr(), + Constant.amountShow( + amount: controller.totalAmount.value.toString(), + ), + isDark, + ), const SizedBox(height: 5), ], ), @@ -1007,28 +2202,55 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(value, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.mediumTextStyle( + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + value, + style: AppThemeData.mediumTextStyle( + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ), ); } - Future showCancelBookingDialog(OnDemandOrderDetailsController controller, bool isDark) { + Future showCancelBookingDialog( + OnDemandOrderDetailsController controller, + bool isDark, + ) { return Get.dialog( AlertDialog( backgroundColor: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - title: Text('Please give reason for canceling this Booking'.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + title: Text( + 'Please give reason for canceling this Booking'.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), content: TextFormField( controller: controller.cancelBookingController.value, maxLines: 5, - decoration: InputDecoration(hintText: "Specify your reason here".tr(), border: OutlineInputBorder(borderRadius: BorderRadius.circular(7))), + decoration: InputDecoration( + hintText: "Specify your reason here".tr(), + border: OutlineInputBorder(borderRadius: BorderRadius.circular(7)), + ), ), actions: [ - TextButton(onPressed: () => Get.back(), child: Text('Cancel'.tr(), style: TextStyle(color: Colors.red))), + TextButton( + onPressed: () => Get.back(), + child: Text('Cancel'.tr(), style: TextStyle(color: Colors.red)), + ), TextButton( onPressed: () async { - if (controller.cancelBookingController.value.text.trim().isEmpty) { + if (controller.cancelBookingController.value.text + .trim() + .isEmpty) { ShowToastDialog.showToast("Please enter reason".tr()); } else { await controller.cancelBooking(); diff --git a/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart b/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart index dd6854a..c99539a 100644 --- a/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart @@ -1,7 +1,7 @@ import 'package:customer/constant/constant.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/0n_demand_payment_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../payment/createRazorPayOrderModel.dart'; @@ -35,12 +35,30 @@ class OnDemandPaymentScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Select Payment Method".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Select Payment Method".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -49,45 +67,106 @@ class OnDemandPaymentScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.greyDark200 : Colors.white), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), + decoration: BoxDecoration( + color: isDark ? AppThemeData.greyDark200 : Colors.white, + ), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Preferred Payment".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Preferred Payment".tr(), + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == + true || + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == + true || + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true) Column( children: [ const SizedBox(height: 10), Text( "Other Payment Options".tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), ), const SizedBox(height: 10), ], @@ -95,38 +174,155 @@ class OnDemandPaymentScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), Visibility( - visible: controller.payStackModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png"), + visible: + controller + .stripeModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller + .payPalModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller + .payStackModel + .value + .isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), Visibility( - visible: controller.razorPayModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), + visible: + controller + .mercadoPagoModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), ), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller + .flutterWaveModel + .value + .isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller + .payFastModel + .value + .isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller + .razorPayModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller + .orangeMoneyModel + .value + .enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -137,55 +333,151 @@ class OnDemandPaymentScreen extends StatelessWidget { color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { - print("getTotalAmount :::::::: ${"${controller.totalAmount.value}"}"); + print( + "getTotalAmount :::::::: ${"${controller.totalAmount.value}"}", + ); if (controller.isOrderPlaced.value == false) { controller.isOrderPlaced.value = true; - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet("${controller.totalAmount.value}", context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment("${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { - double totalAmount = double.parse("${controller.totalAmount.value}"); - double walletAmount = double.tryParse(Constant.userModel?.walletAmount?.toString() ?? "0") ?? 0; + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + "${controller.totalAmount.value}", + context, + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.wallet.name) { + double totalAmount = double.parse( + "${controller.totalAmount.value}", + ); + double walletAmount = + double.tryParse( + Constant.userModel?.walletAmount + ?.toString() ?? + "0", + ) ?? + 0; if (walletAmount == 0) { - ShowToastDialog.showToast("Wallet balance is 0. Please recharge wallet.".tr()); + ShowToastDialog.showToast( + "Wallet balance is 0. Please recharge wallet." + .tr(), + ); } else if (walletAmount < totalAmount) { - ShowToastDialog.showToast("Insufficient wallet balance. Please add funds.".tr()); + ShowToastDialog.showToast( + "Insufficient wallet balance. Please add funds." + .tr(), + ); } else { controller.placeOrder(); } - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.cod.name) { controller.placeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.wallet.name) { controller.placeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse("${controller.totalAmount.value}"), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: "${controller.totalAmount.value}", orderId: result.id); - } - }); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + "${controller.totalAmount.value}", + ), + razorpayModel: + controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr(), + ); + } else { + CreateRazorPayOrderModel result = + value; + controller.openCheckout( + amount: + "${controller.totalAmount.value}", + orderId: result.id, + ); + } + }); } else { controller.isOrderPlaced.value = false; - ShowToastDialog.showToast("Please select payment method".tr()); + ShowToastDialog.showToast( + "Please select payment method".tr(), + ); } controller.isOrderPlaced.value = false; } @@ -215,8 +507,21 @@ class OnDemandPaymentScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -227,12 +532,30 @@ class OnDemandPaymentScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: Constant.userModel?.walletAmount == null ? '0.0' : Constant.userModel?.walletAmount.toString()), + Constant.amountShow( + amount: + Constant.userModel?.walletAmount == null + ? '0.0' + : Constant.userModel?.walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -241,14 +564,23 @@ class OnDemandPaymentScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/on_demand_service/on_demand_review_screen.dart b/lib/screen_ui/on_demand_service/on_demand_review_screen.dart index f108a20..0b7a998 100644 --- a/lib/screen_ui/on_demand_service/on_demand_review_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_review_screen.dart @@ -1,7 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/on_demand_review_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -34,61 +34,139 @@ class OnDemandReviewScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text(controller.ratingModel.value != null ? "Update Review".tr() : "Add Review".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + controller.ratingModel.value != null + ? "Update Review".tr() + : "Add Review".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), ), body: Obx( () => - (controller.reviewFor.value == "Worker" && controller.workerModel.value == null) || (controller.reviewFor.value == "Provider" && controller.provider.value == null) + (controller.reviewFor.value == "Worker" && + controller.workerModel.value == null) || + (controller.reviewFor.value == "Provider" && + controller.provider.value == null) ? Constant.loader() : Padding( padding: const EdgeInsets.only(top: 50.0), child: Stack( children: [ Padding( - padding: const EdgeInsets.only(left: 20, right: 20, top: 42, bottom: 20), + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 42, + bottom: 20, + ), child: Card( elevation: 2, - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.only(top: 65), child: Column( children: [ - Text('Rate for'.tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - controller.reviewFor.value == "Provider" ? controller.order.value!.provider.authorName ?? "" : controller.workerModel.value!.fullName(), - style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + 'Rate for'.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + controller.reviewFor.value == "Provider" + ? controller + .order + .value! + .provider + .authorName ?? + "" + : controller.workerModel.value! + .fullName(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), Padding( padding: const EdgeInsets.only(top: 10), child: RatingBar.builder( - initialRating: controller.ratings.value, + initialRating: + controller.ratings.value, minRating: 1, direction: Axis.horizontal, allowHalfRating: true, itemCount: 5, - itemPadding: const EdgeInsets.symmetric(horizontal: 4.0), - itemBuilder: (context, _) => const Icon(Icons.star, color: Colors.amber), - unratedColor: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400, + itemPadding: + const EdgeInsets.symmetric( + horizontal: 4.0, + ), + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: Colors.amber, + ), + unratedColor: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, onRatingUpdate: (rating) { controller.ratings.value = rating; }, ), ), - Padding(padding: EdgeInsets.all(20.0), child: TextFieldWidget(hintText: "Type comment....".tr(), controller: controller.comment, maxLine: 5)), + Padding( + padding: EdgeInsets.all(20.0), + child: TextFieldWidget( + hintText: "Type comment....".tr(), + controller: controller.comment, + maxLine: 5, + ), + ), Padding( padding: const EdgeInsets.all(20.0), child: RoundedButtonFill( - title: controller.ratingModel.value != null ? "Update Review".tr() : "Add Review".tr(), + title: + controller.ratingModel.value != + null + ? "Update Review".tr() + : "Add Review".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: controller.submitReview, @@ -105,7 +183,19 @@ class OnDemandReviewScreen extends StatelessWidget { child: ClipRRect( borderRadius: BorderRadius.circular(50), child: NetworkImageWidget( - imageUrl: controller.reviewFor.value == "Provider" ? controller.order.value?.provider.authorProfilePic ?? '' : controller.workerModel.value?.profilePictureURL ?? '', + imageUrl: + controller.reviewFor.value == "Provider" + ? controller + .order + .value + ?.provider + .authorProfilePic ?? + '' + : controller + .workerModel + .value + ?.profilePictureURL ?? + '', fit: BoxFit.cover, height: 100, width: 100, diff --git a/lib/screen_ui/on_demand_service/provider_inbox_screen.dart b/lib/screen_ui/on_demand_service/provider_inbox_screen.dart index d582fc2..c0474bd 100644 --- a/lib/screen_ui/on_demand_service/provider_inbox_screen.dart +++ b/lib/screen_ui/on_demand_service/provider_inbox_screen.dart @@ -10,8 +10,7 @@ import 'package:customer/widget/firebase_pagination/src/fireStore_pagination.dar import 'package:customer/widget/firebase_pagination/src/models/view_type.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -25,10 +24,19 @@ class ProviderInboxScreen extends StatelessWidget { final isDark = themeController.isDark.value; return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Provider Inbox".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Provider Inbox".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: FirestorePagination( //item builder type is compulsory. @@ -40,8 +48,12 @@ class ProviderInboxScreen extends StatelessWidget { onTap: () async { ShowToastDialog.showLoader("Please wait...".tr()); - UserModel? customer = await FireStoreUtils.getUserProfile(inboxModel.customerId.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(inboxModel.restaurantId.toString()); + UserModel? customer = await FireStoreUtils.getUserProfile( + inboxModel.customerId.toString(), + ); + UserModel? restaurantUser = await FireStoreUtils.getUserProfile( + inboxModel.restaurantId.toString(), + ); ShowToastDialog.closeLoader(); Get.to( @@ -62,15 +74,23 @@ class ProviderInboxScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: NetworkImageWidget( - imageUrl: inboxModel.restaurantProfileImage.toString(), + imageUrl: + inboxModel.restaurantProfileImage.toString(), fit: BoxFit.cover, height: Responsive.height(6, context), width: Responsive.width(12, context), @@ -87,13 +107,29 @@ class ProviderInboxScreen extends StatelessWidget { child: Text( "${inboxModel.restaurantName}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), ), Text( - Constant.timestampToDate(inboxModel.createdAt!), + Constant.timestampToDate( + inboxModel.createdAt!, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.regular, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -101,7 +137,14 @@ class ProviderInboxScreen extends StatelessWidget { Text( "${inboxModel.lastMessage}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + ), ), ], ), @@ -116,7 +159,10 @@ class ProviderInboxScreen extends StatelessWidget { shrinkWrap: true, onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination - query: FirebaseFirestore.instance.collection('chat_provider').where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()).orderBy('createdAt', descending: true), + query: FirebaseFirestore.instance + .collection('chat_provider') + .where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()) + .orderBy('createdAt', descending: true), //Change types customerId viewType: ViewType.list, initialLoader: Constant.loader(), diff --git a/lib/screen_ui/on_demand_service/provider_screen.dart b/lib/screen_ui/on_demand_service/provider_screen.dart index 02e9936..e38223b 100644 --- a/lib/screen_ui/on_demand_service/provider_screen.dart +++ b/lib/screen_ui/on_demand_service/provider_screen.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/on_demand_service/on_demand_home_screen.dart' import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/provider_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../models/provider_serivce_model.dart'; @@ -26,58 +26,114 @@ class ProviderScreen extends StatelessWidget { controller.isLoading.value ? Center(child: Constant.loader()) : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 50), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 50, + ), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ Center( child: - (controller.userModel.value?.profilePictureURL ?? "").isNotEmpty - ? CircleAvatar(backgroundImage: NetworkImage(controller.userModel.value?.profilePictureURL ?? ''), radius: 50.0) - : CircleAvatar(backgroundImage: NetworkImage(Constant.placeHolderImage), radius: 50.0), + (controller.userModel.value?.profilePictureURL ?? + "") + .isNotEmpty + ? CircleAvatar( + backgroundImage: NetworkImage( + controller + .userModel + .value + ?.profilePictureURL ?? + '', + ), + radius: 50.0, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + Constant.placeHolderImage, + ), + radius: 50.0, + ), ), const SizedBox(height: 10), Text( controller.userModel.value?.fullName() ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 20, fontWeight: FontWeight.w900), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontFamily: AppThemeData.regular, + fontSize: 20, + fontWeight: FontWeight.w900, + ), ), const SizedBox(height: 5), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_mail.svg", color: isDark ? Colors.white : Colors.black), + SvgPicture.asset( + "assets/icons/ic_mail.svg", + color: isDark ? Colors.white : Colors.black, + ), const SizedBox(width: 6), Text( controller.userModel.value?.email ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14, fontWeight: FontWeight.w500), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontFamily: AppThemeData.regular, + fontSize: 14, + fontWeight: FontWeight.w500, + ), ), ], ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_mobile.svg", color: isDark ? Colors.white : Colors.black), + SvgPicture.asset( + "assets/icons/ic_mobile.svg", + color: isDark ? Colors.white : Colors.black, + ), const SizedBox(width: 6), Text( controller.userModel.value?.phoneNumber ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14, fontWeight: FontWeight.w500), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontFamily: AppThemeData.regular, + fontSize: 14, + fontWeight: FontWeight.w500, + ), ), ], ), const SizedBox(height: 10), Container( - decoration: const BoxDecoration(color: AppThemeData.warning400, borderRadius: BorderRadius.all(Radius.circular(16))), + decoration: const BoxDecoration( + color: AppThemeData.warning400, + borderRadius: BorderRadius.all(Radius.circular(16)), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.star, size: 16, color: Colors.white), + const Icon( + Icons.star, + size: 16, + color: Colors.white, + ), const SizedBox(width: 3), Text( _getRating(controller), - style: const TextStyle(letterSpacing: 0.5, fontSize: 12, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: Colors.white), + style: const TextStyle( + letterSpacing: 0.5, + fontSize: 12, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + color: Colors.white, + ), ), ], ), @@ -93,8 +149,14 @@ class ProviderScreen extends StatelessWidget { itemCount: controller.providerList.length, padding: EdgeInsets.zero, itemBuilder: (context, index) { - ProviderServiceModel data = controller.providerList[index]; - return ServiceView(provider: data, isDark: isDark, controller: controller.onDemandHomeController.value); + ProviderServiceModel data = + controller.providerList[index]; + return ServiceView( + provider: data, + isDark: isDark, + controller: + controller.onDemandHomeController.value, + ); }, ), ), @@ -107,8 +169,16 @@ class ProviderScreen extends StatelessWidget { } String _getRating(ProviderController controller) { - final reviewsCount = double.tryParse(controller.userModel.value?.reviewsCount?.toString() ?? "0") ?? 0; - final reviewsSum = double.tryParse(controller.userModel.value?.reviewsSum?.toString() ?? "0") ?? 0; + final reviewsCount = + double.tryParse( + controller.userModel.value?.reviewsCount?.toString() ?? "0", + ) ?? + 0; + final reviewsSum = + double.tryParse( + controller.userModel.value?.reviewsSum?.toString() ?? "0", + ) ?? + 0; if (reviewsCount == 0) return "0"; final avg = reviewsSum / reviewsCount; diff --git a/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart b/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart index b180048..287ddba 100644 --- a/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart +++ b/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart @@ -1,7 +1,7 @@ import 'package:customer/screen_ui/on_demand_service/on_demand_home_screen.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../controllers/view_all_popular_service_controller.dart'; @@ -32,12 +32,30 @@ class ViewAllPopularServiceScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("All Services".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "All Services".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -46,13 +64,29 @@ class ViewAllPopularServiceScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15), + padding: const EdgeInsets.symmetric( + vertical: 20, + horizontal: 15, + ), child: Column( children: [ - TextFieldWidget(hintText: "Search Service".tr(), controller: controller.searchTextFiledController.value, onchange: (value) => controller.getFilterData(value.toString())), + TextFieldWidget( + hintText: "Search Service".tr(), + controller: + controller.searchTextFiledController.value, + onchange: + (value) => + controller.getFilterData(value.toString()), + ), const SizedBox(height: 15), controller.providerList.isEmpty - ? Expanded(child: Center(child: Constant.showEmptyView(message: "No service Found".tr()))) + ? Expanded( + child: Center( + child: Constant.showEmptyView( + message: "No service Found".tr(), + ), + ), + ) : Expanded( child: ListView.builder( itemCount: controller.providerList.length, @@ -60,8 +94,14 @@ class ViewAllPopularServiceScreen extends StatelessWidget { padding: EdgeInsets.zero, scrollDirection: Axis.vertical, itemBuilder: (context, index) { - ProviderServiceModel data = controller.providerList[index]; - return ServiceView(provider: data, isDark: isDark, controller: controller.onDemandHomeController.value); + ProviderServiceModel data = + controller.providerList[index]; + return ServiceView( + provider: data, + isDark: isDark, + controller: + controller.onDemandHomeController.value, + ); }, ), ), diff --git a/lib/screen_ui/on_demand_service/view_category_service_screen.dart b/lib/screen_ui/on_demand_service/view_category_service_screen.dart index e86e7d9..467d535 100644 --- a/lib/screen_ui/on_demand_service/view_category_service_screen.dart +++ b/lib/screen_ui/on_demand_service/view_category_service_screen.dart @@ -1,6 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../controllers/view_category_service_controller.dart'; @@ -32,12 +32,30 @@ class ViewCategoryServiceListScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text(controller.categoryTitle.value, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + controller.categoryTitle.value, + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -48,14 +66,22 @@ class ViewCategoryServiceListScreen extends StatelessWidget { : controller.providerList.isEmpty ? Constant.showEmptyView(message: "No Service Found".tr()) : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: ListView.builder( itemCount: controller.providerList.length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - ProviderServiceModel providerModel = controller.providerList[index]; - return ServiceView(isDark: isDark, provider: providerModel, controller: controller.onDemandHomeController.value); + ProviderServiceModel providerModel = + controller.providerList[index]; + return ServiceView( + isDark: isDark, + provider: providerModel, + controller: controller.onDemandHomeController.value, + ); }, ), ), diff --git a/lib/screen_ui/on_demand_service/worker_inbox_screen.dart b/lib/screen_ui/on_demand_service/worker_inbox_screen.dart index 4b32e36..e74599c 100644 --- a/lib/screen_ui/on_demand_service/worker_inbox_screen.dart +++ b/lib/screen_ui/on_demand_service/worker_inbox_screen.dart @@ -10,8 +10,7 @@ import 'package:customer/widget/firebase_pagination/src/fireStore_pagination.dar import 'package:customer/widget/firebase_pagination/src/models/view_type.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -25,10 +24,19 @@ class WorkerInboxScreen extends StatelessWidget { final isDark = themeController.isDark.value; return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Worker Inbox".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Worker Inbox".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: FirestorePagination( //item builder type is compulsory. @@ -40,11 +48,17 @@ class WorkerInboxScreen extends StatelessWidget { onTap: () async { ShowToastDialog.showLoader("Please wait...".tr()); - UserModel? customer = await FireStoreUtils.getUserProfile(inboxModel.customerId.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(inboxModel.restaurantId.toString()); + UserModel? customer = await FireStoreUtils.getUserProfile( + inboxModel.customerId.toString(), + ); + UserModel? restaurantUser = await FireStoreUtils.getUserProfile( + inboxModel.restaurantId.toString(), + ); ShowToastDialog.closeLoader(); - print("customerId: ${inboxModel.customerId}, restaurantId: ${inboxModel.restaurantId}"); + print( + "customerId: ${inboxModel.customerId}, restaurantId: ${inboxModel.restaurantId}", + ); Get.to( const ChatScreen(), arguments: { @@ -63,15 +77,23 @@ class WorkerInboxScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: NetworkImageWidget( - imageUrl: inboxModel.restaurantProfileImage.toString(), + imageUrl: + inboxModel.restaurantProfileImage.toString(), fit: BoxFit.cover, height: Responsive.height(6, context), width: Responsive.width(12, context), @@ -88,13 +110,29 @@ class WorkerInboxScreen extends StatelessWidget { child: Text( "${inboxModel.restaurantName}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), ), Text( - Constant.timestampToDate(inboxModel.createdAt!), + Constant.timestampToDate( + inboxModel.createdAt!, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.regular, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -102,7 +140,14 @@ class WorkerInboxScreen extends StatelessWidget { Text( "${inboxModel.lastMessage}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + ), ), ], ), @@ -117,7 +162,10 @@ class WorkerInboxScreen extends StatelessWidget { shrinkWrap: true, onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination - query: FirebaseFirestore.instance.collection('chat_worker').where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()).orderBy('createdAt', descending: true), + query: FirebaseFirestore.instance + .collection('chat_worker') + .where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()) + .orderBy('createdAt', descending: true), //Change types customerId viewType: ViewType.list, initialLoader: Constant.loader(), diff --git a/lib/screen_ui/parcel_service/book_parcel_screen.dart b/lib/screen_ui/parcel_service/book_parcel_screen.dart index e60a814..cc14c4e 100644 --- a/lib/screen_ui/parcel_service/book_parcel_screen.dart +++ b/lib/screen_ui/parcel_service/book_parcel_screen.dart @@ -8,7 +8,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/book_parcel_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -43,8 +43,20 @@ class BookParcelScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), @@ -52,12 +64,21 @@ class BookParcelScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Book Your Document Delivery".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Book Your Document Delivery".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), Text( "Schedule a secure and timely pickup & delivery".tr(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: AppThemeData.mediumTextStyle(fontSize: 12, color: AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 12, + color: AppThemeData.grey900, + ), ), ], ), @@ -84,7 +105,8 @@ class BookParcelScreen extends StatelessWidget { nameController: controller.senderNameController.value, mobileController: controller.senderMobileController.value, noteController: controller.senderNoteController.value, - countryCodeController: controller.senderCountryCodeController.value, + countryCodeController: + controller.senderCountryCodeController.value, showWeight: true, isDark: isDark, context: context, @@ -95,14 +117,25 @@ class BookParcelScreen extends StatelessWidget { if (result != null) { final firstPlace = result; - if (Constant.checkZoneCheck(firstPlace.coordinates.latitude, firstPlace.coordinates.longitude) == true) { + if (Constant.checkZoneCheck( + firstPlace.coordinates.latitude, + firstPlace.coordinates.longitude, + ) == + true) { final address = firstPlace.address; final lat = firstPlace.coordinates.latitude; final lng = firstPlace.coordinates.longitude; - controller.senderLocationController.value.text = address; // ✅ - controller.senderLocation.value = UserLocation(latitude: lat, longitude: lng); // ✅ <-- Add this + controller.senderLocationController.value.text = + address; // ✅ + controller.senderLocation.value = UserLocation( + latitude: lat, + longitude: lng, + ); // ✅ <-- Add this } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr(), + ); } } } else { @@ -110,11 +143,27 @@ class BookParcelScreen extends StatelessWidget { if (value != null) { SelectedLocationModel selectedLocationModel = value; - if (Constant.checkZoneCheck(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude) == true) { - controller.senderLocationController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.senderLocation.value = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); + if (Constant.checkZoneCheck( + selectedLocationModel.latLng!.latitude, + selectedLocationModel.latLng!.longitude, + ) == + true) { + controller + .senderLocationController + .value + .text = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + controller.senderLocation.value = UserLocation( + latitude: selectedLocationModel.latLng!.latitude, + longitude: + selectedLocationModel.latLng!.longitude, + ); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr(), + ); } // ✅ <-- Add this } @@ -125,11 +174,13 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(height: 16), buildInfoSectionView( title: "Receiver Information".tr(), - locationController: controller.receiverLocationController.value, + locationController: + controller.receiverLocationController.value, nameController: controller.receiverNameController.value, mobileController: controller.receiverMobileController.value, noteController: controller.receiverNoteController.value, - countryCodeController: controller.receiverCountryCodeController.value, + countryCodeController: + controller.receiverCountryCodeController.value, showWeight: false, isDark: isDark, context: context, @@ -140,15 +191,26 @@ class BookParcelScreen extends StatelessWidget { if (result != null) { final firstPlace = result; - if (Constant.checkZoneCheck(firstPlace.coordinates.latitude, firstPlace.coordinates.longitude) == true) { + if (Constant.checkZoneCheck( + firstPlace.coordinates.latitude, + firstPlace.coordinates.longitude, + ) == + true) { final lat = firstPlace.coordinates.latitude; final lng = firstPlace.coordinates.longitude; final address = firstPlace.address; - controller.receiverLocationController.value.text = address; // ✅ - controller.receiverLocation.value = UserLocation(latitude: lat, longitude: lng); + controller.receiverLocationController.value.text = + address; // ✅ + controller.receiverLocation.value = UserLocation( + latitude: lat, + longitude: lng, + ); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr(), + ); } } } else { @@ -156,11 +218,27 @@ class BookParcelScreen extends StatelessWidget { if (value != null) { SelectedLocationModel selectedLocationModel = value; - if (Constant.checkZoneCheck(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude) == true) { - controller.receiverLocationController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.receiverLocation.value = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); // ✅ <-- Add this + if (Constant.checkZoneCheck( + selectedLocationModel.latLng!.latitude, + selectedLocationModel.latLng!.longitude, + ) == + true) { + controller + .receiverLocationController + .value + .text = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + controller.receiverLocation.value = UserLocation( + latitude: selectedLocationModel.latLng!.latitude, + longitude: + selectedLocationModel.latLng!.longitude, + ); // ✅ <-- Add this } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr(), + ); } } }); @@ -187,18 +265,30 @@ class BookParcelScreen extends StatelessWidget { ); } - Widget selectDeliveryTypeView(BookParcelController controller, bool isDark, BuildContext context) { + Widget selectDeliveryTypeView( + BookParcelController controller, + bool isDark, + BuildContext context, + ) { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + border: Border.all( + color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + ), ), padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 15), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Select delivery type".tr(), style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, fontSize: 13)), + Text( + "Select delivery type".tr(), + style: AppThemeData.boldTextStyle( + color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, + fontSize: 13, + ), + ), const SizedBox(height: 10), InkWell( onTap: () { @@ -207,12 +297,34 @@ class BookParcelScreen extends StatelessWidget { }, child: Row( children: [ - Image.asset("assets/images/image_parcel.png", height: 38, width: 38), + Image.asset( + "assets/images/image_parcel.png", + height: 38, + width: 38, + ), const SizedBox(width: 20), - Expanded(child: Text("As soon as possible".tr(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16))), + Expanded( + child: Text( + "As soon as possible".tr(), + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), + ), + ), Icon( - controller.selectedDeliveryType.value == 'now' ? Icons.radio_button_checked : Icons.radio_button_off, - color: controller.selectedDeliveryType.value == 'now' ? AppThemeData.primary300 : (isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + controller.selectedDeliveryType.value == 'now' + ? Icons.radio_button_checked + : Icons.radio_button_off, + color: + controller.selectedDeliveryType.value == 'now' + ? AppThemeData.primary300 + : (isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500), size: 20, ), ], @@ -228,12 +340,34 @@ class BookParcelScreen extends StatelessWidget { children: [ Row( children: [ - Image.asset("assets/images/image_parcel_scheduled.png", height: 38, width: 38), + Image.asset( + "assets/images/image_parcel_scheduled.png", + height: 38, + width: 38, + ), const SizedBox(width: 20), - Expanded(child: Text("Scheduled".tr(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16))), + Expanded( + child: Text( + "Scheduled".tr(), + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), + ), + ), Icon( - controller.selectedDeliveryType.value == 'later' ? Icons.radio_button_checked : Icons.radio_button_off, - color: controller.selectedDeliveryType.value == 'later' ? AppThemeData.primary300 : (isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + controller.selectedDeliveryType.value == 'later' + ? Icons.radio_button_checked + : Icons.radio_button_off, + color: + controller.selectedDeliveryType.value == 'later' + ? AppThemeData.primary300 + : (isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500), size: 20, ), ], @@ -246,9 +380,18 @@ class BookParcelScreen extends StatelessWidget { hintText: "When to pickup at this address".tr(), controller: controller.scheduledDateController.value, enable: false, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, - suffix: const Padding(padding: EdgeInsets.only(right: 10), child: Icon(Icons.calendar_month_outlined)), + backgroundColor: + isDark + ? AppThemeData.surfaceDark + : AppThemeData.surface, + borderColor: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + suffix: const Padding( + padding: EdgeInsets.only(right: 10), + child: Icon(Icons.calendar_month_outlined), + ), ), ), const SizedBox(height: 10), @@ -259,9 +402,18 @@ class BookParcelScreen extends StatelessWidget { controller: controller.scheduledTimeController.value, enable: false, // onchange: (v) => controller.pickScheduledTime(context), - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, - suffix: const Padding(padding: EdgeInsets.only(right: 10), child: Icon(Icons.access_time)), + backgroundColor: + isDark + ? AppThemeData.surfaceDark + : AppThemeData.surface, + borderColor: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + suffix: const Padding( + padding: EdgeInsets.only(right: 10), + child: Icon(Icons.access_time), + ), ), ), ], @@ -278,29 +430,75 @@ class BookParcelScreen extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + border: Border.all( + color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + ), ), padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 15), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Upload parcel image".tr(), style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, fontSize: 13)), + Text( + "Upload parcel image".tr(), + style: AppThemeData.boldTextStyle( + color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, + fontSize: 13, + ), + ), const SizedBox(height: 10), DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(10), color: isDark ? AppThemeData.greyDark300 : AppThemeData.grey300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(10), + color: isDark ? AppThemeData.greyDark300 : AppThemeData.grey300, + ), child: Container( alignment: Alignment.center, - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + ), padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 50), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_upload_parcel.svg", height: 40, width: 40), + SvgPicture.asset( + "assets/icons/ic_upload_parcel.svg", + height: 40, + width: 40, + ), const SizedBox(height: 10), - Text("Upload Parcel Image".tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Upload Parcel Image".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(height: 4), - Text("Supported: .jpg, .jpeg, .png".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text("Max size 1MB".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + "Supported: .jpg, .jpeg, .png".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), + Text( + "Max size 1MB".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), const SizedBox(height: 8), RoundedButtonFill( title: "Browse Image".tr(), @@ -326,7 +524,15 @@ class BookParcelScreen extends StatelessWidget { children: [ Container( padding: const EdgeInsets.only(top: 20, right: 20), - child: ClipRRect(borderRadius: BorderRadius.circular(8), child: Image.file(File(image.path), width: 70, height: 70, fit: BoxFit.cover)), + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.file( + File(image.path), + width: 70, + height: 70, + fit: BoxFit.cover, + ), + ), ), Positioned.fill( top: 0, @@ -334,7 +540,11 @@ class BookParcelScreen extends StatelessWidget { child: Align( alignment: Alignment.topRight, child: IconButton( - icon: const Icon(Icons.cancel, color: AppThemeData.danger300, size: 20), + icon: const Icon( + Icons.cancel, + color: AppThemeData.danger300, + size: 20, + ), onPressed: () { controller.images.remove(image); }, @@ -367,13 +577,21 @@ class BookParcelScreen extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + border: Border.all( + color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + ), ), padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 15), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(title, style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, fontSize: 13)), + Text( + title, + style: AppThemeData.boldTextStyle( + color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, + fontSize: 13, + ), + ), const SizedBox(height: 10), GestureDetector( @@ -382,9 +600,14 @@ class BookParcelScreen extends StatelessWidget { hintText: "Your Location".tr(), controller: locationController, - suffix: const Padding(padding: EdgeInsets.only(right: 10), child: Icon(Icons.location_on_outlined)), - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + suffix: const Padding( + padding: EdgeInsets.only(right: 10), + child: Icon(Icons.location_on_outlined), + ), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + borderColor: + isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, enable: false, ), ), @@ -393,8 +616,10 @@ class BookParcelScreen extends StatelessWidget { TextFieldWidget( hintText: "Name".tr(), controller: nameController, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + borderColor: + isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, ), const SizedBox(height: 10), @@ -402,24 +627,49 @@ class BookParcelScreen extends StatelessWidget { hintText: "Enter Mobile number".tr(), controller: mobileController, textInputType: TextInputType.number, - inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]')), LengthLimitingTextInputFormatter(10)], - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp('[0-9]')), + LengthLimitingTextInputFormatter(10), + ], + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + borderColor: + isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, prefix: Row( mainAxisSize: MainAxisSize.min, children: [ CountryCodePicker( onChanged: (value) { - countryCodeController.text = value.dialCode ?? Constant.defaultCountryCode; + countryCodeController.text = + value.dialCode ?? Constant.defaultCountryCode; }, - initialSelection: countryCodeController.text.isNotEmpty ? countryCodeController.text : Constant.defaultCountryCode, + initialSelection: + countryCodeController.text.isNotEmpty + ? countryCodeController.text + : Constant.defaultCountryCode, showCountryOnly: false, showOnlyCountryWhenClosed: false, alignLeft: false, - textStyle: TextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : Colors.black), - dialogTextStyle: TextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), - searchStyle: TextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), - dialogBackgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + textStyle: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark900 : Colors.black, + ), + dialogTextStyle: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + searchStyle: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + dialogBackgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, padding: EdgeInsets.zero, ), // const Icon(Icons.keyboard_arrow_down_rounded, size: 24, color: AppThemeData.grey400), @@ -437,19 +687,37 @@ class BookParcelScreen extends StatelessWidget { enableSearch: false, textFieldDecoration: InputDecoration( hintText: "Select parcel Weight".tr(), - hintStyle: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.greyDark400), + hintStyle: AppThemeData.regularTextStyle( + fontSize: 14, + color: + isDark ? AppThemeData.grey400 : AppThemeData.greyDark400, + ), filled: true, - fillColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - border: OutlineInputBorder(borderRadius: BorderRadius.circular(10), borderSide: BorderSide(color: AppThemeData.grey200)), - enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(10), borderSide: BorderSide(color: AppThemeData.grey200)), - focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(10), borderSide: BorderSide(color: AppThemeData.grey200)), + fillColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + contentPadding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 12, + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide(color: AppThemeData.grey200), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide(color: AppThemeData.grey200), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide(color: AppThemeData.grey200), + ), ), dropDownList: controller.parcelWeight.map((e) { return DropDownValueModel( name: e.title ?? 'Normal'.tr(), - value: e.title ?? 'Normal'.tr(), // safer to use title string + value: + e.title ?? 'Normal'.tr(), // safer to use title string ); }).toList(), onChanged: (val) { @@ -457,7 +725,8 @@ class BookParcelScreen extends StatelessWidget { controller.senderWeightController.value.setDropDown(val); // Link it to the selectedWeight object - controller.selectedWeight = controller.parcelWeight.firstWhereOrNull((e) => e.title == val.value); + controller.selectedWeight = controller.parcelWeight + .firstWhereOrNull((e) => e.title == val.value); } }, ), @@ -467,8 +736,10 @@ class BookParcelScreen extends StatelessWidget { TextFieldWidget( hintText: "Notes (Optional)".tr(), controller: noteController, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + borderColor: + isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, ), ], ), diff --git a/lib/screen_ui/parcel_service/home_parcel_screen.dart b/lib/screen_ui/parcel_service/home_parcel_screen.dart index 16e2437..b9ad4e1 100644 --- a/lib/screen_ui/parcel_service/home_parcel_screen.dart +++ b/lib/screen_ui/parcel_service/home_parcel_screen.dart @@ -3,7 +3,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/home_parcel_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../models/banner_model.dart'; @@ -46,8 +46,20 @@ class HomeParcelScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), @@ -60,9 +72,21 @@ class HomeParcelScreen extends StatelessWidget { onTap: () { Get.offAll(const LoginScreen()); }, - child: Text("Login".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + child: Text( + "Login".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), + ), ) - : Text(Constant.userModel!.fullName(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + : Text( + Constant.userModel!.fullName(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), + ), InkWell( onTap: () async { if (Constant.userModel != null) { @@ -75,9 +99,12 @@ class HomeParcelScreen extends StatelessWidget { } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); - ShippingAddress shippingAddress = ShippingAddress(); + ShippingAddress shippingAddress = + ShippingAddress(); try { await Geolocator.requestPermission(); @@ -85,40 +112,71 @@ class HomeParcelScreen extends StatelessWidget { ShowToastDialog.closeLoader(); if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lat = + firstPlace.coordinates.latitude; + final lng = + firstPlace.coordinates.longitude; final address = firstPlace.address; shippingAddress.addressAs = "Home"; - shippingAddress.locality = address.toString(); - shippingAddress.location = UserLocation(latitude: lat, longitude: lng); + shippingAddress.locality = + address.toString(); + shippingAddress.location = UserLocation( + latitude: lat, + longitude: lng, + ); - Constant.selectedLocation = shippingAddress; + Constant.selectedLocation = + shippingAddress; Get.back(); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); - shippingAddress.locality = "Picked from Map"; + shippingAddress + .location = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, + ); + shippingAddress.locality = + "Picked from Map"; - Constant.selectedLocation = shippingAddress; + Constant.selectedLocation = + shippingAddress; } }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then((valuePlaceMaker) { Placemark placeMark = valuePlaceMaker[0]; - shippingAddress.location = UserLocation(latitude: 19.228825, longitude: 72.854118); + shippingAddress.location = UserLocation( + latitude: 19.228825, + longitude: 72.854118, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; - shippingAddress.locality = currentLocation; + shippingAddress.locality = + currentLocation; }); Constant.selectedLocation = shippingAddress; @@ -133,7 +191,10 @@ class HomeParcelScreen extends StatelessWidget { Constant.selectedLocation.getFullAddress(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), ), ), ], @@ -160,22 +221,46 @@ class HomeParcelScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("What are you sending?".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "What are you sending?".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(height: 12), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), + ), + padding: const EdgeInsets.symmetric( + horizontal: 20, ), - padding: const EdgeInsets.symmetric(horizontal: 20), child: ListView.builder( itemCount: controller.parcelCategory.length, shrinkWrap: true, physics: const ScrollPhysics(), - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), itemBuilder: (context, index) { - return buildItems(item: controller.parcelCategory[index], isDark: isDark); + return buildItems( + item: controller.parcelCategory[index], + isDark: isDark, + ); }, ), ), @@ -199,16 +284,36 @@ class HomeParcelScreen extends StatelessWidget { if (Constant.userModel == null) { Get.to(const LoginScreen()); } else { - Get.to(const BookParcelScreen(), arguments: {'parcelCategory': item}); + Get.to( + const BookParcelScreen(), + arguments: {'parcelCategory': item}, + ); } }, child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - NetworkImageWidget(imageUrl: item.image ?? '', height: 38, width: 38), + NetworkImageWidget( + imageUrl: item.image ?? '', + height: 38, + width: 38, + ), const SizedBox(width: 20), - Expanded(child: Text(item.title ?? '', style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16))), - Icon(Icons.arrow_forward_ios, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, size: 20), + Expanded( + child: Text( + item.title ?? '', + style: AppThemeData.semiBoldTextStyle( + color: + isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + fontSize: 16, + ), + ), + ), + Icon( + Icons.arrow_forward_ios, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + size: 20, + ), ], ), ), @@ -256,7 +361,13 @@ class BannerView extends StatelessWidget { final banner = bannerList[index]; return ClipRRect( borderRadius: BorderRadius.circular(15), - child: SizedBox(width: MediaQuery.of(context).size.width * 0.8, child: NetworkImageWidget(imageUrl: banner.photo ?? '', fit: BoxFit.cover)), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.8, + child: NetworkImageWidget( + imageUrl: banner.photo ?? '', + fit: BoxFit.cover, + ), + ), ); }, ), @@ -266,7 +377,18 @@ class BannerView extends StatelessWidget { return Row( children: List.generate(bannerList.length, (index) { bool isSelected = currentPage.value == index; - return Expanded(child: Container(height: 4, decoration: BoxDecoration(color: isSelected ? AppThemeData.grey300 : AppThemeData.grey100, borderRadius: BorderRadius.circular(5)))); + return Expanded( + child: Container( + height: 4, + decoration: BoxDecoration( + color: + isSelected + ? AppThemeData.grey300 + : AppThemeData.grey100, + borderRadius: BorderRadius.circular(5), + ), + ), + ); }), ); }), diff --git a/lib/screen_ui/parcel_service/my_booking_screen.dart b/lib/screen_ui/parcel_service/my_booking_screen.dart index c1f00d5..25c4509 100644 --- a/lib/screen_ui/parcel_service/my_booking_screen.dart +++ b/lib/screen_ui/parcel_service/my_booking_screen.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/parcel_service/parcel_order_details.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/parcel_my_booking_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -23,14 +23,27 @@ class MyBookingScreen extends StatelessWidget { builder: (controller) { return DefaultTabController( length: controller.tabTitles.length, - initialIndex: controller.tabTitles.indexOf(controller.selectedTab.value), + initialIndex: controller.tabTitles.indexOf( + controller.selectedTab.value, + ), child: Scaffold( appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: AppThemeData.primary300, title: Padding( padding: const EdgeInsets.only(bottom: 10), - child: Row(children: [const SizedBox(width: 10), Text("Parcel History".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))]), + child: Row( + children: [ + const SizedBox(width: 10), + Text( + "Parcel History".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), + ], + ), ), bottom: TabBar( // don't re-subscribe onTap — just update selectedTab (optional) @@ -41,8 +54,13 @@ class MyBookingScreen extends StatelessWidget { labelColor: AppThemeData.parcelService500, unselectedLabelColor: AppThemeData.parcelService500, labelStyle: AppThemeData.boldTextStyle(fontSize: 15), - unselectedLabelStyle: AppThemeData.mediumTextStyle(fontSize: 15), - tabs: controller.tabTitles.map((title) => Tab(child: Center(child: Text(title)))).toList(), + unselectedLabelStyle: AppThemeData.mediumTextStyle( + fontSize: 15, + ), + tabs: + controller.tabTitles + .map((title) => Tab(child: Center(child: Text(title)))) + .toList(), ), ), @@ -56,12 +74,30 @@ class MyBookingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "Please Log In to Continue".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr(), + "You’re not logged in. Please sign in to access your account and explore all features." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -83,7 +119,17 @@ class MyBookingScreen extends StatelessWidget { final orders = controller.getOrdersForTab(title); if (orders.isEmpty) { - return Center(child: Text("No orders found".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center( + child: Text( + "No orders found".tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ); } return ListView.builder( @@ -93,55 +139,98 @@ class MyBookingScreen extends StatelessWidget { final order = orders[index]; return GestureDetector( onTap: () { - Get.to(() => const ParcelOrderDetails(), arguments: order); + Get.to( + () => const ParcelOrderDetails(), + arguments: order, + ); }, child: Container( margin: const EdgeInsets.only(bottom: 16), padding: const EdgeInsets.all(16), decoration: BoxDecoration( - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, borderRadius: BorderRadius.circular(15), - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.only(bottom: 8.0), + padding: const EdgeInsets.only( + bottom: 8.0, + ), child: Text( "${'Order Date:'.tr()}${order.isSchedule == true ? controller.formatDate(order.createdAt!) : controller.formatDate(order.senderPickupDateTime!)}", - style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.info400), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.info400, + ), ), ), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Column( children: [ - Image.asset("assets/images/image_parcel.png", height: 32, width: 32), - DottedBorder( - options: CustomPathDottedBorderOptions( - color: Colors.grey.shade400, - strokeWidth: 2, - dashPattern: [4, 4], - customPath: - (size) => - Path() - ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), - ), - child: const SizedBox(width: 20, height: 95), + Image.asset( + "assets/images/image_parcel.png", + height: 32, + width: 32, + ), + DottedBorder( + options: + CustomPathDottedBorderOptions( + color: + Colors + .grey + .shade400, + strokeWidth: 2, + dashPattern: [4, 4], + customPath: + (size) => + Path() + ..moveTo( + size.width / + 2, + 0, + ) + ..lineTo( + size.width / + 2, + size.height, + ), + ), + child: const SizedBox( + width: 20, + height: 95, + ), + ), + Image.asset( + "assets/images/image_parcel.png", + height: 32, + width: 32, ), - Image.asset("assets/images/image_parcel.png", height: 32, width: 32), ], ), const SizedBox(width: 12), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ _infoSection( - "Pickup Address (Sender):".tr(), + "Pickup Address (Sender):" + .tr(), order.sender?.name ?? '', order.sender?.address ?? '', order.sender?.phone ?? '', @@ -153,9 +242,11 @@ class MyBookingScreen extends StatelessWidget { ), const SizedBox(height: 16), _infoSection( - "Delivery Address (Receiver):".tr(), + "Delivery Address (Receiver):" + .tr(), order.receiver?.name ?? '', - order.receiver?.address ?? '', + order.receiver?.address ?? + '', order.receiver?.phone ?? '', // order.receiverPickupDateTime != null // ? "Delivery Time: ${controller.formatDate(order.receiverPickupDateTime!)}" @@ -182,27 +273,74 @@ class MyBookingScreen extends StatelessWidget { ); } - Widget _infoSection(String title, String name, String address, String phone, String? status, bool isDark) { + Widget _infoSection( + String title, + String name, + String address, + String phone, + String? status, + bool isDark, + ) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( - child: Text(title, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), maxLines: 1, overflow: TextOverflow.ellipsis), + child: Text( + title, + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), ), if (status != null) ...[ Container( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), - decoration: BoxDecoration(color: AppThemeData.info50, border: Border.all(color: AppThemeData.info300), borderRadius: BorderRadius.circular(12)), - child: Text(status, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.info500)), + padding: const EdgeInsets.symmetric( + vertical: 6, + horizontal: 12, + ), + decoration: BoxDecoration( + color: AppThemeData.info50, + border: Border.all(color: AppThemeData.info300), + borderRadius: BorderRadius.circular(12), + ), + child: Text( + status, + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.info500, + ), + ), ), ], ], ), - Text(name, style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(address, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(phone, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + name, + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + address, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + phone, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), //Text(time, style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ); diff --git a/lib/screen_ui/parcel_service/order_successfully_placed.dart b/lib/screen_ui/parcel_service/order_successfully_placed.dart index a4ff870..cbccb86 100644 --- a/lib/screen_ui/parcel_service/order_successfully_placed.dart +++ b/lib/screen_ui/parcel_service/order_successfully_placed.dart @@ -1,7 +1,7 @@ import 'package:customer/screen_ui/parcel_service/parcel_dashboard_screen.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import '../../controllers/parcel_dashboard_controller.dart'; @@ -24,13 +24,21 @@ class OrderSuccessfullyPlaced extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Image.asset("assets/images/parcel_order_successfully_placed.png"), + Image.asset( + "assets/images/parcel_order_successfully_placed.png", + ), const SizedBox(height: 20), Padding( padding: const EdgeInsets.symmetric(horizontal: 25), child: Text( "Your Order Has Been Placed!".tr(), - style: AppThemeData.boldTextStyle(fontSize: 22, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 22, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), textAlign: TextAlign.center, ), ), @@ -38,8 +46,15 @@ class OrderSuccessfullyPlaced extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 50), child: Text( - "We’ve received your parcel booking and it’s now being processed. You can track its status in real time.".tr(), - style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + "We’ve received your parcel booking and it’s now being processed. You can track its status in real time." + .tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), textAlign: TextAlign.center, ), ), @@ -50,7 +65,9 @@ class OrderSuccessfullyPlaced extends StatelessWidget { print("Tracking Order: $parcelOrder"); //Get.to(() => TrackOrderScreen(), arguments: {'order': parcelOrder}); Get.offAll(const ParcelDashboardScreen()); - ParcelDashboardController controller = Get.put(ParcelDashboardController()); + ParcelDashboardController controller = Get.put( + ParcelDashboardController(), + ); controller.selectedIndex.value = 1; }, color: AppThemeData.primary300, diff --git a/lib/screen_ui/parcel_service/parcel_coupon_screen.dart b/lib/screen_ui/parcel_service/parcel_coupon_screen.dart index 7c372ae..5393cc6 100644 --- a/lib/screen_ui/parcel_service/parcel_coupon_screen.dart +++ b/lib/screen_ui/parcel_service/parcel_coupon_screen.dart @@ -8,7 +8,7 @@ import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class ParcelCouponScreen extends StatelessWidget { const ParcelCouponScreen({super.key}); @@ -33,12 +33,30 @@ class ParcelCouponScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Coupon".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Coupon".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -54,17 +72,35 @@ class ParcelCouponScreen extends StatelessWidget { itemBuilder: (context, index) { CouponModel couponModel = controller.cabCouponList[index]; return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Container( height: Responsive.height(16, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(10), bottomLeft: Radius.circular(10)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10), + ), child: Stack( children: [ - Image.asset("assets/images/ic_coupon_image.png", height: Responsive.height(16, context), fit: BoxFit.fill), + Image.asset( + "assets/images/ic_coupon_image.png", + height: Responsive.height(16, context), + fit: BoxFit.fill, + ), Padding( padding: const EdgeInsets.only(left: 10), child: Align( @@ -74,7 +110,14 @@ class ParcelCouponScreen extends StatelessWidget { child: Text( "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr()}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ), ), @@ -84,24 +127,53 @@ class ParcelCouponScreen extends StatelessWidget { ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 18), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(6), color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + options: + RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular( + 6, + ), + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), child: Text( "${couponModel.code}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), ), ), ), - const Expanded(child: SizedBox(height: 10)), + const Expanded( + child: SizedBox(height: 10), + ), InkWell( onTap: () { Get.back(result: couponModel); @@ -109,18 +181,38 @@ class ParcelCouponScreen extends StatelessWidget { child: Text( "Tap To Apply".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ], ), const SizedBox(height: 20), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 20), Text( "${couponModel.description}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), diff --git a/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart b/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart index 97744c2..2fe7a4a 100644 --- a/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart +++ b/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart @@ -5,7 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class ParcelDashboardScreen extends StatelessWidget { const ParcelDashboardScreen({super.key}); @@ -25,12 +25,21 @@ class ParcelDashboardScreen extends StatelessWidget { showUnselectedLabels: true, showSelectedLabels: true, selectedFontSize: 12, - selectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), - unselectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), + selectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), + unselectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), currentIndex: controller.selectedIndex.value, - backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - selectedItemColor: isDark ? AppThemeData.parcelServiceDark300 : AppThemeData.primary300, - unselectedItemColor: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, + backgroundColor: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + selectedItemColor: + isDark + ? AppThemeData.parcelServiceDark300 + : AppThemeData.primary300, + unselectedItemColor: + isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, onTap: (int index) { if (index == 0) { Get.put(ParcelDashboardController()); @@ -40,15 +49,57 @@ class ParcelDashboardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_parcel.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_mybooking_parcel.svg", label: 'My Bookings'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_profile_parcel.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_parcel.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_mybooking_parcel.svg", + label: 'My Bookings'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_profile_parcel.svg", + label: 'Profile'.tr(), + controller: controller, + ), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_parcel.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_mybooking_parcel.svg", label: 'My Bookings'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet_parcel.svg", label: 'Wallet'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile_parcel.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_parcel.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_mybooking_parcel.svg", + label: 'My Bookings'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_wallet_parcel.svg", + label: 'Wallet'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_profile_parcel.svg", + label: 'Profile'.tr(), + controller: controller, + ), ], ), ); @@ -57,7 +108,13 @@ class ParcelDashboardScreen extends StatelessWidget { }); } - BottomNavigationBarItem navigationBarItem(isDark, {required int index, required String label, required String assetIcon, required ParcelDashboardController controller}) { + BottomNavigationBarItem navigationBarItem( + isDark, { + required int index, + required String label, + required String assetIcon, + required ParcelDashboardController controller, + }) { return BottomNavigationBarItem( icon: Padding( padding: const EdgeInsets.symmetric(vertical: 5), diff --git a/lib/screen_ui/parcel_service/parcel_order_confirmation.dart b/lib/screen_ui/parcel_service/parcel_order_confirmation.dart index a53ea1a..1d76a34 100644 --- a/lib/screen_ui/parcel_service/parcel_order_confirmation.dart +++ b/lib/screen_ui/parcel_service/parcel_order_confirmation.dart @@ -4,7 +4,7 @@ import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/parcel_order_confirmation_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -38,12 +38,30 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Order Confirmation".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Order Confirmation".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -60,8 +78,16 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Row( @@ -70,7 +96,11 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // Timeline with icons and line Column( children: [ - Image.asset("assets/images/image_parcel.png", height: 32, width: 32), + Image.asset( + "assets/images/image_parcel.png", + height: 32, + width: 32, + ), DottedBorder( options: CustomPathDottedBorderOptions( color: Colors.grey.shade400, @@ -80,11 +110,21 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { (size) => Path() ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), + ..lineTo( + size.width / 2, + size.height, + ), + ), + child: const SizedBox( + width: 20, + height: 95, ), - child: const SizedBox(width: 20, height: 95), ), - Image.asset("assets/images/image_parcel.png", height: 32, width: 32), + Image.asset( + "assets/images/image_parcel.png", + height: 32, + width: 32, + ), ], ), const SizedBox(width: 12), @@ -95,9 +135,24 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { children: [ _infoSection( "Pickup Address (Sender):".tr(), - controller.parcelOrder.value.sender?.name ?? '', - controller.parcelOrder.value.sender?.address ?? '', - controller.parcelOrder.value.sender?.phone ?? '', + controller + .parcelOrder + .value + .sender + ?.name ?? + '', + controller + .parcelOrder + .value + .sender + ?.address ?? + '', + controller + .parcelOrder + .value + .sender + ?.phone ?? + '', // controller.parcelOrder.value.senderPickupDateTime != null // ? "Pickup Time: ${controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}" // : '', @@ -106,9 +161,24 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { const SizedBox(height: 16), _infoSection( "Delivery Address (Receiver):".tr(), - controller.parcelOrder.value.receiver?.name ?? '', - controller.parcelOrder.value.receiver?.address ?? '', - controller.parcelOrder.value.receiver?.phone ?? '', + controller + .parcelOrder + .value + .receiver + ?.name ?? + '', + controller + .parcelOrder + .value + .receiver + ?.address ?? + '', + controller + .parcelOrder + .value + .receiver + ?.phone ?? + '', // controller.parcelOrder.value.receiverPickupDateTime != null // ? "Delivery Time: ${controller.formatDate(controller.parcelOrder.value.receiverPickupDateTime!)}" // : '', @@ -125,16 +195,42 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: EdgeInsets.all(16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - _iconTile("${controller.parcelOrder.value.distance ?? '--'} ${'KM'.tr()}", "Distance".tr(), "assets/icons/ic_distance_parcel.svg", isDark), - _iconTile(controller.parcelOrder.value.parcelWeight ?? '--', "Weight".tr(), "assets/icons/ic_weight_parcel.svg", isDark), - _iconTile(Constant.amountShow(amount: controller.parcelOrder.value.subTotal), "Rate".tr(), "assets/icons/ic_rate_parcel.svg", isDark), + _iconTile( + "${controller.parcelOrder.value.distance ?? '--'} ${'KM'.tr()}", + "Distance".tr(), + "assets/icons/ic_distance_parcel.svg", + isDark, + ), + _iconTile( + controller.parcelOrder.value.parcelWeight ?? + '--', + "Weight".tr(), + "assets/icons/ic_weight_parcel.svg", + isDark, + ), + _iconTile( + Constant.amountShow( + amount: controller.parcelOrder.value.subTotal, + ), + "Rate".tr(), + "assets/icons/ic_rate_parcel.svg", + isDark, + ), ], ), ), @@ -143,24 +239,53 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Row( children: [ - Expanded(child: Text("Coupons".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Expanded( + child: Text( + "Coupons".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), InkWell( onTap: () { Get.to(ParcelCouponScreen())!.then((value) { if (value != null) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: value); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = value; + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: value, + ); + if (couponAmount < + controller.subTotal.value) { + controller.selectedCouponModel.value = + value; controller.calculatePrice(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr()); + ShowToastDialog.showToast( + "This offer not eligible for this booking" + .tr(), + ); } } }); }, child: Text( "View All".tr(), - style: AppThemeData.boldTextStyle(decoration: TextDecoration.underline, fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.boldTextStyle( + decoration: TextDecoration.underline, + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ], @@ -169,21 +294,45 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // Coupon input DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(10), color: isDark ? AppThemeData.parcelServiceDark300 : AppThemeData.primary300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(10), + color: + isDark + ? AppThemeData.parcelServiceDark300 + : AppThemeData.primary300, + ), child: Container( - decoration: BoxDecoration(color: AppThemeData.parcelService50, borderRadius: BorderRadius.circular(10)), - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + color: AppThemeData.parcelService50, + borderRadius: BorderRadius.circular(10), + ), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_coupon_parcel.svg", height: 28, width: 28), + SvgPicture.asset( + "assets/icons/ic_coupon_parcel.svg", + height: 28, + width: 28, + ), SizedBox(width: 15), Expanded( child: TextField( - controller: controller.couponController.value, - style: AppThemeData.semiBoldTextStyle(color: AppThemeData.parcelService500, fontSize: 16), + controller: + controller.couponController.value, + style: AppThemeData.semiBoldTextStyle( + color: AppThemeData.parcelService500, + fontSize: 16, + ), decoration: InputDecoration( hintText: "Write coupon code".tr(), - hintStyle: AppThemeData.mediumTextStyle(fontSize: 16, color: AppThemeData.parcelService500), + hintStyle: AppThemeData.mediumTextStyle( + fontSize: 16, + color: AppThemeData.parcelService500, + ), border: InputBorder.none, ), ), @@ -191,22 +340,60 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { RoundedButtonFill( title: "Redeem now".tr(), onPress: () { - if (controller.couponList.where((element) => element.code!.toLowerCase() == controller.couponController.value.text.toLowerCase()).isNotEmpty) { - CouponModel couponModel = controller.couponList.firstWhere((p0) => p0.code!.toLowerCase() == controller.couponController.value.text.toLowerCase()); - if (couponModel.expiresAt!.toDate().isAfter(DateTime.now())) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: couponModel); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = couponModel; + if (controller.couponList + .where( + (element) => + element.code!.toLowerCase() == + controller + .couponController + .value + .text + .toLowerCase(), + ) + .isNotEmpty) { + CouponModel couponModel = controller + .couponList + .firstWhere( + (p0) => + p0.code!.toLowerCase() == + controller + .couponController + .value + .text + .toLowerCase(), + ); + if (couponModel.expiresAt! + .toDate() + .isAfter(DateTime.now())) { + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: couponModel, + ); + if (couponAmount < + controller.subTotal.value) { + controller.selectedCouponModel.value = + couponModel; controller.calculatePrice(); controller.update(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr()); + ShowToastDialog.showToast( + "This offer not eligible for this booking" + .tr(), + ); } } else { - ShowToastDialog.showToast("This coupon code has been expired".tr()); + ShowToastDialog.showToast( + "This coupon code has been expired" + .tr(), + ); } } else { - ShowToastDialog.showToast("Invalid coupon code".tr()); + ShowToastDialog.showToast( + "Invalid coupon code".tr(), + ); } }, borderRadius: 10, @@ -224,35 +411,84 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text( + "Order Summary".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey500, + ), + ), const SizedBox(height: 8), // Subtotal - _summaryTile("Subtotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, null), + _summaryTile( + "Subtotal".tr(), + Constant.amountShow( + amount: controller.subTotal.value.toString(), + ), + isDark, + null, + ), // Discount - _summaryTile("Discount".tr(), "-${Constant.amountShow(amount: controller.discount.value.toString())}", isDark, AppThemeData.dangerDark300), + _summaryTile( + "Discount".tr(), + "-${Constant.amountShow(amount: controller.discount.value.toString())}", + isDark, + AppThemeData.dangerDark300, + ), // Tax List - ...List.generate(Constant.taxList.length, (index) { + ...List.generate(Constant.taxList.length, ( + index, + ) { final taxModel = Constant.taxList[index]; - final taxTitle = "${taxModel.title} ${taxModel.type == 'fix' ? '(${Constant.amountShow(amount: taxModel.tax)})' : '(${taxModel.tax}%)'}"; - final taxAmount = Constant.getTaxValue(amount: (controller.subTotal.value - controller.discount.value).toString(), taxModel: taxModel).toString(); + final taxTitle = + "${taxModel.title} ${taxModel.type == 'fix' ? '(${Constant.amountShow(amount: taxModel.tax)})' : '(${taxModel.tax}%)'}"; + final taxAmount = + Constant.getTaxValue( + amount: + (controller.subTotal.value - + controller.discount.value) + .toString(), + taxModel: taxModel, + ).toString(); - return _summaryTile(taxTitle, Constant.amountShow(amount: taxAmount), isDark, null); + return _summaryTile( + taxTitle, + Constant.amountShow(amount: taxAmount), + isDark, + null, + ); }), const Divider(), // Total - _summaryTile("Order Total".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark, null), + _summaryTile( + "Order Total".tr(), + Constant.amountShow( + amount: + controller.totalAmount.value.toString(), + ), + isDark, + null, + ), ], ), ), @@ -260,15 +496,32 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Title - Text("Payment by".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Payment by".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 12), // Row with Sender and Receiver options @@ -276,16 +529,36 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { children: [ // Sender GestureDetector( - onTap: () => controller.paymentBy.value = "Sender", + onTap: + () => + controller.paymentBy.value = + "Sender", child: Row( children: [ Icon( - controller.paymentBy.value == "Sender" ? Icons.radio_button_checked : Icons.radio_button_off, - color: controller.paymentBy.value == "Sender" ? AppThemeData.primary300 : (isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + controller.paymentBy.value == "Sender" + ? Icons.radio_button_checked + : Icons.radio_button_off, + color: + controller.paymentBy.value == + "Sender" + ? AppThemeData.primary300 + : (isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500), size: 20, ), const SizedBox(width: 6), - Text("Sender".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + "Sender".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), ], ), ), @@ -294,16 +567,37 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // Receiver GestureDetector( - onTap: () => controller.paymentBy.value = "Receiver", + onTap: + () => + controller.paymentBy.value = + "Receiver", child: Row( children: [ Icon( - controller.paymentBy.value == "Receiver" ? Icons.radio_button_checked : Icons.radio_button_off, - color: controller.paymentBy.value == "Receiver" ? AppThemeData.primary300 : (isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + controller.paymentBy.value == + "Receiver" + ? Icons.radio_button_checked + : Icons.radio_button_off, + color: + controller.paymentBy.value == + "Receiver" + ? AppThemeData.primary300 + : (isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500), size: 20, ), const SizedBox(width: 6), - Text("Receiver".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + "Receiver".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), ], ), ), @@ -317,13 +611,23 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // Continue button RoundedButtonFill( - title: controller.paymentBy.value == "Sender" ? "Select Payment Method".tr() : "Continue".tr(), + title: + controller.paymentBy.value == "Sender" + ? "Select Payment Method".tr() + : "Continue".tr(), onPress: () async { if (controller.paymentBy.value == "Sender") { Get.bottomSheet( - paymentBottomSheet(context, controller, isDark), // your widget - isScrollControlled: true, // ✅ allows full drag scrolling - backgroundColor: Colors.transparent, // so your rounded corners are visible + paymentBottomSheet( + context, + controller, + isDark, + ), // your widget + isScrollControlled: + true, // ✅ allows full drag scrolling + backgroundColor: + Colors + .transparent, // so your rounded corners are visible ); } else { controller.placeOrder(); @@ -340,14 +644,44 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { ); } - Widget _infoSection(String title, String name, String address, String phone, bool isDark) { + Widget _infoSection( + String title, + String name, + String address, + String phone, + bool isDark, + ) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(title, style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(name, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(address, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(phone, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + name, + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + address, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + phone, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), // Text(time, style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ); @@ -357,11 +691,28 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { return Column( children: [ // Icon(icon, color: AppThemeData.primary300), - SvgPicture.asset(icon, height: 28, width: 28, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + SvgPicture.asset( + icon, + height: 28, + width: 28, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), const SizedBox(height: 6), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), const SizedBox(height: 6), - Text(title, style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ); } @@ -372,14 +723,32 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: title == "Order Total" ? 18 : 16, color: colors ?? (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Text( + title, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: title == "Order Total" ? 18 : 16, + color: + colors ?? + (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ), + ), ], ), ); } - Widget paymentBottomSheet(BuildContext context, ParcelOrderConfirmationController controller, bool isDark) { + Widget paymentBottomSheet( + BuildContext context, + ParcelOrderConfirmationController controller, + bool isDark, + ) { return DraggableScrollableSheet( initialChildSize: 0.70, minChildSize: 0.30, @@ -388,14 +757,26 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey500 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey500 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Select Payment Method".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Select Payment Method".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), GestureDetector( onTap: () { Get.back(); @@ -409,63 +790,213 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { child: ListView( controller: scrollController, children: [ - Text("Preferred Payment".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Preferred Payment".tr(), + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) const SizedBox(height: 10), - Text("Other Payment Options".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) + const SizedBox(height: 10), + Text( + "Other Payment Options".tr(), + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -479,25 +1010,59 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { color: AppThemeData.taxiBooking300, textColor: AppThemeData.grey900, onPress: () async { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.totalAmount.value.toString(), context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.totalAmount.value.toString(), + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.cod.name) { controller.placeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { - double walletBalance = double.tryParse(controller.userModel.value.walletAmount.toString()) ?? 0.0; - double amountToPay = double.tryParse(controller.totalAmount.value.toString()) ?? 0.0; + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name) { + double walletBalance = + double.tryParse( + controller.userModel.value.walletAmount.toString(), + ) ?? + 0.0; + double amountToPay = + double.tryParse( + controller.totalAmount.value.toString(), + ) ?? + 0.0; if (walletBalance < amountToPay) { - ShowToastDialog.showToast("Insufficient wallet balance".tr()); + ShowToastDialog.showToast( + "Insufficient wallet balance".tr(), + ); return; } controller.placeOrder(); @@ -505,24 +1070,52 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { // controller.placeOrder(); // } - else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); - } - }); + else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.totalAmount.value.toString(), + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr(), + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: controller.totalAmount.value.toString(), + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast("Please select payment method".tr()); + ShowToastDialog.showToast( + "Please select payment method".tr(), + ); } }, ), @@ -546,8 +1139,16 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -558,12 +1159,30 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: Constant.userModel?.walletAmount == null ? '0.0' : Constant.userModel?.walletAmount.toString()), + Constant.amountShow( + amount: + Constant.userModel?.walletAmount == null + ? '0.0' + : Constant.userModel?.walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -572,13 +1191,18 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/parcel_service/parcel_order_details.dart b/lib/screen_ui/parcel_service/parcel_order_details.dart index 8c75859..9a801bd 100644 --- a/lib/screen_ui/parcel_service/parcel_order_details.dart +++ b/lib/screen_ui/parcel_service/parcel_order_details.dart @@ -3,7 +3,7 @@ import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/parcel_order_details_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -40,8 +40,20 @@ class ParcelOrderDetails extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), @@ -49,12 +61,22 @@ class ParcelOrderDetails extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Details".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), Text( - "Your parcel is on the way. Track it in real time below.".tr(), + "Order Details".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), + Text( + "Your parcel is on the way. Track it in real time below." + .tr(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), ), ], ), @@ -74,23 +96,47 @@ class ParcelOrderDetails extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), width: double.infinity, padding: const EdgeInsets.all(16), child: Text( - "${'Order Id:'.tr()} ${Constant.orderId(orderId: controller.parcelOrder.value.id.toString())}".tr(), + "${'Order Id:'.tr()} ${Constant.orderId(orderId: controller.parcelOrder.value.id.toString())}" + .tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const SizedBox(height: 16), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( @@ -102,7 +148,11 @@ class ParcelOrderDetails extends StatelessWidget { // Timeline with icons and line Column( children: [ - Image.asset("assets/images/image_parcel.png", height: 32, width: 32), + Image.asset( + "assets/images/image_parcel.png", + height: 32, + width: 32, + ), DottedBorder( options: CustomPathDottedBorderOptions( color: Colors.grey.shade400, @@ -112,24 +162,50 @@ class ParcelOrderDetails extends StatelessWidget { (size) => Path() ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), + ..lineTo( + size.width / 2, + size.height, + ), + ), + child: const SizedBox( + width: 20, + height: 95, ), - child: const SizedBox(width: 20, height: 95), ), - Image.asset("assets/images/image_parcel.png", height: 32, width: 32), + Image.asset( + "assets/images/image_parcel.png", + height: 32, + width: 32, + ), ], ), const SizedBox(width: 12), // Address Details Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ _infoSection( "Pickup Address (Sender):".tr(), - controller.parcelOrder.value.sender?.name ?? '', - controller.parcelOrder.value.sender?.address ?? '', - controller.parcelOrder.value.sender?.phone ?? '', + controller + .parcelOrder + .value + .sender + ?.name ?? + '', + controller + .parcelOrder + .value + .sender + ?.address ?? + '', + controller + .parcelOrder + .value + .sender + ?.phone ?? + '', // controller.parcelOrder.value.senderPickupDateTime != null // ? "Pickup Time: ${controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}" // : '', @@ -138,9 +214,24 @@ class ParcelOrderDetails extends StatelessWidget { const SizedBox(height: 16), _infoSection( "Delivery Address (Receiver):".tr(), - controller.parcelOrder.value.receiver?.name ?? '', - controller.parcelOrder.value.receiver?.address ?? '', - controller.parcelOrder.value.receiver?.phone ?? '', + controller + .parcelOrder + .value + .receiver + ?.name ?? + '', + controller + .parcelOrder + .value + .receiver + ?.address ?? + '', + controller + .parcelOrder + .value + .receiver + ?.phone ?? + '', // controller.parcelOrder.value.receiverPickupDateTime != null // ? "Delivery Time: ${controller.formatDate(controller.parcelOrder.value.receiverPickupDateTime!)}" // : '', @@ -154,12 +245,16 @@ class ParcelOrderDetails extends StatelessWidget { const Divider(), - if (controller.parcelOrder.value.isSchedule == true) + if (controller.parcelOrder.value.isSchedule == + true) Padding( padding: const EdgeInsets.only(bottom: 8.0), child: Text( "${'Schedule Pickup time:'.tr()} ${controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}", - style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.info400), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.info400, + ), ), ), @@ -167,23 +262,61 @@ class ParcelOrderDetails extends StatelessWidget { padding: const EdgeInsets.only(bottom: 8.0), child: Text( "${'Order Date:'.tr()}${controller.parcelOrder.value.isSchedule == true ? controller.formatDate(controller.parcelOrder.value.createdAt!) : controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}", - style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.info400), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.info400, + ), ), ), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text("Parcel Type:".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + "Parcel Type:".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), Row( children: [ Text( - controller.parcelOrder.value.parcelType ?? '', - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + controller + .parcelOrder + .value + .parcelType ?? + '', + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), ), const SizedBox(width: 8), - if (controller.getSelectedCategory()?.image != null && controller.getSelectedCategory()!.image!.isNotEmpty) - NetworkImageWidget(imageUrl: controller.getSelectedCategory()?.image ?? '', height: 20, width: 20), + if (controller + .getSelectedCategory() + ?.image != + null && + controller + .getSelectedCategory()! + .image! + .isNotEmpty) + NetworkImageWidget( + imageUrl: + controller + .getSelectedCategory() + ?.image ?? + '', + height: 20, + width: 20, + ), ], ), ], @@ -193,15 +326,31 @@ class ParcelOrderDetails extends StatelessWidget { : SizedBox( height: 120, child: ListView.builder( - itemCount: controller.parcelOrder.value.parcelImages!.length, + itemCount: + controller + .parcelOrder + .value + .parcelImages! + .length, shrinkWrap: true, scrollDirection: Axis.horizontal, itemBuilder: (context, index) { return Padding( padding: const EdgeInsets.all(8.0), child: ClipRRect( - borderRadius: BorderRadius.circular(10), - child: NetworkImageWidget(imageUrl: controller.parcelOrder.value.parcelImages![index], width: 100, fit: BoxFit.cover, borderRadius: 10), + borderRadius: BorderRadius.circular( + 10, + ), + child: NetworkImageWidget( + imageUrl: + controller + .parcelOrder + .value + .parcelImages![index], + width: 100, + fit: BoxFit.cover, + borderRadius: 10, + ), ), ); }, @@ -215,16 +364,42 @@ class ParcelOrderDetails extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: EdgeInsets.all(16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - _iconTile("${controller.parcelOrder.value.distance ?? '--'} ${Constant.distanceType}", "Distance".tr(), "assets/icons/ic_distance_parcel.svg", isDark), - _iconTile(controller.parcelOrder.value.parcelWeight ?? '--', "Weight".tr(), "assets/icons/ic_weight_parcel.svg", isDark), - _iconTile(Constant.amountShow(amount: controller.parcelOrder.value.subTotal), "Rate".tr(), "assets/icons/ic_rate_parcel.svg", isDark), + _iconTile( + "${controller.parcelOrder.value.distance ?? '--'} ${Constant.distanceType}", + "Distance".tr(), + "assets/icons/ic_distance_parcel.svg", + isDark, + ), + _iconTile( + controller.parcelOrder.value.parcelWeight ?? + '--', + "Weight".tr(), + "assets/icons/ic_weight_parcel.svg", + isDark, + ), + _iconTile( + Constant.amountShow( + amount: controller.parcelOrder.value.subTotal, + ), + "Rate".tr(), + "assets/icons/ic_rate_parcel.svg", + isDark, + ), ], ), ), @@ -235,18 +410,37 @@ class ParcelOrderDetails extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("About Driver".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "About Driver".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 8), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Row( children: [ @@ -254,19 +448,48 @@ class ParcelOrderDetails extends StatelessWidget { width: 52, height: 52, child: ClipRRect( - borderRadius: BorderRadiusGeometry.circular(10), - child: NetworkImageWidget(imageUrl: controller.driverUser.value?.profilePictureURL ?? '', height: 70, width: 70, borderRadius: 35), + borderRadius: + BorderRadiusGeometry.circular( + 10, + ), + child: NetworkImageWidget( + imageUrl: + controller + .driverUser + .value + ?.profilePictureURL ?? + '', + height: 70, + width: 70, + borderRadius: 35, + ), ), ), SizedBox(width: 20), Text( - controller.parcelOrder.value.driver?.fullName() ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 18), + controller + .parcelOrder + .value + .driver + ?.fullName() ?? + '', + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData.grey900, + fontSize: 18, + ), ), ], ), RoundedButtonBorder( - title: controller.driverUser.value!.averageRating.toStringAsFixed(1), + title: controller + .driverUser + .value! + .averageRating + .toStringAsFixed(1), width: 20, height: 3.5, radius: 10, @@ -275,72 +498,155 @@ class ParcelOrderDetails extends StatelessWidget { textColor: AppThemeData.warning400, borderColor: AppThemeData.warning400, color: AppThemeData.warning50, - icon: SvgPicture.asset("assets/icons/ic_start.svg"), + icon: SvgPicture.asset( + "assets/icons/ic_start.svg", + ), onPress: () {}, ), ], ), Visibility( - visible: controller.parcelOrder.value.status == Constant.orderCompleted ? true : false, + visible: + controller.parcelOrder.value.status == + Constant.orderCompleted + ? true + : false, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: RoundedButtonFill( - title: controller.ratingModel.value.id != null && controller.ratingModel.value.id!.isNotEmpty ? 'Update Review'.tr() : 'Add Review'.tr(), + title: + controller.ratingModel.value.id != + null && + controller + .ratingModel + .value + .id! + .isNotEmpty + ? 'Update Review'.tr() + : 'Add Review'.tr(), onPress: () async { - final result = await Get.to(() => ParcelReviewScreen(), arguments: {'order': controller.parcelOrder.value}); + final result = await Get.to( + () => ParcelReviewScreen(), + arguments: { + 'order': + controller + .parcelOrder + .value, + }, + ); // If review was submitted successfully if (result == true) { - await controller.fetchDriverDetails(); + await controller + .fetchDriverDetails(); } }, height: 5, borderRadius: 15, color: Colors.orange, - textColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, ), ), ), - if (controller.parcelOrder.value.status != Constant.orderCompleted) + if (controller.parcelOrder.value.status != + Constant.orderCompleted) Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ InkWell( onTap: () { - Constant.makePhoneCall(controller.parcelOrder.value.driver!.phoneNumber.toString()); + Constant.makePhoneCall( + controller + .parcelOrder + .value + .driver! + .phoneNumber + .toString(), + ); }, child: Container( width: 150, height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_phone_call.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_phone_call.svg")), ), ), const SizedBox(width: 10), InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); - UserModel? customer = await FireStoreUtils.getUserProfile(controller.parcelOrder.value.authorID ?? ''); - UserModel? driverUser = await FireStoreUtils.getUserProfile(controller.parcelOrder.value.driverId ?? ''); + UserModel? customer = + await FireStoreUtils.getUserProfile( + controller + .parcelOrder + .value + .authorID ?? + '', + ); + UserModel? driverUser = + await FireStoreUtils.getUserProfile( + controller + .parcelOrder + .value + .driverId ?? + '', + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": customer?.fullName(), - "restaurantName": driverUser?.fullName(), - "orderId": controller.parcelOrder.value.id, - "restaurantId": driverUser?.id, + "customerName": + customer?.fullName(), + "restaurantName": + driverUser?.fullName(), + "orderId": + controller + .parcelOrder + .value + .id, + "restaurantId": + driverUser?.id, "customerId": customer?.id, - "customerProfileImage": customer?.profilePictureURL, - "restaurantProfileImage": driverUser?.profilePictureURL, + "customerProfileImage": + customer + ?.profilePictureURL, + "restaurantProfileImage": + driverUser + ?.profilePictureURL, "token": driverUser?.fcmToken, "chatType": "Driver", }, @@ -351,11 +657,29 @@ class ParcelOrderDetails extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_wechat.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_wechat.svg")), ), ), ], @@ -369,43 +693,98 @@ class ParcelOrderDetails extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text( + "Order Summary".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey500, + ), + ), const SizedBox(height: 8), // Subtotal - _summaryTile("Subtotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), + _summaryTile( + "Subtotal".tr(), + Constant.amountShow( + amount: controller.subTotal.value.toString(), + ), + isDark, + ), // Discount - _summaryTile("Discount".tr(), Constant.amountShow(amount: controller.discount.value.toString()), isDark), + _summaryTile( + "Discount".tr(), + Constant.amountShow( + amount: controller.discount.value.toString(), + ), + isDark, + ), // Tax List - ...List.generate(controller.parcelOrder.value.taxSetting!.length, (index) { - return _summaryTile( - "${controller.parcelOrder.value.taxSetting![index].title} ${controller.parcelOrder.value.taxSetting![index].type == 'fix' ? '' : '(${controller.parcelOrder.value.taxSetting![index].tax}%)'}", - Constant.amountShow( - amount: - Constant.getTaxValue( - amount: - ((double.tryParse(controller.parcelOrder.value.subTotal.toString()) ?? 0.0) - (double.tryParse(controller.parcelOrder.value.discount.toString()) ?? 0.0)) - .toString(), - taxModel: controller.parcelOrder.value.taxSetting![index], - ).toString(), - ), - isDark, - ); - }), + ...List.generate( + controller.parcelOrder.value.taxSetting!.length, + (index) { + return _summaryTile( + "${controller.parcelOrder.value.taxSetting![index].title} ${controller.parcelOrder.value.taxSetting![index].type == 'fix' ? '' : '(${controller.parcelOrder.value.taxSetting![index].tax}%)'}", + Constant.amountShow( + amount: + Constant.getTaxValue( + amount: + ((double.tryParse( + controller + .parcelOrder + .value + .subTotal + .toString(), + ) ?? + 0.0) - + (double.tryParse( + controller + .parcelOrder + .value + .discount + .toString(), + ) ?? + 0.0)) + .toString(), + taxModel: + controller + .parcelOrder + .value + .taxSetting![index], + ).toString(), + ), + isDark, + ); + }, + ), const Divider(), // Total - _summaryTile("Order Total".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), + _summaryTile( + "Order Total".tr(), + Constant.amountShow( + amount: + controller.totalAmount.value.toString(), + ), + isDark, + ), ], ), ), @@ -424,7 +803,10 @@ class ParcelOrderDetails extends StatelessWidget { height: 5, borderRadius: 15, color: AppThemeData.primary300, - textColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, ), ) : SizedBox(), @@ -433,7 +815,11 @@ class ParcelOrderDetails extends StatelessWidget { ); } - Widget statusBottomSheet(BuildContext context, ParcelOrderDetailsController controller, bool isDark) { + Widget statusBottomSheet( + BuildContext context, + ParcelOrderDetailsController controller, + bool isDark, + ) { return DraggableScrollableSheet( initialChildSize: 0.30, minChildSize: 0.20, @@ -442,23 +828,46 @@ class ParcelOrderDetails extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey500 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey500 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), child: SingleChildScrollView( controller: scrollController, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Parcel Status Timeline".tr(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 18)), + Text( + "Parcel Status Timeline".tr(), + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 18, + ), + ), const SizedBox(height: 8), // Dynamic List Obx(() { - final history = controller.parcelOrder.value.statusHistory ?? []; + final history = + controller.parcelOrder.value.statusHistory ?? []; if (history.isEmpty) { return SizedBox( height: 80, - child: Center(child: Text("No status updates yet".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + child: Center( + child: Text( + "No status updates yet".tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), ); } @@ -476,12 +885,26 @@ class ParcelOrderDetails extends StatelessWidget { child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Image.asset(isCompleted ? "assets/images/image_status_timeline.png" : "assets/images/image_timeline.png", height: 48, width: 48), + Image.asset( + isCompleted + ? "assets/images/image_status_timeline.png" + : "assets/images/image_timeline.png", + height: 48, + width: 48, + ), const SizedBox(width: 20), Expanded( child: Text( statusUpdate.status ?? '', - style: AppThemeData.semiBoldTextStyle(color: isCompleted ? (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900) : AppThemeData.grey500, fontSize: 18), + style: AppThemeData.semiBoldTextStyle( + color: + isCompleted + ? (isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900) + : AppThemeData.grey500, + fontSize: 18, + ), ), ), ], @@ -499,14 +922,44 @@ class ParcelOrderDetails extends StatelessWidget { ); } - Widget _infoSection(String title, String name, String address, String phone, bool isDark) { + Widget _infoSection( + String title, + String name, + String address, + String phone, + bool isDark, + ) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(title, style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(name, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(address, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(phone, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + name, + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + address, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + phone, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), // Text(time, style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ); @@ -516,11 +969,28 @@ class ParcelOrderDetails extends StatelessWidget { return Column( children: [ // Icon(icon, color: AppThemeData.primary300), - SvgPicture.asset(icon, height: 28, width: 28, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + SvgPicture.asset( + icon, + height: 28, + width: 28, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), const SizedBox(height: 6), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), const SizedBox(height: 6), - Text(title, style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ); } @@ -531,8 +1001,20 @@ class ParcelOrderDetails extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: title == "Order Total".tr() ? 18 : 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: title == "Order Total".tr() ? 18 : 16, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ), ); diff --git a/lib/screen_ui/parcel_service/parcel_review_screen.dart b/lib/screen_ui/parcel_service/parcel_review_screen.dart index 3464b07..8a829c4 100644 --- a/lib/screen_ui/parcel_service/parcel_review_screen.dart +++ b/lib/screen_ui/parcel_service/parcel_review_screen.dart @@ -2,7 +2,7 @@ import 'package:customer/controllers/parcel_review_controller.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -26,10 +26,22 @@ class ParcelReviewScreen extends StatelessWidget { centerTitle: true, elevation: 0, backgroundColor: AppThemeData.primary300, - leading: GestureDetector(onTap: () => Get.back(), child: Icon(Icons.arrow_back_ios, color: isDark ? Colors.white : Colors.black)), + leading: GestureDetector( + onTap: () => Get.back(), + child: Icon( + Icons.arrow_back_ios, + color: isDark ? Colors.white : Colors.black, + ), + ), title: Text( - controller.ratingModel.value != null && controller.ratingModel.value!.id!.isNotEmpty ? "Update Review".tr() : "Add Review".tr(), - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 16), + controller.ratingModel.value != null && + controller.ratingModel.value!.id!.isNotEmpty + ? "Update Review".tr() + : "Add Review".tr(), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontSize: 16, + ), ), ), body: Obx( @@ -41,11 +53,21 @@ class ParcelReviewScreen extends StatelessWidget { child: Stack( children: [ Padding( - padding: const EdgeInsets.only(left: 20, right: 20, top: 50, bottom: 20), + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 50, + bottom: 20, + ), child: Card( elevation: 2, - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.only(top: 65), @@ -53,65 +75,148 @@ class ParcelReviewScreen extends StatelessWidget { children: [ // Driver Name Padding( - padding: const EdgeInsets.only(top: 8.0), + padding: const EdgeInsets.only( + top: 8.0, + ), child: Text( - controller.order.value!.driver?.fullName() ?? "", - style: TextStyle(color: isDark ? Colors.white : Colors.black87, fontFamily: AppThemeData.medium, fontSize: 18), + controller.order.value!.driver + ?.fullName() ?? + "", + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black87, + fontFamily: AppThemeData.medium, + fontSize: 18, + ), ), ), // Car info - const Padding(padding: EdgeInsets.symmetric(vertical: 12), child: Divider(color: Colors.grey)), + const Padding( + padding: EdgeInsets.symmetric( + vertical: 12, + ), + child: Divider(color: Colors.grey), + ), // Title Padding( padding: const EdgeInsets.only(top: 16), - child: Text('How is your trip?'.tr(), style: TextStyle(fontSize: 18, color: isDark ? Colors.white : Colors.black, fontWeight: FontWeight.bold, letterSpacing: 2)), + child: Text( + 'How is your trip?'.tr(), + style: TextStyle( + fontSize: 18, + color: + isDark + ? Colors.white + : Colors.black, + fontWeight: FontWeight.bold, + letterSpacing: 2, + ), + ), ), Padding( padding: const EdgeInsets.only(top: 8), child: Text( - 'Your feedback will help us improve \n driving experience better'.tr(), + 'Your feedback will help us improve \n driving experience better' + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? Colors.white : Colors.black.withOpacity(0.60), letterSpacing: 0.8), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black.withOpacity( + 0.60, + ), + letterSpacing: 0.8, + ), ), ), // Rating Padding( padding: const EdgeInsets.only(top: 20), - child: Text('Rate for'.tr(), style: TextStyle(fontSize: 16, color: isDark ? Colors.white : Colors.black.withOpacity(0.60), letterSpacing: 0.8)), + child: Text( + 'Rate for'.tr(), + style: TextStyle( + fontSize: 16, + color: + isDark + ? Colors.white + : Colors.black.withOpacity( + 0.60, + ), + letterSpacing: 0.8, + ), + ), ), Padding( padding: const EdgeInsets.only(top: 8), child: Text( - controller.order.value!.driver?.fullName() ?? "", - style: TextStyle(fontSize: 18, color: isDark ? Colors.white : Colors.black, fontWeight: FontWeight.bold, letterSpacing: 2), + controller.order.value!.driver + ?.fullName() ?? + "", + style: TextStyle( + fontSize: 18, + color: + isDark + ? Colors.white + : Colors.black, + fontWeight: FontWeight.bold, + letterSpacing: 2, + ), ), ), Padding( padding: const EdgeInsets.only(top: 10), child: RatingBar.builder( - initialRating: controller.ratings.value, + initialRating: + controller.ratings.value, minRating: 1, direction: Axis.horizontal, allowHalfRating: true, itemCount: 5, - itemBuilder: (context, _) => const Icon(Icons.star, color: Colors.amber), - unratedColor: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400, - onRatingUpdate: (rating) => controller.ratings.value = rating, + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: Colors.amber, + ), + unratedColor: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + onRatingUpdate: + (rating) => + controller.ratings.value = + rating, ), ), // Comment - Padding(padding: const EdgeInsets.all(20.0), child: TextFieldWidget(hintText: "Type comment....".tr(), controller: controller.comment.value, maxLine: 5)), + Padding( + padding: const EdgeInsets.all(20.0), + child: TextFieldWidget( + hintText: "Type comment....".tr(), + controller: controller.comment.value, + maxLine: 5, + ), + ), // Submit Button Padding( padding: const EdgeInsets.all(20.0), child: RoundedButtonFill( - title: controller.ratingModel.value != null ? "Update Review".tr() : "Add Review".tr(), + title: + controller.ratingModel.value != + null + ? "Update Review".tr() + : "Add Review".tr(), color: AppThemeData.primary300, - textColor: isDark ? Colors.white : Colors.black, + textColor: + isDark + ? Colors.white + : Colors.black, onPress: controller.submitReview, ), ), @@ -127,11 +232,28 @@ class ParcelReviewScreen extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(60), color: Colors.white, - boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.15), blurRadius: 8, spreadRadius: 6)], + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.15), + blurRadius: 8, + spreadRadius: 6, + ), + ], ), child: ClipRRect( borderRadius: BorderRadius.circular(60), - child: NetworkImageWidget(imageUrl: controller.order.value?.driver?.profilePictureURL ?? '', fit: BoxFit.cover, height: 110, width: 110), + child: NetworkImageWidget( + imageUrl: + controller + .order + .value + ?.driver + ?.profilePictureURL ?? + '', + fit: BoxFit.cover, + height: 110, + width: 110, + ), ), ), ), diff --git a/lib/screen_ui/rental_service/my_rental_booking_screen.dart b/lib/screen_ui/rental_service/my_rental_booking_screen.dart index 072d05a..11c5f77 100644 --- a/lib/screen_ui/rental_service/my_rental_booking_screen.dart +++ b/lib/screen_ui/rental_service/my_rental_booking_screen.dart @@ -6,7 +6,7 @@ import 'package:customer/screen_ui/rental_service/rental_order_details_screen.da import 'package:customer/themes/round_button_fill.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/my_rental_booking_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -25,14 +25,27 @@ class MyRentalBookingScreen extends StatelessWidget { builder: (controller) { return DefaultTabController( length: controller.tabTitles.length, - initialIndex: controller.tabTitles.indexOf(controller.selectedTab.value), + initialIndex: controller.tabTitles.indexOf( + controller.selectedTab.value, + ), child: Scaffold( appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: AppThemeData.primary300, title: Padding( padding: const EdgeInsets.only(bottom: 10), - child: Row(children: [const SizedBox(width: 10), Text("Rental History".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))]), + child: Row( + children: [ + const SizedBox(width: 10), + Text( + "Rental History".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), + ], + ), ), bottom: TabBar( onTap: (index) { @@ -42,8 +55,13 @@ class MyRentalBookingScreen extends StatelessWidget { labelColor: AppThemeData.parcelService500, unselectedLabelColor: AppThemeData.parcelService500, labelStyle: AppThemeData.boldTextStyle(fontSize: 13), - unselectedLabelStyle: AppThemeData.mediumTextStyle(fontSize: 13), - tabs: controller.tabTitles.map((title) => Tab(child: Center(child: Text(title)))).toList(), + unselectedLabelStyle: AppThemeData.mediumTextStyle( + fontSize: 13, + ), + tabs: + controller.tabTitles + .map((title) => Tab(child: Center(child: Text(title)))) + .toList(), ), ), body: @@ -56,12 +74,30 @@ class MyRentalBookingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "Please Log In to Continue".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr(), + "You’re not logged in. Please sign in to access your account and explore all features." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -80,71 +116,154 @@ class MyRentalBookingScreen extends StatelessWidget { : TabBarView( children: controller.tabTitles.map((title) { - List orders = controller.getOrdersForTab(title); + List orders = controller + .getOrdersForTab(title); if (orders.isEmpty) { - return Center(child: Text("No orders found".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center( + child: Text( + "No orders found".tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ); } return ListView.builder( padding: const EdgeInsets.all(16), itemCount: orders.length, itemBuilder: (context, index) { - RentalOrderModel order = orders[index]; //use this + RentalOrderModel order = + orders[index]; //use this return InkWell( onTap: () { - Get.to(() => RentalOrderDetailsScreen(), arguments: order); + Get.to( + () => RentalOrderDetailsScreen(), + arguments: order, + ); }, child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), margin: const EdgeInsets.only(bottom: 10), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Padding(padding: const EdgeInsets.only(top: 5), child: Image.asset("assets/icons/pickup.png", height: 18, width: 18)), + Padding( + padding: const EdgeInsets.only( + top: 5, + ), + child: Image.asset( + "assets/icons/pickup.png", + height: 18, + width: 18, + ), + ), const SizedBox(width: 10), Expanded( //prevents overflow child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Expanded( //text wraps if too long child: Text( - order.sourceLocationName ?? "-", - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), - overflow: TextOverflow.ellipsis, //safe cutoff + order.sourceLocationName ?? + "-", + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + overflow: + TextOverflow + .ellipsis, //safe cutoff maxLines: 2, ), ), - if (order.status != null) ...[ - const SizedBox(width: 8), + if (order.status != + null) ...[ + const SizedBox( + width: 8, + ), Container( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), + padding: + const EdgeInsets.symmetric( + vertical: 6, + horizontal: 12, + ), decoration: BoxDecoration( - color: AppThemeData.info50, - border: Border.all(color: AppThemeData.info300), - borderRadius: BorderRadius.circular(12), + color: + AppThemeData + .info50, + border: Border.all( + color: + AppThemeData + .info300, + ), + borderRadius: + BorderRadius.circular( + 12, + ), + ), + child: Text( + order.status ?? '', + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + AppThemeData + .info500, + ), ), - child: Text(order.status ?? '', style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.info500)), ), ], ], ), - if (order.bookingDateTime != null) + if (order.bookingDateTime != + null) Text( - Constant.timestampToDateTime(order.bookingDateTime!), - style: AppThemeData.mediumTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + Constant.timestampToDateTime( + order.bookingDateTime!, + ), + style: AppThemeData.mediumTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ], ), @@ -152,41 +271,112 @@ class MyRentalBookingScreen extends StatelessWidget { ], ), const SizedBox(height: 12), - Text("Vehicle Type :".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Vehicle Type :".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), child: Row( children: [ ClipRRect( //borderRadius: BorderRadius.circular(10), child: CachedNetworkImage( - imageUrl: order.rentalVehicleType!.rentalVehicleIcon.toString(), + imageUrl: + order + .rentalVehicleType! + .rentalVehicleIcon + .toString(), height: 60, width: 60, imageBuilder: - (context, imageProvider) => Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover)), + ( + context, + imageProvider, + ) => Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 10, + ), + image: DecorationImage( + image: + imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), + errorWidget: + ( + context, + url, + error, + ) => Image.network( + Constant + .placeHolderImage, + fit: BoxFit.cover, ), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover), fit: BoxFit.cover, ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( "${order.rentalVehicleType!.name}", - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), Padding( - padding: const EdgeInsets.only(top: 2.0), + padding: + const EdgeInsets.only( + top: 2.0, + ), child: Text( "${order.rentalVehicleType!.shortDescription}", - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ), ], @@ -196,60 +386,143 @@ class MyRentalBookingScreen extends StatelessWidget { ], ), ), - Text("Package info :".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Package info :".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - order.rentalPackageModel!.name.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + order + .rentalPackageModel! + .name + .toString(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), const SizedBox(height: 4), Text( - order.rentalPackageModel!.description.toString(), - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + order + .rentalPackageModel! + .description + .toString(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ], ), ), SizedBox(width: 10), Text( - Constant.amountShow(amount: order.rentalPackageModel!.baseFare.toString()), - style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: + order + .rentalPackageModel! + .baseFare + .toString(), + ), + style: + AppThemeData.boldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), ), - if (Constant.isEnableOTPTripStartForRental == true) - Text("${'OTP :'.tr()} ${order.otpCode}", style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + if (Constant + .isEnableOTPTripStartForRental == + true) + Text( + "${'OTP :'.tr()} ${order.otpCode}", + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), SizedBox(height: 10), Row( children: [ - order.status == Constant.orderInTransit && order.paymentStatus == false + order.status == + Constant + .orderInTransit && + order.paymentStatus == false ? Expanded( child: RoundedButtonFill( title: "Pay Now", onPress: () { - Get.to(() => RentalOrderDetailsScreen(), arguments: order); + Get.to( + () => + RentalOrderDetailsScreen(), + arguments: order, + ); }, - color: AppThemeData.primary300, - textColor: AppThemeData.grey900, + color: + AppThemeData.primary300, + textColor: + AppThemeData.grey900, ), ) : SizedBox(), - order.status == Constant.orderPlaced || order.status == Constant.driverAccepted + order.status == + Constant.orderPlaced || + order.status == + Constant.driverAccepted ? Expanded( child: RoundedButtonFill( title: "Cancel Booking", - onPress: () => controller.cancelRentalRequest(order, taxList: order.taxSetting), - color: AppThemeData.danger300, - textColor: AppThemeData.surface, + onPress: + () => controller + .cancelRentalRequest( + order, + taxList: + order + .taxSetting, + ), + color: + AppThemeData.danger300, + textColor: + AppThemeData.surface, ), ) : SizedBox(), @@ -269,7 +542,12 @@ class MyRentalBookingScreen extends StatelessWidget { ); } - Obx cardDecoration(MyRentalBookingController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + MyRentalBookingController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -284,8 +562,21 @@ class MyRentalBookingScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -296,12 +587,30 @@ class MyRentalBookingScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: Constant.userModel!.walletAmount == null ? '0.0' : Constant.userModel!.walletAmount.toString()), + Constant.amountShow( + amount: + Constant.userModel!.walletAmount == null + ? '0.0' + : Constant.userModel!.walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -310,14 +619,23 @@ class MyRentalBookingScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/rental_service/rental_conformation_screen.dart b/lib/screen_ui/rental_service/rental_conformation_screen.dart index 1c2419c..92ac2a1 100644 --- a/lib/screen_ui/rental_service/rental_conformation_screen.dart +++ b/lib/screen_ui/rental_service/rental_conformation_screen.dart @@ -7,7 +7,7 @@ import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/rental_conformation_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -38,12 +38,30 @@ class RentalConformationScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Confirm Rent a Car".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Confirm Rent a Car".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -61,26 +79,56 @@ class RentalConformationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Image.asset("assets/icons/pickup.png", height: 15, width: 15), + Image.asset( + "assets/icons/pickup.png", + height: 15, + width: 15, + ), SizedBox(width: 15), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${controller.rentalOrderModel.value.sourceLocationName}", - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), Text( - Constant.timestampToDate(controller.rentalOrderModel.value.bookingDateTime!), - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + Constant.timestampToDate( + controller + .rentalOrderModel + .value + .bookingDateTime!, + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), ), ], ), @@ -92,38 +140,96 @@ class RentalConformationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Your Preference".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Your Preference".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), SizedBox(height: 10), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.rentalOrderModel.value.rentalPackageModel!.name.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller + .rentalOrderModel + .value + .rentalPackageModel! + .name + .toString(), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), const SizedBox(height: 4), Text( - controller.rentalOrderModel.value.rentalPackageModel!.description.toString(), - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + controller + .rentalOrderModel + .value + .rentalPackageModel! + .description + .toString(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), ), ], ), ), SizedBox(width: 10), Text( - Constant.amountShow(amount: controller.rentalOrderModel.value.rentalPackageModel!.baseFare.toString()), - style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: + controller + .rentalOrderModel + .value + .rentalPackageModel! + .baseFare + .toString(), + ), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -134,35 +240,81 @@ class RentalConformationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Vehicle Type".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Vehicle Type".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), SizedBox(height: 10), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ ClipRRect( - borderRadius: BorderRadiusGeometry.circular(10), - child: NetworkImageWidget(imageUrl: controller.rentalOrderModel.value.rentalVehicleType!.rentalVehicleIcon.toString(), height: 50, width: 50, borderRadius: 10), + borderRadius: + BorderRadiusGeometry.circular(10), + child: NetworkImageWidget( + imageUrl: + controller + .rentalOrderModel + .value + .rentalVehicleType! + .rentalVehicleIcon + .toString(), + height: 50, + width: 50, + borderRadius: 10, + ), ), SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${controller.rentalOrderModel.value.rentalVehicleType!.name}", - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), Text( "${controller.rentalOrderModel.value.rentalVehicleType!.shortDescription}", - style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), ), ], ), @@ -176,24 +328,53 @@ class RentalConformationScreen extends StatelessWidget { Row( children: [ - Expanded(child: Text("Coupons".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Expanded( + child: Text( + "Coupons".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), InkWell( onTap: () { Get.to(RentalCouponScreen())!.then((value) { if (value != null) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: value); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = value; + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: value, + ); + if (couponAmount < + controller.subTotal.value) { + controller.selectedCouponModel.value = + value; controller.calculateAmount(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr()); + ShowToastDialog.showToast( + "This offer not eligible for this booking" + .tr(), + ); } } }); }, child: Text( "View All".tr(), - style: AppThemeData.boldTextStyle(decoration: TextDecoration.underline, fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.boldTextStyle( + decoration: TextDecoration.underline, + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ], @@ -202,21 +383,44 @@ class RentalConformationScreen extends StatelessWidget { // Coupon input DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(10), color: isDark ? AppThemeData.parcelServiceDark300 : AppThemeData.primary300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(10), + color: + isDark + ? AppThemeData.parcelServiceDark300 + : AppThemeData.primary300, + ), child: Container( - decoration: BoxDecoration(color: AppThemeData.parcelService50, borderRadius: BorderRadius.circular(10)), - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + color: AppThemeData.parcelService50, + borderRadius: BorderRadius.circular(10), + ), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_coupon_parcel.svg", height: 28, width: 28), + SvgPicture.asset( + "assets/icons/ic_coupon_parcel.svg", + height: 28, + width: 28, + ), SizedBox(width: 15), Expanded( child: TextFormField( - controller: controller.couponController.value, - style: AppThemeData.semiBoldTextStyle(color: AppThemeData.grey900), + controller: + controller.couponController.value, + style: AppThemeData.semiBoldTextStyle( + color: AppThemeData.grey900, + ), decoration: InputDecoration( hintText: "Write coupon code".tr(), - hintStyle: AppThemeData.mediumTextStyle(fontSize: 16, color: AppThemeData.parcelService500), + hintStyle: AppThemeData.mediumTextStyle( + fontSize: 16, + color: AppThemeData.parcelService500, + ), border: InputBorder.none, ), ), @@ -224,22 +428,61 @@ class RentalConformationScreen extends StatelessWidget { RoundedButtonFill( title: "Redeem now".tr(), onPress: () { - if (controller.couponList.where((element) => element.code!.toLowerCase() == controller.couponController.value.text.toLowerCase()).isNotEmpty) { - CouponModel couponModel = controller.couponList.firstWhere((p0) => p0.code!.toLowerCase() == controller.couponController.value.text.toLowerCase()); - if (couponModel.expiresAt!.toDate().isAfter(DateTime.now())) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: couponModel); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = couponModel; + if (controller.couponList + .where( + (element) => + element.code!.toLowerCase() == + controller + .couponController + .value + .text + .toLowerCase(), + ) + .isNotEmpty) { + CouponModel couponModel = controller + .couponList + .firstWhere( + (p0) => + p0.code!.toLowerCase() == + controller + .couponController + .value + .text + .toLowerCase(), + ); + if (couponModel.expiresAt! + .toDate() + .isAfter(DateTime.now())) { + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: couponModel, + ); + if (couponAmount < + controller.subTotal.value) { + controller + .selectedCouponModel + .value = couponModel; controller.calculateAmount(); controller.update(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr()); + ShowToastDialog.showToast( + "This offer not eligible for this booking" + .tr(), + ); } } else { - ShowToastDialog.showToast("This coupon code has been expired".tr()); + ShowToastDialog.showToast( + "This coupon code has been expired" + .tr(), + ); } } else { - ShowToastDialog.showToast("Invalid coupon code".tr()); + ShowToastDialog.showToast( + "Invalid coupon code".tr(), + ); } }, borderRadius: 10, @@ -257,45 +500,104 @@ class RentalConformationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text( + "Order Summary".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey500, + ), + ), const SizedBox(height: 8), // Subtotal - _summaryTile("Subtotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, null), + _summaryTile( + "Subtotal".tr(), + Constant.amountShow( + amount: + controller.subTotal.value.toString(), + ), + isDark, + null, + ), // Discount - _summaryTile("Discount".tr(), Constant.amountShow(amount: controller.discount.value.toString()), isDark, AppThemeData.dangerDark300), + _summaryTile( + "Discount".tr(), + Constant.amountShow( + amount: + controller.discount.value.toString(), + ), + isDark, + AppThemeData.dangerDark300, + ), // Tax List - ...List.generate(controller.rentalOrderModel.value.taxSetting!.length, (index) { - final taxModel = controller.rentalOrderModel.value.taxSetting![index]; - final taxTitle = "${taxModel.title} ${taxModel.type == 'fix' ? '(${Constant.amountShow(amount: taxModel.tax)})' : '(${taxModel.tax}%)'}"; + ...List.generate( + controller + .rentalOrderModel + .value + .taxSetting! + .length, + (index) { + final taxModel = + controller + .rentalOrderModel + .value + .taxSetting![index]; + final taxTitle = + "${taxModel.title} ${taxModel.type == 'fix' ? '(${Constant.amountShow(amount: taxModel.tax)})' : '(${taxModel.tax}%)'}"; - return _summaryTile( - taxTitle, - Constant.amountShow( - amount: - Constant.getTaxValue( - amount: (controller.subTotal.value - controller.discount.value).toString(), - taxModel: controller.rentalOrderModel.value.taxSetting![index], - ).toString(), - ), - isDark, - null, - ); - }), + return _summaryTile( + taxTitle, + Constant.amountShow( + amount: + Constant.getTaxValue( + amount: + (controller.subTotal.value - + controller + .discount + .value) + .toString(), + taxModel: + controller + .rentalOrderModel + .value + .taxSetting![index], + ).toString(), + ), + isDark, + null, + ); + }, + ), const Divider(), // Total - _summaryTile("Order Total".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark, null), + _summaryTile( + "Order Total".tr(), + Constant.amountShow( + amount: + controller.totalAmount.value.toString(), + ), + isDark, + null, + ), ], ), ), @@ -324,8 +626,22 @@ class RentalConformationScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: title == "Order Total" ? 18 : 16, color: colors ?? (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Text( + title, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: title == "Order Total" ? 18 : 16, + color: + colors ?? + (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ), + ), ], ), ); diff --git a/lib/screen_ui/rental_service/rental_coupon_screen.dart b/lib/screen_ui/rental_service/rental_coupon_screen.dart index 2ce13d3..c1e2c6b 100644 --- a/lib/screen_ui/rental_service/rental_coupon_screen.dart +++ b/lib/screen_ui/rental_service/rental_coupon_screen.dart @@ -8,7 +8,7 @@ import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class RentalCouponScreen extends StatelessWidget { const RentalCouponScreen({super.key}); @@ -33,12 +33,30 @@ class RentalCouponScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Coupon".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Coupon".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -54,17 +72,35 @@ class RentalCouponScreen extends StatelessWidget { itemBuilder: (context, index) { CouponModel couponModel = controller.cabCouponList[index]; return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Container( height: Responsive.height(16, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(10), bottomLeft: Radius.circular(10)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10), + ), child: Stack( children: [ - Image.asset("assets/images/ic_coupon_image.png", height: Responsive.height(16, context), fit: BoxFit.fill), + Image.asset( + "assets/images/ic_coupon_image.png", + height: Responsive.height(16, context), + fit: BoxFit.fill, + ), Padding( padding: const EdgeInsets.only(left: 10), child: Align( @@ -74,7 +110,14 @@ class RentalCouponScreen extends StatelessWidget { child: Text( "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr()}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ), ), @@ -84,24 +127,53 @@ class RentalCouponScreen extends StatelessWidget { ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 18), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(6), color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + options: + RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular( + 6, + ), + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), child: Text( "${couponModel.code}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), ), ), ), - const Expanded(child: SizedBox(height: 10)), + const Expanded( + child: SizedBox(height: 10), + ), InkWell( onTap: () { Get.back(result: couponModel); @@ -109,18 +181,38 @@ class RentalCouponScreen extends StatelessWidget { child: Text( "Tap To Apply".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ], ), const SizedBox(height: 20), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 20), Text( "${couponModel.description}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), diff --git a/lib/screen_ui/rental_service/rental_dashboard_screen.dart b/lib/screen_ui/rental_service/rental_dashboard_screen.dart index ae0e79f..549f827 100644 --- a/lib/screen_ui/rental_service/rental_dashboard_screen.dart +++ b/lib/screen_ui/rental_service/rental_dashboard_screen.dart @@ -5,7 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/cab_rental_dashboard_controllers.dart'; class RentalDashboardScreen extends StatelessWidget { @@ -26,12 +26,19 @@ class RentalDashboardScreen extends StatelessWidget { showUnselectedLabels: true, showSelectedLabels: true, selectedFontSize: 12, - selectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), - unselectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), + selectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), + unselectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), currentIndex: controller.selectedIndex.value, - backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - selectedItemColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - unselectedItemColor: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + backgroundColor: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + selectedItemColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, + unselectedItemColor: + isDark ? AppThemeData.grey300 : AppThemeData.grey600, onTap: (int index) { if (index == 0) { Get.put(CabDashboardController()); @@ -41,15 +48,57 @@ class RentalDashboardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_cab.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_booking_cab.svg", + label: 'My Bookings'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet_cab.svg", label: 'Wallet'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_cab.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_booking_cab.svg", + label: 'My Bookings'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_wallet_cab.svg", + label: 'Wallet'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ], ), ); @@ -58,7 +107,13 @@ class RentalDashboardScreen extends StatelessWidget { }); } - BottomNavigationBarItem navigationBarItem(isDark, {required int index, required String label, required String assetIcon, required CabRentalDashboardControllers controller}) { + BottomNavigationBarItem navigationBarItem( + isDark, { + required int index, + required String label, + required String assetIcon, + required CabRentalDashboardControllers controller, + }) { return BottomNavigationBarItem( icon: Padding( padding: const EdgeInsets.symmetric(vertical: 5), diff --git a/lib/screen_ui/rental_service/rental_home_screen.dart b/lib/screen_ui/rental_service/rental_home_screen.dart index 30f7ca1..0ba3a0d 100644 --- a/lib/screen_ui/rental_service/rental_home_screen.dart +++ b/lib/screen_ui/rental_service/rental_home_screen.dart @@ -2,7 +2,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:customer/constant/constant.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/rental_home_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../models/rental_vehicle_type.dart'; @@ -44,8 +44,20 @@ class RentalHomeScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), @@ -58,9 +70,21 @@ class RentalHomeScreen extends StatelessWidget { onTap: () { Get.offAll(const LoginScreen()); }, - child: Text("Login".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + child: Text( + "Login".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), + ), ) - : Text(Constant.userModel!.fullName(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + : Text( + Constant.userModel!.fullName(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -82,30 +106,69 @@ class RentalHomeScreen extends StatelessWidget { InkWell( onTap: () async { if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; - if (Constant.checkZoneCheck(firstPlace.coordinates.latitude, firstPlace.coordinates.longitude) == true) { + if (Constant.checkZoneCheck( + firstPlace.coordinates.latitude, + firstPlace.coordinates.longitude, + ) == + true) { final address = firstPlace.address; final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; - controller.sourceTextEditController.value.text = address; - controller.departureLatLongOsm.value = latlong.LatLng(lat, lng); + final lng = + firstPlace.coordinates.longitude; + controller + .sourceTextEditController + .value + .text = address; + controller + .departureLatLongOsm + .value = latlong.LatLng(lat, lng); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr(), + ); } } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - if (Constant.checkZoneCheck(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude) == true) { - controller.sourceTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.departureLatLong.value = latlong.LatLng(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + if (Constant.checkZoneCheck( + selectedLocationModel + .latLng! + .latitude, + selectedLocationModel + .latLng! + .longitude, + ) == + true) { + controller + .sourceTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + controller + .departureLatLong + .value = latlong.LatLng( + selectedLocationModel.latLng!.latitude, + selectedLocationModel.latLng!.longitude, + ); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr(), + ); } } }); @@ -113,11 +176,18 @@ class RentalHomeScreen extends StatelessWidget { }, hoverColor: Colors.transparent, child: TextFieldWidget( - controller: controller.sourceTextEditController.value, + controller: + controller.sourceTextEditController.value, hintText: "Your current location".tr(), title: "Pickup Location".tr(), enable: false, - prefix: Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.stop_circle_outlined, color: Colors.green)), + prefix: Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: Icon( + Icons.stop_circle_outlined, + color: Colors.green, + ), + ), ), ), const SizedBox(height: 25), @@ -125,7 +195,16 @@ class RentalHomeScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text("Select Your Vehicle Type".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Select Your Vehicle Type".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(width: 10), GestureDetector( onTap: () => controller.pickDate(context), @@ -133,7 +212,13 @@ class RentalHomeScreen extends StatelessWidget { children: [ Text( "${controller.selectedDate.value.day}-${controller.selectedDate.value.month}-${controller.selectedDate.value.year}", - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), const SizedBox(width: 5), const Icon(Icons.date_range, size: 20), @@ -150,11 +235,13 @@ class RentalHomeScreen extends StatelessWidget { physics: NeverScrollableScrollPhysics(), scrollDirection: Axis.vertical, itemBuilder: (context, index) { - RentalVehicleType vehicleType = controller.vehicleTypes[index]; + RentalVehicleType vehicleType = + controller.vehicleTypes[index]; return Obx( () => InkWell( onTap: () { - controller.selectedVehicleType.value = controller.vehicleTypes[index]; + controller.selectedVehicleType.value = + controller.vehicleTypes[index]; }, child: Padding( padding: const EdgeInsets.only(bottom: 10), @@ -164,72 +251,144 @@ class RentalHomeScreen extends StatelessWidget { border: Border.all( color: isDark - ? controller.selectedVehicleType.value?.id == vehicleType.id - ? AppThemeData.carRentDark300 + ? controller + .selectedVehicleType + .value + ?.id == + vehicleType.id + ? AppThemeData + .carRentDark300 : Colors.transparent - : controller.selectedVehicleType.value?.id == vehicleType.id + : controller + .selectedVehicleType + .value + ?.id == + vehicleType.id ? AppThemeData.carRent300 : Colors.transparent, width: 1, ), color: - controller.selectedVehicleType.value?.id == vehicleType.id + controller + .selectedVehicleType + .value + ?.id == + vehicleType.id ? AppThemeData.carRent50 : isDark ? AppThemeData.carRentDark50 : Colors.white, ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), child: Row( children: [ ClipRRect( //borderRadius: BorderRadius.circular(10), child: CachedNetworkImage( - imageUrl: vehicleType.rentalVehicleIcon.toString(), + imageUrl: + vehicleType + .rentalVehicleIcon + .toString(), height: 60, width: 60, imageBuilder: - (context, imageProvider) => - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover))), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover), + ( + context, + imageProvider, + ) => Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 10, + ), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), + errorWidget: + (context, url, error) => + Image.network( + Constant + .placeHolderImage, + fit: BoxFit.cover, + ), fit: BoxFit.cover, ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${vehicleType.name}", style: TextStyle( fontSize: 16, - fontWeight: FontWeight.bold, + fontWeight: + FontWeight.bold, letterSpacing: 1, color: isDark - ? controller.selectedVehicleType.value?.id == vehicleType.id - ? AppThemeData.greyDark50 - : AppThemeData.grey50 - : AppThemeData.greyDark50, + ? controller + .selectedVehicleType + .value + ?.id == + vehicleType + .id + ? AppThemeData + .greyDark50 + : AppThemeData + .grey50 + : AppThemeData + .greyDark50, ), ), Padding( - padding: const EdgeInsets.only(top: 2.0), + padding: + const EdgeInsets.only( + top: 2.0, + ), child: Text( "${vehicleType.description}", style: TextStyle( - fontWeight: FontWeight.w400, + fontWeight: + FontWeight.w400, letterSpacing: 1, color: isDark - ? controller.selectedVehicleType.value?.id == vehicleType.id - ? AppThemeData.greyDark50 - : AppThemeData.grey50 - : AppThemeData.greyDark50, + ? controller + .selectedVehicleType + .value + ?.id == + vehicleType + .id + ? AppThemeData + .greyDark50 + : AppThemeData + .grey50 + : AppThemeData + .greyDark50, ), ), ), @@ -250,30 +409,46 @@ class RentalHomeScreen extends StatelessWidget { RoundedButtonFill( title: "Continue".tr(), onPress: () async { - final sourceText = controller.sourceTextEditController.value.text.trim(); + final sourceText = + controller.sourceTextEditController.value.text + .trim(); if (Constant.userModel == null) { - ShowToastDialog.showToast("Please login to continue".tr()); + ShowToastDialog.showToast( + "Please login to continue".tr(), + ); return; } if (sourceText.isEmpty) { - ShowToastDialog.showToast("Please select source location".tr()); + ShowToastDialog.showToast( + "Please select source location".tr(), + ); return; } - if (controller.selectedVehicleType.value == null) { - ShowToastDialog.showToast("Please select a vehicle type".tr()); + if (controller.selectedVehicleType.value == + null) { + ShowToastDialog.showToast( + "Please select a vehicle type".tr(), + ); return; } await controller.getRentalPackage(); if (controller.rentalPackages.isEmpty) { - ShowToastDialog.showToast("No preference available for the selected vehicle type".tr()); + ShowToastDialog.showToast( + "No preference available for the selected vehicle type" + .tr(), + ); return; } // Open bottom sheet if packages exist - Get.bottomSheet(selectPreferences(context, controller, isDark), isScrollControlled: true, backgroundColor: Colors.transparent); + Get.bottomSheet( + selectPreferences(context, controller, isDark), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); }, color: AppThemeData.primary300, textColor: AppThemeData.grey900, @@ -289,7 +464,11 @@ class RentalHomeScreen extends StatelessWidget { ); } - Widget selectPreferences(BuildContext context, RentalHomeController controller, bool isDark) { + Widget selectPreferences( + BuildContext context, + RentalHomeController controller, + bool isDark, + ) { return DraggableScrollableSheet( initialChildSize: 0.40, minChildSize: 0.40, @@ -297,19 +476,39 @@ class RentalHomeScreen extends StatelessWidget { expand: false, builder: (context, scrollController) { return Container( - decoration: BoxDecoration(color: isDark ? Colors.black : Colors.white, borderRadius: const BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? Colors.black : Colors.white, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(24), + topRight: Radius.circular(24), + ), + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), child: Column( children: [ // handle bar - Container(height: 4, width: 33, decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: Colors.grey.shade400)), + Container( + height: 4, + width: 33, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.grey.shade400, + ), + ), Align( alignment: Alignment.topLeft, child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), - child: Text("Select Preferences".tr(), style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: isDark ? Colors.white : Colors.black)), + child: Text( + "Select Preferences".tr(), + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: isDark ? Colors.white : Colors.black, + ), + ), ), ), @@ -321,30 +520,43 @@ class RentalHomeScreen extends StatelessWidget { final package = controller.rentalPackages[index]; return Obx( () => InkWell( - onTap: () => controller.selectedPackage.value = package, + onTap: + () => controller.selectedPackage.value = package, child: Container( margin: const EdgeInsets.symmetric(vertical: 6), decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), border: Border.all( - color: controller.selectedPackage.value?.id == package.id ? (isDark ? AppThemeData.carRentDark300 : AppThemeData.carRent300) : Colors.transparent, + color: + controller.selectedPackage.value?.id == + package.id + ? (isDark + ? AppThemeData.carRentDark300 + : AppThemeData.carRent300) + : Colors.transparent, width: 1, ), color: - controller.selectedPackage.value?.id == package.id + controller.selectedPackage.value?.id == + package.id ? AppThemeData.carRent50 : isDark ? AppThemeData.carRentDark50 : Colors.white, ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 12), + padding: const EdgeInsets.symmetric( + vertical: 15, + horizontal: 12, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( package.name ?? "", @@ -352,8 +564,13 @@ class RentalHomeScreen extends StatelessWidget { fontSize: 18, color: isDark - ? controller.selectedPackage.value?.id == package.id - ? AppThemeData.greyDark50 + ? controller + .selectedPackage + .value + ?.id == + package.id + ? AppThemeData + .greyDark50 : AppThemeData.grey50 : AppThemeData.greyDark50, ), @@ -365,8 +582,13 @@ class RentalHomeScreen extends StatelessWidget { fontSize: 14, color: isDark - ? controller.selectedPackage.value?.id == package.id - ? AppThemeData.greyDark50 + ? controller + .selectedPackage + .value + ?.id == + package.id + ? AppThemeData + .greyDark50 : AppThemeData.grey50 : AppThemeData.greyDark50, ), @@ -375,12 +597,18 @@ class RentalHomeScreen extends StatelessWidget { ), ), Text( - Constant.amountShow(amount: package.baseFare.toString()), + Constant.amountShow( + amount: package.baseFare.toString(), + ), style: AppThemeData.boldTextStyle( fontSize: 18, color: isDark - ? controller.selectedPackage.value?.id == package.id + ? controller + .selectedPackage + .value + ?.id == + package.id ? AppThemeData.greyDark50 : AppThemeData.grey50 : AppThemeData.greyDark50, @@ -401,7 +629,11 @@ class RentalHomeScreen extends StatelessWidget { RoundedButtonFill( title: "Continue".tr(), onPress: () { - Get.bottomSheet(paymentBottomSheet(context, controller, isDark), isScrollControlled: true, backgroundColor: Colors.transparent); + Get.bottomSheet( + paymentBottomSheet(context, controller, isDark), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); }, color: AppThemeData.primary300, textColor: AppThemeData.grey900, @@ -414,7 +646,11 @@ class RentalHomeScreen extends StatelessWidget { ); } - Widget paymentBottomSheet(BuildContext context, RentalHomeController controller, bool isDark) { + Widget paymentBottomSheet( + BuildContext context, + RentalHomeController controller, + bool isDark, + ) { return DraggableScrollableSheet( initialChildSize: 0.70, // Start height @@ -427,7 +663,10 @@ class RentalHomeScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey500 : Colors.white, borderRadius: const BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey500 : Colors.white, + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -435,8 +674,20 @@ class RentalHomeScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Select Payment Method".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - GestureDetector(onTap: () => Get.back(), child: const Icon(Icons.close)), + Text( + "Select Payment Method".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + GestureDetector( + onTap: () => Get.back(), + child: const Icon(Icons.close), + ), ], ), const SizedBox(height: 20), @@ -447,39 +698,89 @@ class RentalHomeScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text("Preferred Payment".tr(), style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Preferred Payment".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 10), - Text("Other Payment Options".tr(), style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Other Payment Options".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), ], ), @@ -488,32 +789,129 @@ class RentalHomeScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -530,17 +928,28 @@ class RentalHomeScreen extends StatelessWidget { textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast("Please select a payment method".tr()); + ShowToastDialog.showToast( + "Please select a payment method".tr(), + ); return; } // Only check wallet if payment method is wallet if (controller.selectedPaymentMethod.value == "wallet") { - num walletAmount = controller.userModel.value.walletAmount ?? 0; - num baseFare = double.tryParse(controller.selectedPackage.value?.baseFare.toString() ?? "0") ?? 0; + num walletAmount = + controller.userModel.value.walletAmount ?? 0; + num baseFare = + double.tryParse( + controller.selectedPackage.value?.baseFare + .toString() ?? + "0", + ) ?? + 0; if (walletAmount < baseFare) { - ShowToastDialog.showToast("You do not have sufficient wallet balance".tr()); + ShowToastDialog.showToast( + "You do not have sufficient wallet balance".tr(), + ); return; } } @@ -555,7 +964,12 @@ class RentalHomeScreen extends StatelessWidget { ); } - Obx cardDecoration(RentalHomeController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + RentalHomeController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -570,8 +984,21 @@ class RentalHomeScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -582,12 +1009,34 @@ class RentalHomeScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: controller.userModel.value.walletAmount == null ? '0.0' : controller.userModel.value.walletAmount.toString()), + Constant.amountShow( + amount: + controller.userModel.value.walletAmount == + null + ? '0.0' + : controller + .userModel + .value + .walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -596,14 +1045,23 @@ class RentalHomeScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/rental_service/rental_order_details_screen.dart b/lib/screen_ui/rental_service/rental_order_details_screen.dart index 9b6129a..a6c0821 100644 --- a/lib/screen_ui/rental_service/rental_order_details_screen.dart +++ b/lib/screen_ui/rental_service/rental_order_details_screen.dart @@ -11,7 +11,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/rental_order_details_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../models/user_model.dart'; @@ -46,12 +46,30 @@ class RentalOrderDetailsScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Order Details".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Order Details".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -64,7 +82,10 @@ class RentalOrderDetailsScreen extends StatelessWidget { Expanded( child: SingleChildScrollView( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -72,8 +93,16 @@ class RentalOrderDetailsScreen extends StatelessWidget { padding: const EdgeInsets.all(16), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( children: [ @@ -81,15 +110,32 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "${'Booking Id :'.tr()} ${controller.order.value.id}", - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark700 + : AppThemeData + .grey700, + ), ), ), InkWell( onTap: () { - Clipboard.setData(ClipboardData(text: controller.order.value.id.toString())); - ShowToastDialog.showToast("Booking ID copied to clipboard".tr()); + Clipboard.setData( + ClipboardData( + text: + controller.order.value.id + .toString(), + ), + ); + ShowToastDialog.showToast( + "Booking ID copied to clipboard" + .tr(), + ); }, child: Icon(Icons.copy), ), @@ -97,22 +143,64 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Padding(padding: const EdgeInsets.only(top: 5), child: Image.asset("assets/icons/pickup.png", height: 15, width: 15)), + Padding( + padding: const EdgeInsets.only( + top: 5, + ), + child: Image.asset( + "assets/icons/pickup.png", + height: 15, + width: 15, + ), + ), const SizedBox(width: 15), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.order.value.sourceLocationName ?? "-", - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller + .order + .value + .sourceLocationName ?? + "-", + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), - if (controller.order.value.bookingDateTime != null) + if (controller + .order + .value + .bookingDateTime != + null) Text( - Constant.timestampToDate(controller.order.value.bookingDateTime!), - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + Constant.timestampToDate( + controller + .order + .value + .bookingDateTime!, + ), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ], ), @@ -123,43 +211,107 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), ), const SizedBox(height: 15), - if (controller.order.value.rentalPackageModel != null) + if (controller.order.value.rentalPackageModel != + null) Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text("Your Preference".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Your Preference".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), SizedBox(height: 10), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.order.value.rentalPackageModel!.name ?? "-", - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller + .order + .value + .rentalPackageModel! + .name ?? + "-", + style: + AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), const SizedBox(height: 4), Text( - controller.order.value.rentalPackageModel!.description ?? "", - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + controller + .order + .value + .rentalPackageModel! + .description ?? + "", + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ], ), ), const SizedBox(width: 10), Text( - Constant.amountShow(amount: controller.order.value.rentalPackageModel!.baseFare.toString()), - style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: + controller + .order + .value + .rentalPackageModel! + .baseFare + .toString(), + ), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -172,19 +324,43 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Container( decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + borderRadius: BorderRadius.circular( + 15, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text("About Driver".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "About Driver".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 8), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ @@ -192,109 +368,277 @@ class RentalOrderDetailsScreen extends StatelessWidget { width: 52, height: 52, child: ClipRRect( - borderRadius: BorderRadiusGeometry.circular(10), - child: NetworkImageWidget(imageUrl: controller.driverUser.value?.profilePictureURL ?? '', height: 70, width: 70, borderRadius: 35), + borderRadius: + BorderRadiusGeometry.circular( + 10, + ), + child: NetworkImageWidget( + imageUrl: + controller + .driverUser + .value + ?.profilePictureURL ?? + '', + height: 70, + width: 70, + borderRadius: 35, + ), ), ), SizedBox(width: 20), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( - controller.order.value.driver?.fullName() ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 18), + controller + .order + .value + .driver + ?.fullName() ?? + '', + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + fontSize: 18, + ), ), Text( "${controller.order.value.driver?.vehicleType ?? ''} | ${controller.order.value.driver?.carMakes.toString()}", - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, fontSize: 14), + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData + .greyDark700 + : AppThemeData + .grey700, + fontSize: 14, + ), ), Text( - controller.order.value.driver?.carNumber ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, fontSize: 16), + controller + .order + .value + .driver + ?.carNumber ?? + '', + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData + .greyDark700 + : AppThemeData + .grey700, + fontSize: 16, + ), ), ], ), ], ), RoundedButtonBorder( - title: controller.driverUser.value?.averageRating.toString() ?? '', + title: + controller + .driverUser + .value + ?.averageRating + .toString() ?? + '', width: 20, height: 3.5, radius: 10, isRight: false, isCenter: true, - textColor: AppThemeData.warning400, - borderColor: AppThemeData.warning400, + textColor: + AppThemeData.warning400, + borderColor: + AppThemeData.warning400, color: AppThemeData.warning50, - icon: SvgPicture.asset("assets/icons/ic_start.svg"), + icon: SvgPicture.asset( + "assets/icons/ic_start.svg", + ), onPress: () {}, ), ], ), Visibility( - visible: controller.order.value.status == Constant.orderCompleted ? true : false, + visible: + controller + .order + .value + .status == + Constant + .orderCompleted + ? true + : false, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: RoundedButtonFill( - title: controller.ratingModel.value.id != null && controller.ratingModel.value.id!.isNotEmpty ? 'Update Review'.tr() : 'Add Review'.tr(), + title: + controller + .ratingModel + .value + .id != + null && + controller + .ratingModel + .value + .id! + .isNotEmpty + ? 'Update Review'.tr() + : 'Add Review'.tr(), onPress: () async { - final result = await Get.to(() => RentalReviewScreen(), arguments: {'order': controller.order.value}); + final result = await Get.to( + () => + RentalReviewScreen(), + arguments: { + 'order': + controller + .order + .value, + }, + ); // If review was submitted successfully if (result == true) { - await controller.fetchDriverDetails(); + await controller + .fetchDriverDetails(); } }, height: 5, borderRadius: 15, color: Colors.orange, - textColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, ), ), ), - controller.order.value.status == Constant.orderCompleted || controller.order.value.status == Constant.orderCancelled + controller.order.value.status == + Constant + .orderCompleted || + controller + .order + .value + .status == + Constant.orderCancelled ? SizedBox() : Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, children: [ InkWell( onTap: () { - Constant.makePhoneCall(controller.order.value.driver!.phoneNumber ?? ''); + Constant.makePhoneCall( + controller + .order + .value + .driver! + .phoneNumber ?? + '', + ); }, child: Container( width: 150, height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_phone_call.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_phone_call.svg")), ), ), const SizedBox(width: 10), InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); - UserModel? customer = await FireStoreUtils.getUserProfile(controller.order.value.authorID ?? ''); - UserModel? driverUser = await FireStoreUtils.getUserProfile(controller.order.value.driverId ?? ''); + UserModel? customer = + await FireStoreUtils.getUserProfile( + controller + .order + .value + .authorID ?? + '', + ); + UserModel? driverUser = + await FireStoreUtils.getUserProfile( + controller + .order + .value + .driverId ?? + '', + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": customer?.fullName(), - "restaurantName": driverUser?.fullName(), - "orderId": controller.order.value.id, - "restaurantId": driverUser?.id, - "customerId": customer?.id, - "customerProfileImage": customer?.profilePictureURL, - "restaurantProfileImage": driverUser?.profilePictureURL, - "token": driverUser?.fcmToken, - "chatType": "Driver", + "customerName": + customer + ?.fullName(), + "restaurantName": + driverUser + ?.fullName(), + "orderId": + controller + .order + .value + .id, + "restaurantId": + driverUser?.id, + "customerId": + customer?.id, + "customerProfileImage": + customer + ?.profilePictureURL, + "restaurantProfileImage": + driverUser + ?.profilePictureURL, + "token": + driverUser + ?.fcmToken, + "chatType": + "Driver", }, ); }, @@ -303,11 +647,30 @@ class RentalOrderDetailsScreen extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_wechat.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_wechat.svg")), ), ), ], @@ -318,37 +681,96 @@ class RentalOrderDetailsScreen extends StatelessWidget { const SizedBox(height: 15), ], ), - if (controller.order.value.rentalVehicleType != null) + if (controller.order.value.rentalVehicleType != + null) Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text("Vehicle Type".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Vehicle Type".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), SizedBox(height: 10), Row( children: [ ClipRRect( - borderRadius: BorderRadius.circular(10), - child: NetworkImageWidget(imageUrl: controller.order.value.rentalVehicleType!.rentalVehicleIcon ?? "", height: 50, width: 50), + borderRadius: + BorderRadius.circular(10), + child: NetworkImageWidget( + imageUrl: + controller + .order + .value + .rentalVehicleType! + .rentalVehicleIcon ?? + "", + height: 50, + width: 50, + ), ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.order.value.rentalVehicleType!.name ?? "", - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller + .order + .value + .rentalVehicleType! + .name ?? + "", + style: + AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), Text( - controller.order.value.rentalVehicleType!.shortDescription ?? "", - style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + controller + .order + .value + .rentalVehicleType! + .shortDescription ?? + "", + style: + AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ], ), @@ -365,107 +787,249 @@ class RentalOrderDetailsScreen extends StatelessWidget { width: Responsive.width(100, context), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text("Rental Details".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Divider(color: isDark ? AppThemeData.greyDark300 : AppThemeData.grey300), + Text( + "Rental Details".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Divider( + color: + isDark + ? AppThemeData.greyDark300 + : AppThemeData.grey300, + ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: Text( 'Rental Package'.tr(), textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( - controller.order.value.rentalPackageModel!.name.toString().tr(), + controller + .order + .value + .rentalPackageModel! + .name + .toString() + .tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: Text( 'Rental Package Price'.tr(), textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( - Constant.amountShow(amount: controller.order.value.rentalPackageModel!.baseFare.toString()).tr(), + Constant.amountShow( + amount: + controller + .order + .value + .rentalPackageModel! + .baseFare + .toString(), + ).tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: Text( '${'Including'.tr()} ${Constant.distanceType.tr()}', textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( - "${controller.order.value.rentalPackageModel!.includedDistance.toString()} ${Constant.distanceType}".tr(), + "${controller.order.value.rentalPackageModel!.includedDistance.toString()} ${Constant.distanceType}" + .tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: Text( 'Including Hours'.tr(), textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( - "${controller.order.value.rentalPackageModel!.includedHours.toString()} ${'Hr'.tr()}".tr(), + "${controller.order.value.rentalPackageModel!.includedHours.toString()} ${'Hr'.tr()}" + .tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: Text( '${'Extra'.tr()} ${Constant.distanceType}', textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( controller.getExtraKm(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), @@ -493,20 +1057,41 @@ class RentalOrderDetailsScreen extends StatelessWidget { controller.order.value.endTime == null ? SizedBox() : Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: Text( 'Extra Minutes'.tr(), - textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + textAlign: + TextAlign.start, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( "${controller.order.value.endTime == null ? "0" : (((controller.order.value.endTime!.toDate().difference(controller.order.value.startTime!.toDate()).inMinutes) - (int.parse(controller.order.value.rentalPackageModel!.includedHours.toString()) * 60)).clamp(0, double.infinity).toInt().toString())} ${'Min'.tr()}", textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), @@ -520,31 +1105,99 @@ class RentalOrderDetailsScreen extends StatelessWidget { padding: const EdgeInsets.all(16), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text("Order Summary".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text( + "Order Summary".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey500, + ), + ), const SizedBox(height: 8), - _summaryTile("Subtotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, null), - _summaryTile("Discount".tr(), Constant.amountShow(amount: controller.discount.value.toString()), isDark, AppThemeData.dangerDark300), + _summaryTile( + "Subtotal".tr(), + Constant.amountShow( + amount: + controller.subTotal.value + .toString(), + ), + isDark, + null, + ), + _summaryTile( + "Discount".tr(), + Constant.amountShow( + amount: + controller.discount.value + .toString(), + ), + isDark, + AppThemeData.dangerDark300, + ), - ...List.generate(controller.order.value.taxSetting?.length ?? 0, (index) { - final taxModel = controller.order.value.taxSetting![index]; - final taxTitle = "${taxModel.title} ${taxModel.type == 'fix' ? '(${Constant.amountShow(amount: taxModel.tax)})' : '(${taxModel.tax}%)'}"; - return _summaryTile( - taxTitle, - Constant.amountShow(amount: Constant.getTaxValue(amount: (controller.subTotal.value - controller.discount.value).toString(), taxModel: taxModel).toString()), - isDark, - null, - ); - }), + ...List.generate( + controller + .order + .value + .taxSetting + ?.length ?? + 0, + (index) { + final taxModel = + controller + .order + .value + .taxSetting![index]; + final taxTitle = + "${taxModel.title} ${taxModel.type == 'fix' ? '(${Constant.amountShow(amount: taxModel.tax)})' : '(${taxModel.tax}%)'}"; + return _summaryTile( + taxTitle, + Constant.amountShow( + amount: + Constant.getTaxValue( + amount: + (controller + .subTotal + .value - + controller + .discount + .value) + .toString(), + taxModel: taxModel, + ).toString(), + ), + isDark, + null, + ); + }, + ), const Divider(), - _summaryTile("Order Total".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark, null), + _summaryTile( + "Order Total".tr(), + Constant.amountShow( + amount: + controller.totalAmount.value + .toString(), + ), + isDark, + null, + ), ], ), ), @@ -554,32 +1207,66 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( children: [ - if (controller.order.value.status == Constant.orderInTransit && controller.order.value.paymentStatus == false) + if (controller.order.value.status == + Constant.orderInTransit && + controller.order.value.paymentStatus == false) Expanded( child: RoundedButtonFill( title: "Pay Now", onPress: () { - if (controller.order.value.endKitoMetersReading == null || - controller.order.value.endKitoMetersReading == "0.0" || - controller.order.value.endKitoMetersReading!.isEmpty) { - ShowToastDialog.showToast("You are not able to pay now until driver adds kilometer".tr()); + if (controller + .order + .value + .endKitoMetersReading == + null || + controller + .order + .value + .endKitoMetersReading == + "0.0" || + controller + .order + .value + .endKitoMetersReading! + .isEmpty) { + ShowToastDialog.showToast( + "You are not able to pay now until driver adds kilometer" + .tr(), + ); } else { - Get.bottomSheet(paymentBottomSheet(context, controller, isDark, controller.order.value), isScrollControlled: true, backgroundColor: Colors.transparent); + Get.bottomSheet( + paymentBottomSheet( + context, + controller, + isDark, + controller.order.value, + ), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); } }, color: AppThemeData.primary300, textColor: AppThemeData.grey900, ), ), - if (controller.order.value.status == Constant.orderPlaced || controller.order.value.status == Constant.driverAccepted) + if (controller.order.value.status == + Constant.orderPlaced || + controller.order.value.status == + Constant.driverAccepted) Expanded( child: RoundedButtonFill( title: "Cancel Booking", onPress: () { - controller.cancelRentalRequest(controller.order.value); + controller.cancelRentalRequest( + controller.order.value, + ); }, color: AppThemeData.danger300, textColor: AppThemeData.surface, @@ -601,14 +1288,33 @@ class RentalOrderDetailsScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: title == "Order Total" ? 18 : 16, color: colors ?? (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Text( + title, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: title == "Order Total" ? 18 : 16, + color: + colors ?? + (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ), + ), ], ), ); } - Widget paymentBottomSheet(BuildContext context, RentalOrderDetailsController controller, bool isDark, RentalOrderModel orderModel) { + Widget paymentBottomSheet( + BuildContext context, + RentalOrderDetailsController controller, + bool isDark, + RentalOrderModel orderModel, + ) { return DraggableScrollableSheet( initialChildSize: 0.70, // Start height @@ -621,14 +1327,26 @@ class RentalOrderDetailsScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey500 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey500 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Select Payment Method".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Select Payment Method".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), GestureDetector( onTap: () { Get.back(); @@ -643,32 +1361,74 @@ class RentalOrderDetailsScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text("Preferred Payment".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Preferred Payment".tr(), + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -676,7 +1436,13 @@ class RentalOrderDetailsScreen extends StatelessWidget { Text( "Other Payment Options".tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), ), const SizedBox(height: 10), ], @@ -684,32 +1450,129 @@ class RentalOrderDetailsScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -724,48 +1587,107 @@ class RentalOrderDetailsScreen extends StatelessWidget { textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast("Please select a payment method".tr()); + ShowToastDialog.showToast( + "Please select a payment method".tr(), + ); } else { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.totalAmount.value.toString(), context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.totalAmount.value.toString(), + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.cod.name) { controller.completeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { - if (Constant.userModel!.walletAmount == null || Constant.userModel!.walletAmount! < controller.totalAmount.value) { - ShowToastDialog.showToast("You do not have sufficient wallet balance".tr()); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name) { + if (Constant.userModel!.walletAmount == null || + Constant.userModel!.walletAmount! < + controller.totalAmount.value) { + ShowToastDialog.showToast( + "You do not have sufficient wallet balance".tr(), + ); } else { controller.completeOrder(); } - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.cod.name) { controller.completeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); - } - }); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.totalAmount.value.toString(), + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr(), + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: controller.totalAmount.value.toString(), + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast("Please select payment method".tr()); + ShowToastDialog.showToast( + "Please select payment method".tr(), + ); } } }, @@ -777,7 +1699,12 @@ class RentalOrderDetailsScreen extends StatelessWidget { ); } - Obx cardDecoration(RentalOrderDetailsController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + RentalOrderDetailsController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -792,8 +1719,21 @@ class RentalOrderDetailsScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -804,12 +1744,30 @@ class RentalOrderDetailsScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: Constant.userModel!.walletAmount == null ? '0.0' : Constant.userModel!.walletAmount.toString()), + Constant.amountShow( + amount: + Constant.userModel!.walletAmount == null + ? '0.0' + : Constant.userModel!.walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -818,14 +1776,23 @@ class RentalOrderDetailsScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/rental_service/rental_review_screen.dart b/lib/screen_ui/rental_service/rental_review_screen.dart index 486ea7a..d5fd8fb 100644 --- a/lib/screen_ui/rental_service/rental_review_screen.dart +++ b/lib/screen_ui/rental_service/rental_review_screen.dart @@ -1,7 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/rental_review_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -28,11 +28,19 @@ class RentalReviewScreen extends StatelessWidget { backgroundColor: AppThemeData.primary300, leading: GestureDetector( onTap: () => Get.back(), - child: Icon(Icons.arrow_back_ios, color: isDark ? Colors.white : Colors.black), + child: Icon( + Icons.arrow_back_ios, + color: isDark ? Colors.white : Colors.black, + ), ), title: Text( - controller.ratingModel.value != null ? "Update Review".tr() : "Add Review".tr(), - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 16), + controller.ratingModel.value != null + ? "Update Review".tr() + : "Add Review".tr(), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontSize: 16, + ), ), ), body: Obx( @@ -44,11 +52,21 @@ class RentalReviewScreen extends StatelessWidget { child: Stack( children: [ Padding( - padding: const EdgeInsets.only(left: 20, right: 20, top: 50, bottom: 20), + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 50, + bottom: 20, + ), child: Card( elevation: 2, - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.only(top: 65), @@ -56,11 +74,18 @@ class RentalReviewScreen extends StatelessWidget { children: [ // Driver Name Padding( - padding: const EdgeInsets.only(top: 8.0), + padding: const EdgeInsets.only( + top: 8.0, + ), child: Text( - controller.order.value!.driver?.fullName() ?? "", + controller.order.value!.driver + ?.fullName() ?? + "", style: TextStyle( - color: isDark ? Colors.white : Colors.black87, + color: + isDark + ? Colors.white + : Colors.black87, fontFamily: AppThemeData.medium, fontSize: 18, ), @@ -68,12 +93,21 @@ class RentalReviewScreen extends StatelessWidget { ), // Car info Row( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, children: [ Text( - controller.driverUser.value?.carNumber?.toUpperCase() ?? '', + controller + .driverUser + .value + ?.carNumber + ?.toUpperCase() ?? + '', style: TextStyle( - color: isDark ? Colors.white : Colors.black87, + color: + isDark + ? Colors.white + : Colors.black87, fontFamily: AppThemeData.medium, ), ), @@ -81,14 +115,22 @@ class RentalReviewScreen extends StatelessWidget { Text( "${controller.driverUser.value?.carName} ${controller.driverUser.value?.carMakes}", style: TextStyle( - color: isDark ? Colors.white : Colors.black38, + color: + isDark + ? Colors.white + : Colors.black38, fontFamily: AppThemeData.medium, ), ), ], ), - const Padding(padding: EdgeInsets.symmetric(vertical: 12), child: Divider(color: Colors.grey)), + const Padding( + padding: EdgeInsets.symmetric( + vertical: 12, + ), + child: Divider(color: Colors.grey), + ), // Title Padding( @@ -97,7 +139,10 @@ class RentalReviewScreen extends StatelessWidget { 'How is your trip?'.tr(), style: TextStyle( fontSize: 18, - color: isDark ? Colors.white : Colors.black, + color: + isDark + ? Colors.white + : Colors.black, fontWeight: FontWeight.bold, letterSpacing: 2, ), @@ -106,10 +151,16 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 8), child: Text( - 'Your feedback will help us improve \n driving experience better'.tr(), + 'Your feedback will help us improve \n driving experience better' + .tr(), textAlign: TextAlign.center, style: TextStyle( - color: isDark ? Colors.white : Colors.black.withOpacity(0.60), + color: + isDark + ? Colors.white + : Colors.black.withOpacity( + 0.60, + ), letterSpacing: 0.8, ), ), @@ -122,7 +173,12 @@ class RentalReviewScreen extends StatelessWidget { 'Rate for'.tr(), style: TextStyle( fontSize: 16, - color: isDark ? Colors.white : Colors.black.withOpacity(0.60), + color: + isDark + ? Colors.white + : Colors.black.withOpacity( + 0.60, + ), letterSpacing: 0.8, ), ), @@ -130,10 +186,15 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 8), child: Text( - controller.order.value!.driver?.fullName() ?? "", + controller.order.value!.driver + ?.fullName() ?? + "", style: TextStyle( fontSize: 18, - color: isDark ? Colors.white : Colors.black, + color: + isDark + ? Colors.white + : Colors.black, fontWeight: FontWeight.bold, letterSpacing: 2, ), @@ -142,14 +203,25 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 10), child: RatingBar.builder( - initialRating: controller.ratings.value, + initialRating: + controller.ratings.value, minRating: 1, direction: Axis.horizontal, allowHalfRating: true, itemCount: 5, - itemBuilder: (context, _) => const Icon(Icons.star, color: Colors.amber), - unratedColor: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400, - onRatingUpdate: (rating) => controller.ratings.value = rating, + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: Colors.amber, + ), + unratedColor: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + onRatingUpdate: + (rating) => + controller.ratings.value = + rating, ), ), @@ -167,9 +239,16 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.all(20.0), child: RoundedButtonFill( - title: controller.ratingModel.value != null ? "Update Review" : "Add Review", + title: + controller.ratingModel.value != + null + ? "Update Review" + : "Add Review", color: AppThemeData.primary300, - textColor: isDark ? Colors.white : Colors.black, + textColor: + isDark + ? Colors.white + : Colors.black, onPress: controller.submitReview, ), ), @@ -185,12 +264,24 @@ class RentalReviewScreen extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(60), color: Colors.white, - boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.15), blurRadius: 8, spreadRadius: 6)], + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.15), + blurRadius: 8, + spreadRadius: 6, + ), + ], ), child: ClipRRect( borderRadius: BorderRadius.circular(60), child: NetworkImageWidget( - imageUrl: controller.order.value?.driver?.profilePictureURL ?? '', + imageUrl: + controller + .order + .value + ?.driver + ?.profilePictureURL ?? + '', fit: BoxFit.cover, height: 110, width: 110, diff --git a/lib/screen_ui/service_home_screen/service_list_screen.dart b/lib/screen_ui/service_home_screen/service_list_screen.dart index c9528bb..5de8a4d 100644 --- a/lib/screen_ui/service_home_screen/service_list_screen.dart +++ b/lib/screen_ui/service_home_screen/service_list_screen.dart @@ -2,7 +2,7 @@ import 'dart:developer'; import 'package:customer/models/section_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/service_list_controller.dart'; import '../../themes/app_them_data.dart'; import '../../utils/network_image_widget.dart'; @@ -66,7 +66,7 @@ class ServiceListScreen extends StatelessWidget { Padding( padding: EdgeInsets.symmetric(horizontal: 16.r), child: Text( - "Другие услуги", + "Other Services", style: TextStyle( fontFamily: AppThemeData.bold, fontWeight: FontWeight.w700, @@ -75,7 +75,6 @@ class ServiceListScreen extends StatelessWidget { ), ), ), - SizedBox(height: 10.h), // Other Services Section @@ -99,7 +98,6 @@ class ServiceListScreen extends StatelessWidget { title: "Продукты питания", subtitle: "Более 1000 товаров", ), - SizedBox(height: 45.h), ], ), @@ -209,7 +207,7 @@ class ServiceListScreen extends StatelessWidget { spacing: 12.r, children: [ _mainCardsMaker( - title: "Еда и доставка", + title: "Food Delivery", image: "assets/images/food_img.png", // onTap: () { // log("Main Card Tapped"); @@ -227,7 +225,7 @@ class ServiceListScreen extends StatelessWidget { // }, ), _mainCardsMaker( - title: "Курьерская доставка", + title: "Delivery", image: "assets/images/delivery_img.png", onTap: () { log("Main Card Tapped"); @@ -276,7 +274,7 @@ class ServiceListScreen extends StatelessWidget { Expanded( child: Text( maxLines: 2, - "Позвать такси", + "Booking Taxi", style: TextStyle( overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.bold, diff --git a/lib/screen_ui/splash_screen/splash_screen.dart b/lib/screen_ui/splash_screen/splash_screen.dart index 652d0e0..64ef3b4 100644 --- a/lib/screen_ui/splash_screen/splash_screen.dart +++ b/lib/screen_ui/splash_screen/splash_screen.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/assets.dart'; import '../../controllers/splash_controller.dart'; import '../../themes/app_them_data.dart'; @@ -12,7 +12,12 @@ class SplashScreen extends StatelessWidget { return GetBuilder( init: SplashController(), builder: (controller) { - return Scaffold(backgroundColor: AppThemeData.surface, body: Center(child: Image.asset(AppAssets.icAppLogo, width: 120, height: 120))); + return Scaffold( + backgroundColor: AppThemeData.mainColor, + body: Center( + child: Image.asset("assets/images/fondex_logo_main.png", width: 120, height: 120), + ), + ); }, ); } diff --git a/lib/service/cart_provider.dart b/lib/service/cart_provider.dart index 4868e0a..bc2ccdb 100644 --- a/lib/service/cart_provider.dart +++ b/lib/service/cart_provider.dart @@ -5,12 +5,12 @@ import 'package:customer/models/cart_product_model.dart'; import 'package:customer/themes/custom_dialog_box.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import 'database_helper.dart'; class CartProvider with ChangeNotifier { - final _cartStreamController = StreamController>.broadcast(); + final _cartStreamController = + StreamController>.broadcast(); List _cartItems = []; Stream> get cartStream => _cartStreamController.stream; @@ -24,7 +24,11 @@ class CartProvider with ChangeNotifier { _cartStreamController.sink.add(_cartItems); } - Future addToCart(BuildContext context, CartProductModel product, int quantity) async { + Future addToCart( + BuildContext context, + CartProductModel product, + int quantity, + ) async { _cartItems = await DatabaseHelper.instance.fetchCartProducts(); if ((_cartItems.where((item) => item.id == product.id)).isNotEmpty) { var index = _cartItems.indexWhere((item) => item.id == product.id); @@ -38,7 +42,10 @@ class CartProvider with ChangeNotifier { } await DatabaseHelper.instance.updateCartProduct(_cartItems[index]); } else { - if (_cartItems.isEmpty || _cartItems.where((item) => item.vendorID == product.vendorID).isNotEmpty) { + if (_cartItems.isEmpty || + _cartItems + .where((item) => item.vendorID == product.vendorID) + .isNotEmpty) { product.quantity = quantity; _cartItems.add(product); cartItem.add(product); @@ -50,7 +57,9 @@ class CartProvider with ChangeNotifier { builder: (BuildContext context) { return CustomDialogBox( title: "Alert".tr(), - descriptions: "Your cart already contains items from another restaurant. Would you like to replace them with items from this restaurant instead?".tr(), + descriptions: + "Your cart already contains items from another restaurant. Would you like to replace them with items from this restaurant instead?" + .tr(), positiveString: "Add".tr(), negativeString: "Cancel".tr(), positiveClick: () async { diff --git a/lib/service/fire_store_utils.dart b/lib/service/fire_store_utils.dart index ad3e445..d5d0d23 100644 --- a/lib/service/fire_store_utils.dart +++ b/lib/service/fire_store_utils.dart @@ -14,7 +14,7 @@ import 'package:firebase_auth/firebase_auth.dart' as auth; import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/cupertino.dart'; import 'package:geocoding/geocoding.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import 'package:uuid/uuid.dart'; import 'package:video_compress/video_compress.dart'; @@ -85,7 +85,7 @@ class FireStoreUtils { static String getCurrentUid() { final user = auth.FirebaseAuth.instance.currentUser; - if(user != null){ + if (user != null) { return user.uid; } return "hello"; diff --git a/lib/service/localization_service.dart b/lib/service/localization_service.dart index b3040e7..92cfb47 100644 --- a/lib/service/localization_service.dart +++ b/lib/service/localization_service.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../lang/app_en.dart'; class LocalizationService extends Translations { diff --git a/lib/themes/custom_dialog_box.dart b/lib/themes/custom_dialog_box.dart index e2ff4d6..9b3d6da 100644 --- a/lib/themes/custom_dialog_box.dart +++ b/lib/themes/custom_dialog_box.dart @@ -1,7 +1,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../controllers/theme_controller.dart'; import 'app_them_data.dart'; @@ -29,23 +29,46 @@ class CustomDialogBox extends StatelessWidget { return Obx(() { final isDark = themeController.isDark.value; - return Dialog(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), elevation: 0, backgroundColor: Colors.transparent, child: contentBox(context, isDark)); + return Dialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + elevation: 0, + backgroundColor: Colors.transparent, + child: contentBox(context, isDark), + ); }); } Widget contentBox(BuildContext context, bool isDark) { return Container( padding: const EdgeInsets.all(20), - decoration: BoxDecoration(shape: BoxShape.rectangle, color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, borderRadius: BorderRadius.circular(20)), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, + borderRadius: BorderRadius.circular(20), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ img ?? const SizedBox(), const SizedBox(height: 20), - if (title.isNotEmpty) Text(title.tr(), style: AppThemeData.boldTextStyle(fontSize: 20, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + if (title.isNotEmpty) + Text( + title.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 20, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), const SizedBox(height: 5), if (descriptions.isNotEmpty) - Text(descriptions.tr(), textAlign: TextAlign.center, style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + descriptions.tr(), + textAlign: TextAlign.center, + style: AppThemeData.regularTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), const SizedBox(height: 20), Row( children: [ @@ -55,9 +78,25 @@ class CustomDialogBox extends StatelessWidget { child: Container( width: Responsive.width(100, context), height: Responsive.height(5, context), - decoration: BoxDecoration(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, borderRadius: BorderRadius.circular(200)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + borderRadius: BorderRadius.circular(200), + ), child: Center( - child: Text(negativeString.tr(), textAlign: TextAlign.center, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100)), + child: Text( + negativeString.tr(), + textAlign: TextAlign.center, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey100, + ), + ), ), ), ), @@ -69,8 +108,20 @@ class CustomDialogBox extends StatelessWidget { child: Container( width: Responsive.width(100, context), height: Responsive.height(5, context), - decoration: BoxDecoration(color: AppThemeData.success300, borderRadius: BorderRadius.circular(200)), - child: Center(child: Text('Confirm'.tr(), textAlign: TextAlign.center, style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey100))), + decoration: BoxDecoration( + color: AppThemeData.success300, + borderRadius: BorderRadius.circular(200), + ), + child: Center( + child: Text( + 'Confirm'.tr(), + textAlign: TextAlign.center, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.grey100, + ), + ), + ), ), ), ), diff --git a/lib/themes/easy_loading_config.dart b/lib/themes/easy_loading_config.dart index a48db16..6735481 100644 --- a/lib/themes/easy_loading_config.dart +++ b/lib/themes/easy_loading_config.dart @@ -1,7 +1,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../controllers/theme_controller.dart'; Future configEasyLoading() async { diff --git a/lib/themes/round_button_border.dart b/lib/themes/round_button_border.dart index a46e769..3b1eb2c 100644 --- a/lib/themes/round_button_border.dart +++ b/lib/themes/round_button_border.dart @@ -2,7 +2,7 @@ import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/responsive.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'app_them_data.dart'; class RoundedButtonBorder extends StatelessWidget { @@ -49,26 +49,51 @@ class RoundedButtonBorder extends StatelessWidget { height: Responsive.height(height ?? 6, context), decoration: ShapeDecoration( color: color ?? Colors.transparent, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(radius ?? 50), side: BorderSide(color: borderColor ?? AppThemeData.danger300)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(radius ?? 50), + side: BorderSide(color: borderColor ?? AppThemeData.danger300), + ), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - if (isRight == false) Padding(padding: const EdgeInsets.only(right: 10, left: 0), child: icon), + if (isRight == false) + Padding( + padding: const EdgeInsets.only(right: 10, left: 0), + child: icon, + ), isCenter == true - ? Text(title.tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 14, color: textColor ?? AppThemeData.grey800)) + ? Text( + title.tr(), + textAlign: TextAlign.center, + style: AppThemeData.semiBoldTextStyle( + fontSize: fontSizes ?? 14, + color: textColor ?? AppThemeData.grey800, + ), + ) : Expanded( child: Padding( padding: EdgeInsets.only(right: isRight == null ? 0 : 30), child: Text( title.tr(), textAlign: TextAlign.center, - style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 14, color: textColor ?? (isDark ? AppThemeData.grey100 : AppThemeData.grey700)), + style: AppThemeData.semiBoldTextStyle( + fontSize: fontSizes ?? 14, + color: + textColor ?? + (isDark + ? AppThemeData.grey100 + : AppThemeData.grey700), + ), ), ), ), - if (isRight == true) Padding(padding: const EdgeInsets.only(left: 10, right: 20), child: icon), + if (isRight == true) + Padding( + padding: const EdgeInsets.only(left: 10, right: 20), + child: icon, + ), ], ), ), diff --git a/lib/themes/round_button_fill.dart b/lib/themes/round_button_fill.dart index 8f61cbe..4b50524 100644 --- a/lib/themes/round_button_fill.dart +++ b/lib/themes/round_button_fill.dart @@ -1,7 +1,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'app_them_data.dart'; class RoundedButtonFill extends StatelessWidget { @@ -45,21 +45,48 @@ class RoundedButtonFill extends StatelessWidget { child: Container( width: Responsive.width(width ?? 100, context), height: Responsive.height(height ?? 6, context), - decoration: ShapeDecoration(color: color, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius ?? 50))), + decoration: ShapeDecoration( + color: color, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(borderRadius ?? 50), + ), + ), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - if (isRight == false) Padding(padding: const EdgeInsets.only(right: 10, left: 10), child: icon), + if (isRight == false) + Padding( + padding: const EdgeInsets.only(right: 10, left: 10), + child: icon, + ), isCenter == true - ? Text(title.tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 16, color: textColor ?? AppThemeData.grey50)) + ? Text( + title.tr(), + textAlign: TextAlign.center, + style: AppThemeData.semiBoldTextStyle( + fontSize: fontSizes ?? 16, + color: textColor ?? AppThemeData.grey50, + ), + ) : Expanded( child: Padding( padding: EdgeInsets.only(right: isRight == null ? 0 : 30), - child: Text(title.tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 16, color: textColor ?? AppThemeData.grey50)), + child: Text( + title.tr(), + textAlign: TextAlign.center, + style: AppThemeData.semiBoldTextStyle( + fontSize: fontSizes ?? 16, + color: textColor ?? AppThemeData.grey50, + ), + ), ), ), - if (isRight == true) Padding(padding: const EdgeInsets.only(left: 10, right: 10), child: icon), + if (isRight == true) + Padding( + padding: const EdgeInsets.only(left: 10, right: 10), + child: icon, + ), ], ), ), diff --git a/lib/themes/text_field_widget.dart b/lib/themes/text_field_widget.dart index 7e87544..44c3e57 100644 --- a/lib/themes/text_field_widget.dart +++ b/lib/themes/text_field_widget.dart @@ -2,7 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../controllers/theme_controller.dart'; import 'app_them_data.dart'; @@ -77,20 +77,39 @@ class _TextFieldWidgetState extends State { final themeController = Get.find(); final isDark = themeController.isDark.value; - final borderColor = widget.borderColor ?? (_focusNode.hasFocus ? (isDark ? AppThemeData.greyDark400 : AppThemeData.grey400) : (isDark ? AppThemeData.greyDark200 : AppThemeData.grey200)); + final borderColor = + widget.borderColor ?? + (_focusNode.hasFocus + ? (isDark ? AppThemeData.greyDark400 : AppThemeData.grey400) + : (isDark ? AppThemeData.greyDark200 : AppThemeData.grey200)); final fillColor = - widget.backgroundColor ?? (isDark ? (_focusNode.hasFocus ? AppThemeData.greyDark50 : AppThemeData.greyDark100) : (_focusNode.hasFocus ? AppThemeData.grey100 : Colors.transparent)); + widget.backgroundColor ?? + (isDark + ? (_focusNode.hasFocus + ? AppThemeData.greyDark50 + : AppThemeData.greyDark100) + : (_focusNode.hasFocus + ? AppThemeData.grey100 + : Colors.transparent)); final textColor = isDark ? AppThemeData.greyDark900 : AppThemeData.grey900; - final hintColor = widget.hintColor ?? (isDark ? AppThemeData.grey400 : AppThemeData.greyDark400); + final hintColor = + widget.hintColor ?? + (isDark ? AppThemeData.grey400 : AppThemeData.greyDark400); return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (widget.title != null) ...[ - Text(widget.title!.tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + widget.title!.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), const SizedBox(height: 5), ], TextFormField( @@ -112,18 +131,46 @@ class _TextFieldWidgetState extends State { filled: true, enabled: widget.enable ?? true, fillColor: fillColor, - contentPadding: EdgeInsets.symmetric(vertical: widget.title == null ? 15 : (widget.enable == false ? 13 : 8), horizontal: 10), + contentPadding: EdgeInsets.symmetric( + vertical: + widget.title == null ? 15 : (widget.enable == false ? 13 : 8), + horizontal: 10, + ), prefixIcon: widget.prefix, suffixIcon: widget.suffix, - prefixIconConstraints: const BoxConstraints(minHeight: 20, minWidth: 20), - suffixIconConstraints: const BoxConstraints(minHeight: 20, minWidth: 20), - border: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: borderColor)), - enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: borderColor)), - focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: borderColor, width: 1.2)), - errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: const BorderSide(color: Colors.red)), - disabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: borderColor)), + prefixIconConstraints: const BoxConstraints( + minHeight: 20, + minWidth: 20, + ), + suffixIconConstraints: const BoxConstraints( + minHeight: 20, + minWidth: 20, + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: borderColor), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: borderColor), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: borderColor, width: 1.2), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: const BorderSide(color: Colors.red), + ), + disabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: borderColor), + ), hintText: widget.hintText.tr(), - hintStyle: AppThemeData.regularTextStyle(fontSize: 14.sp, color: hintColor), + hintStyle: AppThemeData.regularTextStyle( + fontSize: 14.sp, + color: hintColor, + ), ), ), ], diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index a7c6398..8b44e86 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get_utils/src/extensions/internacionalization.dart'; + import 'package:map_launcher/map_launcher.dart'; import '../themes/show_toast_dialog.dart'; import 'package:geocoding/geocoding.dart'; diff --git a/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart b/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart index 844cd6d..576c3e6 100644 --- a/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart +++ b/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart @@ -1,7 +1,7 @@ // Flutter Packages import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; /// A [Widget] to show when there is no data to display. class EmptyScreen extends StatelessWidget { @@ -10,8 +10,6 @@ class EmptyScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return Center( - child: Text('Nothing found here...'.tr()), - ); + return Center(child: Text('Nothing found here...'.tr())); } } diff --git a/lib/widget/osm_map/map_controller.dart b/lib/widget/osm_map/map_controller.dart index 182b786..d08d846 100644 --- a/lib/widget/osm_map/map_controller.dart +++ b/lib/widget/osm_map/map_controller.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:customer/widget/osm_map/place_model.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import '../../utils/utils.dart'; import 'package:latlong2/latlong.dart'; @@ -20,11 +20,15 @@ class OSMMapController extends GetxController { } final url = Uri.parse( - 'https://nominatim.openstreetmap.org/search?q=$query&format=json&addressdetails=1&limit=10'); + 'https://nominatim.openstreetmap.org/search?q=$query&format=json&addressdetails=1&limit=10', + ); - final response = await http.get(url, headers: { - 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', - }); + final response = await http.get( + url, + headers: { + 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', + }, + ); if (response.statusCode == 200) { final data = json.decode(response.body); @@ -52,11 +56,15 @@ class OSMMapController extends GetxController { Future _getAddressFromLatLng(LatLng coords) async { final url = Uri.parse( - 'https://nominatim.openstreetmap.org/reverse?lat=${coords.latitude}&lon=${coords.longitude}&format=json'); + 'https://nominatim.openstreetmap.org/reverse?lat=${coords.latitude}&lon=${coords.longitude}&format=json', + ); - final response = await http.get(url, headers: { - 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', - }); + final response = await http.get( + url, + headers: { + 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', + }, + ); if (response.statusCode == 200) { final data = json.decode(response.body); @@ -79,10 +87,13 @@ class OSMMapController extends GetxController { Future getCurrentLocation() async { Position? location = await Utils.getCurrentLocation(); - LatLng latlng = - LatLng(location?.latitude ?? 0.0, location?.longitude ?? 0.0); + LatLng latlng = LatLng( + location?.latitude ?? 0.0, + location?.longitude ?? 0.0, + ); addLatLngOnly( - LatLng(location?.latitude ?? 0.0, location?.longitude ?? 0.0)); + LatLng(location?.latitude ?? 0.0, location?.longitude ?? 0.0), + ); mapController.move(latlng, mapController.camera.zoom); } } diff --git a/lib/widget/osm_map/map_picker_page.dart b/lib/widget/osm_map/map_picker_page.dart index a05628d..6b65246 100644 --- a/lib/widget/osm_map/map_picker_page.dart +++ b/lib/widget/osm_map/map_picker_page.dart @@ -7,7 +7,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:latlong2/latlong.dart'; import '../../controllers/theme_controller.dart'; diff --git a/lib/widget/permission_dialog.dart b/lib/widget/permission_dialog.dart index 701275b..e499e38 100644 --- a/lib/widget/permission_dialog.dart +++ b/lib/widget/permission_dialog.dart @@ -1,7 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../themes/app_them_data.dart'; import '../themes/round_button_fill.dart'; @@ -21,10 +21,15 @@ class PermissionDialog extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Icon(Icons.add_location_alt_rounded, color: Theme.of(context).primaryColor, size: 100), + Icon( + Icons.add_location_alt_rounded, + color: Theme.of(context).primaryColor, + size: 100, + ), const SizedBox(height: 20), Text( - 'You denied location permission forever. Please allow location permission from your app settings and receive more accurate delivery.'.tr(), + 'You denied location permission forever. Please allow location permission from your app settings and receive more accurate delivery.' + .tr(), textAlign: TextAlign.center, style: TextStyle(fontSize: 18), ), @@ -34,7 +39,13 @@ class PermissionDialog extends StatelessWidget { Expanded( child: TextButton( style: TextButton.styleFrom( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30), side: BorderSide(width: 2, color: Theme.of(context).primaryColor)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30), + side: BorderSide( + width: 2, + color: Theme.of(context).primaryColor, + ), + ), minimumSize: const Size(1, 50), ), child: Text('close'.tr()), diff --git a/lib/widget/place_picker/location_controller.dart b/lib/widget/place_picker/location_controller.dart index c9eb0d6..70a4ab8 100644 --- a/lib/widget/place_picker/location_controller.dart +++ b/lib/widget/place_picker/location_controller.dart @@ -1,5 +1,5 @@ import 'package:customer/widget/place_picker/selected_location_model.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:geolocator/geolocator.dart'; import 'package:geocoding/geocoding.dart'; @@ -34,11 +34,15 @@ class LocationController extends GetxController { Future getCurrentLocation() async { try { - Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high); + Position position = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high, + ); selectedLocation.value = LatLng(position.latitude, position.longitude); if (mapController != null) { - mapController!.animateCamera(CameraUpdate.newLatLngZoom(selectedLocation.value!, 15)); + mapController!.animateCamera( + CameraUpdate.newLatLngZoom(selectedLocation.value!, 15), + ); } await getAddressFromLatLng(selectedLocation.value!); @@ -49,11 +53,15 @@ class LocationController extends GetxController { Future getAddressFromLatLng(LatLng latLng) async { try { - List placemarks = await placemarkFromCoordinates(latLng.latitude, latLng.longitude); + List placemarks = await placemarkFromCoordinates( + latLng.latitude, + latLng.longitude, + ); if (placemarks.isNotEmpty) { Placemark place = placemarks.first; selectedPlaceAddress.value = place; - address.value = "${place.street}, ${place.locality}, ${place.administrativeArea}, ${place.country}"; + address.value = + "${place.street}, ${place.locality}, ${place.administrativeArea}, ${place.country}"; } else { address.value = "Address not found"; } @@ -71,7 +79,10 @@ class LocationController extends GetxController { try { List locations = await locationFromAddress(zipCode); if (locations.isNotEmpty) { - selectedLocation.value = LatLng(locations.first.latitude, locations.first.longitude); + selectedLocation.value = LatLng( + locations.first.latitude, + locations.first.longitude, + ); } } catch (e) { print("Error getting coordinates for ZIP code: $e"); @@ -80,7 +91,10 @@ class LocationController extends GetxController { void confirmLocation() { if (selectedLocation.value != null) { - SelectedLocationModel selectedLocationModel = SelectedLocationModel(address: selectedPlaceAddress.value, latLng: selectedLocation.value); + SelectedLocationModel selectedLocationModel = SelectedLocationModel( + address: selectedPlaceAddress.value, + latLng: selectedLocation.value, + ); Get.back(result: selectedLocationModel); } } diff --git a/lib/widget/place_picker/location_picker_screen.dart b/lib/widget/place_picker/location_picker_screen.dart index 4c0c96d..e00f665 100644 --- a/lib/widget/place_picker/location_picker_screen.dart +++ b/lib/widget/place_picker/location_picker_screen.dart @@ -8,7 +8,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_google_places_hoc081098/flutter_google_places_hoc081098.dart'; import 'package:flutter_google_places_hoc081098/google_maps_webservice_places.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; final GoogleMapsPlaces _places = GoogleMapsPlaces(apiKey: Constant.mapAPIKey); diff --git a/lib/widget/story_view/widgets/story_image.dart b/lib/widget/story_view/widgets/story_image.dart index ce6308f..9a193a5 100644 --- a/lib/widget/story_view/widgets/story_image.dart +++ b/lib/widget/story_view/widgets/story_image.dart @@ -4,8 +4,6 @@ import 'dart:ui' as ui; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; -import 'package:get/get_utils/src/extensions/internacionalization.dart'; - import '../controller/story_controller.dart'; import '../utils.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index 2be1d69..f0da5ca 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: customer description: "A new Flutter project." -version: 1.0.0+3 +version: 1.0.0+4 environment: sdk: ^3.7.2