BASE: Update Icons & Name Of The App.
This commit is contained in:
BIN
android/app/src/main/res/ic_launcher-web.png
Normal file
BIN
android/app/src/main/res/ic_launcher-web.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
@@ -1,6 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@mipmap/ic_launcher_background"/>
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
<monochrome android:drawable="@mipmap/ic_launcher_monochrome"/>
|
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
</adaptive-icon>
|
||||||
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Normal file
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 205 KiB |
BIN
android/app/src/main/res/playstore-icon.png
Normal file
BIN
android/app/src/main/res/playstore-icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 34 KiB |
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<color name="ic_launcher_background">#ff643c</color>
|
||||||
|
</resources>
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
<resources>
|
|
||||||
<!-- Theme for launch/splash screen -->
|
|
||||||
<style name="LaunchTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
|
|
||||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<!-- Normal app theme -->
|
|
||||||
<style name="NormalTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
|
|
||||||
<item name="android:windowBackground">?android:colorBackground</item>
|
|
||||||
</style>
|
|
||||||
</resources>
|
|
||||||
@@ -102,5 +102,7 @@
|
|||||||
"rideHistory": "Ride History",
|
"rideHistory": "Ride History",
|
||||||
"plsLoginToAcc": "Please Log In to Continue",
|
"plsLoginToAcc": "Please Log In to Continue",
|
||||||
"youAreNotLoggedIn": "You’re not logged in. Please sign in to access your account and explore all features.",
|
"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}"
|
||||||
}
|
}
|
||||||
108
assets/translations/ru-RU.json
Normal file
108
assets/translations/ru-RU.json
Normal file
@@ -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}"
|
||||||
|
}
|
||||||
108
assets/translations/uz-UZ.json
Normal file
108
assets/translations/uz-UZ.json
Normal file
@@ -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}"
|
||||||
|
}
|
||||||
@@ -19,7 +19,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:geolocator/geolocator.dart' as geolocator;
|
import 'package:geolocator/geolocator.dart' as geolocator;
|
||||||
import 'package:geolocator/geolocator.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:google_maps_flutter/google_maps_flutter.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:mailer/mailer.dart';
|
import 'package:mailer/mailer.dart';
|
||||||
@@ -172,7 +172,10 @@ class Constant {
|
|||||||
static bool checkZoneCheck(double latitude, double longLatitude) {
|
static bool checkZoneCheck(double latitude, double longLatitude) {
|
||||||
bool isZoneAvailable = false;
|
bool isZoneAvailable = false;
|
||||||
for (var element in Constant.zoneList) {
|
for (var element in Constant.zoneList) {
|
||||||
if (Constant.isPointInPolygon(LatLng(latitude, longLatitude), element.area!)) {
|
if (Constant.isPointInPolygon(
|
||||||
|
LatLng(latitude, longLatitude),
|
||||||
|
element.area!,
|
||||||
|
)) {
|
||||||
isZoneAvailable = true;
|
isZoneAvailable = true;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
@@ -185,7 +188,10 @@ class Constant {
|
|||||||
static String? getZoneId(double latitude, double longLatitude) {
|
static String? getZoneId(double latitude, double longLatitude) {
|
||||||
String? zoneId;
|
String? zoneId;
|
||||||
for (var element in Constant.zoneList) {
|
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;
|
zoneId = element.id;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -198,13 +204,18 @@ class Constant {
|
|||||||
return (rng.nextInt(900000) + 100000).toString(); // 6 digit
|
return (rng.nextInt(900000) + 100000).toString(); // 6 digit
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<void> checkPermission({required BuildContext context, required Function() onTap}) async {
|
static Future<void> checkPermission({
|
||||||
|
required BuildContext context,
|
||||||
|
required Function() onTap,
|
||||||
|
}) async {
|
||||||
LocationPermission permission = await Geolocator.checkPermission();
|
LocationPermission permission = await Geolocator.checkPermission();
|
||||||
if (permission == LocationPermission.denied) {
|
if (permission == LocationPermission.denied) {
|
||||||
permission = await Geolocator.requestPermission();
|
permission = await Geolocator.requestPermission();
|
||||||
}
|
}
|
||||||
if (permission == LocationPermission.denied) {
|
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) {
|
} else if (permission == LocationPermission.deniedForever) {
|
||||||
showDialog(
|
showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
@@ -241,7 +252,10 @@ class Constant {
|
|||||||
return isPlanExpire;
|
return isPlanExpire;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isExpireDate({required bool expiryDay, Timestamp? subscriptionExpiryDate}) {
|
static bool isExpireDate({
|
||||||
|
required bool expiryDay,
|
||||||
|
Timestamp? subscriptionExpiryDate,
|
||||||
|
}) {
|
||||||
bool isPlanExpire = false;
|
bool isPlanExpire = false;
|
||||||
if (expiryDay == true) {
|
if (expiryDay == true) {
|
||||||
isPlanExpire = false;
|
isPlanExpire = false;
|
||||||
@@ -301,17 +315,49 @@ class Constant {
|
|||||||
String commission = "0";
|
String commission = "0";
|
||||||
if (sectionConstantModel!.adminCommision!.isEnabled == true) {
|
if (sectionConstantModel!.adminCommision!.isEnabled == true) {
|
||||||
if (vendorModel.adminCommission == null) {
|
if (vendorModel.adminCommission == null) {
|
||||||
if (sectionConstantModel!.adminCommision!.commissionType!.toLowerCase() == "Percent".toLowerCase() ||
|
if (sectionConstantModel!.adminCommision!.commissionType!
|
||||||
sectionConstantModel!.adminCommision!.commissionType?.toLowerCase() == "Percentage".toLowerCase()) {
|
.toLowerCase() ==
|
||||||
commission = (double.parse(price) + (double.parse(price) * double.parse(sectionConstantModel!.adminCommision!.amount.toString()) / 100)).toString();
|
"Percent".toLowerCase() ||
|
||||||
|
sectionConstantModel!.adminCommision!.commissionType
|
||||||
|
?.toLowerCase() ==
|
||||||
|
"Percentage".toLowerCase()) {
|
||||||
|
commission =
|
||||||
|
(double.parse(price) +
|
||||||
|
(double.parse(price) *
|
||||||
|
double.parse(
|
||||||
|
sectionConstantModel!.adminCommision!.amount
|
||||||
|
.toString(),
|
||||||
|
) /
|
||||||
|
100))
|
||||||
|
.toString();
|
||||||
} else {
|
} else {
|
||||||
commission = (double.parse(price) + double.parse(sectionConstantModel!.adminCommision!.amount.toString())).toString();
|
commission =
|
||||||
|
(double.parse(price) +
|
||||||
|
double.parse(
|
||||||
|
sectionConstantModel!.adminCommision!.amount.toString(),
|
||||||
|
))
|
||||||
|
.toString();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (vendorModel.adminCommission!.commissionType!.toLowerCase() == "Percent".toLowerCase() || vendorModel.adminCommission!.commissionType?.toLowerCase() == "Percentage".toLowerCase()) {
|
if (vendorModel.adminCommission!.commissionType!.toLowerCase() ==
|
||||||
commission = (double.parse(price) + (double.parse(price) * double.parse(vendorModel.adminCommission!.amount.toString()) / 100)).toString();
|
"Percent".toLowerCase() ||
|
||||||
|
vendorModel.adminCommission!.commissionType?.toLowerCase() ==
|
||||||
|
"Percentage".toLowerCase()) {
|
||||||
|
commission =
|
||||||
|
(double.parse(price) +
|
||||||
|
(double.parse(price) *
|
||||||
|
double.parse(
|
||||||
|
vendorModel.adminCommission!.amount.toString(),
|
||||||
|
) /
|
||||||
|
100))
|
||||||
|
.toString();
|
||||||
} else {
|
} else {
|
||||||
commission = (double.parse(price) + double.parse(vendorModel.adminCommission!.amount.toString())).toString();
|
commission =
|
||||||
|
(double.parse(price) +
|
||||||
|
double.parse(
|
||||||
|
vendorModel.adminCommission!.amount.toString(),
|
||||||
|
))
|
||||||
|
.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -327,7 +373,10 @@ class Constant {
|
|||||||
if (taxModel.type == "fix") {
|
if (taxModel.type == "fix") {
|
||||||
taxAmount = double.parse(taxModel.tax.toString());
|
taxAmount = double.parse(taxModel.tax.toString());
|
||||||
} else {
|
} 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;
|
return taxAmount;
|
||||||
@@ -336,8 +385,12 @@ class Constant {
|
|||||||
static double calculateDiscount({String? amount, CouponModel? offerModel}) {
|
static double calculateDiscount({String? amount, CouponModel? offerModel}) {
|
||||||
double taxAmount = 0.0;
|
double taxAmount = 0.0;
|
||||||
if (offerModel != null) {
|
if (offerModel != null) {
|
||||||
if (offerModel.discountType == "Percentage" || offerModel.discountType == "percentage") {
|
if (offerModel.discountType == "Percentage" ||
|
||||||
taxAmount = (double.parse(amount.toString()) * double.parse(offerModel.discount.toString())) / 100;
|
offerModel.discountType == "percentage") {
|
||||||
|
taxAmount =
|
||||||
|
(double.parse(amount.toString()) *
|
||||||
|
double.parse(offerModel.discount.toString())) /
|
||||||
|
100;
|
||||||
} else {
|
} else {
|
||||||
taxAmount = double.parse(offerModel.discount.toString());
|
taxAmount = double.parse(offerModel.discount.toString());
|
||||||
}
|
}
|
||||||
@@ -345,11 +398,17 @@ class Constant {
|
|||||||
return taxAmount;
|
return taxAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
static String calculateReview({required String? reviewCount, required String? reviewSum}) {
|
static String calculateReview({
|
||||||
if (0 == double.parse(reviewSum.toString()) && 0 == double.parse(reviewSum.toString())) {
|
required String? reviewCount,
|
||||||
|
required String? reviewSum,
|
||||||
|
}) {
|
||||||
|
if (0 == double.parse(reviewSum.toString()) &&
|
||||||
|
0 == double.parse(reviewSum.toString())) {
|
||||||
return "0";
|
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() {
|
static String getUuid() {
|
||||||
@@ -357,13 +416,24 @@ class Constant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Widget loader() {
|
static Widget loader() {
|
||||||
return Center(child: CircularProgressIndicator(color: AppThemeData.primary300));
|
return Center(
|
||||||
|
child: CircularProgressIndicator(color: AppThemeData.primary300),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Widget showEmptyView({required String message}) {
|
static Widget showEmptyView({required String message}) {
|
||||||
final themeController = Get.find<ThemeController>();
|
final themeController = Get.find<ThemeController>();
|
||||||
final isDark = themeController.isDark.value;
|
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) {
|
static String maskingString(String documentId, int maskingDigit) {
|
||||||
@@ -382,7 +452,8 @@ class Constant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String? validateEmail(String? value) {
|
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);
|
RegExp regExp = RegExp(pattern);
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
return "Email is Required";
|
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 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") {
|
if (distanceType == "miles") {
|
||||||
distance = distanceInMeters / 1609;
|
distance = distanceInMeters / 1609;
|
||||||
} else {
|
} else {
|
||||||
@@ -405,7 +486,8 @@ class Constant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool hasValidUrl(String? value) {
|
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);
|
RegExp regExp = RegExp(pattern);
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
return false;
|
return false;
|
||||||
@@ -415,10 +497,17 @@ class Constant {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<String> uploadUserImageToFireStorage(File image, String filePath, String fileName) async {
|
static Future<String> uploadUserImageToFireStorage(
|
||||||
Reference upload = FirebaseStorage.instance.ref().child('$filePath/$fileName');
|
File image,
|
||||||
|
String filePath,
|
||||||
|
String fileName,
|
||||||
|
) async {
|
||||||
|
Reference upload = FirebaseStorage.instance.ref().child(
|
||||||
|
'$filePath/$fileName',
|
||||||
|
);
|
||||||
UploadTask uploadTask = upload.putFile(image);
|
UploadTask uploadTask = upload.putFile(image);
|
||||||
var downloadUrl = await (await uploadTask.whenComplete(() {})).ref.getDownloadURL();
|
var downloadUrl =
|
||||||
|
await (await uploadTask.whenComplete(() {})).ref.getDownloadURL();
|
||||||
return downloadUrl.toString();
|
return downloadUrl.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,14 +524,22 @@ class Constant {
|
|||||||
|
|
||||||
Future<Uint8List> getBytesFromAsset(String path, int width) async {
|
Future<Uint8List> getBytesFromAsset(String path, int width) async {
|
||||||
ByteData data = await rootBundle.load(path);
|
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();
|
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<TimeOfDay?> selectTime(context) async {
|
static Future<TimeOfDay?> selectTime(context) async {
|
||||||
FocusScope.of(context).requestFocus(FocusNode()); //remove focus
|
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) {
|
if (newTime != null) {
|
||||||
return newTime;
|
return newTime;
|
||||||
}
|
}
|
||||||
@@ -480,7 +577,11 @@ class Constant {
|
|||||||
|
|
||||||
static int calculateDifference(DateTime date) {
|
static int calculateDifference(DateTime date) {
|
||||||
DateTime now = DateTime.now();
|
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) {
|
static String timestampToDate(Timestamp timestamp) {
|
||||||
@@ -509,7 +610,15 @@ class Constant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static DateTime stringToDate(String openDineTime) {
|
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() {
|
static LanguageModel getLanguage() {
|
||||||
@@ -527,7 +636,10 @@ class Constant {
|
|||||||
int crossings = 0;
|
int crossings = 0;
|
||||||
for (int i = 0; i < polygon.length; i++) {
|
for (int i = 0; i < polygon.length; i++) {
|
||||||
int next = (i + 1) % polygon.length;
|
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 edgeLong = polygon[next].longitude - polygon[i].longitude;
|
||||||
double edgeLat = polygon[next].latitude - polygon[i].latitude;
|
double edgeLat = polygon[next].latitude - polygon[i].latitude;
|
||||||
double interpol = (point.latitude - polygon[i].latitude) / edgeLat;
|
double interpol = (point.latitude - polygon[i].latitude) / edgeLat;
|
||||||
@@ -549,7 +661,12 @@ class Constant {
|
|||||||
allowInsecure: true,
|
allowInsecure: true,
|
||||||
);
|
);
|
||||||
|
|
||||||
static Future<void> sendMail({String? subject, String? body, bool? isAdmin = false, List<dynamic>? recipients}) async {
|
static Future<void> sendMail({
|
||||||
|
String? subject,
|
||||||
|
String? body,
|
||||||
|
bool? isAdmin = false,
|
||||||
|
List<dynamic>? recipients,
|
||||||
|
}) async {
|
||||||
// Create our message.
|
// Create our message.
|
||||||
if (mailSettings != null) {
|
if (mailSettings != null) {
|
||||||
if (isAdmin == true) {
|
if (isAdmin == true) {
|
||||||
@@ -557,7 +674,10 @@ class Constant {
|
|||||||
}
|
}
|
||||||
final message =
|
final message =
|
||||||
Message()
|
Message()
|
||||||
..from = Address(mailSettings!.userName.toString(), mailSettings!.fromName.toString())
|
..from = Address(
|
||||||
|
mailSettings!.userName.toString(),
|
||||||
|
mailSettings!.fromName.toString(),
|
||||||
|
)
|
||||||
..recipients = recipients!
|
..recipients = recipients!
|
||||||
..subject = subject
|
..subject = subject
|
||||||
..text = body
|
..text = body
|
||||||
@@ -581,10 +701,17 @@ class Constant {
|
|||||||
// await connection.send(message);
|
// await connection.send(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Uri createCoordinatesUrl(double latitude, double longitude, [String? label]) {
|
static Uri createCoordinatesUrl(
|
||||||
|
double latitude,
|
||||||
|
double longitude, [
|
||||||
|
String? label,
|
||||||
|
]) {
|
||||||
Uri uri;
|
Uri uri;
|
||||||
if (kIsWeb) {
|
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) {
|
} else if (Platform.isAndroid) {
|
||||||
var query = '$latitude,$longitude';
|
var query = '$latitude,$longitude';
|
||||||
if (label != null) query += '($label)';
|
if (label != null) query += '($label)';
|
||||||
@@ -594,14 +721,18 @@ class Constant {
|
|||||||
if (label != null) params['q'] = label;
|
if (label != null) params['q'] = label;
|
||||||
uri = Uri.https('maps.apple.com', '/', params);
|
uri = Uri.https('maps.apple.com', '/', params);
|
||||||
} else {
|
} 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;
|
return uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<void> sendOrderEmail({required OrderModel orderModel}) async {
|
static Future<void> sendOrderEmail({required OrderModel orderModel}) async {
|
||||||
EmailTemplateModel? emailTemplateModel = await FireStoreUtils.getEmailTemplates(newOrderPlaced);
|
EmailTemplateModel? emailTemplateModel =
|
||||||
|
await FireStoreUtils.getEmailTemplates(newOrderPlaced);
|
||||||
if (emailTemplateModel != null) {
|
if (emailTemplateModel != null) {
|
||||||
String firstHTML = """
|
String firstHTML = """
|
||||||
<table style="width: 100%; border-collapse: collapse; border: 1px solid rgb(0, 0, 0);">
|
<table style="width: 100%; border-collapse: collapse; border: 1px solid rgb(0, 0, 0);">
|
||||||
@@ -618,11 +749,23 @@ class Constant {
|
|||||||
""";
|
""";
|
||||||
|
|
||||||
String newString = emailTemplateModel.message.toString();
|
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("{orderid}", orderModel.id.toString());
|
||||||
newString = newString.replaceAll("{date}", DateFormat('yyyy-MM-dd').format(orderModel.createdAt!.toDate()));
|
newString = newString.replaceAll(
|
||||||
newString = newString.replaceAll("{address}", orderModel.address!.getFullAddress());
|
"{date}",
|
||||||
newString = newString.replaceAll("{paymentmethod}", orderModel.paymentMethod.toString());
|
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 deliveryCharge = 0.0;
|
||||||
double total = 0.0;
|
double total = 0.0;
|
||||||
@@ -630,7 +773,8 @@ class Constant {
|
|||||||
double discount = 0.0;
|
double discount = 0.0;
|
||||||
double taxAmount = 0.0;
|
double taxAmount = 0.0;
|
||||||
double tipValue = 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<String> htmlList = [];
|
List<String> htmlList = [];
|
||||||
|
|
||||||
if (orderModel.deliveryCharge != null) {
|
if (orderModel.deliveryCharge != null) {
|
||||||
@@ -640,15 +784,22 @@ class Constant {
|
|||||||
tipValue = double.parse(orderModel.tipAmount.toString());
|
tipValue = double.parse(orderModel.tipAmount.toString());
|
||||||
}
|
}
|
||||||
for (var element in orderModel.products!) {
|
for (var element in orderModel.products!) {
|
||||||
if (element.extrasPrice != null && element.extrasPrice!.isNotEmpty && double.parse(element.extrasPrice!) != 0.0) {
|
if (element.extrasPrice != null &&
|
||||||
total += double.parse(element.quantity.toString()) * double.parse(element.extrasPrice!);
|
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<dynamic>? addon = element.extras;
|
List<dynamic>? addon = element.extras;
|
||||||
String extrasDisVal = '';
|
String extrasDisVal = '';
|
||||||
for (int i = 0; i < addon!.length; i++) {
|
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 = """
|
String product = """
|
||||||
<tr>
|
<tr>
|
||||||
@@ -666,7 +817,9 @@ class Constant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (orderModel.specialDiscount!.isNotEmpty) {
|
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) {
|
if (orderModel.couponId != null && orderModel.couponId!.isNotEmpty) {
|
||||||
@@ -675,35 +828,81 @@ class Constant {
|
|||||||
|
|
||||||
List<String> taxHtmlList = [];
|
List<String> taxHtmlList = [];
|
||||||
for (var element in taxList) {
|
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 =
|
String taxHtml =
|
||||||
"""<span style="font-size: 1rem;">${element.title}: ${amountShow(amount: calculateTax(amount: (total - discount - specialDiscount).toString(), taxModel: element).toString())}${taxList.indexOf(element) == taxList.length - 1 ? "</span>" : "<br></span>"}""";
|
"""<span style="font-size: 1rem;">${element.title}: ${amountShow(amount: calculateTax(amount: (total - discount - specialDiscount).toString(), taxModel: element).toString())}${taxList.indexOf(element) == taxList.length - 1 ? "</span>" : "<br></span>"}""";
|
||||||
taxHtmlList.add(taxHtml);
|
taxHtmlList.add(taxHtml);
|
||||||
}
|
}
|
||||||
|
|
||||||
var totalamount =
|
var totalamount =
|
||||||
orderModel.deliveryCharge == null || orderModel.deliveryCharge!.isEmpty
|
orderModel.deliveryCharge == null ||
|
||||||
|
orderModel.deliveryCharge!.isEmpty
|
||||||
? total + taxAmount - discount - specialDiscount
|
? 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(
|
||||||
newString = newString.replaceAll("{coupon}", orderModel.couponId.toString());
|
"{subtotal}",
|
||||||
newString = newString.replaceAll("{discountamount}", amountShow(amount: orderModel.discount.toString()));
|
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("{specialcoupon}", specialLabel);
|
||||||
newString = newString.replaceAll("{specialdiscountamount}", amountShow(amount: specialDiscount.toString()));
|
newString = newString.replaceAll(
|
||||||
newString = newString.replaceAll("{shippingcharge}", amountShow(amount: deliveryCharge.toString()));
|
"{specialdiscountamount}",
|
||||||
newString = newString.replaceAll("{tipamount}", amountShow(amount: tipValue.toString()));
|
amountShow(amount: specialDiscount.toString()),
|
||||||
newString = newString.replaceAll("{totalAmount}", amountShow(amount: totalamount.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 tableHTML = htmlList.join();
|
||||||
String lastHTML = "</tbody></table>";
|
String lastHTML = "</tbody></table>";
|
||||||
newString = newString.replaceAll("{productdetails}", firstHTML + tableHTML + lastHTML);
|
newString = newString.replaceAll(
|
||||||
|
"{productdetails}",
|
||||||
|
firstHTML + tableHTML + lastHTML,
|
||||||
|
);
|
||||||
newString = newString.replaceAll("{taxdetails}", taxHtmlList.join());
|
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();
|
String subjectNewString = emailTemplateModel.subject.toString();
|
||||||
subjectNewString = subjectNewString.replaceAll("{orderid}", orderModel.id.toString());
|
subjectNewString = subjectNewString.replaceAll(
|
||||||
await sendMail(subject: subjectNewString, isAdmin: emailTemplateModel.isSendToAdmin, body: newString, recipients: [Constant.userModel!.email]);
|
"{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
|
const R = 6371; // Earth's radius in km
|
||||||
final dLat = _degToRad(lat2 - lat1);
|
final dLat = _degToRad(lat2 - lat1);
|
||||||
final dLon = _degToRad(lon2 - lon1);
|
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));
|
final c = 2 * atan2(sqrt(a), sqrt(1 - a));
|
||||||
return R * c;
|
return R * c;
|
||||||
}
|
}
|
||||||
@@ -725,13 +929,19 @@ class Constant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Calculate tax amount for a single tax model
|
/// 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;
|
double taxVal = 0.0;
|
||||||
if (taxModel.enable == true) {
|
if (taxModel.enable == true) {
|
||||||
if (taxModel.type == "fix") {
|
if (taxModel.type == "fix") {
|
||||||
taxVal = double.tryParse(taxModel.tax.toString()) ?? 0.0;
|
taxVal = double.tryParse(taxModel.tax.toString()) ?? 0.0;
|
||||||
} else {
|
} 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;
|
return taxVal;
|
||||||
@@ -743,10 +953,15 @@ class Constant {
|
|||||||
if (response.statusCode != 200) throw Exception("Failed to load image");
|
if (response.statusCode != 200) throw Exception("Failed to load image");
|
||||||
|
|
||||||
final Uint8List bytes = response.bodyBytes;
|
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 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();
|
return byteData!.buffer.asUint8List();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print("⚠️ getBytesFromUrl error: $e — using default cab icon");
|
print("⚠️ getBytesFromUrl error: $e — using default cab icon");
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||||
import 'package:easy_localization/easy_localization.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 'package:http/http.dart' as http;
|
||||||
import '../../models/onprovider_order_model.dart';
|
import '../../models/onprovider_order_model.dart';
|
||||||
import '../models/wallet_transaction_model.dart';
|
import '../models/wallet_transaction_model.dart';
|
||||||
@@ -48,7 +48,9 @@ import '../utils/preferences.dart';
|
|||||||
import 'on_demand_dashboard_controller.dart';
|
import 'on_demand_dashboard_controller.dart';
|
||||||
|
|
||||||
class OnDemandPaymentController extends GetxController {
|
class OnDemandPaymentController extends GetxController {
|
||||||
Rx<OnProviderOrderModel?> onDemandOrderModel = Rx<OnProviderOrderModel?>(null);
|
Rx<OnProviderOrderModel?> onDemandOrderModel = Rx<OnProviderOrderModel?>(
|
||||||
|
null,
|
||||||
|
);
|
||||||
RxDouble totalAmount = 0.0.obs;
|
RxDouble totalAmount = 0.0.obs;
|
||||||
late bool isExtra;
|
late bool isExtra;
|
||||||
|
|
||||||
@@ -76,19 +78,37 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
ShowToastDialog.showLoader("Please wait...".tr());
|
ShowToastDialog.showLoader("Please wait...".tr());
|
||||||
|
|
||||||
onDemandOrderModel.value?.payment_method = selectedPaymentMethod.value;
|
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;
|
onDemandOrderModel.value?.extraPaymentStatus = true;
|
||||||
|
|
||||||
await FireStoreUtils.onDemandOrderPlace(onDemandOrderModel.value!, totalAmount.value);
|
await FireStoreUtils.onDemandOrderPlace(
|
||||||
|
onDemandOrderModel.value!,
|
||||||
|
totalAmount.value,
|
||||||
|
);
|
||||||
|
|
||||||
if (onDemandOrderModel.value?.status == Constant.orderPlaced) {
|
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) {
|
if (providerUser != null) {
|
||||||
final payLoad = {"type": 'provider_order', "orderId": onDemandOrderModel.value?.id};
|
final payLoad = {
|
||||||
await SendNotification.sendFcmMessage(Constant.bookingPlaced, providerUser.fcmToken ?? '', payLoad);
|
"type": 'provider_order',
|
||||||
|
"orderId": onDemandOrderModel.value?.id,
|
||||||
|
};
|
||||||
|
await SendNotification.sendFcmMessage(
|
||||||
|
Constant.bookingPlaced,
|
||||||
|
providerUser.fcmToken ?? '',
|
||||||
|
payLoad,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowToastDialog.showToast("OnDemand Service successfully booked".tr());
|
ShowToastDialog.showToast("OnDemand Service successfully booked".tr());
|
||||||
@@ -107,16 +127,23 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
paymentStatus: "success".tr(),
|
paymentStatus: "success".tr(),
|
||||||
);
|
);
|
||||||
|
|
||||||
await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async {
|
await FireStoreUtils.setWalletTransaction(transactionModel).then((
|
||||||
|
value,
|
||||||
|
) async {
|
||||||
if (value == true) {
|
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();
|
ShowToastDialog.closeLoader();
|
||||||
Get.offAll(const OnDemandDashboardScreen());
|
Get.offAll(const OnDemandDashboardScreen());
|
||||||
OnDemandDashboardController controller = Get.put(OnDemandDashboardController());
|
OnDemandDashboardController controller = Get.put(
|
||||||
|
OnDemandDashboardController(),
|
||||||
|
);
|
||||||
controller.selectedIndex.value = 2;
|
controller.selectedIndex.value = 2;
|
||||||
} else {
|
} else {
|
||||||
// Extra Charges Flow
|
// Extra Charges Flow
|
||||||
@@ -137,9 +164,14 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
paymentStatus: "success".tr(),
|
paymentStatus: "success".tr(),
|
||||||
);
|
);
|
||||||
|
|
||||||
await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async {
|
await FireStoreUtils.setWalletTransaction(transactionModel).then((
|
||||||
|
value,
|
||||||
|
) async {
|
||||||
if (value == true) {
|
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(),
|
paymentStatus: "success".tr(),
|
||||||
);
|
);
|
||||||
|
|
||||||
await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async {
|
await FireStoreUtils.setWalletTransaction(transactionModel).then((
|
||||||
|
value,
|
||||||
|
) async {
|
||||||
if (value == true) {
|
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();
|
ShowToastDialog.closeLoader();
|
||||||
Get.offAll(const OnDemandDashboardScreen());
|
Get.offAll(const OnDemandDashboardScreen());
|
||||||
OnDemandDashboardController controller = Get.put(OnDemandDashboardController());
|
OnDemandDashboardController controller = Get.put(
|
||||||
|
OnDemandDashboardController(),
|
||||||
|
);
|
||||||
controller.selectedIndex.value = 2;
|
controller.selectedIndex.value = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -194,19 +233,45 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
Future<void> getPaymentSettings() async {
|
Future<void> getPaymentSettings() async {
|
||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
await FireStoreUtils.getPaymentSettingsData().then((value) {
|
await FireStoreUtils.getPaymentSettingsData().then((value) {
|
||||||
stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings)));
|
stripeModel.value = StripeModel.fromJson(
|
||||||
payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings)));
|
jsonDecode(Preferences.getString(Preferences.stripeSettings)),
|
||||||
payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack)));
|
);
|
||||||
mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago)));
|
payPalModel.value = PayPalModel.fromJson(
|
||||||
flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave)));
|
jsonDecode(Preferences.getString(Preferences.paypalSettings)),
|
||||||
paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings)));
|
);
|
||||||
payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings)));
|
payStackModel.value = PayStackModel.fromJson(
|
||||||
razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings)));
|
jsonDecode(Preferences.getString(Preferences.payStack)),
|
||||||
midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings)));
|
);
|
||||||
orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)));
|
mercadoPagoModel.value = MercadoPagoModel.fromJson(
|
||||||
xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings)));
|
jsonDecode(Preferences.getString(Preferences.mercadoPago)),
|
||||||
walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings)));
|
);
|
||||||
cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings)));
|
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) {
|
if (walletSettingModel.value.isEnabled == true) {
|
||||||
selectedPaymentMethod.value = PaymentGateway.wallet.name;
|
selectedPaymentMethod.value = PaymentGateway.wallet.name;
|
||||||
@@ -249,20 +314,32 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
Future<void> stripeMakePayment({required String amount}) async {
|
Future<void> stripeMakePayment({required String amount}) async {
|
||||||
log(double.parse(amount).toStringAsFixed(0));
|
log(double.parse(amount).toStringAsFixed(0));
|
||||||
try {
|
try {
|
||||||
Map<String, dynamic>? paymentIntentData = await createStripeIntent(amount: amount);
|
Map<String, dynamic>? paymentIntentData = await createStripeIntent(
|
||||||
|
amount: amount,
|
||||||
|
);
|
||||||
log("stripe Responce====>$paymentIntentData");
|
log("stripe Responce====>$paymentIntentData");
|
||||||
if (paymentIntentData!.containsKey("error")) {
|
if (paymentIntentData!.containsKey("error")) {
|
||||||
Get.back();
|
Get.back();
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
await Stripe.instance.initPaymentSheet(
|
await Stripe.instance.initPaymentSheet(
|
||||||
paymentSheetParameters: SetupPaymentSheetParameters(
|
paymentSheetParameters: SetupPaymentSheetParameters(
|
||||||
paymentIntentClientSecret: paymentIntentData['client_secret'],
|
paymentIntentClientSecret: paymentIntentData['client_secret'],
|
||||||
allowsDelayedPaymentMethods: false,
|
allowsDelayedPaymentMethods: false,
|
||||||
googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"),
|
googlePay: const PaymentSheetGooglePay(
|
||||||
|
merchantCountryCode: 'US',
|
||||||
|
testEnv: true,
|
||||||
|
currencyCode: "USD",
|
||||||
|
),
|
||||||
customFlow: true,
|
customFlow: true,
|
||||||
style: ThemeMode.system,
|
style: ThemeMode.system,
|
||||||
appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)),
|
appearance: PaymentSheetAppearance(
|
||||||
|
colors: PaymentSheetAppearanceColors(
|
||||||
|
primary: AppThemeData.primary300,
|
||||||
|
),
|
||||||
|
),
|
||||||
merchantDisplayName: 'GoRide',
|
merchantDisplayName: 'GoRide',
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -308,7 +385,10 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
var response = await http.post(
|
var response = await http.post(
|
||||||
Uri.parse('https://api.stripe.com/v1/payment_intents'),
|
Uri.parse('https://api.stripe.com/v1/payment_intents'),
|
||||||
body: body,
|
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);
|
return jsonDecode(response.body);
|
||||||
@@ -318,8 +398,14 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//mercadoo
|
//mercadoo
|
||||||
Future<Null> mercadoPagoMakePayment({required BuildContext context, required String amount}) async {
|
Future<Null> mercadoPagoMakePayment({
|
||||||
final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'};
|
required BuildContext context,
|
||||||
|
required String amount,
|
||||||
|
}) async {
|
||||||
|
final headers = {
|
||||||
|
'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
};
|
||||||
|
|
||||||
final body = jsonEncode({
|
final body = jsonEncode({
|
||||||
"items": [
|
"items": [
|
||||||
@@ -332,12 +418,20 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
"payer": {"email": Constant.userModel?.email},
|
"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",
|
"auto_return": "approved",
|
||||||
// Automatically return after payment is 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) {
|
if (response.statusCode == 200 || response.statusCode == 201) {
|
||||||
final data = jsonDecode(response.body);
|
final data = jsonDecode(response.body);
|
||||||
@@ -420,15 +514,23 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//flutter wave Payment Method
|
//flutter wave Payment Method
|
||||||
Future<Null> flutterWaveInitiatePayment({required BuildContext context, required String amount}) async {
|
Future<Null> flutterWaveInitiatePayment({
|
||||||
|
required BuildContext context,
|
||||||
|
required String amount,
|
||||||
|
}) async {
|
||||||
final url = Uri.parse('https://api.flutterwave.com/v3/payments');
|
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({
|
final body = jsonEncode({
|
||||||
"tx_ref": _ref,
|
"tx_ref": _ref,
|
||||||
@@ -436,15 +538,24 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
"currency": "NGN",
|
"currency": "NGN",
|
||||||
"redirect_url": "${Constant.globalUrl}payment/success",
|
"redirect_url": "${Constant.globalUrl}payment/success",
|
||||||
"payment_options": "ussd, card, barter, payattitude",
|
"payment_options": "ussd, card, barter, payattitude",
|
||||||
"customer": {"email": Constant.userModel?.email.toString(), "phonenumber": Constant.userModel?.phoneNumber, "name": Constant.userModel?.fullName()},
|
"customer": {
|
||||||
"customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"},
|
"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);
|
final response = await http.post(url, headers: headers, body: body);
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
final data = jsonDecode(response.body);
|
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) {
|
if (value) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
placeOrder();
|
placeOrder();
|
||||||
@@ -473,8 +584,14 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
|
|
||||||
// payFast
|
// payFast
|
||||||
void payFastPayment({required BuildContext context, required String amount}) {
|
void payFastPayment({required BuildContext context, required String amount}) {
|
||||||
PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: Constant.userModel!).then((String? value) async {
|
PayStackURLGen.getPayHTML(
|
||||||
bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value));
|
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) {
|
if (isDone) {
|
||||||
Get.back();
|
Get.back();
|
||||||
ShowToastDialog.showToast("Payment successfully".tr());
|
ShowToastDialog.showToast("Payment successfully".tr());
|
||||||
@@ -494,26 +611,50 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
final response = await http.post(
|
final response = await http.post(
|
||||||
Uri.parse(getChecksum),
|
Uri.parse(getChecksum),
|
||||||
headers: {},
|
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);
|
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) {
|
initiatePayment(amount: amount, orderId: orderId).then((value) {
|
||||||
String callback = "";
|
String callback = "";
|
||||||
if (paytmModel.value.isSandboxEnabled == true) {
|
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 {
|
} 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;
|
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<void> startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async {
|
Future<void> startTransaction(
|
||||||
|
context, {
|
||||||
|
required String txnTokenBy,
|
||||||
|
required orderId,
|
||||||
|
required double amount,
|
||||||
|
required callBackURL,
|
||||||
|
required isStaging,
|
||||||
|
}) async {
|
||||||
// try {
|
// try {
|
||||||
// var response = AllInOneSdk.startTransaction(
|
// var response = AllInOneSdk.startTransaction(
|
||||||
// paytmModel.value.paytmMID.toString(),
|
// 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";
|
String getChecksum = "${Constant.globalUrl}payments/validatechecksum";
|
||||||
final response = await http.post(
|
final response = await http.post(
|
||||||
Uri.parse(getChecksum),
|
Uri.parse(getChecksum),
|
||||||
headers: {},
|
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);
|
final data = jsonDecode(response.body);
|
||||||
return data['status'];
|
return data['status'];
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<GetPaymentTxtTokenModel> initiatePayment({required double amount, required orderId}) async {
|
Future<GetPaymentTxtTokenModel> initiatePayment({
|
||||||
|
required double amount,
|
||||||
|
required orderId,
|
||||||
|
}) async {
|
||||||
String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment";
|
String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment";
|
||||||
String callback = "";
|
String callback = "";
|
||||||
if (paytmModel.value.isSandboxEnabled == true) {
|
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 {
|
} 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(
|
final response = await http.post(
|
||||||
Uri.parse(initiateURL),
|
Uri.parse(initiateURL),
|
||||||
@@ -584,9 +739,12 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
);
|
);
|
||||||
log(response.body);
|
log(response.body);
|
||||||
final data = jsonDecode(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();
|
Get.back();
|
||||||
ShowToastDialog.showToast("something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return GetPaymentTxtTokenModel.fromJson(data);
|
return GetPaymentTxtTokenModel.fromJson(data);
|
||||||
}
|
}
|
||||||
@@ -604,7 +762,10 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
'description': 'wallet Topup',
|
'description': 'wallet Topup',
|
||||||
'retry': {'enabled': true, 'max_count': 1},
|
'retry': {'enabled': true, 'max_count': 1},
|
||||||
'send_sms_hash': true,
|
'send_sms_hash': true,
|
||||||
'prefill': {'contact': Constant.userModel?.phoneNumber, 'email': Constant.userModel?.email},
|
'prefill': {
|
||||||
|
'contact': Constant.userModel?.phoneNumber,
|
||||||
|
'email': Constant.userModel?.email,
|
||||||
|
},
|
||||||
'external': {
|
'external': {
|
||||||
'wallets': ['paytm'],
|
'wallets': ['paytm'],
|
||||||
},
|
},
|
||||||
@@ -639,7 +800,10 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Midtrans payment
|
//Midtrans payment
|
||||||
Future<void> midtransMakePayment({required String amount, required BuildContext context}) async {
|
Future<void> midtransMakePayment({
|
||||||
|
required String amount,
|
||||||
|
required BuildContext context,
|
||||||
|
}) async {
|
||||||
await createPaymentLink(amount: amount).then((url) {
|
await createPaymentLink(amount: amount).then((url) {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
if (url != '') {
|
if (url != '') {
|
||||||
@@ -657,15 +821,30 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
|
|
||||||
Future<String> createPaymentLink({required var amount}) async {
|
Future<String> createPaymentLink({required var amount}) async {
|
||||||
var ordersId = const Uuid().v1();
|
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(
|
final response = await http.post(
|
||||||
url,
|
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({
|
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,
|
'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);
|
final responseData = jsonDecode(response.body);
|
||||||
return responseData['payment_url'];
|
return responseData['payment_url'];
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -692,16 +873,33 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
static String orderId = '';
|
static String orderId = '';
|
||||||
static String amount = '';
|
static String amount = '';
|
||||||
|
|
||||||
Future<void> orangeMakePayment({required String amount, required BuildContext context}) async {
|
Future<void> orangeMakePayment({
|
||||||
|
required String amount,
|
||||||
|
required BuildContext context,
|
||||||
|
}) async {
|
||||||
reset();
|
reset();
|
||||||
|
|
||||||
var id = const Uuid().v4();
|
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();
|
ShowToastDialog.closeLoader();
|
||||||
|
|
||||||
if (paymentURL.toString().isNotEmpty) {
|
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) {
|
if (value == true) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
placeOrder();
|
placeOrder();
|
||||||
@@ -712,13 +910,22 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async {
|
Future<String> fetchToken({
|
||||||
|
required String orderId,
|
||||||
|
required String currency,
|
||||||
|
required BuildContext context,
|
||||||
|
required String amount,
|
||||||
|
}) async {
|
||||||
String apiUrl = 'https://api.orange.com/oauth/v3/token';
|
String apiUrl = 'https://api.orange.com/oauth/v3/token';
|
||||||
Map<String, String> requestBody = {'grant_type': 'client_credentials'};
|
Map<String, String> requestBody = {'grant_type': 'client_credentials'};
|
||||||
|
|
||||||
var response = await http.post(
|
var response = await http.post(
|
||||||
Uri.parse(apiUrl),
|
Uri.parse(apiUrl),
|
||||||
headers: <String, String>{'Authorization': "Basic ${orangeMoneyModel.value.auth ?? ''}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'},
|
headers: <String, String>{
|
||||||
|
'Authorization': "Basic ${orangeMoneyModel.value.auth ?? ''}",
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
body: requestBody,
|
body: requestBody,
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -731,21 +938,36 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId);
|
return await webpayment(
|
||||||
|
context: context,
|
||||||
|
amountData: amount,
|
||||||
|
currency: currency,
|
||||||
|
orderIdData: orderId,
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async {
|
Future<String> webpayment({
|
||||||
|
required String orderIdData,
|
||||||
|
required BuildContext context,
|
||||||
|
required String currency,
|
||||||
|
required String amountData,
|
||||||
|
}) async {
|
||||||
orderId = orderIdData;
|
orderId = orderIdData;
|
||||||
amount = amountData;
|
amount = amountData;
|
||||||
|
|
||||||
// ✅ Null-safe handling
|
// ✅ Null-safe handling
|
||||||
bool isSandbox = orangeMoneyModel.value.isSandbox ?? false;
|
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<String, String> requestBody = {
|
Map<String, String> requestBody = {
|
||||||
"merchant_key": orangeMoneyModel.value.merchantKey ?? '',
|
"merchant_key": orangeMoneyModel.value.merchantKey ?? '',
|
||||||
@@ -761,7 +983,11 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
|
|
||||||
var response = await http.post(
|
var response = await http.post(
|
||||||
Uri.parse(apiUrl),
|
Uri.parse(apiUrl),
|
||||||
headers: <String, String>{'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'},
|
headers: <String, String>{
|
||||||
|
'Authorization': 'Bearer $accessToken',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
body: json.encode(requestBody),
|
body: json.encode(requestBody),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -774,7 +1000,9 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -888,7 +1116,13 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
await createXenditInvoice(amount: amount).then((model) {
|
await createXenditInvoice(amount: amount).then((model) {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
if (model.id != null) {
|
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) {
|
if (value == true) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
placeOrder();
|
placeOrder();
|
||||||
@@ -905,7 +1139,9 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
const url = 'https://api.xendit.co/v2/invoices';
|
const url = 'https://api.xendit.co/v2/invoices';
|
||||||
var headers = {
|
var headers = {
|
||||||
'Content-Type': 'application/json',
|
'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',
|
// 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ',
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -918,7 +1154,11 @@ class OnDemandPaymentController extends GetxController {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
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) {
|
if (response.statusCode == 200 || response.statusCode == 201) {
|
||||||
XenditModel model = XenditModel.fromJson(jsonDecode(response.body));
|
XenditModel model = XenditModel.fromJson(jsonDecode(response.body));
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,5 @@
|
|||||||
import 'package:customer/models/user_model.dart';
|
import 'package:customer/models/user_model.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
import '../constant/constant.dart';
|
import '../constant/constant.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
|
|
||||||
@@ -18,7 +17,9 @@ class AddressListController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getUser() async {
|
Future<void> getUser() async {
|
||||||
await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) {
|
await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
userModel.value = value;
|
userModel.value = value;
|
||||||
if (userModel.value.shippingAddress != null) {
|
if (userModel.value.shippingAddress != null) {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import 'package:customer/models/advertisement_model.dart';
|
|||||||
import 'package:customer/models/favourite_model.dart';
|
import 'package:customer/models/favourite_model.dart';
|
||||||
import 'package:customer/models/vendor_model.dart';
|
import 'package:customer/models/vendor_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class AdvertisementListController extends GetxController {
|
class AdvertisementListController extends GetxController {
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import 'package:customer/models/brands_model.dart';
|
|||||||
import 'package:customer/models/product_model.dart';
|
import 'package:customer/models/product_model.dart';
|
||||||
import 'package:customer/models/vendor_model.dart';
|
import 'package:customer/models/vendor_model.dart';
|
||||||
import 'package:customer/service/fire_store_utils.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 {
|
class AllBrandProductController extends GetxController {
|
||||||
RxList<ProductModel> productList = <ProductModel>[].obs;
|
RxList<ProductModel> productList = <ProductModel>[].obs;
|
||||||
@@ -27,19 +27,27 @@ class AllBrandProductController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getProductByCategoryId() async {
|
Future<void> getProductByCategoryId() async {
|
||||||
List<ProductModel> productDataList = await FireStoreUtils.getProductListByBrandId(brandModel.value.id.toString());
|
List<ProductModel> productDataList =
|
||||||
|
await FireStoreUtils.getProductListByBrandId(
|
||||||
|
brandModel.value.id.toString(),
|
||||||
|
);
|
||||||
|
|
||||||
List<VendorModel> vendorList = await FireStoreUtils.getAllStoresFuture();
|
List<VendorModel> vendorList = await FireStoreUtils.getAllStoresFuture();
|
||||||
List<ProductModel> allProduct = <ProductModel>[];
|
List<ProductModel> allProduct = <ProductModel>[];
|
||||||
for (var vendor in vendorList) {
|
for (var vendor in vendorList) {
|
||||||
await FireStoreUtils.getAllProducts(vendor.id.toString()).then((value) {
|
await FireStoreUtils.getAllProducts(vendor.id.toString()).then((value) {
|
||||||
if (Constant.isSubscriptionModelApplied == true || vendor.adminCommission?.isEnabled == true) {
|
if (Constant.isSubscriptionModelApplied == true ||
|
||||||
if (vendor.subscriptionPlan != null && Constant.isExpire(vendor) == false) {
|
vendor.adminCommission?.isEnabled == true) {
|
||||||
|
if (vendor.subscriptionPlan != null &&
|
||||||
|
Constant.isExpire(vendor) == false) {
|
||||||
if (vendor.subscriptionPlan?.itemLimit == '-1') {
|
if (vendor.subscriptionPlan?.itemLimit == '-1') {
|
||||||
allProduct.addAll(value);
|
allProduct.addAll(value);
|
||||||
} else {
|
} else {
|
||||||
int selectedProduct =
|
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));
|
allProduct.addAll(value.sublist(0, selectedProduct));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -49,7 +57,9 @@ class AllBrandProductController extends GetxController {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
for (var element in productDataList) {
|
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) {
|
if (productIsInList) {
|
||||||
productList.add(element);
|
productList.add(element);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:customer/models/product_model.dart';
|
import 'package:customer/models/product_model.dart';
|
||||||
import 'package:customer/models/vendor_category_model.dart';
|
import 'package:customer/models/vendor_category_model.dart';
|
||||||
import 'package:customer/service/fire_store_utils.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 {
|
class AllCategoryProductController extends GetxController {
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
@@ -25,6 +25,8 @@ class AllCategoryProductController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getProductByCategoryId() async {
|
Future<void> getProductByCategoryId() async {
|
||||||
productList.value = await FireStoreUtils.getProductListByCategoryId(categoryModel.value.id.toString());
|
productList.value = await FireStoreUtils.getProductListByCategoryId(
|
||||||
|
categoryModel.value.id.toString(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import 'package:flutter/cupertino.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:geocoding/geocoding.dart';
|
import 'package:geocoding/geocoding.dart';
|
||||||
import 'package:geolocator/geolocator.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:google_maps_flutter/google_maps_flutter.dart' as latlong;
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'package:image_picker/image_picker.dart';
|
import 'package:image_picker/image_picker.dart';
|
||||||
@@ -23,26 +23,39 @@ import '../themes/show_toast_dialog.dart';
|
|||||||
|
|
||||||
class BookParcelController extends GetxController {
|
class BookParcelController extends GetxController {
|
||||||
// Sender details
|
// Sender details
|
||||||
final Rx<TextEditingController> senderLocationController = TextEditingController().obs;
|
final Rx<TextEditingController> senderLocationController =
|
||||||
final Rx<TextEditingController> senderNameController = TextEditingController().obs;
|
TextEditingController().obs;
|
||||||
final Rx<TextEditingController> senderMobileController = TextEditingController().obs;
|
final Rx<TextEditingController> senderNameController =
|
||||||
final Rx<SingleValueDropDownController> senderWeightController = SingleValueDropDownController().obs;
|
TextEditingController().obs;
|
||||||
final Rx<TextEditingController> senderNoteController = TextEditingController().obs;
|
final Rx<TextEditingController> senderMobileController =
|
||||||
final Rx<TextEditingController> senderCountryCodeController = TextEditingController(text: Constant.defaultCountryCode).obs;
|
TextEditingController().obs;
|
||||||
|
final Rx<SingleValueDropDownController> senderWeightController =
|
||||||
|
SingleValueDropDownController().obs;
|
||||||
|
final Rx<TextEditingController> senderNoteController =
|
||||||
|
TextEditingController().obs;
|
||||||
|
final Rx<TextEditingController> senderCountryCodeController =
|
||||||
|
TextEditingController(text: Constant.defaultCountryCode).obs;
|
||||||
|
|
||||||
// Receiver details
|
// Receiver details
|
||||||
final Rx<TextEditingController> receiverLocationController = TextEditingController().obs;
|
final Rx<TextEditingController> receiverLocationController =
|
||||||
final Rx<TextEditingController> receiverNameController = TextEditingController().obs;
|
TextEditingController().obs;
|
||||||
final Rx<TextEditingController> receiverMobileController = TextEditingController().obs;
|
final Rx<TextEditingController> receiverNameController =
|
||||||
final Rx<TextEditingController> receiverNoteController = TextEditingController().obs;
|
TextEditingController().obs;
|
||||||
final Rx<TextEditingController> receiverCountryCodeController = TextEditingController(text: Constant.defaultCountryCode).obs;
|
final Rx<TextEditingController> receiverMobileController =
|
||||||
|
TextEditingController().obs;
|
||||||
|
final Rx<TextEditingController> receiverNoteController =
|
||||||
|
TextEditingController().obs;
|
||||||
|
final Rx<TextEditingController> receiverCountryCodeController =
|
||||||
|
TextEditingController(text: Constant.defaultCountryCode).obs;
|
||||||
|
|
||||||
// Delivery type
|
// Delivery type
|
||||||
final RxString selectedDeliveryType = 'now'.obs;
|
final RxString selectedDeliveryType = 'now'.obs;
|
||||||
|
|
||||||
// Scheduled delivery fields
|
// Scheduled delivery fields
|
||||||
final Rx<TextEditingController> scheduledDateController = TextEditingController().obs;
|
final Rx<TextEditingController> scheduledDateController =
|
||||||
final Rx<TextEditingController> scheduledTimeController = TextEditingController().obs;
|
TextEditingController().obs;
|
||||||
|
final Rx<TextEditingController> scheduledTimeController =
|
||||||
|
TextEditingController().obs;
|
||||||
final RxString scheduledDate = ''.obs;
|
final RxString scheduledDate = ''.obs;
|
||||||
final RxString scheduledTime = ''.obs;
|
final RxString scheduledTime = ''.obs;
|
||||||
|
|
||||||
@@ -83,7 +96,12 @@ class BookParcelController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> pickScheduledDate(BuildContext context) async {
|
Future<void> 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) {
|
if (picked != null) {
|
||||||
final formattedDate = "${picked.day}/${picked.month}/${picked.year}";
|
final formattedDate = "${picked.day}/${picked.month}/${picked.year}";
|
||||||
scheduledDate.value = formattedDate;
|
scheduledDate.value = formattedDate;
|
||||||
@@ -92,7 +110,10 @@ class BookParcelController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> pickScheduledTime(BuildContext context) async {
|
Future<void> 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) {
|
if (picked != null) {
|
||||||
final formattedTime = picked.format(context);
|
final formattedTime = picked.format(context);
|
||||||
scheduledTime.value = formattedTime;
|
scheduledTime.value = formattedTime;
|
||||||
@@ -102,7 +123,10 @@ class BookParcelController extends GetxController {
|
|||||||
|
|
||||||
void onCameraClick(BuildContext context) {
|
void onCameraClick(BuildContext context) {
|
||||||
final action = CupertinoActionSheet(
|
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: <Widget>[
|
actions: <Widget>[
|
||||||
CupertinoActionSheetAction(
|
CupertinoActionSheetAction(
|
||||||
child: Text('Choose image from gallery'.tr()),
|
child: Text('Choose image from gallery'.tr()),
|
||||||
@@ -118,14 +142,19 @@ class BookParcelController extends GetxController {
|
|||||||
child: Text('Take a picture'.tr()),
|
child: Text('Take a picture'.tr()),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
final XFile? photo = await _picker.pickImage(source: ImageSource.camera);
|
final XFile? photo = await _picker.pickImage(
|
||||||
|
source: ImageSource.camera,
|
||||||
|
);
|
||||||
if (photo != null) {
|
if (photo != null) {
|
||||||
images.add(photo);
|
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);
|
showCupertinoModalPopup(context: context, builder: (context) => action);
|
||||||
}
|
}
|
||||||
@@ -134,11 +163,18 @@ class BookParcelController extends GetxController {
|
|||||||
try {
|
try {
|
||||||
await Geolocator.requestPermission();
|
await Geolocator.requestPermission();
|
||||||
final position = await Geolocator.getCurrentPosition();
|
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 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;
|
senderLocation.value = userLocation;
|
||||||
senderLocationController.value.text = address;
|
senderLocationController.value.text = address;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -179,7 +215,9 @@ class BookParcelController extends GetxController {
|
|||||||
ShowToastDialog.showToast("Please select parcel weight".tr());
|
ShowToastDialog.showToast("Please select parcel weight".tr());
|
||||||
return false;
|
return false;
|
||||||
} else if (senderLocation.value == null || receiverLocation.value == null) {
|
} 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 false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -193,22 +231,37 @@ class BookParcelController extends GetxController {
|
|||||||
|
|
||||||
if (Constant.selectedMapType == 'osm') {
|
if (Constant.selectedMapType == 'osm') {
|
||||||
print("Fetching route using OSM");
|
print("Fetching route using OSM");
|
||||||
print("Sender Location: ${senderLocation.value?.latitude}, ${senderLocation.value?.longitude}");
|
print(
|
||||||
print("Receiver Location: ${receiverLocation.value?.latitude}, ${receiverLocation.value?.longitude}");
|
"Sender Location: ${senderLocation.value?.latitude}, ${senderLocation.value?.longitude}",
|
||||||
|
);
|
||||||
|
print(
|
||||||
|
"Receiver Location: ${receiverLocation.value?.latitude}, ${receiverLocation.value?.longitude}",
|
||||||
|
);
|
||||||
await fetchRouteWithWaypoints([
|
await fetchRouteWithWaypoints([
|
||||||
latlong.LatLng(senderLocation.value?.latitude ?? 0.0, senderLocation.value?.longitude ?? 0.0),
|
latlong.LatLng(
|
||||||
latlong.LatLng(receiverLocation.value?.latitude ?? 0.0, receiverLocation.value?.longitude ?? 0.0),
|
senderLocation.value?.latitude ?? 0.0,
|
||||||
|
senderLocation.value?.longitude ?? 0.0,
|
||||||
|
),
|
||||||
|
latlong.LatLng(
|
||||||
|
receiverLocation.value?.latitude ?? 0.0,
|
||||||
|
receiverLocation.value?.longitude ?? 0.0,
|
||||||
|
),
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
await fetchGoogleRouteWithWaypoints();
|
await fetchGoogleRouteWithWaypoints();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (distance.value < 0.5) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
subTotal.value = (distance.value * double.parse(selectedWeight!.deliveryCharge.toString()));
|
subTotal.value =
|
||||||
|
(distance.value *
|
||||||
|
double.parse(selectedWeight!.deliveryCharge.toString()));
|
||||||
goToCart();
|
goToCart();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
ShowToastDialog.showToast("Something went wrong while booking.".tr());
|
ShowToastDialog.showToast("Something went wrong while booking.".tr());
|
||||||
@@ -217,7 +270,10 @@ class BookParcelController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void goToCart() {
|
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");
|
print("Sender Pickup: $distance");
|
||||||
ParcelOrderModel order = ParcelOrderModel(
|
ParcelOrderModel order = ParcelOrderModel(
|
||||||
@@ -236,22 +292,42 @@ class BookParcelController extends GetxController {
|
|||||||
taxSetting: Constant.taxList,
|
taxSetting: Constant.taxList,
|
||||||
isSchedule: isScheduled.value,
|
isSchedule: isScheduled.value,
|
||||||
sourcePoint: G(
|
sourcePoint: G(
|
||||||
geopoint: GeoPoint(senderLocation.value!.latitude ?? 0.0, senderLocation.value!.longitude ?? 0.0),
|
geopoint: GeoPoint(
|
||||||
geohash: Geoflutterfire().point(latitude: senderLocation.value!.latitude ?? 0.0, longitude: senderLocation.value!.longitude ?? 0.0).hash,
|
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(
|
destinationPoint: G(
|
||||||
geopoint: GeoPoint(receiverLocation.value!.latitude ?? 0.0, receiverLocation.value!.longitude ?? 0.0),
|
geopoint: GeoPoint(
|
||||||
geohash: Geoflutterfire().point(latitude: receiverLocation.value!.latitude ?? 0.0, longitude: receiverLocation.value!.longitude ?? 0.0).hash,
|
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(
|
sender: LocationInformation(
|
||||||
address: senderLocationController.value.text,
|
address: senderLocationController.value.text,
|
||||||
name: senderNameController.value.text,
|
name: senderNameController.value.text,
|
||||||
phone: "(${senderCountryCodeController.value.text}) ${senderMobileController.value.text}",
|
phone:
|
||||||
|
"(${senderCountryCodeController.value.text}) ${senderMobileController.value.text}",
|
||||||
),
|
),
|
||||||
receiver: LocationInformation(
|
receiver: LocationInformation(
|
||||||
address: receiverLocationController.value.text,
|
address: receiverLocationController.value.text,
|
||||||
name: receiverNameController.value.text,
|
name: receiverNameController.value.text,
|
||||||
phone: "(${receiverCountryCodeController.value.text}) ${receiverMobileController.value.text}",
|
phone:
|
||||||
|
"(${receiverCountryCodeController.value.text}) ${receiverMobileController.value.text}",
|
||||||
),
|
),
|
||||||
receiverLatLong: receiverLocation.value,
|
receiverLatLong: receiverLocation.value,
|
||||||
senderLatLong: senderLocation.value,
|
senderLatLong: senderLocation.value,
|
||||||
@@ -262,7 +338,10 @@ class BookParcelController extends GetxController {
|
|||||||
debugPrint("Subtotal: ${subTotal.value}");
|
debugPrint("Subtotal: ${subTotal.value}");
|
||||||
debugPrint("Order JSON: ${order.toJson()}");
|
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) {
|
DateTime parseScheduledDateTime(String dateStr, String timeStr) {
|
||||||
@@ -272,7 +351,10 @@ class BookParcelController extends GetxController {
|
|||||||
final month = int.parse(dateParts[1]);
|
final month = int.parse(dateParts[1]);
|
||||||
final year = int.parse(dateParts[2]);
|
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 isPM = timeStr.toLowerCase().contains('pm');
|
||||||
final hour24 = isPM && time.hour < 12 ? time.hour + 12 : time.hour;
|
final hour24 = isPM && time.hour < 12 ? time.hour + 12 : time.hour;
|
||||||
|
|
||||||
@@ -284,9 +366,13 @@ class BookParcelController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> fetchGoogleRouteWithWaypoints() async {
|
Future<void> fetchGoogleRouteWithWaypoints() async {
|
||||||
final origin = '${senderLocation.value!.latitude},${senderLocation.value!.longitude}';
|
final origin =
|
||||||
final destination = '${receiverLocation.value!.latitude},${receiverLocation.value!.longitude}';
|
'${senderLocation.value!.latitude},${senderLocation.value!.longitude}';
|
||||||
final url = Uri.parse('https://maps.googleapis.com/maps/api/directions/json?origin=$origin&destination=$destination&mode=driving&key=${Constant.mapAPIKey}');
|
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 {
|
try {
|
||||||
final response = await http.get(url);
|
final response = await http.get(url);
|
||||||
@@ -315,8 +401,12 @@ class BookParcelController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> fetchRouteWithWaypoints(List<latlong.LatLng> points) async {
|
Future<void> fetchRouteWithWaypoints(List<latlong.LatLng> points) async {
|
||||||
final coordinates = points.map((p) => '${p.longitude},${p.latitude}').join(';');
|
final coordinates = points
|
||||||
final url = Uri.parse('https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson');
|
.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 {
|
try {
|
||||||
final response = await http.get(url);
|
final response = await http.get(url);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
import 'package:customer/models/coupon_model.dart';
|
import 'package:customer/models/coupon_model.dart';
|
||||||
import 'package:customer/service/fire_store_utils.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 {
|
class CabCouponCodeController extends GetxController {
|
||||||
// Add your methods and properties here
|
// Add your methods and properties here
|
||||||
@@ -12,10 +12,10 @@ class CabCouponCodeController extends GetxController {
|
|||||||
super.onInit();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getData() {
|
||||||
void getData(){
|
|
||||||
getCouponCode();
|
getCouponCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
RxList<CouponModel> cabCouponList = <CouponModel>[].obs;
|
RxList<CouponModel> cabCouponList = <CouponModel>[].obs;
|
||||||
|
|
||||||
|
|||||||
@@ -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/profile_screen/profile_screen.dart';
|
||||||
import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_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: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';
|
import '../screen_ui/cab_service_screens/my_cab_booking_screen.dart';
|
||||||
|
|
||||||
class CabDashboardController extends GetxController {
|
class CabDashboardController extends GetxController {
|
||||||
@@ -15,15 +15,26 @@ class CabDashboardController extends GetxController {
|
|||||||
void onInit() {
|
void onInit() {
|
||||||
getTaxList();
|
getTaxList();
|
||||||
if (Constant.walletSetting == false) {
|
if (Constant.walletSetting == false) {
|
||||||
pageList.value = [CabHomeScreen(), const MyCabBookingScreen(), const ProfileScreen()];
|
pageList.value = [
|
||||||
|
CabHomeScreen(),
|
||||||
|
const MyCabBookingScreen(),
|
||||||
|
const ProfileScreen(),
|
||||||
|
];
|
||||||
} else {
|
} else {
|
||||||
pageList.value = [CabHomeScreen(), const MyCabBookingScreen(), const WalletScreen(), const ProfileScreen()];
|
pageList.value = [
|
||||||
|
CabHomeScreen(),
|
||||||
|
const MyCabBookingScreen(),
|
||||||
|
const WalletScreen(),
|
||||||
|
const ProfileScreen(),
|
||||||
|
];
|
||||||
}
|
}
|
||||||
super.onInit();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getTaxList() async {
|
Future<void> getTaxList() async {
|
||||||
await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) {
|
await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
Constant.taxList = value;
|
Constant.taxList = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:customer/models/banner_model.dart';
|
import 'package:customer/models/banner_model.dart';
|
||||||
import 'package:customer/service/fire_store_utils.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 {
|
class CabHomeController extends GetxController {
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import 'dart:convert';
|
|||||||
import 'package:customer/constant/constant.dart';
|
import 'package:customer/constant/constant.dart';
|
||||||
import 'package:customer/models/rating_model.dart';
|
import 'package:customer/models/rating_model.dart';
|
||||||
import 'package:flutter_polyline_points/flutter_polyline_points.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:http/http.dart' as http;
|
||||||
import 'package:google_maps_flutter/google_maps_flutter.dart' as gmap;
|
import 'package:google_maps_flutter/google_maps_flutter.dart' as gmap;
|
||||||
import 'package:latlong2/latlong.dart' as osm;
|
import 'package:latlong2/latlong.dart' as osm;
|
||||||
@@ -56,14 +56,18 @@ class CabOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
Future<void> fetchDriverDetails() async {
|
Future<void> fetchDriverDetails() async {
|
||||||
if (cabOrder.value.driverId != null) {
|
if (cabOrder.value.driverId != null) {
|
||||||
await FireStoreUtils.getUserProfile(cabOrder.value.driverId ?? '').then((value) {
|
await FireStoreUtils.getUserProfile(cabOrder.value.driverId ?? '').then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
driverUser.value = value;
|
driverUser.value = value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
print(driverUser.value.toJson());
|
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) {
|
if (value != null) {
|
||||||
ratingModel.value = value;
|
ratingModel.value = value;
|
||||||
}
|
}
|
||||||
@@ -79,7 +83,12 @@ class CabOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
if (cabOrder.value.taxSetting != null) {
|
if (cabOrder.value.taxSetting != null) {
|
||||||
for (var element in cabOrder.value.taxSetting!) {
|
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;
|
final destLng = cabOrder.value.destinationLocation!.longitude;
|
||||||
|
|
||||||
googleMarkers.value = {
|
googleMarkers.value = {
|
||||||
gmap.Marker(markerId: const gmap.MarkerId('source'), position: gmap.LatLng(sourceLat!, sourceLng!), icon: gmap.BitmapDescriptor.defaultMarkerWithHue(gmap.BitmapDescriptor.hueGreen)),
|
gmap.Marker(
|
||||||
gmap.Marker(markerId: const gmap.MarkerId('destination'), position: gmap.LatLng(destLat!, destLng!), icon: gmap.BitmapDescriptor.defaultMarkerWithHue(gmap.BitmapDescriptor.hueRed)),
|
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 src = cabOrder.value.sourceLocation;
|
||||||
final dest = cabOrder.value.destinationLocation;
|
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 response = await http.get(Uri.parse(url));
|
||||||
final data = jsonDecode(response.body);
|
final data = jsonDecode(response.body);
|
||||||
@@ -113,9 +135,19 @@ class CabOrderDetailsController extends GetxController {
|
|||||||
final points = data["routes"][0]["overview_polyline"]["points"];
|
final points = data["routes"][0]["overview_polyline"]["points"];
|
||||||
final polylinePoints = PolylinePoints.decodePolyline(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 src = cabOrder.value.sourceLocation;
|
||||||
final dest = cabOrder.value.destinationLocation;
|
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 response = await http.get(Uri.parse(url));
|
||||||
final data = jsonDecode(response.body);
|
final data = jsonDecode(response.body);
|
||||||
|
|
||||||
if (data["routes"].isNotEmpty) {
|
if (data["routes"].isNotEmpty) {
|
||||||
final coords = data["routes"][0]["geometry"]["coordinates"] as List<dynamic>;
|
final coords =
|
||||||
|
data["routes"][0]["geometry"]["coordinates"] as List<dynamic>;
|
||||||
|
|
||||||
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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/multi_vendor_service/wallet_screen/wallet_screen.dart';
|
||||||
import 'package:customer/screen_ui/rental_service/rental_home_screen.dart';
|
import 'package:customer/screen_ui/rental_service/rental_home_screen.dart';
|
||||||
import 'package:customer/service/fire_store_utils.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';
|
import '../screen_ui/rental_service/my_rental_booking_screen.dart';
|
||||||
|
|
||||||
class CabRentalDashboardControllers extends GetxController {
|
class CabRentalDashboardControllers extends GetxController {
|
||||||
@@ -17,15 +16,26 @@ class CabRentalDashboardControllers extends GetxController {
|
|||||||
// TODO: implement onInit
|
// TODO: implement onInit
|
||||||
getTaxList();
|
getTaxList();
|
||||||
if (Constant.walletSetting == false) {
|
if (Constant.walletSetting == false) {
|
||||||
pageList.value = [RentalHomeScreen(), MyRentalBookingScreen(), const ProfileScreen()];
|
pageList.value = [
|
||||||
|
RentalHomeScreen(),
|
||||||
|
MyRentalBookingScreen(),
|
||||||
|
const ProfileScreen(),
|
||||||
|
];
|
||||||
} else {
|
} else {
|
||||||
pageList.value = [RentalHomeScreen(), MyRentalBookingScreen(), const WalletScreen(), const ProfileScreen()];
|
pageList.value = [
|
||||||
|
RentalHomeScreen(),
|
||||||
|
MyRentalBookingScreen(),
|
||||||
|
const WalletScreen(),
|
||||||
|
const ProfileScreen(),
|
||||||
|
];
|
||||||
}
|
}
|
||||||
super.onInit();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getTaxList() async {
|
Future<void> getTaxList() async {
|
||||||
await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) {
|
await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
Constant.taxList = value;
|
Constant.taxList = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import 'package:cloud_firestore/cloud_firestore.dart';
|
|||||||
import 'package:customer/models/cab_order_model.dart';
|
import 'package:customer/models/cab_order_model.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import '../constant/collection_name.dart';
|
import '../constant/collection_name.dart';
|
||||||
import '../models/rating_model.dart';
|
import '../models/rating_model.dart';
|
||||||
import '../models/user_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) {
|
if (value != null) {
|
||||||
driverUser.value = value;
|
driverUser.value = value;
|
||||||
|
|
||||||
final int userReviewsCount = int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? 0;
|
final int userReviewsCount =
|
||||||
final int userReviewsSum = int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0;
|
int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ??
|
||||||
|
0;
|
||||||
|
final int userReviewsSum =
|
||||||
|
int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0;
|
||||||
|
|
||||||
if (ratingModel.value != null) {
|
if (ratingModel.value != null) {
|
||||||
final int oldRating = ratingModel.value?.rating?.toInt() ?? 0;
|
final int oldRating = ratingModel.value?.rating?.toInt() ?? 0;
|
||||||
@@ -74,7 +79,9 @@ class CabReviewController extends GetxController {
|
|||||||
|
|
||||||
ShowToastDialog.showLoader("Submit in...".tr());
|
ShowToastDialog.showLoader("Submit in...".tr());
|
||||||
|
|
||||||
final user = await FireStoreUtils.getUserProfile(order.value?.driverId ?? '');
|
final user = await FireStoreUtils.getUserProfile(
|
||||||
|
order.value?.driverId ?? '',
|
||||||
|
);
|
||||||
|
|
||||||
if (user != null) {
|
if (user != null) {
|
||||||
user.reviewsCount = (futureCount.value + 1).toString();
|
user.reviewsCount = (futureCount.value + 1).toString();
|
||||||
@@ -91,7 +98,8 @@ class CabReviewController extends GetxController {
|
|||||||
driverId: ratingModel.value!.driverId,
|
driverId: ratingModel.value!.driverId,
|
||||||
customerId: ratingModel.value!.customerId,
|
customerId: ratingModel.value!.customerId,
|
||||||
vendorId: ratingModel.value?.vendorId,
|
vendorId: ratingModel.value?.vendorId,
|
||||||
uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}",
|
uname:
|
||||||
|
"${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}",
|
||||||
profile: Constant.userModel?.profilePictureURL,
|
profile: Constant.userModel?.profilePictureURL,
|
||||||
createdAt: Timestamp.now(),
|
createdAt: Timestamp.now(),
|
||||||
);
|
);
|
||||||
@@ -102,7 +110,8 @@ class CabReviewController extends GetxController {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/// New review
|
/// New review
|
||||||
final docRef = FireStoreUtils.fireStore.collection(CollectionName.itemsReview).doc();
|
final docRef =
|
||||||
|
FireStoreUtils.fireStore.collection(CollectionName.itemsReview).doc();
|
||||||
final newRating = RatingModel(
|
final newRating = RatingModel(
|
||||||
id: docRef.id,
|
id: docRef.id,
|
||||||
comment: comment.value.text,
|
comment: comment.value.text,
|
||||||
@@ -111,7 +120,8 @@ class CabReviewController extends GetxController {
|
|||||||
orderId: order.value?.id,
|
orderId: order.value?.id,
|
||||||
driverId: order.value?.driverId.toString(),
|
driverId: order.value?.driverId.toString(),
|
||||||
customerId: Constant.userModel?.id,
|
customerId: Constant.userModel?.id,
|
||||||
uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}",
|
uname:
|
||||||
|
"${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}",
|
||||||
profile: Constant.userModel?.profilePictureURL,
|
profile: Constant.userModel?.profilePictureURL,
|
||||||
createdAt: Timestamp.now(),
|
createdAt: Timestamp.now(),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import 'package:easy_localization/easy_localization.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_paypal/flutter_paypal.dart';
|
import 'package:flutter_paypal/flutter_paypal.dart';
|
||||||
import 'package:flutter_stripe/flutter_stripe.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:http/http.dart' as http;
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:razorpay_flutter/razorpay_flutter.dart';
|
import 'package:razorpay_flutter/razorpay_flutter.dart';
|
||||||
@@ -108,7 +108,9 @@ class CartController extends GetxController {
|
|||||||
cartItem.addAll(event);
|
cartItem.addAll(event);
|
||||||
|
|
||||||
if (cartItem.isNotEmpty) {
|
if (cartItem.isNotEmpty) {
|
||||||
await FireStoreUtils.getVendorById(cartItem.first.vendorID.toString()).then((value) {
|
await FireStoreUtils.getVendorById(
|
||||||
|
cartItem.first.vendorID.toString(),
|
||||||
|
).then((value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
vendorModel.value = value;
|
vendorModel.value = value;
|
||||||
}
|
}
|
||||||
@@ -116,9 +118,14 @@ class CartController extends GetxController {
|
|||||||
}
|
}
|
||||||
calculatePrice();
|
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) {
|
if (value != null) {
|
||||||
userModel.value = value;
|
userModel.value = value;
|
||||||
}
|
}
|
||||||
@@ -127,16 +134,22 @@ class CartController extends GetxController {
|
|||||||
await FireStoreUtils.getDeliveryCharge().then((value) {
|
await FireStoreUtils.getDeliveryCharge().then((value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
deliveryChargeModel.value = value;
|
deliveryChargeModel.value = value;
|
||||||
print("===> Delivery Charge Model: ${deliveryChargeModel.value.toJson()}");
|
print(
|
||||||
|
"===> Delivery Charge Model: ${deliveryChargeModel.value.toJson()}",
|
||||||
|
);
|
||||||
calculatePrice();
|
calculatePrice();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
await FireStoreUtils.getAllVendorPublicCoupons(vendorModel.value.id.toString()).then((value) {
|
await FireStoreUtils.getAllVendorPublicCoupons(
|
||||||
|
vendorModel.value.id.toString(),
|
||||||
|
).then((value) {
|
||||||
couponList.value = 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;
|
allCouponList.value = value;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -150,8 +163,11 @@ class CartController extends GetxController {
|
|||||||
totalAmount.value = 0.0;
|
totalAmount.value = 0.0;
|
||||||
|
|
||||||
if (cartItem.isNotEmpty) {
|
if (cartItem.isNotEmpty) {
|
||||||
if (Constant.sectionConstantModel!.serviceTypeFlag == "ecommerce-service") {
|
if (Constant.sectionConstantModel!.serviceTypeFlag ==
|
||||||
deliveryCharges.value = double.parse(Constant.sectionConstantModel!.delivery_charge ?? "0");
|
"ecommerce-service") {
|
||||||
|
deliveryCharges.value = double.parse(
|
||||||
|
Constant.sectionConstantModel!.delivery_charge ?? "0",
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
if (selectedFoodType.value == "Delivery") {
|
if (selectedFoodType.value == "Delivery") {
|
||||||
totalDistance.value = double.parse(
|
totalDistance.value = double.parse(
|
||||||
@@ -162,26 +178,50 @@ class CartController extends GetxController {
|
|||||||
lng2: vendorModel.value.longitude.toString(),
|
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;
|
deliveryCharges.value = 0.0;
|
||||||
} else if (deliveryChargeModel.value.vendorCanModify == false) {
|
} else if (deliveryChargeModel.value.vendorCanModify == false) {
|
||||||
if (totalDistance.value > deliveryChargeModel.value.minimumDeliveryChargesWithinKm!) {
|
if (totalDistance.value >
|
||||||
deliveryCharges.value = totalDistance.value * deliveryChargeModel.value.deliveryChargesPerKm!;
|
deliveryChargeModel.value.minimumDeliveryChargesWithinKm!) {
|
||||||
|
deliveryCharges.value =
|
||||||
|
totalDistance.value *
|
||||||
|
deliveryChargeModel.value.deliveryChargesPerKm!;
|
||||||
} else {
|
} else {
|
||||||
deliveryCharges.value = (deliveryChargeModel.value.minimumDeliveryCharges)!.toDouble();
|
deliveryCharges.value =
|
||||||
|
(deliveryChargeModel.value.minimumDeliveryCharges)!
|
||||||
|
.toDouble();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (vendorModel.value.deliveryCharge != null) {
|
if (vendorModel.value.deliveryCharge != null) {
|
||||||
if (totalDistance.value > vendorModel.value.deliveryCharge!.minimumDeliveryChargesWithinKm!) {
|
if (totalDistance.value >
|
||||||
deliveryCharges.value = (totalDistance.value * vendorModel.value.deliveryCharge!.deliveryChargesPerKm!).toDouble();
|
vendorModel
|
||||||
|
.value
|
||||||
|
.deliveryCharge!
|
||||||
|
.minimumDeliveryChargesWithinKm!) {
|
||||||
|
deliveryCharges.value =
|
||||||
|
(totalDistance.value *
|
||||||
|
vendorModel
|
||||||
|
.value
|
||||||
|
.deliveryCharge!
|
||||||
|
.deliveryChargesPerKm!)
|
||||||
|
.toDouble();
|
||||||
} else {
|
} else {
|
||||||
deliveryCharges.value = vendorModel.value.deliveryCharge!.minimumDeliveryCharges!.toDouble();
|
deliveryCharges.value =
|
||||||
|
vendorModel.value.deliveryCharge!.minimumDeliveryCharges!
|
||||||
|
.toDouble();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (totalDistance.value > deliveryChargeModel.value.minimumDeliveryChargesWithinKm!) {
|
if (totalDistance.value >
|
||||||
deliveryCharges.value = (totalDistance.value * deliveryChargeModel.value.deliveryChargesPerKm!).toDouble();
|
deliveryChargeModel.value.minimumDeliveryChargesWithinKm!) {
|
||||||
|
deliveryCharges.value =
|
||||||
|
(totalDistance.value *
|
||||||
|
deliveryChargeModel.value.deliveryChargesPerKm!)
|
||||||
|
.toDouble();
|
||||||
} else {
|
} 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) {
|
if (double.parse(element.discountPrice.toString()) <= 0) {
|
||||||
subTotal.value =
|
subTotal.value =
|
||||||
subTotal.value +
|
subTotal.value +
|
||||||
double.parse(element.price.toString()) * double.parse(element.quantity.toString()) +
|
double.parse(element.price.toString()) *
|
||||||
(double.parse(element.extrasPrice.toString()) * double.parse(element.quantity.toString()));
|
double.parse(element.quantity.toString()) +
|
||||||
|
(double.parse(element.extrasPrice.toString()) *
|
||||||
|
double.parse(element.quantity.toString()));
|
||||||
} else {
|
} else {
|
||||||
subTotal.value =
|
subTotal.value =
|
||||||
subTotal.value +
|
subTotal.value +
|
||||||
double.parse(element.discountPrice.toString()) * double.parse(element.quantity.toString()) +
|
double.parse(element.discountPrice.toString()) *
|
||||||
(double.parse(element.extrasPrice.toString()) * double.parse(element.quantity.toString()));
|
double.parse(element.quantity.toString()) +
|
||||||
|
(double.parse(element.extrasPrice.toString()) *
|
||||||
|
double.parse(element.quantity.toString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selectedCouponModel.value.id != null) {
|
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();
|
final now = DateTime.now();
|
||||||
var day = DateFormat('EEEE', 'en_US').format(now);
|
var day = DateFormat('EEEE', 'en_US').format(now);
|
||||||
var date = DateFormat('dd-MM-yyyy').format(now);
|
var date = DateFormat('dd-MM-yyyy').format(now);
|
||||||
@@ -218,13 +266,20 @@ class CartController extends GetxController {
|
|||||||
if (element.timeslot!.isNotEmpty) {
|
if (element.timeslot!.isNotEmpty) {
|
||||||
for (var element in element.timeslot!) {
|
for (var element in element.timeslot!) {
|
||||||
if (element.discountType == "delivery") {
|
if (element.discountType == "delivery") {
|
||||||
var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}");
|
var start = DateFormat(
|
||||||
var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}");
|
"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)) {
|
if (isCurrentDateInRange(start, end)) {
|
||||||
specialDiscount.value = double.parse(element.discount.toString());
|
specialDiscount.value = double.parse(
|
||||||
|
element.discount.toString(),
|
||||||
|
);
|
||||||
specialType.value = element.type.toString();
|
specialType.value = element.type.toString();
|
||||||
if (element.type == "percentage") {
|
if (element.type == "percentage") {
|
||||||
specialDiscountAmount.value = subTotal * specialDiscount.value / 100;
|
specialDiscountAmount.value =
|
||||||
|
subTotal * specialDiscount.value / 100;
|
||||||
} else {
|
} else {
|
||||||
specialDiscountAmount.value = specialDiscount.value;
|
specialDiscountAmount.value = specialDiscount.value;
|
||||||
}
|
}
|
||||||
@@ -240,10 +295,23 @@ class CartController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (var element in Constant.taxList) {
|
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();
|
getCashback();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,17 +332,31 @@ class CartController extends GetxController {
|
|||||||
|
|
||||||
if (startDate == null || endDate == null) continue;
|
if (startDate == null || endDate == null) continue;
|
||||||
|
|
||||||
final withinDateRange = startDate.toDate().isBefore(now) && endDate.toDate().isAfter(now);
|
final withinDateRange =
|
||||||
final meetsMinAmount = orderTotal >= (cashback.minimumPurchaseAmount ?? 0);
|
startDate.toDate().isBefore(now) && endDate.toDate().isAfter(now);
|
||||||
|
final meetsMinAmount =
|
||||||
|
orderTotal >= (cashback.minimumPurchaseAmount ?? 0);
|
||||||
final allPayment = cashback.allPayment ?? false;
|
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 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);
|
final underLimit = redeemData.length < (cashback.redeemLimit ?? 0);
|
||||||
|
|
||||||
if (withinDateRange && meetsMinAmount && paymentMatch && customerMatch && underLimit) {
|
if (withinDateRange &&
|
||||||
|
meetsMinAmount &&
|
||||||
|
paymentMatch &&
|
||||||
|
customerMatch &&
|
||||||
|
underLimit) {
|
||||||
eligibleCashbacks.add(cashback);
|
eligibleCashbacks.add(cashback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -312,7 +394,11 @@ class CartController extends GetxController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> addToCart({required CartProductModel cartProductModel, required bool isIncrement, required int quantity}) async {
|
Future<void> addToCart({
|
||||||
|
required CartProductModel cartProductModel,
|
||||||
|
required bool isIncrement,
|
||||||
|
required int quantity,
|
||||||
|
}) async {
|
||||||
if (isIncrement) {
|
if (isIncrement) {
|
||||||
cartProvider.addToCart(Get.context!, cartProductModel, quantity);
|
cartProvider.addToCart(Get.context!, cartProductModel, quantity);
|
||||||
} else {
|
} else {
|
||||||
@@ -325,10 +411,13 @@ class CartController extends GetxController {
|
|||||||
|
|
||||||
Future<void> placeOrder() async {
|
Future<void> placeOrder() async {
|
||||||
if (selectedPaymentMethod.value == PaymentGateway.wallet.name) {
|
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();
|
setOrder();
|
||||||
} else {
|
} 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 {
|
} else {
|
||||||
setOrder();
|
setOrder();
|
||||||
@@ -338,11 +427,19 @@ class CartController extends GetxController {
|
|||||||
Future<void> setOrder() async {
|
Future<void> setOrder() async {
|
||||||
ShowToastDialog.showLoader("Please wait...".tr());
|
ShowToastDialog.showLoader("Please wait...".tr());
|
||||||
|
|
||||||
if ((Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) && vendorModel.value.subscriptionPlan != null) {
|
if ((Constant.isSubscriptionModelApplied == true ||
|
||||||
await FireStoreUtils.getVendorById(vendorModel.value.id!).then((vender) async {
|
Constant.sectionConstantModel?.adminCommision?.isEnabled == true) &&
|
||||||
if (vender?.subscriptionTotalOrders == '0' || vender?.subscriptionTotalOrders == null) {
|
vendorModel.value.subscriptionPlan != null) {
|
||||||
|
await FireStoreUtils.getVendorById(vendorModel.value.id!).then((
|
||||||
|
vender,
|
||||||
|
) async {
|
||||||
|
if (vender?.subscriptionTotalOrders == '0' ||
|
||||||
|
vender?.subscriptionTotalOrders == null) {
|
||||||
ShowToastDialog.closeLoader();
|
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;
|
return;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -356,7 +453,11 @@ class CartController extends GetxController {
|
|||||||
tempProduc.add(tempCart);
|
tempProduc.add(tempCart);
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> specialDiscountMap = {'special_discount': specialDiscountAmount.value, 'special_discount_label': specialDiscount.value, 'specialType': specialType.value};
|
Map<String, dynamic> specialDiscountMap = {
|
||||||
|
'special_discount': specialDiscountAmount.value,
|
||||||
|
'special_discount_label': specialDiscount.value,
|
||||||
|
'specialType': specialType.value,
|
||||||
|
};
|
||||||
|
|
||||||
OrderModel orderModel = OrderModel();
|
OrderModel orderModel = OrderModel();
|
||||||
orderModel.id = Constant.getUuid();
|
orderModel.id = Constant.getUuid();
|
||||||
@@ -391,8 +492,12 @@ class CartController extends GetxController {
|
|||||||
orderModel.notes = reMarkController.value.text;
|
orderModel.notes = reMarkController.value.text;
|
||||||
orderModel.takeAway = selectedFoodType.value == "Delivery" ? false : true;
|
orderModel.takeAway = selectedFoodType.value == "Delivery" ? false : true;
|
||||||
orderModel.createdAt = Timestamp.now();
|
orderModel.createdAt = Timestamp.now();
|
||||||
orderModel.scheduleTime = deliveryType.value == "schedule" ? Timestamp.fromDate(scheduleDateTime.value) : null;
|
orderModel.scheduleTime =
|
||||||
orderModel.cashback = bestCashback.value.id == null ? null : bestCashback.value;
|
deliveryType.value == "schedule"
|
||||||
|
? Timestamp.fromDate(scheduleDateTime.value)
|
||||||
|
: null;
|
||||||
|
orderModel.cashback =
|
||||||
|
bestCashback.value.id == null ? null : bestCashback.value;
|
||||||
if (selectedPaymentMethod.value == PaymentGateway.wallet.name) {
|
if (selectedPaymentMethod.value == PaymentGateway.wallet.name) {
|
||||||
WalletTransactionModel transactionModel = WalletTransactionModel(
|
WalletTransactionModel transactionModel = WalletTransactionModel(
|
||||||
id: Constant.getUuid(),
|
id: Constant.getUuid(),
|
||||||
@@ -407,33 +512,57 @@ class CartController extends GetxController {
|
|||||||
paymentStatus: "success".tr(),
|
paymentStatus: "success".tr(),
|
||||||
);
|
);
|
||||||
|
|
||||||
await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async {
|
await FireStoreUtils.setWalletTransaction(transactionModel).then((
|
||||||
|
value,
|
||||||
|
) async {
|
||||||
if (value == true) {
|
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++) {
|
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;
|
ProductModel? productModel = value;
|
||||||
if (tempProduc[i].variantInfo != null) {
|
if (tempProduc[i].variantInfo != null) {
|
||||||
if (productModel!.itemAttribute != null) {
|
if (productModel!.itemAttribute != null) {
|
||||||
for (int j = 0; j < productModel.itemAttribute!.variants!.length; j++) {
|
for (
|
||||||
if (productModel.itemAttribute!.variants![j].variantId == tempProduc[i].id!.split('~').last) {
|
int j = 0;
|
||||||
if (productModel.itemAttribute!.variants![j].variantQuantity != "-1") {
|
j < productModel.itemAttribute!.variants!.length;
|
||||||
productModel.itemAttribute!.variants![j].variantQuantity = (int.parse(productModel.itemAttribute!.variants![j].variantQuantity.toString()) - tempProduc[i].quantity!).toString();
|
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 {
|
} else {
|
||||||
if (productModel.quantity != -1) {
|
if (productModel.quantity != -1) {
|
||||||
productModel.quantity = (productModel.quantity! - tempProduc[i].quantity!);
|
productModel.quantity =
|
||||||
|
(productModel.quantity! - tempProduc[i].quantity!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (productModel!.quantity != -1) {
|
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.setCashbackRedeemModel(cashbackRedeemModel);
|
||||||
}
|
}
|
||||||
await FireStoreUtils.setOrder(orderModel).then((value) async {
|
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 (value != null) {
|
||||||
if (orderModel.scheduleTime != null) {
|
if (orderModel.scheduleTime != null) {
|
||||||
await SendNotification.sendFcmMessage(Constant.scheduleOrder, value.fcmToken ?? '', {});
|
await SendNotification.sendFcmMessage(
|
||||||
|
Constant.scheduleOrder,
|
||||||
|
value.fcmToken ?? '',
|
||||||
|
{},
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
await SendNotification.sendFcmMessage(Constant.newOrderPlaced, value.fcmToken ?? '', {});
|
await SendNotification.sendFcmMessage(
|
||||||
|
Constant.newOrderPlaced,
|
||||||
|
value.fcmToken ?? '',
|
||||||
|
{},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
await Constant.sendOrderEmail(orderModel: orderModel);
|
await Constant.sendOrderEmail(orderModel: orderModel);
|
||||||
ShowToastDialog.closeLoader();
|
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<void> getPaymentSettings() async {
|
Future<void> getPaymentSettings() async {
|
||||||
await FireStoreUtils.getPaymentSettingsData().then((value) {
|
await FireStoreUtils.getPaymentSettingsData().then((value) {
|
||||||
stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings)));
|
stripeModel.value = StripeModel.fromJson(
|
||||||
payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings)));
|
jsonDecode(Preferences.getString(Preferences.stripeSettings)),
|
||||||
payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack)));
|
);
|
||||||
mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago)));
|
payPalModel.value = PayPalModel.fromJson(
|
||||||
flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave)));
|
jsonDecode(Preferences.getString(Preferences.paypalSettings)),
|
||||||
paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings)));
|
);
|
||||||
payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings)));
|
payStackModel.value = PayStackModel.fromJson(
|
||||||
razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings)));
|
jsonDecode(Preferences.getString(Preferences.payStack)),
|
||||||
midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings)));
|
);
|
||||||
orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)));
|
mercadoPagoModel.value = MercadoPagoModel.fromJson(
|
||||||
xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings)));
|
jsonDecode(Preferences.getString(Preferences.mercadoPago)),
|
||||||
walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings)));
|
);
|
||||||
cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings)));
|
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) {
|
if (walletSettingModel.value.isEnabled == true) {
|
||||||
selectedPaymentMethod.value = PaymentGateway.wallet.name;
|
selectedPaymentMethod.value = PaymentGateway.wallet.name;
|
||||||
@@ -537,20 +705,32 @@ class CartController extends GetxController {
|
|||||||
Future<void> stripeMakePayment({required String amount}) async {
|
Future<void> stripeMakePayment({required String amount}) async {
|
||||||
log(double.parse(amount).toStringAsFixed(0));
|
log(double.parse(amount).toStringAsFixed(0));
|
||||||
try {
|
try {
|
||||||
Map<String, dynamic>? paymentIntentData = await createStripeIntent(amount: amount);
|
Map<String, dynamic>? paymentIntentData = await createStripeIntent(
|
||||||
|
amount: amount,
|
||||||
|
);
|
||||||
log("stripe Responce====>$paymentIntentData");
|
log("stripe Responce====>$paymentIntentData");
|
||||||
if (paymentIntentData!.containsKey("error")) {
|
if (paymentIntentData!.containsKey("error")) {
|
||||||
Get.back();
|
Get.back();
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
await Stripe.instance.initPaymentSheet(
|
await Stripe.instance.initPaymentSheet(
|
||||||
paymentSheetParameters: SetupPaymentSheetParameters(
|
paymentSheetParameters: SetupPaymentSheetParameters(
|
||||||
paymentIntentClientSecret: paymentIntentData['client_secret'],
|
paymentIntentClientSecret: paymentIntentData['client_secret'],
|
||||||
allowsDelayedPaymentMethods: false,
|
allowsDelayedPaymentMethods: false,
|
||||||
googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"),
|
googlePay: const PaymentSheetGooglePay(
|
||||||
|
merchantCountryCode: 'US',
|
||||||
|
testEnv: true,
|
||||||
|
currencyCode: "USD",
|
||||||
|
),
|
||||||
customFlow: true,
|
customFlow: true,
|
||||||
style: ThemeMode.system,
|
style: ThemeMode.system,
|
||||||
appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)),
|
appearance: PaymentSheetAppearance(
|
||||||
|
colors: PaymentSheetAppearanceColors(
|
||||||
|
primary: AppThemeData.primary300,
|
||||||
|
),
|
||||||
|
),
|
||||||
merchantDisplayName: 'GoRide',
|
merchantDisplayName: 'GoRide',
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -596,7 +776,10 @@ class CartController extends GetxController {
|
|||||||
var response = await http.post(
|
var response = await http.post(
|
||||||
Uri.parse('https://api.stripe.com/v1/payment_intents'),
|
Uri.parse('https://api.stripe.com/v1/payment_intents'),
|
||||||
body: body,
|
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);
|
return jsonDecode(response.body);
|
||||||
@@ -606,8 +789,14 @@ class CartController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//mercadoo
|
//mercadoo
|
||||||
Future<Null> mercadoPagoMakePayment({required BuildContext context, required String amount}) async {
|
Future<Null> mercadoPagoMakePayment({
|
||||||
final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'};
|
required BuildContext context,
|
||||||
|
required String amount,
|
||||||
|
}) async {
|
||||||
|
final headers = {
|
||||||
|
'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
};
|
||||||
|
|
||||||
final body = jsonEncode({
|
final body = jsonEncode({
|
||||||
"items": [
|
"items": [
|
||||||
@@ -620,12 +809,20 @@ class CartController extends GetxController {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
"payer": {"email": userModel.value.email},
|
"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",
|
"auto_return": "approved",
|
||||||
// Automatically return after payment is 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) {
|
if (response.statusCode == 200 || response.statusCode == 201) {
|
||||||
final data = jsonDecode(response.body);
|
final data = jsonDecode(response.body);
|
||||||
@@ -683,9 +880,12 @@ class CartController extends GetxController {
|
|||||||
|
|
||||||
///PayStack Payment Method
|
///PayStack Payment Method
|
||||||
Future<void> payStackPayment(String totalAmount) async {
|
Future<void> payStackPayment(String totalAmount) async {
|
||||||
await PayStackURLGen.payStackURLGen(amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value).then((
|
await PayStackURLGen.payStackURLGen(
|
||||||
value,
|
amount: (double.parse(totalAmount) * 100).toString(),
|
||||||
) async {
|
currency: "ZAR",
|
||||||
|
secretKey: payStackModel.value.secretKey.toString(),
|
||||||
|
userModel: userModel.value,
|
||||||
|
).then((value) async {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
PayStackUrlModel payStackModel0 = value;
|
PayStackUrlModel payStackModel0 = value;
|
||||||
Get.to(
|
Get.to(
|
||||||
@@ -705,15 +905,23 @@ class CartController extends GetxController {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//flutter wave Payment Method
|
//flutter wave Payment Method
|
||||||
Future<Null> flutterWaveInitiatePayment({required BuildContext context, required String amount}) async {
|
Future<Null> flutterWaveInitiatePayment({
|
||||||
|
required BuildContext context,
|
||||||
|
required String amount,
|
||||||
|
}) async {
|
||||||
final url = Uri.parse('https://api.flutterwave.com/v3/payments');
|
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({
|
final body = jsonEncode({
|
||||||
"tx_ref": _ref,
|
"tx_ref": _ref,
|
||||||
@@ -726,14 +934,19 @@ class CartController extends GetxController {
|
|||||||
"phonenumber": userModel.value.phoneNumber, // Add a real phone number
|
"phonenumber": userModel.value.phoneNumber, // Add a real phone number
|
||||||
"name": userModel.value.fullName(), // Add a real customer name
|
"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);
|
final response = await http.post(url, headers: headers, body: body);
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
final data = jsonDecode(response.body);
|
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) {
|
if (value) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
placeOrder();
|
placeOrder();
|
||||||
@@ -762,8 +975,14 @@ class CartController extends GetxController {
|
|||||||
|
|
||||||
// payFast
|
// payFast
|
||||||
void payFastPayment({required BuildContext context, required String amount}) {
|
void payFastPayment({required BuildContext context, required String amount}) {
|
||||||
PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value).then((String? value) async {
|
PayStackURLGen.getPayHTML(
|
||||||
bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value));
|
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) {
|
if (isDone) {
|
||||||
Get.back();
|
Get.back();
|
||||||
ShowToastDialog.showToast("Payment successfully".tr());
|
ShowToastDialog.showToast("Payment successfully".tr());
|
||||||
@@ -783,26 +1002,50 @@ class CartController extends GetxController {
|
|||||||
final response = await http.post(
|
final response = await http.post(
|
||||||
Uri.parse(getChecksum),
|
Uri.parse(getChecksum),
|
||||||
headers: {},
|
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);
|
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) {
|
initiatePayment(amount: amount, orderId: orderId).then((value) {
|
||||||
String callback = "";
|
String callback = "";
|
||||||
if (paytmModel.value.isSandboxEnabled == true) {
|
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 {
|
} 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;
|
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<void> startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async {
|
Future<void> startTransaction(
|
||||||
|
context, {
|
||||||
|
required String txnTokenBy,
|
||||||
|
required orderId,
|
||||||
|
required double amount,
|
||||||
|
required callBackURL,
|
||||||
|
required isStaging,
|
||||||
|
}) async {
|
||||||
// try {
|
// try {
|
||||||
// var response = AllInOneSdk.startTransaction(
|
// var response = AllInOneSdk.startTransaction(
|
||||||
// paytmModel.value.paytmMID.toString(),
|
// 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";
|
String getChecksum = "${Constant.globalUrl}payments/validatechecksum";
|
||||||
final response = await http.post(
|
final response = await http.post(
|
||||||
Uri.parse(getChecksum),
|
Uri.parse(getChecksum),
|
||||||
headers: {},
|
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);
|
final data = jsonDecode(response.body);
|
||||||
return data['status'];
|
return data['status'];
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<GetPaymentTxtTokenModel> initiatePayment({required double amount, required orderId}) async {
|
Future<GetPaymentTxtTokenModel> initiatePayment({
|
||||||
|
required double amount,
|
||||||
|
required orderId,
|
||||||
|
}) async {
|
||||||
String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment";
|
String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment";
|
||||||
String callback = "";
|
String callback = "";
|
||||||
if (paytmModel.value.isSandboxEnabled == true) {
|
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 {
|
} 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(
|
final response = await http.post(
|
||||||
Uri.parse(initiateURL),
|
Uri.parse(initiateURL),
|
||||||
@@ -873,9 +1130,12 @@ class CartController extends GetxController {
|
|||||||
);
|
);
|
||||||
log(response.body);
|
log(response.body);
|
||||||
final data = jsonDecode(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();
|
Get.back();
|
||||||
ShowToastDialog.showToast("something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return GetPaymentTxtTokenModel.fromJson(data);
|
return GetPaymentTxtTokenModel.fromJson(data);
|
||||||
}
|
}
|
||||||
@@ -893,7 +1153,10 @@ class CartController extends GetxController {
|
|||||||
'description': 'wallet Topup',
|
'description': 'wallet Topup',
|
||||||
'retry': {'enabled': true, 'max_count': 1},
|
'retry': {'enabled': true, 'max_count': 1},
|
||||||
'send_sms_hash': true,
|
'send_sms_hash': true,
|
||||||
'prefill': {'contact': userModel.value.phoneNumber, 'email': userModel.value.email},
|
'prefill': {
|
||||||
|
'contact': userModel.value.phoneNumber,
|
||||||
|
'email': userModel.value.email,
|
||||||
|
},
|
||||||
'external': {
|
'external': {
|
||||||
'wallets': ['paytm'],
|
'wallets': ['paytm'],
|
||||||
},
|
},
|
||||||
@@ -927,7 +1190,10 @@ class CartController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Midtrans payment
|
//Midtrans payment
|
||||||
Future<void> midtransMakePayment({required String amount, required BuildContext context}) async {
|
Future<void> midtransMakePayment({
|
||||||
|
required String amount,
|
||||||
|
required BuildContext context,
|
||||||
|
}) async {
|
||||||
await createPaymentLink(amount: amount).then((url) {
|
await createPaymentLink(amount: amount).then((url) {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
if (url != '') {
|
if (url != '') {
|
||||||
@@ -945,15 +1211,30 @@ class CartController extends GetxController {
|
|||||||
|
|
||||||
Future<String> createPaymentLink({required var amount}) async {
|
Future<String> createPaymentLink({required var amount}) async {
|
||||||
var ordersId = const Uuid().v1();
|
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(
|
final response = await http.post(
|
||||||
url,
|
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({
|
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,
|
'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);
|
final responseData = jsonDecode(response.body);
|
||||||
return responseData['payment_url'];
|
return responseData['payment_url'];
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -978,13 +1261,30 @@ class CartController extends GetxController {
|
|||||||
static String orderId = '';
|
static String orderId = '';
|
||||||
static String amount = '';
|
static String amount = '';
|
||||||
|
|
||||||
Future<void> orangeMakePayment({required String amount, required BuildContext context}) async {
|
Future<void> orangeMakePayment({
|
||||||
|
required String amount,
|
||||||
|
required BuildContext context,
|
||||||
|
}) async {
|
||||||
reset();
|
reset();
|
||||||
var id = const Uuid().v4();
|
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();
|
ShowToastDialog.closeLoader();
|
||||||
if (paymentURL.toString() != '') {
|
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) {
|
if (value == true) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
placeOrder();
|
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';
|
String apiUrl = 'https://api.orange.com/oauth/v3/token';
|
||||||
Map<String, String> requestBody = {'grant_type': 'client_credentials'};
|
Map<String, String> requestBody = {'grant_type': 'client_credentials'};
|
||||||
|
|
||||||
var response = await http.post(
|
var response = await http.post(
|
||||||
Uri.parse(apiUrl),
|
Uri.parse(apiUrl),
|
||||||
headers: <String, String>{'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'},
|
headers: <String, String>{
|
||||||
|
'Authorization': "Basic ${orangeMoneyModel.value.auth!}",
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
body: requestBody,
|
body: requestBody,
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -1013,17 +1322,32 @@ class CartController extends GetxController {
|
|||||||
|
|
||||||
accessToken = responseData['access_token'];
|
accessToken = responseData['access_token'];
|
||||||
// ignore: use_build_context_synchronously
|
// 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 {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
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;
|
orderId = orderIdData;
|
||||||
amount = amountData;
|
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<String, String> requestBody = {
|
Map<String, String> requestBody = {
|
||||||
"merchant_key": orangeMoneyModel.value.merchantKey ?? '',
|
"merchant_key": orangeMoneyModel.value.merchantKey ?? '',
|
||||||
"currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency,
|
"currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency,
|
||||||
@@ -1038,7 +1362,11 @@ class CartController extends GetxController {
|
|||||||
|
|
||||||
var response = await http.post(
|
var response = await http.post(
|
||||||
Uri.parse(apiUrl),
|
Uri.parse(apiUrl),
|
||||||
headers: <String, String>{'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'},
|
headers: <String, String>{
|
||||||
|
'Authorization': 'Bearer $accessToken',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
body: json.encode(requestBody),
|
body: json.encode(requestBody),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -1052,7 +1380,9 @@ class CartController extends GetxController {
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1069,7 +1399,13 @@ class CartController extends GetxController {
|
|||||||
await createXenditInvoice(amount: amount).then((model) {
|
await createXenditInvoice(amount: amount).then((model) {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
if (model.id != null) {
|
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) {
|
if (value == true) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
placeOrder();
|
placeOrder();
|
||||||
@@ -1086,7 +1422,9 @@ class CartController extends GetxController {
|
|||||||
const url = 'https://api.xendit.co/v2/invoices';
|
const url = 'https://api.xendit.co/v2/invoices';
|
||||||
var headers = {
|
var headers = {
|
||||||
'Content-Type': 'application/json',
|
'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',
|
// 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ',
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1099,7 +1437,11 @@ class CartController extends GetxController {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
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) {
|
if (response.statusCode == 200 || response.statusCode == 201) {
|
||||||
XenditModel model = XenditModel.fromJson(jsonDecode(response.body));
|
XenditModel model = XenditModel.fromJson(jsonDecode(response.body));
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import '../models/cashback_model.dart';
|
import '../models/cashback_model.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
|
|
||||||
class CashbackController extends GetxController {
|
class CashbackController extends GetxController {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import 'package:customer/models/vendor_model.dart';
|
|||||||
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||||
import '../models/vendor_category_model.dart';
|
import '../models/vendor_category_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class CategoryRestaurantController extends GetxController {
|
class CategoryRestaurantController extends GetxController {
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
@@ -33,9 +33,10 @@ class CategoryRestaurantController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future getRestaurant() async {
|
Future getRestaurant() async {
|
||||||
FireStoreUtils.getAllNearestRestaurantByCategoryId(categoryId: vendorCategoryModel.value.id.toString(), isDining: dineIn.value).listen((
|
FireStoreUtils.getAllNearestRestaurantByCategoryId(
|
||||||
event,
|
categoryId: vendorCategoryModel.value.id.toString(),
|
||||||
) async {
|
isDining: dineIn.value,
|
||||||
|
).listen((event) async {
|
||||||
allNearestRestaurant.clear();
|
allNearestRestaurant.clear();
|
||||||
allNearestRestaurant.addAll(event);
|
allNearestRestaurant.addAll(event);
|
||||||
});
|
});
|
||||||
@@ -46,7 +47,10 @@ class CategoryRestaurantController extends GetxController {
|
|||||||
if (value != null) {
|
if (value != null) {
|
||||||
for (int i = 0; i < value.length; i++) {
|
for (int i = 0; i < value.length; i++) {
|
||||||
if (Constant.isPointInPolygon(
|
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!,
|
value[i].area!,
|
||||||
)) {
|
)) {
|
||||||
Constant.selectedZone = value[i];
|
Constant.selectedZone = value[i];
|
||||||
|
|||||||
@@ -2,8 +2,7 @@ import 'package:customer/constant/constant.dart';
|
|||||||
import 'package:customer/models/language_model.dart';
|
import 'package:customer/models/language_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:customer/utils/preferences.dart';
|
import 'package:customer/utils/preferences.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
import '../constant/collection_name.dart';
|
import '../constant/collection_name.dart';
|
||||||
|
|
||||||
class ChangeLanguageController extends GetxController {
|
class ChangeLanguageController extends GetxController {
|
||||||
@@ -20,24 +19,30 @@ class ChangeLanguageController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getLanguage() async {
|
Future<void> getLanguage() async {
|
||||||
await FireStoreUtils.fireStore.collection(CollectionName.settings).doc("languages").get().then((event) {
|
await FireStoreUtils.fireStore
|
||||||
if (event.exists) {
|
.collection(CollectionName.settings)
|
||||||
List languageListTemp = event.data()!["list"];
|
.doc("languages")
|
||||||
for (var element in languageListTemp) {
|
.get()
|
||||||
LanguageModel languageModel = LanguageModel.fromJson(element);
|
.then((event) {
|
||||||
languageList.add(languageModel);
|
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) {
|
if (Preferences.getString(
|
||||||
LanguageModel pref = Constant.getLanguage();
|
Preferences.languageCodeKey,
|
||||||
for (var element in languageList) {
|
).toString().isNotEmpty) {
|
||||||
if (element.slug == pref.slug) {
|
LanguageModel pref = Constant.getLanguage();
|
||||||
selectedLanguage.value = element;
|
for (var element in languageList) {
|
||||||
|
if (element.slug == pref.slug) {
|
||||||
|
selectedLanguage.value = element;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import '../models/conversation_model.dart';
|
|||||||
import '../models/inbox_model.dart';
|
import '../models/inbox_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
import '../service/send_notification.dart';
|
import '../service/send_notification.dart';
|
||||||
@@ -21,7 +21,11 @@ class ChatController extends GetxController {
|
|||||||
void onInit() {
|
void onInit() {
|
||||||
// TODO: implement onInit
|
// TODO: implement onInit
|
||||||
if (scrollController.hasClients) {
|
if (scrollController.hasClients) {
|
||||||
Timer(const Duration(milliseconds: 500), () => scrollController.jumpTo(scrollController.position.maxScrollExtent));
|
Timer(
|
||||||
|
const Duration(milliseconds: 500),
|
||||||
|
() =>
|
||||||
|
scrollController.jumpTo(scrollController.position.maxScrollExtent),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
getArgument();
|
getArgument();
|
||||||
super.onInit();
|
super.onInit();
|
||||||
@@ -47,14 +51,20 @@ class ChatController extends GetxController {
|
|||||||
customerProfileImage.value = argumentData['customerProfileImage'] ?? "";
|
customerProfileImage.value = argumentData['customerProfileImage'] ?? "";
|
||||||
restaurantId.value = argumentData['restaurantId'];
|
restaurantId.value = argumentData['restaurantId'];
|
||||||
restaurantName.value = argumentData['restaurantName'];
|
restaurantName.value = argumentData['restaurantName'];
|
||||||
restaurantProfileImage.value = argumentData['restaurantProfileImage'] ?? "";
|
restaurantProfileImage.value =
|
||||||
|
argumentData['restaurantProfileImage'] ?? "";
|
||||||
token.value = argumentData['token'] ?? "";
|
token.value = argumentData['token'] ?? "";
|
||||||
chatType.value = argumentData['chatType'];
|
chatType.value = argumentData['chatType'];
|
||||||
}
|
}
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> sendMessage(String message, Url? url, String videoThumbnail, String messageType) async {
|
Future<void> sendMessage(
|
||||||
|
String message,
|
||||||
|
Url? url,
|
||||||
|
String videoThumbnail,
|
||||||
|
String messageType,
|
||||||
|
) async {
|
||||||
InboxModel inboxModel = InboxModel(
|
InboxModel inboxModel = InboxModel(
|
||||||
lastSenderId: customerId.value,
|
lastSenderId: customerId.value,
|
||||||
customerId: 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, {});
|
||||||
await SendNotification.sendChatFcmMessage(customerName.value, conversationModel.message.toString(), token.value, {
|
await SendNotification.sendChatFcmMessage(
|
||||||
"type": "chat",
|
customerName.value,
|
||||||
"chatType": chatType.value,
|
conversationModel.message.toString(),
|
||||||
"orderId": orderId.value,
|
token.value,
|
||||||
"customerId": customerId.value,
|
{
|
||||||
"customerName": customerName.value,
|
"type": "chat",
|
||||||
"customerProfileImage": customerProfileImage.value,
|
"chatType": chatType.value,
|
||||||
"restaurantId": restaurantId.value,
|
"orderId": orderId.value,
|
||||||
"restaurantName": restaurantName.value,
|
"customerId": customerId.value,
|
||||||
"restaurantProfileImage": restaurantProfileImage.value,
|
"customerName": customerName.value,
|
||||||
"token": token.value,
|
"customerProfileImage": customerProfileImage.value,
|
||||||
});
|
"restaurantId": restaurantId.value,
|
||||||
|
"restaurantName": restaurantName.value,
|
||||||
|
"restaurantProfileImage": restaurantProfileImage.value,
|
||||||
|
"token": token.value,
|
||||||
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
final ImagePicker imagePicker = ImagePicker();
|
final ImagePicker imagePicker = ImagePicker();
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.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 '../models/cab_order_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import '../themes/show_toast_dialog.dart';
|
import '../themes/show_toast_dialog.dart';
|
||||||
@@ -30,7 +30,9 @@ class ComplainController extends GetxController {
|
|||||||
Future<void> getComplain() async {
|
Future<void> getComplain() async {
|
||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
try {
|
try {
|
||||||
final data = await FireStoreUtils.getRideComplainData(order.value.id ?? '');
|
final data = await FireStoreUtils.getRideComplainData(
|
||||||
|
order.value.id ?? '',
|
||||||
|
);
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
title.value.text = data['title'] ?? '';
|
title.value.text = data['title'] ?? '';
|
||||||
comment.value.text = data['description'] ?? '';
|
comment.value.text = data['description'] ?? '';
|
||||||
@@ -59,7 +61,9 @@ class ComplainController extends GetxController {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Check if complaint already exists
|
// Check if complaint already exists
|
||||||
bool exists = await FireStoreUtils.isRideComplainAdded(order.value.id ?? '');
|
bool exists = await FireStoreUtils.isRideComplainAdded(
|
||||||
|
order.value.id ?? '',
|
||||||
|
);
|
||||||
|
|
||||||
if (!exists) {
|
if (!exists) {
|
||||||
await FireStoreUtils.setRideComplain(
|
await FireStoreUtils.setRideComplain(
|
||||||
@@ -67,13 +71,19 @@ class ComplainController extends GetxController {
|
|||||||
title: title.value.text.trim(),
|
title: title.value.text.trim(),
|
||||||
description: comment.value.text.trim(),
|
description: comment.value.text.trim(),
|
||||||
customerID: order.value.authorID ?? '',
|
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 ?? '',
|
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.closeLoader();
|
||||||
ShowToastDialog.showToast("Your complaint has been submitted to admin".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Your complaint has been submitted to admin".tr(),
|
||||||
|
);
|
||||||
Get.back();
|
Get.back();
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
|
|||||||
@@ -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/profile_screen/profile_screen.dart';
|
||||||
import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart';
|
import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class DashBoardController extends GetxController {
|
class DashBoardController extends GetxController {
|
||||||
RxInt selectedIndex = 0.obs;
|
RxInt selectedIndex = 0.obs;
|
||||||
@@ -19,22 +19,46 @@ class DashBoardController extends GetxController {
|
|||||||
getTaxList();
|
getTaxList();
|
||||||
if (Constant.sectionConstantModel!.theme == "theme_2") {
|
if (Constant.sectionConstantModel!.theme == "theme_2") {
|
||||||
if (Constant.walletSetting == false) {
|
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 {
|
} 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 {
|
} else {
|
||||||
if (Constant.walletSetting == false) {
|
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 {
|
} 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();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getTaxList() async {
|
Future<void> getTaxList() async {
|
||||||
await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) {
|
await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
Constant.taxList = value;
|
Constant.taxList = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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/profile_screen/profile_screen.dart';
|
||||||
import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart';
|
import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class DashBoardEcommerceController extends GetxController {
|
class DashBoardEcommerceController extends GetxController {
|
||||||
RxInt selectedIndex = 0.obs;
|
RxInt selectedIndex = 0.obs;
|
||||||
@@ -17,15 +17,28 @@ class DashBoardEcommerceController extends GetxController {
|
|||||||
// TODO: implement onInit
|
// TODO: implement onInit
|
||||||
getTaxList();
|
getTaxList();
|
||||||
if (Constant.walletSetting == false) {
|
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 {
|
} 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();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getTaxList() async {
|
Future<void> getTaxList() async {
|
||||||
await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) {
|
await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
Constant.taxList = value;
|
Constant.taxList = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import '../models/dine_in_booking_model.dart';
|
import '../models/dine_in_booking_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class DineInBookingController extends GetxController {
|
class DineInBookingController extends GetxController {
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
@@ -18,16 +18,12 @@ class DineInBookingController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getDineInBooking() async {
|
Future<void> getDineInBooking() async {
|
||||||
await FireStoreUtils.getDineInBooking(true).then(
|
await FireStoreUtils.getDineInBooking(true).then((value) {
|
||||||
(value) {
|
featureList.value = value;
|
||||||
featureList.value = value;
|
});
|
||||||
},
|
await FireStoreUtils.getDineInBooking(false).then((value) {
|
||||||
);
|
historyList.value = value;
|
||||||
await FireStoreUtils.getDineInBooking(false).then(
|
});
|
||||||
(value) {
|
|
||||||
historyList.value = value;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:customer/models/dine_in_booking_model.dart';
|
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 {
|
class DineInBookingDetailsController extends GetxController {
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import 'package:google_maps_flutter/google_maps_flutter.dart';
|
|||||||
import '../models/banner_model.dart';
|
import '../models/banner_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class DineInController extends GetxController {
|
class DineInController extends GetxController {
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
@@ -28,7 +28,8 @@ class DineInController extends GetxController {
|
|||||||
RxList<VendorModel> popularRestaurantList = <VendorModel>[].obs;
|
RxList<VendorModel> popularRestaurantList = <VendorModel>[].obs;
|
||||||
|
|
||||||
RxList<BannerModel> bannerBottomModel = <BannerModel>[].obs;
|
RxList<BannerModel> bannerBottomModel = <BannerModel>[].obs;
|
||||||
Rx<PageController> pageBottomController = PageController(viewportFraction: 0.877).obs;
|
Rx<PageController> pageBottomController =
|
||||||
|
PageController(viewportFraction: 0.877).obs;
|
||||||
RxInt currentBottomPage = 0.obs;
|
RxInt currentBottomPage = 0.obs;
|
||||||
|
|
||||||
RxList<FavouriteModel> favouriteList = <FavouriteModel>[].obs;
|
RxList<FavouriteModel> favouriteList = <FavouriteModel>[].obs;
|
||||||
@@ -37,7 +38,9 @@ class DineInController extends GetxController {
|
|||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
await getZone();
|
await getZone();
|
||||||
|
|
||||||
FireStoreUtils.getAllNearestRestaurant(isDining: true).listen((event) async {
|
FireStoreUtils.getAllNearestRestaurant(isDining: true).listen((
|
||||||
|
event,
|
||||||
|
) async {
|
||||||
newArrivalRestaurantList.clear();
|
newArrivalRestaurantList.clear();
|
||||||
allNearestRestaurant.clear();
|
allNearestRestaurant.clear();
|
||||||
popularRestaurantList.clear();
|
popularRestaurantList.clear();
|
||||||
@@ -47,12 +50,21 @@ class DineInController extends GetxController {
|
|||||||
popularRestaurantList.addAll(event);
|
popularRestaurantList.addAll(event);
|
||||||
|
|
||||||
popularRestaurantList.sort(
|
popularRestaurantList.sort(
|
||||||
(a, b) => Constant.calculateReview(reviewCount: b.reviewsCount.toString(), reviewSum: b.reviewsSum.toString())
|
(a, b) => Constant.calculateReview(
|
||||||
.compareTo(Constant.calculateReview(reviewCount: a.reviewsCount.toString(), reviewSum: a.reviewsSum.toString())),
|
reviewCount: b.reviewsCount.toString(),
|
||||||
|
reviewSum: b.reviewsSum.toString(),
|
||||||
|
).compareTo(
|
||||||
|
Constant.calculateReview(
|
||||||
|
reviewCount: a.reviewsCount.toString(),
|
||||||
|
reviewSum: a.reviewsSum.toString(),
|
||||||
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
newArrivalRestaurantList.sort(
|
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<void> getCategory() async {
|
Future<void> getCategory() async {
|
||||||
await FireStoreUtils.getHomeVendorCategory().then(
|
await FireStoreUtils.getHomeVendorCategory().then((value) {
|
||||||
(value) {
|
vendorCategoryModel.value = value;
|
||||||
vendorCategoryModel.value = value;
|
});
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
await FireStoreUtils.getHomeBottomBanner().then(
|
await FireStoreUtils.getHomeBottomBanner().then((value) {
|
||||||
(value) {
|
bannerBottomModel.value = value;
|
||||||
bannerBottomModel.value = value;
|
});
|
||||||
},
|
|
||||||
);
|
|
||||||
if (Constant.userModel != null) {
|
if (Constant.userModel != null) {
|
||||||
await FireStoreUtils.getFavouriteRestaurant().then(
|
await FireStoreUtils.getFavouriteRestaurant().then((value) {
|
||||||
(value) {
|
favouriteList.value = value;
|
||||||
favouriteList.value = value;
|
});
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,7 +91,13 @@ class DineInController extends GetxController {
|
|||||||
await FireStoreUtils.getZone().then((value) {
|
await FireStoreUtils.getZone().then((value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
for (int i = 0; i < value.length; i++) {
|
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.selectedZone = value[i];
|
||||||
Constant.isZoneAvailable = true;
|
Constant.isZoneAvailable = true;
|
||||||
break;
|
break;
|
||||||
@@ -96,5 +108,4 @@ class DineInController extends GetxController {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 '../screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
|
|
||||||
import '../service/send_notification.dart';
|
import '../service/send_notification.dart';
|
||||||
import '../themes/show_toast_dialog.dart';
|
import '../themes/show_toast_dialog.dart';
|
||||||
|
|
||||||
class DineInRestaurantDetailsController extends GetxController {
|
class DineInRestaurantDetailsController extends GetxController {
|
||||||
Rx<TextEditingController> searchEditingController = TextEditingController().obs;
|
Rx<TextEditingController> searchEditingController =
|
||||||
|
TextEditingController().obs;
|
||||||
|
|
||||||
Rx<TextEditingController> additionRequestController = TextEditingController().obs;
|
Rx<TextEditingController> additionRequestController =
|
||||||
|
TextEditingController().obs;
|
||||||
|
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
RxBool firstVisit = false.obs;
|
RxBool firstVisit = false.obs;
|
||||||
@@ -42,6 +44,7 @@ class DineInRestaurantDetailsController extends GetxController {
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RxString selectedOccasion = "".obs;
|
RxString selectedOccasion = "".obs;
|
||||||
|
|
||||||
RxList<DateModel> dateList = <DateModel>[].obs;
|
RxList<DateModel> dateList = <DateModel>[].obs;
|
||||||
@@ -65,30 +68,53 @@ class DineInRestaurantDetailsController extends GetxController {
|
|||||||
ShowToastDialog.showLoader("Please wait...".tr());
|
ShowToastDialog.showLoader("Please wait...".tr());
|
||||||
|
|
||||||
DateTime dt = selectedDate.value.toDate();
|
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()));
|
String hour = DateFormat("kk:mm").format(
|
||||||
dt = DateTime(dt.year, dt.month, dt.day, int.parse(hour.split(":")[0]), int.parse(hour.split(":")[1]), dt.second, dt.millisecond, dt.microsecond);
|
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);
|
selectedDate.value = Timestamp.fromDate(dt);
|
||||||
DineInBookingModel dineInBookingModel = DineInBookingModel(
|
DineInBookingModel dineInBookingModel = DineInBookingModel(
|
||||||
id: Constant.getUuid(),
|
id: Constant.getUuid(),
|
||||||
author: Constant.userModel,
|
author: Constant.userModel,
|
||||||
authorID: FireStoreUtils.getCurrentUid(),
|
authorID: FireStoreUtils.getCurrentUid(),
|
||||||
createdAt: Timestamp.now(),
|
createdAt: Timestamp.now(),
|
||||||
date: selectedDate.value,
|
date: selectedDate.value,
|
||||||
status: Constant.orderPlaced,
|
status: Constant.orderPlaced,
|
||||||
vendor: vendorModel.value,
|
vendor: vendorModel.value,
|
||||||
specialRequest: additionRequestController.value.text.isEmpty ? "" : additionRequestController.value.text,
|
specialRequest:
|
||||||
vendorID: vendorModel.value.id,
|
additionRequestController.value.text.isEmpty
|
||||||
guestEmail: Constant.userModel!.email,
|
? ""
|
||||||
guestFirstName: Constant.userModel!.firstName,
|
: additionRequestController.value.text,
|
||||||
guestLastName: Constant.userModel!.lastName,
|
vendorID: vendorModel.value.id,
|
||||||
guestPhone: Constant.userModel!.phoneNumber,
|
guestEmail: Constant.userModel!.email,
|
||||||
occasion: selectedOccasion.value,
|
guestFirstName: Constant.userModel!.firstName,
|
||||||
discount: selectedTimeDiscount.value,
|
guestLastName: Constant.userModel!.lastName,
|
||||||
discountType: selectedTimeDiscountType.value,
|
guestPhone: Constant.userModel!.phoneNumber,
|
||||||
totalGuest: noOfQuantity.value.toString(),
|
occasion: selectedOccasion.value,
|
||||||
firstVisit: firstVisit.value);
|
discount: selectedTimeDiscount.value,
|
||||||
|
discountType: selectedTimeDiscountType.value,
|
||||||
|
totalGuest: noOfQuantity.value.toString(),
|
||||||
|
firstVisit: firstVisit.value,
|
||||||
|
);
|
||||||
await FireStoreUtils.setBookedOrder(dineInBookingModel);
|
await FireStoreUtils.setBookedOrder(dineInBookingModel);
|
||||||
await SendNotification.sendFcmMessage(Constant.dineInPlaced, vendorModel.value.fcmToken.toString(), {});
|
await SendNotification.sendFcmMessage(
|
||||||
|
Constant.dineInPlaced,
|
||||||
|
vendorModel.value.fcmToken.toString(),
|
||||||
|
{},
|
||||||
|
);
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
Get.back();
|
Get.back();
|
||||||
Get.to(const DineInBookingScreen());
|
Get.to(const DineInBookingScreen());
|
||||||
@@ -99,27 +125,46 @@ class DineInRestaurantDetailsController extends GetxController {
|
|||||||
for (int i = 0; i < 7; i++) {
|
for (int i = 0; i < 7; i++) {
|
||||||
final now = DateTime.now().add(Duration(days: i));
|
final now = DateTime.now().add(Duration(days: i));
|
||||||
var day = DateFormat('EEEE').format(now);
|
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!) {
|
for (var element in vendorModel.value.specialDiscount!) {
|
||||||
if (day == element.day.toString()) {
|
if (day == element.day.toString()) {
|
||||||
if (element.timeslot!.isNotEmpty) {
|
if (element.timeslot!.isNotEmpty) {
|
||||||
SpecialDiscountTimeslot employeeWithMaxSalary =
|
SpecialDiscountTimeslot employeeWithMaxSalary = element.timeslot!
|
||||||
element.timeslot!.reduce((item1, item2) => double.parse(item1.discount.toString()) > double.parse(item2.discount.toString()) ? item1 : item2);
|
.reduce(
|
||||||
|
(item1, item2) =>
|
||||||
|
double.parse(item1.discount.toString()) >
|
||||||
|
double.parse(item2.discount.toString())
|
||||||
|
? item1
|
||||||
|
: item2,
|
||||||
|
);
|
||||||
if (employeeWithMaxSalary.discountType == "dinein") {
|
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);
|
dateList.add(model);
|
||||||
} else {
|
} else {
|
||||||
DateModel model = DateModel(date: Timestamp.fromDate(now), discountPer: "0");
|
DateModel model = DateModel(
|
||||||
|
date: Timestamp.fromDate(now),
|
||||||
|
discountPer: "0",
|
||||||
|
);
|
||||||
dateList.add(model);
|
dateList.add(model);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
DateModel model = DateModel(date: Timestamp.fromDate(now), discountPer: "0");
|
DateModel model = DateModel(
|
||||||
|
date: Timestamp.fromDate(now),
|
||||||
|
discountPer: "0",
|
||||||
|
);
|
||||||
dateList.add(model);
|
dateList.add(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
DateModel model = DateModel(date: Timestamp.fromDate(now), discountPer: "0");
|
DateModel model = DateModel(
|
||||||
|
date: Timestamp.fromDate(now),
|
||||||
|
discountPer: "0",
|
||||||
|
);
|
||||||
dateList.add(model);
|
dateList.add(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -127,70 +172,116 @@ class DineInRestaurantDetailsController extends GetxController {
|
|||||||
|
|
||||||
timeSet(selectedDate.value);
|
timeSet(selectedDate.value);
|
||||||
if (timeSlotList.isNotEmpty) {
|
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) {
|
void timeSet(Timestamp selectedDate) {
|
||||||
timeSlotList.clear();
|
timeSlotList.clear();
|
||||||
|
|
||||||
for (DateTime time = Constant.stringToDate(vendorModel.value.openDineTime.toString());
|
for (
|
||||||
time.isBefore(Constant.stringToDate(vendorModel.value.closeDineTime.toString()));
|
DateTime time = Constant.stringToDate(
|
||||||
time = time.add(const Duration(minutes: 30))) {
|
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());
|
final now = DateTime.parse(selectedDate.toDate().toString());
|
||||||
var day = DateFormat('EEEE').format(now);
|
var day = DateFormat('EEEE').format(now);
|
||||||
var date = DateFormat('dd-MM-yyyy').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!) {
|
for (var element in vendorModel.value.specialDiscount!) {
|
||||||
if (day == element.day.toString()) {
|
if (day == element.day.toString()) {
|
||||||
if (element.timeslot!.isNotEmpty) {
|
if (element.timeslot!.isNotEmpty) {
|
||||||
for (var element in element.timeslot!) {
|
for (var element in element.timeslot!) {
|
||||||
if (element.discountType == "dinein") {
|
if (element.discountType == "dinein") {
|
||||||
var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}");
|
var start = DateFormat(
|
||||||
var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}");
|
"dd-MM-yyyy HH:mm",
|
||||||
var selected = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${DateFormat.Hm().format(time)}");
|
).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)) {
|
if (isCurrentDateInRangeDineIn(start, end, selected)) {
|
||||||
var contains = timeSlotList.where((element) => element.time == time);
|
var contains = timeSlotList.where(
|
||||||
|
(element) => element.time == time,
|
||||||
|
);
|
||||||
if (contains.isNotEmpty) {
|
if (contains.isNotEmpty) {
|
||||||
var index = timeSlotList.indexWhere((element) => element.time == time);
|
var index = timeSlotList.indexWhere(
|
||||||
|
(element) => element.time == time,
|
||||||
|
);
|
||||||
if (timeSlotList[index].discountPer == "0") {
|
if (timeSlotList[index].discountPer == "0") {
|
||||||
timeSlotList.removeAt(index);
|
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);
|
timeSlotList.insert(index == 0 ? 0 : index, model);
|
||||||
}
|
}
|
||||||
} else {
|
} 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);
|
timeSlotList.add(model);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var contains = timeSlotList.where((element) => element.time == time);
|
var contains = timeSlotList.where(
|
||||||
|
(element) => element.time == time,
|
||||||
|
);
|
||||||
if (contains.isEmpty) {
|
if (contains.isEmpty) {
|
||||||
TimeModel model = TimeModel(time: time, discountPer: "0", discountType: "amount");
|
TimeModel model = TimeModel(
|
||||||
|
time: time,
|
||||||
|
discountPer: "0",
|
||||||
|
discountType: "amount",
|
||||||
|
);
|
||||||
timeSlotList.add(model);
|
timeSlotList.add(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
TimeModel model = TimeModel(time: time, discountPer: "0", discountType: "amount");
|
TimeModel model = TimeModel(
|
||||||
|
time: time,
|
||||||
|
discountPer: "0",
|
||||||
|
discountType: "amount",
|
||||||
|
);
|
||||||
timeSlotList.add(model);
|
timeSlotList.add(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
TimeModel model = TimeModel(time: time, discountPer: "0", discountType: "amount");
|
TimeModel model = TimeModel(
|
||||||
|
time: time,
|
||||||
|
discountPer: "0",
|
||||||
|
discountType: "amount",
|
||||||
|
);
|
||||||
timeSlotList.add(model);
|
timeSlotList.add(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
TimeModel model = TimeModel(time: time, discountPer: "0", discountType: "amount");
|
TimeModel model = TimeModel(
|
||||||
|
time: time,
|
||||||
|
discountPer: "0",
|
||||||
|
discountType: "amount",
|
||||||
|
);
|
||||||
timeSlotList.add(model);
|
timeSlotList.add(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void animateSlider() {
|
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) {
|
Timer.periodic(const Duration(seconds: 2), (Timer timer) {
|
||||||
if (currentPage < vendorModel.value.photos!.length) {
|
if (currentPage < vendorModel.value.photos!.length) {
|
||||||
currentPage++;
|
currentPage++;
|
||||||
@@ -226,18 +317,16 @@ class DineInRestaurantDetailsController extends GetxController {
|
|||||||
|
|
||||||
Future<void> getFavouriteList() async {
|
Future<void> getFavouriteList() async {
|
||||||
if (Constant.userModel != null) {
|
if (Constant.userModel != null) {
|
||||||
await FireStoreUtils.getFavouriteRestaurant().then(
|
await FireStoreUtils.getFavouriteRestaurant().then((value) {
|
||||||
(value) {
|
favouriteList.value = value;
|
||||||
favouriteList.value = value;
|
});
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await FireStoreUtils.getVendorCuisines(vendorModel.value.id.toString()).then(
|
await FireStoreUtils.getVendorCuisines(
|
||||||
(value) {
|
vendorModel.value.id.toString(),
|
||||||
tags.value = value;
|
).then((value) {
|
||||||
},
|
tags.value = value;
|
||||||
);
|
});
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,8 +340,12 @@ class DineInRestaurantDetailsController extends GetxController {
|
|||||||
if (day == element.day.toString()) {
|
if (day == element.day.toString()) {
|
||||||
if (element.timeslot!.isNotEmpty) {
|
if (element.timeslot!.isNotEmpty) {
|
||||||
for (var element in element.timeslot!) {
|
for (var element in element.timeslot!) {
|
||||||
var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}");
|
var start = DateFormat(
|
||||||
var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}");
|
"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)) {
|
if (isCurrentDateInRange(start, end)) {
|
||||||
isOpen.value = true;
|
isOpen.value = true;
|
||||||
}
|
}
|
||||||
@@ -262,8 +355,14 @@ class DineInRestaurantDetailsController extends GetxController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isCurrentDateInRangeDineIn(DateTime startDate, DateTime endDate, DateTime selected) {
|
bool isCurrentDateInRangeDineIn(
|
||||||
return selected.isAtSameMomentAs(startDate) || selected.isAtSameMomentAs(endDate) || selected.isAfter(startDate) && selected.isBefore(endDate);
|
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) {
|
bool isCurrentDateInRange(DateTime startDate, DateTime endDate) {
|
||||||
@@ -284,5 +383,9 @@ class TimeModel {
|
|||||||
String? discountPer;
|
String? discountPer;
|
||||||
String? discountType;
|
String? discountType;
|
||||||
|
|
||||||
TimeModel({required this.time, required this.discountPer, required this.discountType});
|
TimeModel({
|
||||||
|
required this.time,
|
||||||
|
required this.discountPer,
|
||||||
|
required this.discountType,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:customer/models/coupon_model.dart';
|
import 'package:customer/models/coupon_model.dart';
|
||||||
import 'package:customer/models/vendor_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 {
|
class DiscountRestaurantListController extends GetxController {
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import 'package:easy_localization/easy_localization.dart';
|
|||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.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 'package:image_picker/image_picker.dart';
|
||||||
|
|
||||||
import '../themes/show_toast_dialog.dart';
|
import '../themes/show_toast_dialog.dart';
|
||||||
@@ -18,7 +18,8 @@ class EditProfileController extends GetxController {
|
|||||||
Rx<TextEditingController> lastNameController = TextEditingController().obs;
|
Rx<TextEditingController> lastNameController = TextEditingController().obs;
|
||||||
Rx<TextEditingController> emailController = TextEditingController().obs;
|
Rx<TextEditingController> emailController = TextEditingController().obs;
|
||||||
Rx<TextEditingController> phoneNumberController = TextEditingController().obs;
|
Rx<TextEditingController> phoneNumberController = TextEditingController().obs;
|
||||||
Rx<TextEditingController> countryCodeController = TextEditingController(text: "+91").obs;
|
Rx<TextEditingController> countryCodeController =
|
||||||
|
TextEditingController(text: "+91").obs;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
@@ -27,14 +28,18 @@ class EditProfileController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getData() async {
|
Future<void> getData() async {
|
||||||
await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) {
|
await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
userModel.value = value;
|
userModel.value = value;
|
||||||
firstNameController.value.text = userModel.value.firstName.toString();
|
firstNameController.value.text = userModel.value.firstName.toString();
|
||||||
lastNameController.value.text = userModel.value.lastName.toString();
|
lastNameController.value.text = userModel.value.lastName.toString();
|
||||||
emailController.value.text = userModel.value.email.toString();
|
emailController.value.text = userModel.value.email.toString();
|
||||||
phoneNumberController.value.text = userModel.value.phoneNumber.toString();
|
phoneNumberController.value.text =
|
||||||
countryCodeController.value.text = userModel.value.countryCode.toString();
|
userModel.value.phoneNumber.toString();
|
||||||
|
countryCodeController.value.text =
|
||||||
|
userModel.value.countryCode.toString();
|
||||||
profileImage.value = userModel.value.profilePictureURL ?? "";
|
profileImage.value = userModel.value.profilePictureURL ?? "";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -44,7 +49,8 @@ class EditProfileController extends GetxController {
|
|||||||
|
|
||||||
Future<void> saveData() async {
|
Future<void> saveData() async {
|
||||||
ShowToastDialog.showLoader("Please wait...".tr());
|
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(
|
profileImage.value = await Constant.uploadUserImageToFireStorage(
|
||||||
File(profileImage.value),
|
File(profileImage.value),
|
||||||
"profileImage/${FireStoreUtils.getCurrentUid()}",
|
"profileImage/${FireStoreUtils.getCurrentUid()}",
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import 'package:customer/service/fire_store_utils.dart';
|
import 'package:customer/service/fire_store_utils.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
import '../models/user_model.dart';
|
import '../models/user_model.dart';
|
||||||
|
|
||||||
class EnterManuallyLocationController extends GetxController {
|
class EnterManuallyLocationController extends GetxController {
|
||||||
@@ -13,9 +12,12 @@ class EnterManuallyLocationController extends GetxController {
|
|||||||
List saveAsList = ['Home', 'Work', 'Hotel', 'other'].obs;
|
List saveAsList = ['Home', 'Work', 'Hotel', 'other'].obs;
|
||||||
RxString selectedSaveAs = "Home".obs;
|
RxString selectedSaveAs = "Home".obs;
|
||||||
|
|
||||||
Rx<TextEditingController> houseBuildingTextEditingController = TextEditingController().obs;
|
Rx<TextEditingController> houseBuildingTextEditingController =
|
||||||
Rx<TextEditingController> localityEditingController = TextEditingController().obs;
|
TextEditingController().obs;
|
||||||
Rx<TextEditingController> landmarkEditingController = TextEditingController().obs;
|
Rx<TextEditingController> localityEditingController =
|
||||||
|
TextEditingController().obs;
|
||||||
|
Rx<TextEditingController> landmarkEditingController =
|
||||||
|
TextEditingController().obs;
|
||||||
Rx<UserLocation> location = UserLocation().obs;
|
Rx<UserLocation> location = UserLocation().obs;
|
||||||
Rx<ShippingAddress> shippingModel = ShippingAddress().obs;
|
Rx<ShippingAddress> shippingModel = ShippingAddress().obs;
|
||||||
RxBool isLoading = false.obs;
|
RxBool isLoading = false.obs;
|
||||||
@@ -36,7 +38,8 @@ class EnterManuallyLocationController extends GetxController {
|
|||||||
mode.value = argumentData['mode'] ?? "Add";
|
mode.value = argumentData['mode'] ?? "Add";
|
||||||
|
|
||||||
//check address
|
//check address
|
||||||
if (argumentData['address'] != null && argumentData['address'] is ShippingAddress) {
|
if (argumentData['address'] != null &&
|
||||||
|
argumentData['address'] is ShippingAddress) {
|
||||||
shippingModel.value = argumentData['address'];
|
shippingModel.value = argumentData['address'];
|
||||||
setData(shippingModel.value);
|
setData(shippingModel.value);
|
||||||
}
|
}
|
||||||
@@ -49,7 +52,8 @@ class EnterManuallyLocationController extends GetxController {
|
|||||||
|
|
||||||
void setData(ShippingAddress shippingAddress) {
|
void setData(ShippingAddress shippingAddress) {
|
||||||
shippingModel.value = shippingAddress;
|
shippingModel.value = shippingAddress;
|
||||||
houseBuildingTextEditingController.value.text = shippingAddress.address.toString();
|
houseBuildingTextEditingController.value.text =
|
||||||
|
shippingAddress.address.toString();
|
||||||
localityEditingController.value.text = shippingAddress.locality.toString();
|
localityEditingController.value.text = shippingAddress.locality.toString();
|
||||||
landmarkEditingController.value.text = shippingAddress.landmark.toString();
|
landmarkEditingController.value.text = shippingAddress.landmark.toString();
|
||||||
selectedSaveAs.value = shippingAddress.addressAs.toString();
|
selectedSaveAs.value = shippingAddress.addressAs.toString();
|
||||||
@@ -57,7 +61,9 @@ class EnterManuallyLocationController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getUser() async {
|
Future<void> getUser() async {
|
||||||
await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) {
|
await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
userModel.value = value;
|
userModel.value = value;
|
||||||
if (userModel.value.shippingAddress != null) {
|
if (userModel.value.shippingAddress != null) {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import 'package:customer/models/favourite_model.dart';
|
|||||||
import 'package:customer/models/product_model.dart';
|
import 'package:customer/models/product_model.dart';
|
||||||
import 'package:customer/models/vendor_model.dart';
|
import 'package:customer/models/vendor_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class FavouriteController extends GetxController {
|
class FavouriteController extends GetxController {
|
||||||
RxBool favouriteRestaurant = true.obs;
|
RxBool favouriteRestaurant = true.obs;
|
||||||
@@ -35,14 +35,22 @@ class FavouriteController extends GetxController {
|
|||||||
});
|
});
|
||||||
|
|
||||||
for (var element in favouriteList) {
|
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 (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") {
|
if (value.subscriptionTotalOrders == "-1") {
|
||||||
favouriteVendorList.add(value);
|
favouriteVendorList.add(value);
|
||||||
} else {
|
} else {
|
||||||
print("Restaurant :: ${value.title.toString()}");
|
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') {
|
value.subscriptionPlan?.expiryDay == '-1') {
|
||||||
if (value.subscriptionTotalOrders != '0') {
|
if (value.subscriptionTotalOrders != '0') {
|
||||||
favouriteVendorList.add(value);
|
favouriteVendorList.add(value);
|
||||||
@@ -57,32 +65,45 @@ class FavouriteController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (var element in favouriteItemList) {
|
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) {
|
if (value != null) {
|
||||||
await FireStoreUtils.fireStore.collection(CollectionName.vendors).doc(value.vendorID.toString()).get().then((value1) async {
|
await FireStoreUtils.fireStore
|
||||||
if (value1.exists) {
|
.collection(CollectionName.vendors)
|
||||||
VendorModel vendorModel = VendorModel.fromJson(value1.data()!);
|
.doc(value.vendorID.toString())
|
||||||
if(value.publish == true){
|
.get()
|
||||||
if (Constant.isSubscriptionModelApplied == true || vendorModel.adminCommission?.isEnabled == true) {
|
.then((value1) async {
|
||||||
if (vendorModel.subscriptionPlan != null) {
|
if (value1.exists) {
|
||||||
if (vendorModel.subscriptionTotalOrders == "-1") {
|
VendorModel vendorModel = VendorModel.fromJson(
|
||||||
favouriteFoodList.add(value);
|
value1.data()!,
|
||||||
} else {
|
);
|
||||||
if ((vendorModel.subscriptionExpiryDate != null && vendorModel.subscriptionExpiryDate!.toDate().isBefore(DateTime.now()) == false) ||
|
if (value.publish == true) {
|
||||||
vendorModel.subscriptionPlan?.expiryDay == "-1") {
|
if (Constant.isSubscriptionModelApplied == true ||
|
||||||
if (vendorModel.subscriptionTotalOrders != '0') {
|
vendorModel.adminCommission?.isEnabled == true) {
|
||||||
|
if (vendorModel.subscriptionPlan != null) {
|
||||||
|
if (vendorModel.subscriptionTotalOrders == "-1") {
|
||||||
favouriteFoodList.add(value);
|
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);
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,14 @@ import 'package:customer/models/favorite_ondemand_service_model.dart';
|
|||||||
import 'package:customer/models/provider_serivce_model.dart';
|
import 'package:customer/models/provider_serivce_model.dart';
|
||||||
import 'package:customer/screen_ui/auth_screens/login_screen.dart';
|
import 'package:customer/screen_ui/auth_screens/login_screen.dart';
|
||||||
import 'package:customer/service/fire_store_utils.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 {
|
class FavouriteOndemmandController extends GetxController {
|
||||||
// Add your controller logic here
|
// Add your controller logic here
|
||||||
|
|
||||||
Rx<bool> isLoading = false.obs;
|
Rx<bool> isLoading = false.obs;
|
||||||
RxList<FavouriteOndemandServiceModel> lstFav = <FavouriteOndemandServiceModel>[].obs;
|
RxList<FavouriteOndemandServiceModel> lstFav =
|
||||||
|
<FavouriteOndemandServiceModel>[].obs;
|
||||||
RxList<CategoryModel> categories = <CategoryModel>[].obs;
|
RxList<CategoryModel> categories = <CategoryModel>[].obs;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -25,7 +26,9 @@ class FavouriteOndemmandController extends GetxController {
|
|||||||
await FireStoreUtils.getOnDemandCategory().then((catValue) {
|
await FireStoreUtils.getOnDemandCategory().then((catValue) {
|
||||||
categories.value = catValue;
|
categories.value = catValue;
|
||||||
});
|
});
|
||||||
await FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()).then((favList) {
|
await FireStoreUtils.getFavouritesServiceList(
|
||||||
|
FireStoreUtils.getCurrentUid(),
|
||||||
|
).then((favList) {
|
||||||
lstFav.value = favList;
|
lstFav.value = favList;
|
||||||
});
|
});
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
@@ -35,23 +38,27 @@ class FavouriteOndemmandController extends GetxController {
|
|||||||
if (Constant.userModel == null) {
|
if (Constant.userModel == null) {
|
||||||
Get.to(LoginScreen());
|
Get.to(LoginScreen());
|
||||||
} else {
|
} else {
|
||||||
var contain = lstFav.where((element) => element.service_id == provider.id);
|
var contain = lstFav.where(
|
||||||
|
(element) => element.service_id == provider.id,
|
||||||
|
);
|
||||||
if (contain.isNotEmpty) {
|
if (contain.isNotEmpty) {
|
||||||
FavouriteOndemandServiceModel favouriteModel = FavouriteOndemandServiceModel(
|
FavouriteOndemandServiceModel favouriteModel =
|
||||||
section_id: provider.sectionId,
|
FavouriteOndemandServiceModel(
|
||||||
service_id: provider.id,
|
section_id: provider.sectionId,
|
||||||
user_id: FireStoreUtils.getCurrentUid(),
|
service_id: provider.id,
|
||||||
serviceAuthorId: provider.author,
|
user_id: FireStoreUtils.getCurrentUid(),
|
||||||
);
|
serviceAuthorId: provider.author,
|
||||||
|
);
|
||||||
FireStoreUtils.removeFavouriteOndemandService(favouriteModel);
|
FireStoreUtils.removeFavouriteOndemandService(favouriteModel);
|
||||||
lstFav.removeWhere((item) => item.service_id == provider.id);
|
lstFav.removeWhere((item) => item.service_id == provider.id);
|
||||||
} else {
|
} else {
|
||||||
FavouriteOndemandServiceModel favouriteModel = FavouriteOndemandServiceModel(
|
FavouriteOndemandServiceModel favouriteModel =
|
||||||
section_id: provider.sectionId,
|
FavouriteOndemandServiceModel(
|
||||||
service_id: provider.id,
|
section_id: provider.sectionId,
|
||||||
user_id: FireStoreUtils.getCurrentUid(),
|
service_id: provider.id,
|
||||||
serviceAuthorId: provider.author,
|
user_id: FireStoreUtils.getCurrentUid(),
|
||||||
);
|
serviceAuthorId: provider.author,
|
||||||
|
);
|
||||||
FireStoreUtils.setFavouriteOndemandSection(favouriteModel);
|
FireStoreUtils.setFavouriteOndemandSection(favouriteModel);
|
||||||
lstFav.add(favouriteModel);
|
lstFav.add(favouriteModel);
|
||||||
}
|
}
|
||||||
@@ -63,7 +70,9 @@ class FavouriteOndemmandController extends GetxController {
|
|||||||
if (categoryId == null || categoryId.isEmpty) return null;
|
if (categoryId == null || categoryId.isEmpty) return null;
|
||||||
|
|
||||||
// Try to find category from cached list
|
// 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
|
// If not found, fetch from Firestore
|
||||||
cat ??= await FireStoreUtils.getCategoryById(categoryId);
|
cat ??= await FireStoreUtils.getCategoryById(categoryId);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import 'package:customer/models/vendor_model.dart';
|
|||||||
import 'package:customer/utils/preferences.dart';
|
import 'package:customer/utils/preferences.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.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:google_maps_flutter/google_maps_flutter.dart';
|
||||||
import '../models/banner_model.dart';
|
import '../models/banner_model.dart';
|
||||||
import '../models/story_model.dart';
|
import '../models/story_model.dart';
|
||||||
@@ -35,8 +35,10 @@ class FoodHomeController extends GetxController {
|
|||||||
RxBool isPopular = true.obs;
|
RxBool isPopular = true.obs;
|
||||||
RxString selectedOrderTypeValue = "Delivery".tr().obs;
|
RxString selectedOrderTypeValue = "Delivery".tr().obs;
|
||||||
|
|
||||||
Rx<PageController> pageController = PageController(viewportFraction: 0.877).obs;
|
Rx<PageController> pageController =
|
||||||
Rx<PageController> pageBottomController = PageController(viewportFraction: 0.877).obs;
|
PageController(viewportFraction: 0.877).obs;
|
||||||
|
Rx<PageController> pageBottomController =
|
||||||
|
PageController(viewportFraction: 0.877).obs;
|
||||||
RxInt currentPage = 0.obs;
|
RxInt currentPage = 0.obs;
|
||||||
RxInt currentBottomPage = 0.obs;
|
RxInt currentBottomPage = 0.obs;
|
||||||
|
|
||||||
@@ -66,7 +68,10 @@ class FoodHomeController extends GetxController {
|
|||||||
Future<void> getData() async {
|
Future<void> getData() async {
|
||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
getCartData();
|
getCartData();
|
||||||
selectedOrderTypeValue.value = Preferences.getString(Preferences.foodDeliveryType, defaultValue: "Delivery");
|
selectedOrderTypeValue.value = Preferences.getString(
|
||||||
|
Preferences.foodDeliveryType,
|
||||||
|
defaultValue: "Delivery",
|
||||||
|
);
|
||||||
await getZone();
|
await getZone();
|
||||||
FireStoreUtils.getAllNearestRestaurant().listen((event) async {
|
FireStoreUtils.getAllNearestRestaurant().listen((event) async {
|
||||||
popularRestaurantList.clear();
|
popularRestaurantList.clear();
|
||||||
@@ -82,17 +87,27 @@ class FoodHomeController extends GetxController {
|
|||||||
(a, b) => Constant.calculateReview(
|
(a, b) => Constant.calculateReview(
|
||||||
reviewCount: b.reviewsCount.toString(),
|
reviewCount: b.reviewsCount.toString(),
|
||||||
reviewSum: b.reviewsSum.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 getVendorCategory();
|
||||||
await FireStoreUtils.getHomeCoupon().then((value) {
|
await FireStoreUtils.getHomeCoupon().then((value) {
|
||||||
couponRestaurantList.clear();
|
couponRestaurantList.clear();
|
||||||
couponList.clear();
|
couponList.clear();
|
||||||
for (var element1 in value) {
|
for (var element1 in value) {
|
||||||
for (var element in allNearestRestaurant) {
|
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);
|
couponList.add(element1);
|
||||||
couponRestaurantList.add(element);
|
couponRestaurantList.add(element);
|
||||||
}
|
}
|
||||||
@@ -110,7 +125,7 @@ class FoodHomeController extends GetxController {
|
|||||||
print("nearestIds: $nearestIds");
|
print("nearestIds: $nearestIds");
|
||||||
// Filter stories whose vendorID exists in nearestIds
|
// Filter stories whose vendorID exists in nearestIds
|
||||||
storyList.addAll(
|
storyList.addAll(
|
||||||
stories.where((story) => nearestIds.contains(story.vendorID))
|
stories.where((story) => nearestIds.contains(story.vendorID)),
|
||||||
);
|
);
|
||||||
print("Filtered storyList length: ${storyList.length}");
|
print("Filtered storyList length: ${storyList.length}");
|
||||||
});
|
});
|
||||||
@@ -148,8 +163,16 @@ class FoodHomeController extends GetxController {
|
|||||||
await FireStoreUtils.getHomeVendorCategory().then((value) {
|
await FireStoreUtils.getHomeVendorCategory().then((value) {
|
||||||
vendorCategoryModel.value = value;
|
vendorCategoryModel.value = value;
|
||||||
if (Constant.restaurantList != null) {
|
if (Constant.restaurantList != null) {
|
||||||
List<String> usedCategoryIds = Constant.restaurantList!.expand((vendor) => vendor.categoryID ?? []).whereType<String>().toSet().toList();
|
List<String> usedCategoryIds =
|
||||||
vendorCategoryModel.value = vendorCategoryModel.where((category) => usedCategoryIds.contains(category.id)).toList();
|
Constant.restaurantList!
|
||||||
|
.expand((vendor) => vendor.categoryID ?? [])
|
||||||
|
.whereType<String>()
|
||||||
|
.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) {
|
await FireStoreUtils.getZone().then((value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
for (int i = 0; i < value.length; i++) {
|
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.selectedZone = value[i];
|
||||||
Constant.isZoneAvailable = true;
|
Constant.isZoneAvailable = true;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:firebase_auth/firebase_auth.dart';
|
import 'package:firebase_auth/firebase_auth.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import '../themes/show_toast_dialog.dart';
|
import '../themes/show_toast_dialog.dart';
|
||||||
|
|
||||||
class ForgotPasswordController extends GetxController {
|
class ForgotPasswordController extends GetxController {
|
||||||
@@ -26,7 +26,8 @@ class ForgotPasswordController extends GetxController {
|
|||||||
await FirebaseAuth.instance.sendPasswordResetEmail(email: email);
|
await FirebaseAuth.instance.sendPasswordResetEmail(email: email);
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
ShowToastDialog.showToast(
|
ShowToastDialog.showToast(
|
||||||
'reset_password_link_sent'.trParams({'email': email}),
|
'reset_password_link_sent'.tr(namedArgs: {'email': email})
|
||||||
|
|
||||||
);
|
);
|
||||||
Get.back();
|
Get.back();
|
||||||
} on FirebaseAuthException catch (e) {
|
} on FirebaseAuthException catch (e) {
|
||||||
@@ -34,7 +35,9 @@ class ForgotPasswordController extends GetxController {
|
|||||||
if (e.code == 'user-not-found') {
|
if (e.code == 'user-not-found') {
|
||||||
ShowToastDialog.showToast('No user found for that email.'.tr());
|
ShowToastDialog.showToast('No user found for that email.'.tr());
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast(e.message?.tr() ?? "something_went_wrong".tr());
|
ShowToastDialog.showToast(
|
||||||
|
e.message?.tr() ?? "something_went_wrong".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart';
|
|||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:customer/utils/preferences.dart';
|
import 'package:customer/utils/preferences.dart';
|
||||||
import 'package:flutter/material.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:http/http.dart' as http;
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
@@ -76,27 +76,31 @@ class GiftCardController extends GetxController {
|
|||||||
giftCardList = value;
|
giftCardList = value;
|
||||||
if (giftCardList.isNotEmpty) {
|
if (giftCardList.isNotEmpty) {
|
||||||
selectedGiftCard.value = giftCardList.first;
|
selectedGiftCard.value = giftCardList.first;
|
||||||
messageController.value.text = selectedGiftCard.value.message.toString();
|
messageController.value.text =
|
||||||
|
selectedGiftCard.value.message.toString();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(
|
await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((
|
||||||
(value) {
|
value,
|
||||||
if (value != null) {
|
) {
|
||||||
userModel.value = value;
|
if (value != null) {
|
||||||
}
|
userModel.value = value;
|
||||||
},
|
}
|
||||||
);
|
});
|
||||||
await getPaymentSettings();
|
await getPaymentSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> placeOrder() async {
|
Future<void> placeOrder() async {
|
||||||
if (selectedPaymentMethod.value == PaymentGateway.wallet.name) {
|
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();
|
setOrder();
|
||||||
} else {
|
} 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 {
|
} else {
|
||||||
setOrder();
|
setOrder();
|
||||||
@@ -116,26 +120,34 @@ class GiftCardController extends GetxController {
|
|||||||
giftCardsOrderModel.giftCode = generateGiftCode();
|
giftCardsOrderModel.giftCode = generateGiftCode();
|
||||||
giftCardsOrderModel.paymentType = selectedPaymentMethod.value;
|
giftCardsOrderModel.paymentType = selectedPaymentMethod.value;
|
||||||
giftCardsOrderModel.createdDate = Timestamp.now();
|
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.expireDate = Timestamp.fromDate(dateTime);
|
||||||
giftCardsOrderModel.userid = FireStoreUtils.getCurrentUid();
|
giftCardsOrderModel.userid = FireStoreUtils.getCurrentUid();
|
||||||
|
|
||||||
if (selectedPaymentMethod.value == PaymentGateway.wallet.name) {
|
if (selectedPaymentMethod.value == PaymentGateway.wallet.name) {
|
||||||
WalletTransactionModel transactionModel = WalletTransactionModel(
|
WalletTransactionModel transactionModel = WalletTransactionModel(
|
||||||
id: Constant.getUuid(),
|
id: Constant.getUuid(),
|
||||||
amount: double.parse(amountController.value.text),
|
amount: double.parse(amountController.value.text),
|
||||||
date: Timestamp.now(),
|
date: Timestamp.now(),
|
||||||
paymentMethod: PaymentGateway.wallet.name,
|
paymentMethod: PaymentGateway.wallet.name,
|
||||||
transactionUser: "user",
|
transactionUser: "user",
|
||||||
userId: FireStoreUtils.getCurrentUid(),
|
userId: FireStoreUtils.getCurrentUid(),
|
||||||
isTopup: false,
|
isTopup: false,
|
||||||
orderId: giftCardsOrderModel.id,
|
orderId: giftCardsOrderModel.id,
|
||||||
note: "Gift card purchase amount debited".tr(),
|
note: "Gift card purchase amount debited".tr(),
|
||||||
paymentStatus: "success".tr());
|
paymentStatus: "success".tr(),
|
||||||
|
);
|
||||||
|
|
||||||
await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async {
|
await FireStoreUtils.setWalletTransaction(transactionModel).then((
|
||||||
|
value,
|
||||||
|
) async {
|
||||||
if (value == true) {
|
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<Xendit> xenditModel = Xendit().obs;
|
Rx<Xendit> xenditModel = Xendit().obs;
|
||||||
|
|
||||||
Future<void> getPaymentSettings() async {
|
Future<void> getPaymentSettings() async {
|
||||||
await FireStoreUtils.getPaymentSettingsData().then(
|
await FireStoreUtils.getPaymentSettingsData().then((value) {
|
||||||
(value) {
|
payFastModel.value = PayFastModel.fromJson(
|
||||||
payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings)));
|
jsonDecode(Preferences.getString(Preferences.payFastSettings)),
|
||||||
mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago)));
|
);
|
||||||
payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings)));
|
mercadoPagoModel.value = MercadoPagoModel.fromJson(
|
||||||
stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings)));
|
jsonDecode(Preferences.getString(Preferences.mercadoPago)),
|
||||||
flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave)));
|
);
|
||||||
payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack)));
|
payPalModel.value = PayPalModel.fromJson(
|
||||||
paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings)));
|
jsonDecode(Preferences.getString(Preferences.paypalSettings)),
|
||||||
razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings)));
|
);
|
||||||
cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings)));
|
stripeModel.value = StripeModel.fromJson(
|
||||||
midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings)));
|
jsonDecode(Preferences.getString(Preferences.stripeSettings)),
|
||||||
orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)));
|
);
|
||||||
xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings)));
|
flutterWaveModel.value = FlutterWaveModel.fromJson(
|
||||||
walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings)));
|
jsonDecode(Preferences.getString(Preferences.flutterWave)),
|
||||||
if (walletSettingModel.value.isEnabled == true) {
|
);
|
||||||
selectedPaymentMethod.value = PaymentGateway.wallet.name;
|
payStackModel.value = PayStackModel.fromJson(
|
||||||
} else if (stripeModel.value.isEnabled == true) {
|
jsonDecode(Preferences.getString(Preferences.payStack)),
|
||||||
selectedPaymentMethod.value = PaymentGateway.stripe.name;
|
);
|
||||||
} else if (payPalModel.value.isEnabled == true) {
|
paytmModel.value = PaytmModel.fromJson(
|
||||||
selectedPaymentMethod.value = PaymentGateway.paypal.name;
|
jsonDecode(Preferences.getString(Preferences.paytmSettings)),
|
||||||
} else if (payStackModel.value.isEnable == true) {
|
);
|
||||||
selectedPaymentMethod.value = PaymentGateway.payStack.name;
|
razorPayModel.value = RazorPayModel.fromJson(
|
||||||
} else if (mercadoPagoModel.value.isEnabled == true) {
|
jsonDecode(Preferences.getString(Preferences.razorpaySettings)),
|
||||||
selectedPaymentMethod.value = PaymentGateway.mercadoPago.name;
|
);
|
||||||
} else if (flutterWaveModel.value.isEnable == true) {
|
cashOnDeliverySettingModel.value = CodSettingModel.fromJson(
|
||||||
selectedPaymentMethod.value = PaymentGateway.flutterWave.name;
|
jsonDecode(Preferences.getString(Preferences.codSettings)),
|
||||||
}else if (payFastModel.value.isEnable == true) {
|
);
|
||||||
selectedPaymentMethod.value = PaymentGateway.payFast.name;
|
midTransModel.value = MidTrans.fromJson(
|
||||||
} else if (razorPayModel.value.isEnabled == true) {
|
jsonDecode(Preferences.getString(Preferences.midTransSettings)),
|
||||||
selectedPaymentMethod.value = PaymentGateway.razorpay.name;
|
);
|
||||||
} else if (midTransModel.value.enable == true) {
|
orangeMoneyModel.value = OrangeMoney.fromJson(
|
||||||
selectedPaymentMethod.value = PaymentGateway.midTrans.name;
|
jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)),
|
||||||
} else if (orangeMoneyModel.value.enable == true) {
|
);
|
||||||
selectedPaymentMethod.value = PaymentGateway.orangeMoney.name;
|
xenditModel.value = Xendit.fromJson(
|
||||||
} else if (xenditModel.value.enable == true) {
|
jsonDecode(Preferences.getString(Preferences.xenditSettings)),
|
||||||
selectedPaymentMethod.value = PaymentGateway.xendit.name;
|
);
|
||||||
}
|
walletSettingModel.value = WalletSettingModel.fromJson(
|
||||||
Stripe.publishableKey = stripeModel.value.clientpublishableKey.toString();
|
jsonDecode(Preferences.getString(Preferences.walletSettings)),
|
||||||
Stripe.merchantIdentifier = 'GoRide';
|
);
|
||||||
Stripe.instance.applySettings();
|
if (walletSettingModel.value.isEnabled == true) {
|
||||||
setRef();
|
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_PAYMENT_SUCCESS, handlePaymentSuccess);
|
||||||
razorPay.on(Razorpay.EVENT_EXTERNAL_WALLET, handleExternalWaller);
|
razorPay.on(Razorpay.EVENT_EXTERNAL_WALLET, handleExternalWaller);
|
||||||
razorPay.on(Razorpay.EVENT_PAYMENT_ERROR, handlePaymentError);
|
razorPay.on(Razorpay.EVENT_PAYMENT_ERROR, handlePaymentError);
|
||||||
},
|
});
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// final _flutterPaypalNativePlugin = FlutterPaypalNative.instance;
|
// final _flutterPaypalNativePlugin = FlutterPaypalNative.instance;
|
||||||
@@ -297,28 +333,34 @@ class GiftCardController extends GetxController {
|
|||||||
// Strip
|
// Strip
|
||||||
Future<void> stripeMakePayment({required String amount}) async {
|
Future<void> stripeMakePayment({required String amount}) async {
|
||||||
try {
|
try {
|
||||||
Map<String, dynamic>? paymentIntentData = await createStripeIntent(amount: amount);
|
Map<String, dynamic>? paymentIntentData = await createStripeIntent(
|
||||||
|
amount: amount,
|
||||||
|
);
|
||||||
if (paymentIntentData!.containsKey("error")) {
|
if (paymentIntentData!.containsKey("error")) {
|
||||||
Get.back();
|
Get.back();
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.");
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.",
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
await Stripe.instance.initPaymentSheet(
|
await Stripe.instance.initPaymentSheet(
|
||||||
paymentSheetParameters: SetupPaymentSheetParameters(
|
paymentSheetParameters: SetupPaymentSheetParameters(
|
||||||
paymentIntentClientSecret: paymentIntentData['client_secret'],
|
paymentIntentClientSecret: paymentIntentData['client_secret'],
|
||||||
allowsDelayedPaymentMethods: false,
|
allowsDelayedPaymentMethods: false,
|
||||||
googlePay: const PaymentSheetGooglePay(
|
googlePay: const PaymentSheetGooglePay(
|
||||||
merchantCountryCode: 'US',
|
merchantCountryCode: 'US',
|
||||||
testEnv: true,
|
testEnv: true,
|
||||||
currencyCode: "USD",
|
currencyCode: "USD",
|
||||||
),
|
),
|
||||||
customFlow: true,
|
customFlow: true,
|
||||||
style: ThemeMode.system,
|
style: ThemeMode.system,
|
||||||
appearance: PaymentSheetAppearance(
|
appearance: PaymentSheetAppearance(
|
||||||
colors: PaymentSheetAppearanceColors(
|
colors: PaymentSheetAppearanceColors(
|
||||||
primary: AppThemeData.primary300,
|
primary: AppThemeData.primary300,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
merchantDisplayName: 'GoRide'));
|
merchantDisplayName: 'GoRide',
|
||||||
|
),
|
||||||
|
);
|
||||||
displayStripePaymentSheet(amount: amount);
|
displayStripePaymentSheet(amount: amount);
|
||||||
}
|
}
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
@@ -357,8 +399,14 @@ class GiftCardController extends GetxController {
|
|||||||
"shipping[address][country]": "US",
|
"shipping[address][country]": "US",
|
||||||
};
|
};
|
||||||
var stripeSecret = stripeModel.value.stripeSecret;
|
var stripeSecret = stripeModel.value.stripeSecret;
|
||||||
var response = await http.post(Uri.parse('https://api.stripe.com/v1/payment_intents'),
|
var response = await http.post(
|
||||||
body: body, headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'});
|
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);
|
return jsonDecode(response.body);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -367,7 +415,10 @@ class GiftCardController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//mercadoo
|
//mercadoo
|
||||||
Future<Null> mercadoPagoMakePayment({required BuildContext context, required String amount}) async {
|
Future<Null> mercadoPagoMakePayment({
|
||||||
|
required BuildContext context,
|
||||||
|
required String amount,
|
||||||
|
}) async {
|
||||||
final headers = {
|
final headers = {
|
||||||
'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}',
|
'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}',
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
@@ -381,7 +432,7 @@ class GiftCardController extends GetxController {
|
|||||||
"quantity": 1,
|
"quantity": 1,
|
||||||
"currency_id": "BRL", // or your preferred currency
|
"currency_id": "BRL", // or your preferred currency
|
||||||
"unit_price": double.parse(amount),
|
"unit_price": double.parse(amount),
|
||||||
}
|
},
|
||||||
],
|
],
|
||||||
"payer": {"email": userModel.value.email},
|
"payer": {"email": userModel.value.email},
|
||||||
"back_urls": {
|
"back_urls": {
|
||||||
@@ -389,7 +440,8 @@ class GiftCardController extends GetxController {
|
|||||||
"pending": "${Constant.globalUrl}payment/pending",
|
"pending": "${Constant.globalUrl}payment/pending",
|
||||||
"success": "${Constant.globalUrl}payment/success",
|
"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(
|
final response = await http.post(
|
||||||
@@ -417,18 +469,22 @@ class GiftCardController extends GetxController {
|
|||||||
///PayStack Payment Method
|
///PayStack Payment Method
|
||||||
Future<void> payStackPayment(String totalAmount) async {
|
Future<void> payStackPayment(String totalAmount) async {
|
||||||
await PayStackURLGen.payStackURLGen(
|
await PayStackURLGen.payStackURLGen(
|
||||||
amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value)
|
amount: (double.parse(totalAmount) * 100).toString(),
|
||||||
.then((value) async {
|
currency: "ZAR",
|
||||||
|
secretKey: payStackModel.value.secretKey.toString(),
|
||||||
|
userModel: userModel.value,
|
||||||
|
).then((value) async {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
PayStackUrlModel payStackModel0 = value;
|
PayStackUrlModel payStackModel0 = value;
|
||||||
Get.to(PayStackScreen(
|
Get.to(
|
||||||
secretKey: payStackModel.value.secretKey.toString(),
|
PayStackScreen(
|
||||||
callBackUrl: payStackModel.value.callbackURL.toString(),
|
secretKey: payStackModel.value.secretKey.toString(),
|
||||||
initialURl: payStackModel0.data.authorizationUrl,
|
callBackUrl: payStackModel.value.callbackURL.toString(),
|
||||||
amount: totalAmount,
|
initialURl: payStackModel0.data.authorizationUrl,
|
||||||
reference: payStackModel0.data.reference,
|
amount: totalAmount,
|
||||||
))!
|
reference: payStackModel0.data.reference,
|
||||||
.then((value) {
|
),
|
||||||
|
)!.then((value) {
|
||||||
if (value) {
|
if (value) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
placeOrder();
|
placeOrder();
|
||||||
@@ -437,13 +493,18 @@ class GiftCardController extends GetxController {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//flutter wave Payment Method
|
//flutter wave Payment Method
|
||||||
Future<Null> flutterWaveInitiatePayment({required BuildContext context, required String amount}) async {
|
Future<Null> flutterWaveInitiatePayment({
|
||||||
|
required BuildContext context,
|
||||||
|
required String amount,
|
||||||
|
}) async {
|
||||||
final url = Uri.parse('https://api.flutterwave.com/v3/payments');
|
final url = Uri.parse('https://api.flutterwave.com/v3/payments');
|
||||||
final headers = {
|
final headers = {
|
||||||
'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}',
|
'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}',
|
||||||
@@ -464,14 +525,16 @@ class GiftCardController extends GetxController {
|
|||||||
"customizations": {
|
"customizations": {
|
||||||
"title": "Payment for Services",
|
"title": "Payment for Services",
|
||||||
"description": "Payment for XYZ services",
|
"description": "Payment for XYZ services",
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
final response = await http.post(url, headers: headers, body: body);
|
final response = await http.post(url, headers: headers, body: body);
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
final data = jsonDecode(response.body);
|
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) {
|
if (value) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
placeOrder();
|
placeOrder();
|
||||||
@@ -500,8 +563,14 @@ class GiftCardController extends GetxController {
|
|||||||
|
|
||||||
// payFast
|
// payFast
|
||||||
void payFastPayment({required BuildContext context, required String amount}) {
|
void payFastPayment({required BuildContext context, required String amount}) {
|
||||||
PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value).then((String? value) async {
|
PayStackURLGen.getPayHTML(
|
||||||
bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value));
|
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) {
|
if (isDone) {
|
||||||
Get.back();
|
Get.back();
|
||||||
ShowToastDialog.showToast("Payment successfully".tr());
|
ShowToastDialog.showToast("Payment successfully".tr());
|
||||||
@@ -513,38 +582,40 @@ class GiftCardController extends GetxController {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//PayPal
|
//PayPal
|
||||||
void paypalPaymentSheet(String amount, context) {
|
void paypalPaymentSheet(String amount, context) {
|
||||||
Navigator.of(context).push(
|
Navigator.of(context).push(
|
||||||
MaterialPageRoute(
|
MaterialPageRoute(
|
||||||
builder: (BuildContext context) => UsePaypal(
|
builder:
|
||||||
sandboxMode: payPalModel.value.isLive == true ? false : true,
|
(BuildContext context) => UsePaypal(
|
||||||
clientId: payPalModel.value.paypalClient ?? '',
|
sandboxMode: payPalModel.value.isLive == true ? false : true,
|
||||||
secretKey: payPalModel.value.paypalSecret ?? '',
|
clientId: payPalModel.value.paypalClient ?? '',
|
||||||
returnURL: "com.parkme://paypalpay",
|
secretKey: payPalModel.value.paypalSecret ?? '',
|
||||||
cancelURL: "com.parkme://paypalpay",
|
returnURL: "com.parkme://paypalpay",
|
||||||
transactions: [
|
cancelURL: "com.parkme://paypalpay",
|
||||||
{
|
transactions: [
|
||||||
"amount": {
|
{
|
||||||
"total": amount,
|
"amount": {
|
||||||
"currency": "USD",
|
"total": amount,
|
||||||
"details": {"subtotal": amount}
|
"currency": "USD",
|
||||||
|
"details": {"subtotal": amount},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
],
|
||||||
],
|
note: "Contact us for any questions on your order.",
|
||||||
note: "Contact us for any questions on your order.",
|
onSuccess: (Map params) async {
|
||||||
onSuccess: (Map params) async {
|
placeOrder();
|
||||||
placeOrder();
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
},
|
||||||
},
|
onError: (error) {
|
||||||
onError: (error) {
|
Get.back();
|
||||||
Get.back();
|
ShowToastDialog.showToast("Payment UnSuccessful!!".tr());
|
||||||
ShowToastDialog.showToast("Payment UnSuccessful!!".tr());
|
},
|
||||||
},
|
onCancel: (params) {
|
||||||
onCancel: (params) {
|
Get.back();
|
||||||
Get.back();
|
ShowToastDialog.showToast("Payment UnSuccessful!!".tr());
|
||||||
ShowToastDialog.showToast("Payment UnSuccessful!!".tr());
|
},
|
||||||
}),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -555,33 +626,52 @@ class GiftCardController extends GetxController {
|
|||||||
String getChecksum = "${Constant.globalUrl}payments/getpaytmchecksum";
|
String getChecksum = "${Constant.globalUrl}payments/getpaytmchecksum";
|
||||||
|
|
||||||
final response = await http.post(
|
final response = await http.post(
|
||||||
Uri.parse(
|
Uri.parse(getChecksum),
|
||||||
getChecksum,
|
headers: {},
|
||||||
),
|
body: {
|
||||||
headers: {},
|
"mid": paytmModel.value.paytmMID.toString(),
|
||||||
body: {
|
"order_id": orderId,
|
||||||
"mid": paytmModel.value.paytmMID.toString(),
|
"key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(),
|
||||||
"order_id": orderId,
|
},
|
||||||
"key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(),
|
);
|
||||||
});
|
|
||||||
|
|
||||||
final data = jsonDecode(response.body);
|
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) {
|
initiatePayment(amount: amount, orderId: orderId).then((value) {
|
||||||
String callback = "";
|
String callback = "";
|
||||||
if (paytmModel.value.isSandboxEnabled == true) {
|
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 {
|
} 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;
|
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<void> startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async {
|
Future<void> startTransaction(
|
||||||
|
context, {
|
||||||
|
required String txnTokenBy,
|
||||||
|
required orderId,
|
||||||
|
required double amount,
|
||||||
|
required callBackURL,
|
||||||
|
required isStaging,
|
||||||
|
}) async {
|
||||||
// try {
|
// try {
|
||||||
// var response = AllInOneSdk.startTransaction(
|
// var response = AllInOneSdk.startTransaction(
|
||||||
// paytmModel.value.paytmMID.toString(),
|
// 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";
|
String getChecksum = "${Constant.globalUrl}payments/validatechecksum";
|
||||||
final response = await http.post(
|
final response = await http.post(
|
||||||
Uri.parse(
|
Uri.parse(getChecksum),
|
||||||
getChecksum,
|
headers: {},
|
||||||
),
|
body: {
|
||||||
headers: {},
|
"mid": paytmModel.value.paytmMID.toString(),
|
||||||
body: {
|
"order_id": orderId,
|
||||||
"mid": paytmModel.value.paytmMID.toString(),
|
"key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(),
|
||||||
"order_id": orderId,
|
"checksum_value": checkSum,
|
||||||
"key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(),
|
},
|
||||||
"checksum_value": checkSum,
|
);
|
||||||
});
|
|
||||||
final data = jsonDecode(response.body);
|
final data = jsonDecode(response.body);
|
||||||
return data['status'];
|
return data['status'];
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<GetPaymentTxtTokenModel> initiatePayment({required double amount, required orderId}) async {
|
Future<GetPaymentTxtTokenModel> initiatePayment({
|
||||||
|
required double amount,
|
||||||
|
required orderId,
|
||||||
|
}) async {
|
||||||
String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment";
|
String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment";
|
||||||
String callback = "";
|
String callback = "";
|
||||||
if (paytmModel.value.isSandboxEnabled == true) {
|
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 {
|
} 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: {
|
final response = await http.post(
|
||||||
"mid": paytmModel.value.paytmMID,
|
Uri.parse(initiateURL),
|
||||||
"order_id": orderId,
|
headers: {},
|
||||||
"key_secret": paytmModel.value.pAYTMMERCHANTKEY,
|
body: {
|
||||||
"amount": amount.toString(),
|
"mid": paytmModel.value.paytmMID,
|
||||||
"currency": "INR",
|
"order_id": orderId,
|
||||||
"callback_url": callback,
|
"key_secret": paytmModel.value.pAYTMMERCHANTKEY,
|
||||||
"custId": FireStoreUtils.getCurrentUid(),
|
"amount": amount.toString(),
|
||||||
"issandbox": paytmModel.value.isSandboxEnabled == true ? "1" : "2",
|
"currency": "INR",
|
||||||
});
|
"callback_url": callback,
|
||||||
|
"custId": FireStoreUtils.getCurrentUid(),
|
||||||
|
"issandbox": paytmModel.value.isSandboxEnabled == true ? "1" : "2",
|
||||||
|
},
|
||||||
|
);
|
||||||
print(response.body);
|
print(response.body);
|
||||||
final data = jsonDecode(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();
|
Get.back();
|
||||||
ShowToastDialog.showToast("something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return GetPaymentTxtTokenModel.fromJson(data);
|
return GetPaymentTxtTokenModel.fromJson(data);
|
||||||
}
|
}
|
||||||
@@ -678,8 +783,8 @@ class GiftCardController extends GetxController {
|
|||||||
'email': userModel.value.email,
|
'email': userModel.value.email,
|
||||||
},
|
},
|
||||||
'external': {
|
'external': {
|
||||||
'wallets': ['paytm']
|
'wallets': ['paytm'],
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -706,14 +811,14 @@ class GiftCardController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Midtrans payment
|
//Midtrans payment
|
||||||
Future<void> midtransMakePayment({required String amount, required BuildContext context}) async {
|
Future<void> midtransMakePayment({
|
||||||
|
required String amount,
|
||||||
|
required BuildContext context,
|
||||||
|
}) async {
|
||||||
await createPaymentLink(amount: amount).then((url) {
|
await createPaymentLink(amount: amount).then((url) {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
if (url != '') {
|
if (url != '') {
|
||||||
Get.to(() => MidtransScreen(
|
Get.to(() => MidtransScreen(initialURl: url))!.then((value) {
|
||||||
initialURl: url,
|
|
||||||
))!
|
|
||||||
.then((value) {
|
|
||||||
if (value == true) {
|
if (value == true) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
placeOrder();
|
placeOrder();
|
||||||
@@ -727,14 +832,20 @@ class GiftCardController extends GetxController {
|
|||||||
|
|
||||||
Future<String> createPaymentLink({required var amount}) async {
|
Future<String> createPaymentLink({required var amount}) async {
|
||||||
var ordersId = const Uuid().v1();
|
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(
|
final response = await http.post(
|
||||||
url,
|
url,
|
||||||
headers: {
|
headers: {
|
||||||
'Accept': 'application/json',
|
'Accept': 'application/json',
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!),
|
'Authorization': generateBasicAuthHeader(
|
||||||
|
midTransModel.value.serverKey!,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
body: jsonEncode({
|
body: jsonEncode({
|
||||||
'transaction_details': {
|
'transaction_details': {
|
||||||
@@ -742,7 +853,9 @@ class GiftCardController extends GetxController {
|
|||||||
'gross_amount': double.parse(amount.toString()).toInt(),
|
'gross_amount': double.parse(amount.toString()).toInt(),
|
||||||
},
|
},
|
||||||
'usage_limit': 2,
|
'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);
|
final responseData = jsonDecode(response.body);
|
||||||
return responseData['payment_url'];
|
return responseData['payment_url'];
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -767,21 +882,30 @@ class GiftCardController extends GetxController {
|
|||||||
static String orderId = '';
|
static String orderId = '';
|
||||||
static String amount = '';
|
static String amount = '';
|
||||||
|
|
||||||
Future<void> orangeMakePayment({required String amount, required BuildContext context}) async {
|
Future<void> orangeMakePayment({
|
||||||
|
required String amount,
|
||||||
|
required BuildContext context,
|
||||||
|
}) async {
|
||||||
reset();
|
reset();
|
||||||
var id = const Uuid().v4();
|
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();
|
ShowToastDialog.closeLoader();
|
||||||
if (paymentURL.toString() != '') {
|
if (paymentURL.toString() != '') {
|
||||||
Get.to(() => OrangeMoneyScreen(
|
Get.to(
|
||||||
initialURl: paymentURL,
|
() => OrangeMoneyScreen(
|
||||||
accessToken: accessToken,
|
initialURl: paymentURL,
|
||||||
amount: amount,
|
accessToken: accessToken,
|
||||||
orangePay: orangeMoneyModel.value,
|
amount: amount,
|
||||||
orderId: orderId,
|
orangePay: orangeMoneyModel.value,
|
||||||
payToken: payToken,
|
orderId: orderId,
|
||||||
))!
|
payToken: payToken,
|
||||||
.then((value) {
|
),
|
||||||
|
)!.then((value) {
|
||||||
if (value == true) {
|
if (value == true) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
placeOrder();
|
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';
|
String apiUrl = 'https://api.orange.com/oauth/v3/token';
|
||||||
Map<String, String> requestBody = {
|
Map<String, String> requestBody = {'grant_type': 'client_credentials'};
|
||||||
'grant_type': 'client_credentials',
|
|
||||||
};
|
|
||||||
|
|
||||||
var response = await http.post(Uri.parse(apiUrl),
|
var response = await http.post(
|
||||||
headers: <String, String>{
|
Uri.parse(apiUrl),
|
||||||
'Authorization': "Basic ${orangeMoneyModel.value.auth!}",
|
headers: <String, String>{
|
||||||
'Content-Type': 'application/x-www-form-urlencoded',
|
'Authorization': "Basic ${orangeMoneyModel.value.auth!}",
|
||||||
'Accept': 'application/json',
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
},
|
'Accept': 'application/json',
|
||||||
body: requestBody);
|
},
|
||||||
|
body: requestBody,
|
||||||
|
);
|
||||||
|
|
||||||
// Handle the response
|
// Handle the response
|
||||||
|
|
||||||
@@ -814,18 +943,32 @@ class GiftCardController extends GetxController {
|
|||||||
|
|
||||||
accessToken = responseData['access_token'];
|
accessToken = responseData['access_token'];
|
||||||
// ignore: use_build_context_synchronously
|
// 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 {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
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;
|
orderId = orderIdData;
|
||||||
amount = amountData;
|
amount = amountData;
|
||||||
String apiUrl =
|
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<String, String> requestBody = {
|
Map<String, String> requestBody = {
|
||||||
"merchant_key": orangeMoneyModel.value.merchantKey ?? '',
|
"merchant_key": orangeMoneyModel.value.merchantKey ?? '',
|
||||||
"currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency,
|
"currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency,
|
||||||
@@ -840,7 +983,11 @@ class GiftCardController extends GetxController {
|
|||||||
|
|
||||||
var response = await http.post(
|
var response = await http.post(
|
||||||
Uri.parse(apiUrl),
|
Uri.parse(apiUrl),
|
||||||
headers: <String, String>{'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'},
|
headers: <String, String>{
|
||||||
|
'Authorization': 'Bearer $accessToken',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
body: json.encode(requestBody),
|
body: json.encode(requestBody),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -854,7 +1001,9 @@ class GiftCardController extends GetxController {
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -871,12 +1020,13 @@ class GiftCardController extends GetxController {
|
|||||||
await createXenditInvoice(amount: amount).then((model) {
|
await createXenditInvoice(amount: amount).then((model) {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
if (model.id != null) {
|
if (model.id != null) {
|
||||||
Get.to(() => XenditScreen(
|
Get.to(
|
||||||
initialURl: model.invoiceUrl ?? '',
|
() => XenditScreen(
|
||||||
transId: model.id ?? '',
|
initialURl: model.invoiceUrl ?? '',
|
||||||
apiKey: xenditModel.value.apiKey!.toString(),
|
transId: model.id ?? '',
|
||||||
))!
|
apiKey: xenditModel.value.apiKey!.toString(),
|
||||||
.then((value) {
|
),
|
||||||
|
)!.then((value) {
|
||||||
if (value == true) {
|
if (value == true) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
placeOrder();
|
placeOrder();
|
||||||
@@ -893,7 +1043,9 @@ class GiftCardController extends GetxController {
|
|||||||
const url = 'https://api.xendit.co/v2/invoices';
|
const url = 'https://api.xendit.co/v2/invoices';
|
||||||
var headers = {
|
var headers = {
|
||||||
'Content-Type': 'application/json',
|
'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',
|
// 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ',
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -906,7 +1058,11 @@ class GiftCardController extends GetxController {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
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) {
|
if (response.statusCode == 200 || response.statusCode == 201) {
|
||||||
XenditModel model = XenditModel.fromJson(jsonDecode(response.body));
|
XenditModel model = XenditModel.fromJson(jsonDecode(response.body));
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import 'package:customer/models/currency_model.dart';
|
|||||||
import 'package:customer/models/user_model.dart';
|
import 'package:customer/models/user_model.dart';
|
||||||
import 'package:customer/utils/notification_service.dart';
|
import 'package:customer/utils/notification_service.dart';
|
||||||
import 'package:firebase_auth/firebase_auth.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 '../constant/collection_name.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
|
|
||||||
@@ -18,13 +18,27 @@ class GlobalSettingController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getCurrentCurrency() async {
|
Future<void> getCurrentCurrency() async {
|
||||||
FireStoreUtils.fireStore.collection(CollectionName.currencies).where("isActive", isEqualTo: true).snapshots().listen((event) {
|
FireStoreUtils.fireStore
|
||||||
if (event.docs.isNotEmpty) {
|
.collection(CollectionName.currencies)
|
||||||
Constant.currencyModel = CurrencyModel.fromJson(event.docs.first.data());
|
.where("isActive", isEqualTo: true)
|
||||||
} else {
|
.snapshots()
|
||||||
Constant.currencyModel = CurrencyModel(id: "", code: "USD", decimal: 2, isactive: true, name: "US Dollar", symbol: "\$", symbolatright: false);
|
.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();
|
await FireStoreUtils.getSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,7 +49,9 @@ class GlobalSettingController extends GetxController {
|
|||||||
String token = await NotificationService.getToken();
|
String token = await NotificationService.getToken();
|
||||||
log(":::::::TOKEN:::::: $token");
|
log(":::::::TOKEN:::::: $token");
|
||||||
if (FirebaseAuth.instance.currentUser != null) {
|
if (FirebaseAuth.instance.currentUser != null) {
|
||||||
await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) {
|
await FireStoreUtils.getUserProfile(
|
||||||
|
FireStoreUtils.getCurrentUid(),
|
||||||
|
).then((value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
UserModel driverUserModel = value;
|
UserModel driverUserModel = value;
|
||||||
driverUserModel.fcmToken = token;
|
driverUserModel.fcmToken = token;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import 'package:customer/models/gift_cards_order_model.dart';
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:share_plus/share_plus.dart';
|
import 'package:share_plus/share_plus.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class HistoryGiftCardController extends GetxController {
|
class HistoryGiftCardController extends GetxController {
|
||||||
RxList<GiftCardsOrderModel> giftCardsOrderList = <GiftCardsOrderModel>[].obs;
|
RxList<GiftCardsOrderModel> giftCardsOrderList = <GiftCardsOrderModel>[].obs;
|
||||||
@@ -25,13 +25,20 @@ class HistoryGiftCardController extends GetxController {
|
|||||||
|
|
||||||
void updateList(int index) {
|
void updateList(int index) {
|
||||||
GiftCardsOrderModel giftCardsOrderModel = giftCardsOrderList[index];
|
GiftCardsOrderModel giftCardsOrderModel = giftCardsOrderList[index];
|
||||||
giftCardsOrderModel.isPasswordShow = giftCardsOrderModel.isPasswordShow == true ? false : true;
|
giftCardsOrderModel.isPasswordShow =
|
||||||
|
giftCardsOrderModel.isPasswordShow == true ? false : true;
|
||||||
|
|
||||||
giftCardsOrderList.removeAt(index);
|
giftCardsOrderList.removeAt(index);
|
||||||
giftCardsOrderList.insert(index, giftCardsOrderModel);
|
giftCardsOrderList.insert(index, giftCardsOrderModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> share(String giftCode, String giftPin, String msg, String amount, Timestamp date) async {
|
Future<void> share(
|
||||||
|
String giftCode,
|
||||||
|
String giftPin,
|
||||||
|
String msg,
|
||||||
|
String amount,
|
||||||
|
Timestamp date,
|
||||||
|
) async {
|
||||||
await Share.share(
|
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",
|
"${'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",
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -8,8 +8,7 @@ import 'package:customer/models/vendor_model.dart';
|
|||||||
import 'package:customer/service/cart_provider.dart';
|
import 'package:customer/service/cart_provider.dart';
|
||||||
import 'package:customer/service/fire_store_utils.dart';
|
import 'package:customer/service/fire_store_utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
import '../constant/constant.dart';
|
import '../constant/constant.dart';
|
||||||
|
|
||||||
class HomeECommerceController extends GetxController {
|
class HomeECommerceController extends GetxController {
|
||||||
@@ -27,8 +26,10 @@ class HomeECommerceController extends GetxController {
|
|||||||
RxBool isListView = true.obs;
|
RxBool isListView = true.obs;
|
||||||
RxBool isPopular = true.obs;
|
RxBool isPopular = true.obs;
|
||||||
|
|
||||||
Rx<PageController> pageController = PageController(viewportFraction: 0.877).obs;
|
Rx<PageController> pageController =
|
||||||
Rx<PageController> pageBottomController = PageController(viewportFraction: 0.877).obs;
|
PageController(viewportFraction: 0.877).obs;
|
||||||
|
Rx<PageController> pageBottomController =
|
||||||
|
PageController(viewportFraction: 0.877).obs;
|
||||||
RxInt currentPage = 0.obs;
|
RxInt currentPage = 0.obs;
|
||||||
RxInt currentBottomPage = 0.obs;
|
RxInt currentBottomPage = 0.obs;
|
||||||
|
|
||||||
@@ -41,7 +42,8 @@ class HomeECommerceController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RxList<VendorCategoryModel> vendorCategoryModel = <VendorCategoryModel>[].obs;
|
RxList<VendorCategoryModel> vendorCategoryModel = <VendorCategoryModel>[].obs;
|
||||||
RxList<VendorCategoryModel> categoryWiseProductList = <VendorCategoryModel>[].obs;
|
RxList<VendorCategoryModel> categoryWiseProductList =
|
||||||
|
<VendorCategoryModel>[].obs;
|
||||||
|
|
||||||
RxList<VendorModel> allNearestRestaurant = <VendorModel>[].obs;
|
RxList<VendorModel> allNearestRestaurant = <VendorModel>[].obs;
|
||||||
RxList<VendorModel> newArrivalRestaurantList = <VendorModel>[].obs;
|
RxList<VendorModel> newArrivalRestaurantList = <VendorModel>[].obs;
|
||||||
@@ -64,10 +66,22 @@ class HomeECommerceController extends GetxController {
|
|||||||
allNearestRestaurant.addAll(event);
|
allNearestRestaurant.addAll(event);
|
||||||
newArrivalRestaurantList.addAll(event);
|
newArrivalRestaurantList.addAll(event);
|
||||||
Constant.restaurantList = allNearestRestaurant;
|
Constant.restaurantList = allNearestRestaurant;
|
||||||
List<String> usedCategoryIds = allNearestRestaurant.expand((vendor) => vendor.categoryID ?? []).whereType<String>().toSet().toList();
|
List<String> usedCategoryIds =
|
||||||
vendorCategoryModel.value = vendorCategoryModel.where((category) => usedCategoryIds.contains(category.id)).toList();
|
allNearestRestaurant
|
||||||
|
.expand((vendor) => vendor.categoryID ?? [])
|
||||||
|
.whereType<String>()
|
||||||
|
.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) {
|
if (Constant.isEnableAdsFeature == true) {
|
||||||
await FireStoreUtils.getAllAdvertisement().then((value) {
|
await FireStoreUtils.getAllAdvertisement().then((value) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'dart:developer';
|
import 'dart:developer';
|
||||||
|
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import '../models/banner_model.dart';
|
import '../models/banner_model.dart';
|
||||||
import '../models/parcel_category.dart';
|
import '../models/parcel_category.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import 'package:customer/models/order_model.dart';
|
|||||||
import 'package:customer/models/user_model.dart';
|
import 'package:customer/models/user_model.dart';
|
||||||
import 'package:customer/service/fire_store_utils.dart';
|
import 'package:customer/service/fire_store_utils.dart';
|
||||||
import 'package:flutter/material.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:google_maps_flutter/google_maps_flutter.dart';
|
||||||
import 'package:latlong2/latlong.dart' as location;
|
import 'package:latlong2/latlong.dart' as location;
|
||||||
import 'package:flutter_map/flutter_map.dart' as flutterMap;
|
import 'package:flutter_map/flutter_map.dart' as flutterMap;
|
||||||
@@ -59,37 +59,58 @@ class LiveTrackingController extends GetxController {
|
|||||||
|
|
||||||
orderModel.value = args['orderModel'];
|
orderModel.value = args['orderModel'];
|
||||||
|
|
||||||
orderSub = FireStoreUtils.fireStore.collection(CollectionName.vendorOrders).doc(orderModel.value.id).snapshots().listen((orderSnap) {
|
orderSub = FireStoreUtils.fireStore
|
||||||
if (orderSnap.data() == null) return;
|
.collection(CollectionName.vendorOrders)
|
||||||
orderModel.value = OrderModel.fromJson(orderSnap.data()!);
|
.doc(orderModel.value.id)
|
||||||
|
.snapshots()
|
||||||
|
.listen((orderSnap) {
|
||||||
|
if (orderSnap.data() == null) return;
|
||||||
|
orderModel.value = OrderModel.fromJson(orderSnap.data()!);
|
||||||
|
|
||||||
if (orderModel.value.driverID != null) {
|
if (orderModel.value.driverID != null) {
|
||||||
driverSub?.cancel();
|
driverSub?.cancel();
|
||||||
driverSub = FireStoreUtils.fireStore.collection(CollectionName.users).doc(orderModel.value.driverID).snapshots().listen((driverSnap) async {
|
driverSub = FireStoreUtils.fireStore
|
||||||
if (driverSnap.data() == null) return;
|
.collection(CollectionName.users)
|
||||||
driverUserModel.value = UserModel.fromJson(driverSnap.data()!);
|
.doc(orderModel.value.driverID)
|
||||||
await updateLiveTracking();
|
.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;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> updateLiveTracking() async {
|
Future<void> 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();
|
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();
|
await showDriverToCustomerRoute();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -136,7 +157,10 @@ class LiveTrackingController extends GetxController {
|
|||||||
routePoints.clear();
|
routePoints.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> fetchRoute(location.LatLng source, location.LatLng destination) async {
|
Future<void> fetchRoute(
|
||||||
|
location.LatLng source,
|
||||||
|
location.LatLng destination,
|
||||||
|
) async {
|
||||||
final url = Uri.parse(
|
final url = Uri.parse(
|
||||||
'https://router.project-osrm.org/route/v1/driving/${source.longitude},${source.latitude};${destination.longitude},${destination.latitude}?overview=full&geometries=geojson',
|
'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) {
|
if (response.statusCode == 200) {
|
||||||
final data = json.decode(response.body);
|
final data = json.decode(response.body);
|
||||||
final coords = data['routes'][0]['geometry']['coordinates'];
|
final coords = data['routes'][0]['geometry']['coordinates'];
|
||||||
routePoints.value = coords.map<location.LatLng>((c) => location.LatLng(c[1].toDouble(), c[0].toDouble())).toList();
|
routePoints.value =
|
||||||
|
coords
|
||||||
|
.map<location.LatLng>(
|
||||||
|
(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}) {
|
void addOsmMarkers({bool showPickup = false, bool showDrop = false}) {
|
||||||
final List<flutterMap.Marker> tempMarkers = [
|
final List<flutterMap.Marker> tempMarkers = [
|
||||||
// Driver Marker
|
// 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) {
|
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) {
|
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;
|
osmMarkers.value = tempMarkers;
|
||||||
@@ -180,11 +228,16 @@ class LiveTrackingController extends GetxController {
|
|||||||
List<LatLng> polylineCoordinates = [];
|
List<LatLng> polylineCoordinates = [];
|
||||||
|
|
||||||
PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
|
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) {
|
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);
|
addGoogleMarkers(showPickup: showPickup, showDrop: showDrop);
|
||||||
@@ -205,9 +258,19 @@ class LiveTrackingController extends GetxController {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (showPickup && orderModel.value.vendor?.latitude != null && pickupIcon != null) {
|
if (showPickup &&
|
||||||
addMarker(id: "Pickup", latitude: orderModel.value.vendor!.latitude ?? 0.0, longitude: orderModel.value.vendor!.longitude ?? 0.0, descriptor: pickupIcon!, rotation: 0.0);
|
orderModel.value.vendor?.latitude != null &&
|
||||||
} else if (showDrop && orderModel.value.address?.location?.latitude != null && dropoffIcon != 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(
|
addMarker(
|
||||||
id: "Drop",
|
id: "Drop",
|
||||||
latitude: orderModel.value.address!.location!.latitude ?? 0.0,
|
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);
|
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<void> addMarkerIcons() async {
|
Future<void> addMarkerIcons() async {
|
||||||
if (Constant.selectedMapType == 'osm') return;
|
if (Constant.selectedMapType == 'osm') return;
|
||||||
|
|
||||||
pickupIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/pickup.png', 100));
|
pickupIcon = BitmapDescriptor.fromBytes(
|
||||||
dropoffIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/dropoff.png', 100));
|
await Constant().getBytesFromAsset('assets/images/pickup.png', 100),
|
||||||
driverIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/food_delivery.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<void> _addPolyLine(List<LatLng> polylineCoordinates) async {
|
Future<void> _addPolyLine(List<LatLng> polylineCoordinates) async {
|
||||||
if (polylineCoordinates.isEmpty) return;
|
if (polylineCoordinates.isEmpty) return;
|
||||||
|
|
||||||
PolylineId id = const PolylineId("poly");
|
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;
|
polyLines[id] = polyline;
|
||||||
await updateCameraBounds(polylineCoordinates);
|
await updateCameraBounds(polylineCoordinates);
|
||||||
@@ -244,13 +333,26 @@ class LiveTrackingController extends GetxController {
|
|||||||
Future<void> updateCameraBounds(List<LatLng> points) async {
|
Future<void> updateCameraBounds(List<LatLng> points) async {
|
||||||
if (mapController == null || points.isEmpty) return;
|
if (mapController == null || points.isEmpty) return;
|
||||||
|
|
||||||
double minLat = points.map((e) => e.latitude).reduce((a, b) => a < b ? a : b);
|
double minLat = points
|
||||||
double maxLat = points.map((e) => e.latitude).reduce((a, b) => a > b ? a : b);
|
.map((e) => e.latitude)
|
||||||
double minLng = points.map((e) => e.longitude).reduce((a, b) => a < b ? a : b);
|
.reduce((a, b) => a < b ? a : b);
|
||||||
double maxLng = points.map((e) => e.longitude).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),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import 'package:customer/screen_ui/location_enable_screens/location_permission_s
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:firebase_auth/firebase_auth.dart';
|
import 'package:firebase_auth/firebase_auth.dart';
|
||||||
import 'package:flutter/material.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:google_sign_in/google_sign_in.dart';
|
||||||
import 'package:sign_in_with_apple/sign_in_with_apple.dart';
|
import 'package:sign_in_with_apple/sign_in_with_apple.dart';
|
||||||
import '../constant/constant.dart';
|
import '../constant/constant.dart';
|
||||||
@@ -46,16 +46,22 @@ class LoginController extends GetxController {
|
|||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
ShowToastDialog.showLoader("Logging in...".tr());
|
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 != null && userModel.role == Constant.userRoleCustomer) {
|
||||||
if (userModel.active == true) {
|
if (userModel.active == true) {
|
||||||
userModel.fcmToken = await NotificationService.getToken();
|
userModel.fcmToken = await NotificationService.getToken();
|
||||||
await FireStoreUtils.updateUser(userModel);
|
await FireStoreUtils.updateUser(userModel);
|
||||||
|
|
||||||
if (userModel.shippingAddress != null && userModel.shippingAddress!.isNotEmpty) {
|
if (userModel.shippingAddress != null &&
|
||||||
|
userModel.shippingAddress!.isNotEmpty) {
|
||||||
final defaultAddress = userModel.shippingAddress!.firstWhere(
|
final defaultAddress = userModel.shippingAddress!.firstWhere(
|
||||||
(e) => e.isDefault == true,
|
(e) => e.isDefault == true,
|
||||||
orElse: () => userModel.shippingAddress!.first,
|
orElse: () => userModel.shippingAddress!.first,
|
||||||
@@ -69,12 +75,16 @@ class LoginController extends GetxController {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
await FirebaseAuth.instance.signOut();
|
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());
|
Get.offAll(() => const LoginScreen());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
await FirebaseAuth.instance.signOut();
|
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());
|
Get.offAll(() => const LoginScreen());
|
||||||
}
|
}
|
||||||
} on FirebaseAuthException catch (e) {
|
} on FirebaseAuthException catch (e) {
|
||||||
@@ -85,7 +95,9 @@ class LoginController extends GetxController {
|
|||||||
} else if (e.code == 'invalid-email') {
|
} else if (e.code == 'invalid-email') {
|
||||||
ShowToastDialog.showToast("Invalid email.".tr());
|
ShowToastDialog.showToast("Invalid email.".tr());
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast(e.message?.tr() ?? "Login failed. Please try again.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
e.message?.tr() ?? "Login failed. Please try again.".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
@@ -107,22 +119,32 @@ class LoginController extends GetxController {
|
|||||||
userModel.provider = 'google';
|
userModel.provider = 'google';
|
||||||
|
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
Get.off(const SignUpScreen(), arguments: {"userModel": userModel, "type": "google"});
|
Get.off(
|
||||||
|
const SignUpScreen(),
|
||||||
|
arguments: {"userModel": userModel, "type": "google"},
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
await FireStoreUtils.userExistOrNot(value.user!.uid).then((userExit) async {
|
await FireStoreUtils.userExistOrNot(value.user!.uid).then((
|
||||||
|
userExit,
|
||||||
|
) async {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
if (userExit == true) {
|
if (userExit == true) {
|
||||||
UserModel? userModel = await FireStoreUtils.getUserProfile(value.user!.uid);
|
UserModel? userModel = await FireStoreUtils.getUserProfile(
|
||||||
if (userModel != null && userModel.role == Constant.userRoleCustomer) {
|
value.user!.uid,
|
||||||
|
);
|
||||||
|
if (userModel != null &&
|
||||||
|
userModel.role == Constant.userRoleCustomer) {
|
||||||
if (userModel.active == true) {
|
if (userModel.active == true) {
|
||||||
userModel.fcmToken = await NotificationService.getToken();
|
userModel.fcmToken = await NotificationService.getToken();
|
||||||
await FireStoreUtils.updateUser(userModel);
|
await FireStoreUtils.updateUser(userModel);
|
||||||
|
|
||||||
if (userModel.shippingAddress != null && userModel.shippingAddress!.isNotEmpty) {
|
if (userModel.shippingAddress != null &&
|
||||||
final defaultAddress = userModel.shippingAddress!.firstWhere(
|
userModel.shippingAddress!.isNotEmpty) {
|
||||||
(e) => e.isDefault == true,
|
final defaultAddress = userModel.shippingAddress!
|
||||||
orElse: () => userModel.shippingAddress!.first,
|
.firstWhere(
|
||||||
);
|
(e) => e.isDefault == true,
|
||||||
|
orElse: () => userModel.shippingAddress!.first,
|
||||||
|
);
|
||||||
|
|
||||||
Constant.selectedLocation = defaultAddress;
|
Constant.selectedLocation = defaultAddress;
|
||||||
|
|
||||||
@@ -132,12 +154,16 @@ class LoginController extends GetxController {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
await FirebaseAuth.instance.signOut();
|
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());
|
Get.offAll(() => const LoginScreen());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
await FirebaseAuth.instance.signOut();
|
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());
|
Get.offAll(() => const LoginScreen());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -148,7 +174,10 @@ class LoginController extends GetxController {
|
|||||||
userModel.lastName = value.user!.displayName?.split(' ').last;
|
userModel.lastName = value.user!.displayName?.split(' ').last;
|
||||||
userModel.provider = 'google';
|
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.lastName = appleCredential.familyName;
|
||||||
userModel.provider = 'apple';
|
userModel.provider = 'apple';
|
||||||
|
|
||||||
Get.off(const SignUpScreen(), arguments: {"userModel": userModel, "type": "apple"});
|
Get.off(
|
||||||
|
const SignUpScreen(),
|
||||||
|
arguments: {"userModel": userModel, "type": "apple"},
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
// Existing user
|
// Existing user
|
||||||
await FireStoreUtils.userExistOrNot(userCredential.user!.uid).then((userExit) async {
|
await FireStoreUtils.userExistOrNot(userCredential.user!.uid).then((
|
||||||
|
userExit,
|
||||||
|
) async {
|
||||||
if (userExit == true) {
|
if (userExit == true) {
|
||||||
UserModel? userModel = await FireStoreUtils.getUserProfile(userCredential.user!.uid);
|
UserModel? userModel = await FireStoreUtils.getUserProfile(
|
||||||
if (userModel != null && userModel.role == Constant.userRoleCustomer) {
|
userCredential.user!.uid,
|
||||||
|
);
|
||||||
|
if (userModel != null &&
|
||||||
|
userModel.role == Constant.userRoleCustomer) {
|
||||||
if (userModel.active == true) {
|
if (userModel.active == true) {
|
||||||
userModel.fcmToken = await NotificationService.getToken();
|
userModel.fcmToken = await NotificationService.getToken();
|
||||||
await FireStoreUtils.updateUser(userModel);
|
await FireStoreUtils.updateUser(userModel);
|
||||||
|
|
||||||
if (userModel.shippingAddress != null && userModel.shippingAddress!.isNotEmpty) {
|
if (userModel.shippingAddress != null &&
|
||||||
final defaultAddress = userModel.shippingAddress!.firstWhere(
|
userModel.shippingAddress!.isNotEmpty) {
|
||||||
(e) => e.isDefault == true,
|
final defaultAddress = userModel.shippingAddress!
|
||||||
orElse: () => userModel.shippingAddress!.first,
|
.firstWhere(
|
||||||
);
|
(e) => e.isDefault == true,
|
||||||
|
orElse: () => userModel.shippingAddress!.first,
|
||||||
|
);
|
||||||
|
|
||||||
Constant.selectedLocation = defaultAddress;
|
Constant.selectedLocation = defaultAddress;
|
||||||
Get.offAll(() => const ServiceListScreen());
|
Get.offAll(() => const ServiceListScreen());
|
||||||
@@ -198,12 +237,16 @@ class LoginController extends GetxController {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
await FirebaseAuth.instance.signOut();
|
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());
|
Get.offAll(() => const LoginScreen());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
await FirebaseAuth.instance.signOut();
|
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());
|
Get.offAll(() => const LoginScreen());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -215,7 +258,10 @@ class LoginController extends GetxController {
|
|||||||
userModel.lastName = appleCredential.familyName;
|
userModel.lastName = appleCredential.familyName;
|
||||||
userModel.provider = 'apple';
|
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 GoogleSignInAuthentication googleAuth = googleUser.authentication;
|
||||||
|
|
||||||
final credential = GoogleAuthProvider.credential(idToken: googleAuth.idToken);
|
final credential = GoogleAuthProvider.credential(
|
||||||
final userCredential = await FirebaseAuth.instance.signInWithCredential(credential);
|
idToken: googleAuth.idToken,
|
||||||
|
);
|
||||||
|
final userCredential = await FirebaseAuth.instance.signInWithCredential(
|
||||||
|
credential,
|
||||||
|
);
|
||||||
|
|
||||||
return userCredential;
|
return userCredential;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -255,17 +305,27 @@ class LoginController extends GetxController {
|
|||||||
final rawNonce = generateNonce();
|
final rawNonce = generateNonce();
|
||||||
final nonce = sha256ofString(rawNonce);
|
final nonce = sha256ofString(rawNonce);
|
||||||
|
|
||||||
AuthorizationCredentialAppleID appleCredential = await SignInWithApple.getAppleIDCredential(
|
AuthorizationCredentialAppleID appleCredential =
|
||||||
scopes: [AppleIDAuthorizationScopes.email, AppleIDAuthorizationScopes.fullName],
|
await SignInWithApple.getAppleIDCredential(
|
||||||
nonce: nonce,
|
scopes: [
|
||||||
|
AppleIDAuthorizationScopes.email,
|
||||||
|
AppleIDAuthorizationScopes.fullName,
|
||||||
|
],
|
||||||
|
nonce: nonce,
|
||||||
|
);
|
||||||
|
|
||||||
|
final oauthCredential = OAuthProvider("apple.com").credential(
|
||||||
|
idToken: appleCredential.identityToken,
|
||||||
|
rawNonce: rawNonce,
|
||||||
|
accessToken: appleCredential.authorizationCode,
|
||||||
);
|
);
|
||||||
|
|
||||||
final oauthCredential = OAuthProvider(
|
UserCredential userCredential = await FirebaseAuth.instance
|
||||||
"apple.com",
|
.signInWithCredential(oauthCredential);
|
||||||
).credential(idToken: appleCredential.identityToken, rawNonce: rawNonce, accessToken: appleCredential.authorizationCode);
|
return {
|
||||||
|
"appleCredential": appleCredential,
|
||||||
UserCredential userCredential = await FirebaseAuth.instance.signInWithCredential(oauthCredential);
|
"userCredential": userCredential,
|
||||||
return {"appleCredential": appleCredential, "userCredential": userCredential};
|
};
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
debugPrint(e.toString());
|
debugPrint(e.toString());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import 'dart:typed_data';
|
|||||||
import 'package:customer/constant/constant.dart';
|
import 'package:customer/constant/constant.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_map/flutter_map.dart' as flutterMap;
|
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:google_maps_flutter/google_maps_flutter.dart';
|
||||||
import 'package:latlong2/latlong.dart' as location;
|
import 'package:latlong2/latlong.dart' as location;
|
||||||
import '../screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart';
|
import '../screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart';
|
||||||
|
|||||||
@@ -2,14 +2,15 @@ import 'package:customer/themes/show_toast_dialog.dart';
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:firebase_auth/firebase_auth.dart';
|
import 'package:firebase_auth/firebase_auth.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
import '../constant/constant.dart';
|
import '../constant/constant.dart';
|
||||||
import '../screen_ui/auth_screens/otp_verification_screen.dart';
|
import '../screen_ui/auth_screens/otp_verification_screen.dart';
|
||||||
|
|
||||||
class MobileLoginController extends GetxController {
|
class MobileLoginController extends GetxController {
|
||||||
final Rx<TextEditingController> mobileController = TextEditingController().obs;
|
final Rx<TextEditingController> mobileController =
|
||||||
final Rx<TextEditingController> countryCodeController = TextEditingController(text: Constant.defaultCountryCode).obs;
|
TextEditingController().obs;
|
||||||
|
final Rx<TextEditingController> countryCodeController =
|
||||||
|
TextEditingController(text: Constant.defaultCountryCode).obs;
|
||||||
|
|
||||||
final FirebaseAuth _auth = FirebaseAuth.instance;
|
final FirebaseAuth _auth = FirebaseAuth.instance;
|
||||||
|
|
||||||
@@ -19,7 +20,9 @@ class MobileLoginController extends GetxController {
|
|||||||
final countryCode = countryCodeController.value.text.trim();
|
final countryCode = countryCodeController.value.text.trim();
|
||||||
|
|
||||||
if (mobile.isEmpty || mobile.length != 10) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,12 +39,21 @@ class MobileLoginController extends GetxController {
|
|||||||
if (e.code == 'invalid-phone-number') {
|
if (e.code == 'invalid-phone-number') {
|
||||||
ShowToastDialog.showToast("Invalid phone number".tr());
|
ShowToastDialog.showToast("Invalid phone number".tr());
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast(e.message ?? "OTP verification failed".tr());
|
ShowToastDialog.showToast(
|
||||||
|
e.message ?? "OTP verification failed".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
codeSent: (String verificationId, int? resendToken) {
|
codeSent: (String verificationId, int? resendToken) {
|
||||||
ShowToastDialog.closeLoader();
|
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) {
|
codeAutoRetrievalTimeout: (String verificationId) {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import '../models/onprovider_order_model.dart';
|
import '../models/onprovider_order_model.dart';
|
||||||
import '../models/worker_model.dart';
|
import '../models/worker_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
@@ -18,7 +18,6 @@ class MyBookingOnDemandController extends GetxController {
|
|||||||
listenOrders(); // Listen for real-time updates
|
listenOrders(); // Listen for real-time updates
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void selectTab(String tab) {
|
void selectTab(String tab) {
|
||||||
selectedTab.value = tab;
|
selectedTab.value = tab;
|
||||||
}
|
}
|
||||||
@@ -32,7 +31,9 @@ class MyBookingOnDemandController extends GetxController {
|
|||||||
|
|
||||||
// Fetch worker info if not already fetched
|
// Fetch worker info if not already fetched
|
||||||
for (var order in updatedOrders) {
|
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) {
|
FireStoreUtils.getWorker(order.workerId!).then((worker) {
|
||||||
if (worker != null) workers[order.workerId!] = worker;
|
if (worker != null) workers[order.workerId!] = worker;
|
||||||
});
|
});
|
||||||
@@ -48,18 +49,39 @@ class MyBookingOnDemandController extends GetxController {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<OnProviderOrderModel> get filteredParcelOrders => getOrdersForTab(selectedTab.value);
|
List<OnProviderOrderModel> get filteredParcelOrders =>
|
||||||
|
getOrdersForTab(selectedTab.value);
|
||||||
|
|
||||||
List<OnProviderOrderModel> getOrdersForTab(String tab) {
|
List<OnProviderOrderModel> getOrdersForTab(String tab) {
|
||||||
switch (tab) {
|
switch (tab) {
|
||||||
case "Placed":
|
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":
|
case "Completed":
|
||||||
return orders.where((order) => ["Order Completed"].contains(order.status)).toList();
|
return orders
|
||||||
|
.where((order) => ["Order Completed"].contains(order.status))
|
||||||
|
.toList();
|
||||||
|
|
||||||
case "Cancelled":
|
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:
|
default:
|
||||||
return [];
|
return [];
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ import 'package:firebase_auth/firebase_auth.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_paypal/flutter_paypal.dart';
|
import 'package:flutter_paypal/flutter_paypal.dart';
|
||||||
import 'package:flutter_stripe/flutter_stripe.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:http/http.dart' as http;
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:razorpay_flutter/razorpay_flutter.dart';
|
import 'package:razorpay_flutter/razorpay_flutter.dart';
|
||||||
@@ -72,7 +72,9 @@ class MyCabBookingController extends GetxController {
|
|||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
|
|
||||||
if (FirebaseAuth.instance.currentUser != null) {
|
if (FirebaseAuth.instance.currentUser != null) {
|
||||||
await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((user) {
|
await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((
|
||||||
|
user,
|
||||||
|
) {
|
||||||
if (user != null) {
|
if (user != null) {
|
||||||
userModel.value = user;
|
userModel.value = user;
|
||||||
}
|
}
|
||||||
@@ -88,21 +90,45 @@ class MyCabBookingController extends GetxController {
|
|||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<CabOrderModel> get filteredParcelOrders => getOrdersForTab(selectedTab.value);
|
List<CabOrderModel> get filteredParcelOrders =>
|
||||||
|
getOrdersForTab(selectedTab.value);
|
||||||
|
|
||||||
List<CabOrderModel> getOrdersForTab(String tab) {
|
List<CabOrderModel> getOrdersForTab(String tab) {
|
||||||
switch (tab) {
|
switch (tab) {
|
||||||
case "New":
|
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":
|
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":
|
case "Completed":
|
||||||
return cabOrder.where((order) => ["Order Completed"].contains(order.status)).toList();
|
return cabOrder
|
||||||
|
.where((order) => ["Order Completed"].contains(order.status))
|
||||||
|
.toList();
|
||||||
|
|
||||||
case "Cancelled":
|
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:
|
default:
|
||||||
return [];
|
return [];
|
||||||
@@ -164,15 +190,22 @@ class MyCabBookingController extends GetxController {
|
|||||||
|
|
||||||
selectedOrder.value = order;
|
selectedOrder.value = order;
|
||||||
try {
|
try {
|
||||||
subTotal.value = double.tryParse(selectedOrder.value.subTotal?.toString() ?? "0") ?? 0.0;
|
subTotal.value =
|
||||||
discount.value = double.tryParse(selectedOrder.value.discount?.toString() ?? "0") ?? 0.0;
|
double.tryParse(selectedOrder.value.subTotal?.toString() ?? "0") ??
|
||||||
|
0.0;
|
||||||
|
discount.value =
|
||||||
|
double.tryParse(selectedOrder.value.discount?.toString() ?? "0") ??
|
||||||
|
0.0;
|
||||||
taxAmount.value = 0.0;
|
taxAmount.value = 0.0;
|
||||||
|
|
||||||
subTotal.value = subTotal.value;
|
subTotal.value = subTotal.value;
|
||||||
|
|
||||||
if (selectedOrder.value.taxSetting != null) {
|
if (selectedOrder.value.taxSetting != null) {
|
||||||
for (var element in selectedOrder.value.taxSetting!) {
|
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,
|
serviceType: Constant.parcelServiceType,
|
||||||
);
|
);
|
||||||
|
|
||||||
await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async {
|
await FireStoreUtils.setWalletTransaction(transactionModel).then((
|
||||||
await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid());
|
value,
|
||||||
|
) async {
|
||||||
|
await FireStoreUtils.updateUserWallet(
|
||||||
|
amount: "-${totalAmount.value.toString()}",
|
||||||
|
userId: FireStoreUtils.getCurrentUid(),
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
selectedOrder.value.paymentStatus = true;
|
selectedOrder.value.paymentStatus = true;
|
||||||
@@ -223,19 +261,45 @@ class MyCabBookingController extends GetxController {
|
|||||||
|
|
||||||
Future<void> getPaymentSettings() async {
|
Future<void> getPaymentSettings() async {
|
||||||
await FireStoreUtils.getPaymentSettingsData().then((value) {
|
await FireStoreUtils.getPaymentSettingsData().then((value) {
|
||||||
stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings)));
|
stripeModel.value = StripeModel.fromJson(
|
||||||
payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings)));
|
jsonDecode(Preferences.getString(Preferences.stripeSettings)),
|
||||||
payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack)));
|
);
|
||||||
mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago)));
|
payPalModel.value = PayPalModel.fromJson(
|
||||||
flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave)));
|
jsonDecode(Preferences.getString(Preferences.paypalSettings)),
|
||||||
paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings)));
|
);
|
||||||
payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings)));
|
payStackModel.value = PayStackModel.fromJson(
|
||||||
razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings)));
|
jsonDecode(Preferences.getString(Preferences.payStack)),
|
||||||
midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings)));
|
);
|
||||||
orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)));
|
mercadoPagoModel.value = MercadoPagoModel.fromJson(
|
||||||
xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings)));
|
jsonDecode(Preferences.getString(Preferences.mercadoPago)),
|
||||||
walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings)));
|
);
|
||||||
cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings)));
|
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) {
|
if (walletSettingModel.value.isEnabled == true) {
|
||||||
selectedPaymentMethod.value = PaymentGateway.wallet.name;
|
selectedPaymentMethod.value = PaymentGateway.wallet.name;
|
||||||
@@ -277,20 +341,32 @@ class MyCabBookingController extends GetxController {
|
|||||||
Future<void> stripeMakePayment({required String amount}) async {
|
Future<void> stripeMakePayment({required String amount}) async {
|
||||||
log(double.parse(amount).toStringAsFixed(0));
|
log(double.parse(amount).toStringAsFixed(0));
|
||||||
try {
|
try {
|
||||||
Map<String, dynamic>? paymentIntentData = await createStripeIntent(amount: amount);
|
Map<String, dynamic>? paymentIntentData = await createStripeIntent(
|
||||||
|
amount: amount,
|
||||||
|
);
|
||||||
log("stripe Responce====>$paymentIntentData");
|
log("stripe Responce====>$paymentIntentData");
|
||||||
if (paymentIntentData!.containsKey("error")) {
|
if (paymentIntentData!.containsKey("error")) {
|
||||||
Get.back();
|
Get.back();
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
await Stripe.instance.initPaymentSheet(
|
await Stripe.instance.initPaymentSheet(
|
||||||
paymentSheetParameters: SetupPaymentSheetParameters(
|
paymentSheetParameters: SetupPaymentSheetParameters(
|
||||||
paymentIntentClientSecret: paymentIntentData['client_secret'],
|
paymentIntentClientSecret: paymentIntentData['client_secret'],
|
||||||
allowsDelayedPaymentMethods: false,
|
allowsDelayedPaymentMethods: false,
|
||||||
googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"),
|
googlePay: const PaymentSheetGooglePay(
|
||||||
|
merchantCountryCode: 'US',
|
||||||
|
testEnv: true,
|
||||||
|
currencyCode: "USD",
|
||||||
|
),
|
||||||
customFlow: true,
|
customFlow: true,
|
||||||
style: ThemeMode.system,
|
style: ThemeMode.system,
|
||||||
appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)),
|
appearance: PaymentSheetAppearance(
|
||||||
|
colors: PaymentSheetAppearanceColors(
|
||||||
|
primary: AppThemeData.primary300,
|
||||||
|
),
|
||||||
|
),
|
||||||
merchantDisplayName: 'GoRide',
|
merchantDisplayName: 'GoRide',
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -336,7 +412,10 @@ class MyCabBookingController extends GetxController {
|
|||||||
var response = await http.post(
|
var response = await http.post(
|
||||||
Uri.parse('https://api.stripe.com/v1/payment_intents'),
|
Uri.parse('https://api.stripe.com/v1/payment_intents'),
|
||||||
body: body,
|
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);
|
return jsonDecode(response.body);
|
||||||
@@ -346,8 +425,14 @@ class MyCabBookingController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//mercadoo
|
//mercadoo
|
||||||
Future<Null> mercadoPagoMakePayment({required BuildContext context, required String amount}) async {
|
Future<Null> mercadoPagoMakePayment({
|
||||||
final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'};
|
required BuildContext context,
|
||||||
|
required String amount,
|
||||||
|
}) async {
|
||||||
|
final headers = {
|
||||||
|
'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
};
|
||||||
|
|
||||||
final body = jsonEncode({
|
final body = jsonEncode({
|
||||||
"items": [
|
"items": [
|
||||||
@@ -369,7 +454,11 @@ class MyCabBookingController extends GetxController {
|
|||||||
// Automatically return after payment is 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) {
|
if (response.statusCode == 200 || response.statusCode == 201) {
|
||||||
final data = jsonDecode(response.body);
|
final data = jsonDecode(response.body);
|
||||||
@@ -452,15 +541,23 @@ class MyCabBookingController extends GetxController {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//flutter wave Payment Method
|
//flutter wave Payment Method
|
||||||
Future<Null> flutterWaveInitiatePayment({required BuildContext context, required String amount}) async {
|
Future<Null> flutterWaveInitiatePayment({
|
||||||
|
required BuildContext context,
|
||||||
|
required String amount,
|
||||||
|
}) async {
|
||||||
final url = Uri.parse('https://api.flutterwave.com/v3/payments');
|
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({
|
final body = jsonEncode({
|
||||||
"tx_ref": _ref,
|
"tx_ref": _ref,
|
||||||
@@ -470,17 +567,23 @@ class MyCabBookingController extends GetxController {
|
|||||||
"payment_options": "ussd, card, barter, payattitude",
|
"payment_options": "ussd, card, barter, payattitude",
|
||||||
"customer": {
|
"customer": {
|
||||||
"email": Constant.userModel!.email.toString(),
|
"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
|
"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);
|
final response = await http.post(url, headers: headers, body: body);
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
final data = jsonDecode(response.body);
|
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) {
|
if (value) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
completeOrder();
|
completeOrder();
|
||||||
@@ -509,10 +612,14 @@ class MyCabBookingController extends GetxController {
|
|||||||
|
|
||||||
// payFast
|
// payFast
|
||||||
void payFastPayment({required BuildContext context, required String amount}) {
|
void payFastPayment({required BuildContext context, required String amount}) {
|
||||||
PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: Constant.userModel!).then((
|
PayStackURLGen.getPayHTML(
|
||||||
String? value,
|
payFastSettingData: payFastModel.value,
|
||||||
) async {
|
amount: amount.toString(),
|
||||||
bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value));
|
userModel: Constant.userModel!,
|
||||||
|
).then((String? value) async {
|
||||||
|
bool isDone = await Get.to(
|
||||||
|
PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value),
|
||||||
|
);
|
||||||
if (isDone) {
|
if (isDone) {
|
||||||
Get.back();
|
Get.back();
|
||||||
ShowToastDialog.showToast("Payment successfully".tr());
|
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";
|
String getChecksum = "${Constant.globalUrl}payments/validatechecksum";
|
||||||
final response = await http.post(
|
final response = await http.post(
|
||||||
Uri.parse(getChecksum),
|
Uri.parse(getChecksum),
|
||||||
@@ -610,13 +721,18 @@ class MyCabBookingController extends GetxController {
|
|||||||
return data['status'];
|
return data['status'];
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<GetPaymentTxtTokenModel> initiatePayment({required double amount, required orderId}) async {
|
Future<GetPaymentTxtTokenModel> initiatePayment({
|
||||||
|
required double amount,
|
||||||
|
required orderId,
|
||||||
|
}) async {
|
||||||
String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment";
|
String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment";
|
||||||
String callback = "";
|
String callback = "";
|
||||||
if (paytmModel.value.isSandboxEnabled == true) {
|
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 {
|
} 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(
|
final response = await http.post(
|
||||||
Uri.parse(initiateURL),
|
Uri.parse(initiateURL),
|
||||||
@@ -634,9 +750,12 @@ class MyCabBookingController extends GetxController {
|
|||||||
);
|
);
|
||||||
log(response.body);
|
log(response.body);
|
||||||
final data = jsonDecode(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();
|
Get.back();
|
||||||
ShowToastDialog.showToast("something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return GetPaymentTxtTokenModel.fromJson(data);
|
return GetPaymentTxtTokenModel.fromJson(data);
|
||||||
}
|
}
|
||||||
@@ -654,7 +773,10 @@ class MyCabBookingController extends GetxController {
|
|||||||
'description': 'wallet Topup',
|
'description': 'wallet Topup',
|
||||||
'retry': {'enabled': true, 'max_count': 1},
|
'retry': {'enabled': true, 'max_count': 1},
|
||||||
'send_sms_hash': true,
|
'send_sms_hash': true,
|
||||||
'prefill': {'contact': Constant.userModel!.phoneNumber, 'email': Constant.userModel!.email},
|
'prefill': {
|
||||||
|
'contact': Constant.userModel!.phoneNumber,
|
||||||
|
'email': Constant.userModel!.email,
|
||||||
|
},
|
||||||
'external': {
|
'external': {
|
||||||
'wallets': ['paytm'],
|
'wallets': ['paytm'],
|
||||||
},
|
},
|
||||||
@@ -689,7 +811,10 @@ class MyCabBookingController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Midtrans payment
|
//Midtrans payment
|
||||||
Future<void> midtransMakePayment({required String amount, required BuildContext context}) async {
|
Future<void> midtransMakePayment({
|
||||||
|
required String amount,
|
||||||
|
required BuildContext context,
|
||||||
|
}) async {
|
||||||
await createPaymentLink(amount: amount).then((url) {
|
await createPaymentLink(amount: amount).then((url) {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
if (url != '') {
|
if (url != '') {
|
||||||
@@ -708,7 +833,9 @@ class MyCabBookingController extends GetxController {
|
|||||||
Future<String> createPaymentLink({required var amount}) async {
|
Future<String> createPaymentLink({required var amount}) async {
|
||||||
var ordersId = const Uuid().v1();
|
var ordersId = const Uuid().v1();
|
||||||
final url = Uri.parse(
|
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(
|
final response = await http.post(
|
||||||
@@ -716,12 +843,19 @@ class MyCabBookingController extends GetxController {
|
|||||||
headers: {
|
headers: {
|
||||||
'Accept': 'application/json',
|
'Accept': 'application/json',
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!),
|
'Authorization': generateBasicAuthHeader(
|
||||||
|
midTransModel.value.serverKey!,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
body: jsonEncode({
|
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,
|
'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);
|
final responseData = jsonDecode(response.body);
|
||||||
return responseData['payment_url'];
|
return responseData['payment_url'];
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -746,10 +882,18 @@ class MyCabBookingController extends GetxController {
|
|||||||
static String orderId = '';
|
static String orderId = '';
|
||||||
static String amount = '';
|
static String amount = '';
|
||||||
|
|
||||||
Future<void> orangeMakePayment({required String amount, required BuildContext context}) async {
|
Future<void> orangeMakePayment({
|
||||||
|
required String amount,
|
||||||
|
required BuildContext context,
|
||||||
|
}) async {
|
||||||
reset();
|
reset();
|
||||||
var id = const Uuid().v4();
|
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();
|
ShowToastDialog.closeLoader();
|
||||||
if (paymentURL.toString() != '') {
|
if (paymentURL.toString() != '') {
|
||||||
Get.to(
|
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';
|
String apiUrl = 'https://api.orange.com/oauth/v3/token';
|
||||||
Map<String, String> requestBody = {'grant_type': 'client_credentials'};
|
Map<String, String> requestBody = {'grant_type': 'client_credentials'};
|
||||||
|
|
||||||
@@ -794,9 +943,16 @@ class MyCabBookingController extends GetxController {
|
|||||||
|
|
||||||
accessToken = responseData['access_token'];
|
accessToken = responseData['access_token'];
|
||||||
// ignore: use_build_context_synchronously
|
// 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 {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -827,7 +983,11 @@ class MyCabBookingController extends GetxController {
|
|||||||
|
|
||||||
var response = await http.post(
|
var response = await http.post(
|
||||||
Uri.parse(apiUrl),
|
Uri.parse(apiUrl),
|
||||||
headers: <String, String>{'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'},
|
headers: <String, String>{
|
||||||
|
'Authorization': 'Bearer $accessToken',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
body: json.encode(requestBody),
|
body: json.encode(requestBody),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -841,7 +1001,9 @@ class MyCabBookingController extends GetxController {
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -859,7 +1021,11 @@ class MyCabBookingController extends GetxController {
|
|||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
if (model.id != null) {
|
if (model.id != null) {
|
||||||
Get.to(
|
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) {
|
)!.then((value) {
|
||||||
if (value == true) {
|
if (value == true) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
@@ -877,7 +1043,9 @@ class MyCabBookingController extends GetxController {
|
|||||||
const url = 'https://api.xendit.co/v2/invoices';
|
const url = 'https://api.xendit.co/v2/invoices';
|
||||||
var headers = {
|
var headers = {
|
||||||
'Content-Type': 'application/json',
|
'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',
|
// 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ',
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -890,7 +1058,11 @@ class MyCabBookingController extends GetxController {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
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) {
|
if (response.statusCode == 200 || response.statusCode == 201) {
|
||||||
XenditModel model = XenditModel.fromJson(jsonDecode(response.body));
|
XenditModel model = XenditModel.fromJson(jsonDecode(response.body));
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import 'package:customer/constant/constant.dart';
|
|||||||
import 'package:customer/controllers/theme_controller.dart';
|
import 'package:customer/controllers/theme_controller.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:customer/utils/preferences.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;
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
class MyProfileController extends GetxController {
|
class MyProfileController extends GetxController {
|
||||||
@@ -41,7 +41,10 @@ class MyProfileController extends GetxController {
|
|||||||
Future<bool> deleteUserFromServer() async {
|
Future<bool> deleteUserFromServer() async {
|
||||||
var url = '${Constant.websiteUrl}/api/delete-user';
|
var url = '${Constant.websiteUrl}/api/delete-user';
|
||||||
try {
|
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}");
|
log("deleteUserFromServer :: ${response.body}");
|
||||||
return response.statusCode == 200;
|
return response.statusCode == 200;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -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/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart';
|
||||||
import 'package:customer/themes/show_toast_dialog.dart';
|
import 'package:customer/themes/show_toast_dialog.dart';
|
||||||
import 'package:easy_localization/easy_localization.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/rental_order_model.dart';
|
||||||
import '../models/tax_model.dart';
|
import '../models/tax_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
@@ -46,7 +46,6 @@ class MyRentalBookingController extends GetxController {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Rx<RentalOrderModel> selectedOrder = RentalOrderModel().obs;
|
Rx<RentalOrderModel> selectedOrder = RentalOrderModel().obs;
|
||||||
@@ -67,38 +66,84 @@ class MyRentalBookingController extends GetxController {
|
|||||||
|
|
||||||
selectedOrder.value = order;
|
selectedOrder.value = order;
|
||||||
try {
|
try {
|
||||||
subTotal.value = double.tryParse(selectedOrder.value.subTotal?.toString() ?? "0") ?? 0.0;
|
subTotal.value =
|
||||||
discount.value = double.tryParse(selectedOrder.value.discount?.toString() ?? "0") ?? 0.0;
|
double.tryParse(selectedOrder.value.subTotal?.toString() ?? "0") ??
|
||||||
|
0.0;
|
||||||
|
discount.value =
|
||||||
|
double.tryParse(selectedOrder.value.discount?.toString() ?? "0") ??
|
||||||
|
0.0;
|
||||||
taxAmount.value = 0.0;
|
taxAmount.value = 0.0;
|
||||||
|
|
||||||
if (selectedOrder.value.endTime != null) {
|
if (selectedOrder.value.endTime != null) {
|
||||||
DateTime start = selectedOrder.value.startTime!.toDate();
|
DateTime start = selectedOrder.value.startTime!.toDate();
|
||||||
DateTime end = selectedOrder.value.endTime!.toDate();
|
DateTime end = selectedOrder.value.endTime!.toDate();
|
||||||
int hours = end.difference(start).inHours;
|
int hours = end.difference(start).inHours;
|
||||||
if (hours >= int.parse(selectedOrder.value.rentalPackageModel!.includedHours.toString())) {
|
if (hours >=
|
||||||
hours = hours - int.parse(selectedOrder.value.rentalPackageModel!.includedHours.toString());
|
int.parse(
|
||||||
double hourlyRate = double.tryParse(selectedOrder.value.rentalPackageModel?.extraMinuteFare?.toString() ?? "0") ?? 0.0;
|
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;
|
extraMinutesCharge.value = (hours * 60) * hourlyRate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selectedOrder.value.startKitoMetersReading != null && selectedOrder.value.endKitoMetersReading != null) {
|
if (selectedOrder.value.startKitoMetersReading != null &&
|
||||||
double startKm = double.tryParse(selectedOrder.value.startKitoMetersReading?.toString() ?? "0") ?? 0.0;
|
selectedOrder.value.endKitoMetersReading != null) {
|
||||||
double endKm = double.tryParse(selectedOrder.value.endKitoMetersReading?.toString() ?? "0") ?? 0.0;
|
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) {
|
if (endKm > startKm) {
|
||||||
double totalKm = endKm - startKm;
|
double totalKm = endKm - startKm;
|
||||||
if (totalKm > double.parse(selectedOrder.value.rentalPackageModel!.includedDistance!)) {
|
if (totalKm >
|
||||||
totalKm = totalKm - double.parse(selectedOrder.value.rentalPackageModel!.includedDistance!);
|
double.parse(
|
||||||
double extraKmRate = double.tryParse(selectedOrder.value.rentalPackageModel?.extraKmFare?.toString() ?? "0") ?? 0.0;
|
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;
|
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) {
|
if (selectedOrder.value.taxSetting != null) {
|
||||||
for (var element in selectedOrder.value.taxSetting!) {
|
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,
|
serviceType: Constant.parcelServiceType,
|
||||||
);
|
);
|
||||||
|
|
||||||
await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async {
|
await FireStoreUtils.setWalletTransaction(transactionModel).then((
|
||||||
|
value,
|
||||||
|
) async {
|
||||||
if (value == true) {
|
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<RentalOrderModel> getOrdersForTab(String tab) {
|
List<RentalOrderModel> getOrdersForTab(String tab) {
|
||||||
switch (tab) {
|
switch (tab) {
|
||||||
case "New":
|
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":
|
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":
|
case "Completed":
|
||||||
return rentalOrders.where((order) => ["Order Completed"].contains(order.status)).toList();
|
return rentalOrders
|
||||||
|
.where((order) => ["Order Completed"].contains(order.status))
|
||||||
|
.toList();
|
||||||
|
|
||||||
case "Cancelled":
|
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:
|
default:
|
||||||
return [];
|
return [];
|
||||||
@@ -170,9 +246,13 @@ class MyRentalBookingController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Old helper (optional)
|
/// Old helper (optional)
|
||||||
List<RentalOrderModel> get filteredRentalOrders => getOrdersForTab(selectedTab.value);
|
List<RentalOrderModel> get filteredRentalOrders =>
|
||||||
|
getOrdersForTab(selectedTab.value);
|
||||||
|
|
||||||
Future<void> cancelRentalRequest(RentalOrderModel order, {List<TaxModel>? taxList}) async {
|
Future<void> cancelRentalRequest(
|
||||||
|
RentalOrderModel order, {
|
||||||
|
List<TaxModel>? taxList,
|
||||||
|
}) async {
|
||||||
try {
|
try {
|
||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
order.status = Constant.orderCancelled;
|
order.status = Constant.orderCancelled;
|
||||||
@@ -186,13 +266,18 @@ class MyRentalBookingController extends GetxController {
|
|||||||
if (taxList != null) {
|
if (taxList != null) {
|
||||||
for (var element in taxList) {
|
for (var element in taxList) {
|
||||||
totalTax += Constant.calculateTax(
|
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,
|
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;
|
double refundAmount = subTotal + totalTax;
|
||||||
|
|
||||||
WalletTransactionModel walletTransaction = WalletTransactionModel(
|
WalletTransactionModel walletTransaction = WalletTransactionModel(
|
||||||
@@ -211,7 +296,10 @@ class MyRentalBookingController extends GetxController {
|
|||||||
);
|
);
|
||||||
|
|
||||||
await FireStoreUtils.setWalletTransaction(walletTransaction);
|
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());
|
ShowToastDialog.showToast("Booking cancelled successfully".tr());
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import '../models/on_boarding_model.dart';
|
import '../models/on_boarding_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import 'package:customer/models/coupon_model.dart';
|
|||||||
import 'package:customer/models/user_model.dart';
|
import 'package:customer/models/user_model.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import '../models/onprovider_order_model.dart';
|
import '../models/onprovider_order_model.dart';
|
||||||
import '../models/provider_serivce_model.dart';
|
import '../models/provider_serivce_model.dart';
|
||||||
@@ -55,8 +55,12 @@ class OnDemandBookingController extends GetxController {
|
|||||||
|
|
||||||
void fetchCoupons() {
|
void fetchCoupons() {
|
||||||
if (provider.value?.author != null && provider.value!.author!.isNotEmpty) {
|
if (provider.value?.author != null && provider.value!.author!.isNotEmpty) {
|
||||||
FireStoreUtils.getProviderCoupon(provider.value!.author!).then((activeCoupons) => couponList.assignAll(activeCoupons));
|
FireStoreUtils.getProviderCoupon(
|
||||||
FireStoreUtils.getProviderCouponAfterExpire(provider.value!.author!).then((expiredCoupons) => couponList.addAll(expiredCoupons));
|
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) {
|
void applyCoupon(CouponModel coupon) {
|
||||||
double discount = 0.0;
|
double discount = 0.0;
|
||||||
if (coupon.discountType == "Percentage" || coupon.discountType == "Percent") {
|
if (coupon.discountType == "Percentage" ||
|
||||||
discount = price.value * (double.tryParse(coupon.discount.toString()) ?? 0) / 100;
|
coupon.discountType == "Percent") {
|
||||||
|
discount =
|
||||||
|
price.value *
|
||||||
|
(double.tryParse(coupon.discount.toString()) ?? 0) /
|
||||||
|
100;
|
||||||
} else {
|
} else {
|
||||||
discount = double.tryParse(coupon.discount.toString()) ?? 0;
|
discount = double.tryParse(coupon.discount.toString()) ?? 0;
|
||||||
}
|
}
|
||||||
@@ -115,9 +123,14 @@ class OnDemandBookingController extends GetxController {
|
|||||||
|
|
||||||
// discount
|
// discount
|
||||||
if (discountType.value == "Percentage" || discountType.value == "Percent") {
|
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 {
|
} 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;
|
subTotal.value = price.value - discountAmount.value;
|
||||||
@@ -125,7 +138,10 @@ class OnDemandBookingController extends GetxController {
|
|||||||
// tax calculation
|
// tax calculation
|
||||||
double total = subTotal.value;
|
double total = subTotal.value;
|
||||||
for (var element in Constant.taxList) {
|
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;
|
totalAmount.value = total;
|
||||||
@@ -137,7 +153,9 @@ class OnDemandBookingController extends GetxController {
|
|||||||
} else if (dateTimeController.value.text.isEmpty) {
|
} else if (dateTimeController.value.text.isEmpty) {
|
||||||
ShowToastDialog.showToast("Please select time slot.".tr());
|
ShowToastDialog.showToast("Please select time slot.".tr());
|
||||||
} else {
|
} else {
|
||||||
UserModel? providerUser = await FireStoreUtils.getUserProfile(provider.value!.author!);
|
UserModel? providerUser = await FireStoreUtils.getUserProfile(
|
||||||
|
provider.value!.author!,
|
||||||
|
);
|
||||||
|
|
||||||
if (provider.value?.priceUnit == "Fixed") {
|
if (provider.value?.priceUnit == "Fixed") {
|
||||||
OnProviderOrderModel onDemandOrderModel = OnProviderOrderModel(
|
OnProviderOrderModel onDemandOrderModel = OnProviderOrderModel(
|
||||||
@@ -161,14 +179,27 @@ class OnDemandBookingController extends GetxController {
|
|||||||
adminCommissionType:
|
adminCommissionType:
|
||||||
Constant.sectionConstantModel?.adminCommision?.isEnabled == false
|
Constant.sectionConstantModel?.adminCommision?.isEnabled == false
|
||||||
? 'fixed'
|
? 'fixed'
|
||||||
: providerUser?.adminCommissionModel?.commissionType ?? Constant.sectionConstantModel?.adminCommision?.commissionType,
|
: providerUser?.adminCommissionModel?.commissionType ??
|
||||||
|
Constant
|
||||||
|
.sectionConstantModel
|
||||||
|
?.adminCommision
|
||||||
|
?.commissionType,
|
||||||
otp: Constant.getReferralCode(),
|
otp: Constant.getReferralCode(),
|
||||||
couponCode: offerCode.toString(),
|
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}');
|
print('totalAmount value ::::::: ${totalAmount.value}');
|
||||||
|
|
||||||
Get.to(() => OnDemandPaymentScreen(), arguments: {'onDemandOrderModel': Rxn<OnProviderOrderModel>(onDemandOrderModel), 'totalAmount': totalAmount.value, 'isExtra': false});
|
Get.to(
|
||||||
|
() => OnDemandPaymentScreen(),
|
||||||
|
arguments: {
|
||||||
|
'onDemandOrderModel': Rxn<OnProviderOrderModel>(onDemandOrderModel),
|
||||||
|
'totalAmount': totalAmount.value,
|
||||||
|
'isExtra': false,
|
||||||
|
},
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showLoader("Please wait...".tr());
|
ShowToastDialog.showLoader("Please wait...".tr());
|
||||||
OnProviderOrderModel onDemandOrder = OnProviderOrderModel(
|
OnProviderOrderModel onDemandOrder = OnProviderOrderModel(
|
||||||
@@ -192,21 +223,36 @@ class OnDemandBookingController extends GetxController {
|
|||||||
adminCommissionType:
|
adminCommissionType:
|
||||||
Constant.sectionConstantModel?.adminCommision?.isEnabled == false
|
Constant.sectionConstantModel?.adminCommision?.isEnabled == false
|
||||||
? 'fixed'
|
? 'fixed'
|
||||||
: providerUser?.adminCommissionModel?.commissionType ?? Constant.sectionConstantModel?.adminCommision?.commissionType,
|
: providerUser?.adminCommissionModel?.commissionType ??
|
||||||
|
Constant
|
||||||
|
.sectionConstantModel
|
||||||
|
?.adminCommision
|
||||||
|
?.commissionType,
|
||||||
paymentStatus: true,
|
paymentStatus: true,
|
||||||
);
|
);
|
||||||
|
|
||||||
await FireStoreUtils.onDemandOrderPlace(onDemandOrder, 0.0);
|
await FireStoreUtils.onDemandOrderPlace(onDemandOrder, 0.0);
|
||||||
await FireStoreUtils.sendOrderOnDemandServiceEmail(orderModel: onDemandOrder);
|
await FireStoreUtils.sendOrderOnDemandServiceEmail(
|
||||||
|
orderModel: onDemandOrder,
|
||||||
|
);
|
||||||
|
|
||||||
if (providerUser != null) {
|
if (providerUser != null) {
|
||||||
Map<String, dynamic> payLoad = {"type": 'provider_order', "orderId": onDemandOrder.id};
|
Map<String, dynamic> payLoad = {
|
||||||
await SendNotification.sendFcmMessage(Constant.bookingPlaced, providerUser.fcmToken.toString(), payLoad);
|
"type": 'provider_order',
|
||||||
|
"orderId": onDemandOrder.id,
|
||||||
|
};
|
||||||
|
await SendNotification.sendFcmMessage(
|
||||||
|
Constant.bookingPlaced,
|
||||||
|
providerUser.fcmToken.toString(),
|
||||||
|
payLoad,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
Get.offAll(const OnDemandDashboardScreen());
|
Get.offAll(const OnDemandDashboardScreen());
|
||||||
OnDemandDashboardController controller = Get.put(OnDemandDashboardController());
|
OnDemandDashboardController controller = Get.put(
|
||||||
|
OnDemandDashboardController(),
|
||||||
|
);
|
||||||
controller.selectedIndex.value = 2;
|
controller.selectedIndex.value = 2;
|
||||||
ShowToastDialog.showToast("OnDemand Service successfully booked".tr());
|
ShowToastDialog.showToast("OnDemand Service successfully booked".tr());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
import '../models/category_model.dart';
|
import '../models/category_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.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/multi_vendor_service/wallet_screen/wallet_screen.dart';
|
||||||
import 'package:customer/screen_ui/on_demand_service/favourite_ondemand_screen.dart';
|
import 'package:customer/screen_ui/on_demand_service/favourite_ondemand_screen.dart';
|
||||||
import 'package:customer/service/fire_store_utils.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/my_booking_on_demand_screen.dart';
|
||||||
import '../screen_ui/on_demand_service/on_demand_home_screen.dart';
|
import '../screen_ui/on_demand_service/on_demand_home_screen.dart';
|
||||||
|
|
||||||
@@ -17,7 +16,12 @@ class OnDemandDashboardController extends GetxController {
|
|||||||
void onInit() {
|
void onInit() {
|
||||||
getTaxList();
|
getTaxList();
|
||||||
if (Constant.walletSetting == false) {
|
if (Constant.walletSetting == false) {
|
||||||
pageList.value = [OnDemandHomeScreen(), FavouriteOndemandScreen(), const MyBookingOnDemandScreen(), const ProfileScreen()];
|
pageList.value = [
|
||||||
|
OnDemandHomeScreen(),
|
||||||
|
FavouriteOndemandScreen(),
|
||||||
|
const MyBookingOnDemandScreen(),
|
||||||
|
const ProfileScreen(),
|
||||||
|
];
|
||||||
} else {
|
} else {
|
||||||
pageList.value = [
|
pageList.value = [
|
||||||
OnDemandHomeScreen(),
|
OnDemandHomeScreen(),
|
||||||
@@ -31,7 +35,9 @@ class OnDemandDashboardController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getTaxList() async {
|
Future<void> getTaxList() async {
|
||||||
await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) {
|
await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
Constant.taxList = value;
|
Constant.taxList = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:customer/constant/constant.dart';
|
import 'package:customer/constant/constant.dart';
|
||||||
import 'package:customer/models/user_model.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 'package:intl/intl.dart';
|
||||||
import '../models/favorite_ondemand_service_model.dart';
|
import '../models/favorite_ondemand_service_model.dart';
|
||||||
import '../models/provider_serivce_model.dart';
|
import '../models/provider_serivce_model.dart';
|
||||||
@@ -14,7 +14,8 @@ class OnDemandDetailsController extends GetxController {
|
|||||||
final RxString subCategoryTitle = ''.obs;
|
final RxString subCategoryTitle = ''.obs;
|
||||||
final RxString categoryTitle = ''.obs;
|
final RxString categoryTitle = ''.obs;
|
||||||
final RxList<RatingModel> ratingService = <RatingModel>[].obs;
|
final RxList<RatingModel> ratingService = <RatingModel>[].obs;
|
||||||
final RxList<FavouriteOndemandServiceModel> lstFav = <FavouriteOndemandServiceModel>[].obs;
|
final RxList<FavouriteOndemandServiceModel> lstFav =
|
||||||
|
<FavouriteOndemandServiceModel>[].obs;
|
||||||
final RxBool isLoading = true.obs;
|
final RxBool isLoading = true.obs;
|
||||||
final RxBool isOpen = false.obs;
|
final RxBool isOpen = false.obs;
|
||||||
final RxString tabString = "About".obs;
|
final RxString tabString = "About".obs;
|
||||||
@@ -27,35 +28,44 @@ class OnDemandDetailsController extends GetxController {
|
|||||||
getData();
|
getData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Future<void> getData() async {
|
Future<void> getData() async {
|
||||||
await getReviewList();
|
await getReviewList();
|
||||||
await getAuthor(); //fetch and set provider author here
|
await getAuthor(); //fetch and set provider author here
|
||||||
if (Constant.userModel != null) {
|
if (Constant.userModel != null) {
|
||||||
lstFav.value = await FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid());
|
lstFav.value = await FireStoreUtils.getFavouritesServiceList(
|
||||||
|
FireStoreUtils.getCurrentUid(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getReviewList() async {
|
Future<void> getReviewList() async {
|
||||||
await FireStoreUtils.getCategoryById(provider.categoryId.toString()).then((value) {
|
await FireStoreUtils.getCategoryById(provider.categoryId.toString()).then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
categoryTitle.value = value.title.toString();
|
categoryTitle.value = value.title.toString();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
await FireStoreUtils.getSubCategoryById(provider.subCategoryId.toString()).then((value) {
|
await FireStoreUtils.getSubCategoryById(
|
||||||
|
provider.subCategoryId.toString(),
|
||||||
|
).then((value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
subCategoryTitle.value = value.title.toString();
|
subCategoryTitle.value = value.title.toString();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
await FireStoreUtils.getReviewByProviderServiceId(provider.id.toString()).then((value) {
|
await FireStoreUtils.getReviewByProviderServiceId(
|
||||||
|
provider.id.toString(),
|
||||||
|
).then((value) {
|
||||||
ratingService.value = value;
|
ratingService.value = value;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (Constant.userModel != null) {
|
if (Constant.userModel != null) {
|
||||||
await FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()).then((value) {
|
await FireStoreUtils.getFavouritesServiceList(
|
||||||
|
FireStoreUtils.getCurrentUid(),
|
||||||
|
).then((value) {
|
||||||
lstFav.value = value;
|
lstFav.value = value;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -78,8 +88,12 @@ class OnDemandDetailsController extends GetxController {
|
|||||||
|
|
||||||
for (var element in provider.days) {
|
for (var element in provider.days) {
|
||||||
if (day == element.toString()) {
|
if (day == element.toString()) {
|
||||||
final start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${provider.startTime}");
|
final start = DateFormat(
|
||||||
final end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${provider.endTime}");
|
"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)) {
|
if (isCurrentDateInRange(start, end)) {
|
||||||
isOpen.value = true;
|
isOpen.value = true;
|
||||||
}
|
}
|
||||||
@@ -96,5 +110,3 @@ class OnDemandDetailsController extends GetxController {
|
|||||||
tabString.value = tab;
|
tabString.value = tab;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import 'package:customer/models/favorite_ondemand_service_model.dart';
|
|||||||
import 'package:customer/models/provider_serivce_model.dart';
|
import 'package:customer/models/provider_serivce_model.dart';
|
||||||
import 'package:customer/screen_ui/auth_screens/login_screen.dart';
|
import 'package:customer/screen_ui/auth_screens/login_screen.dart';
|
||||||
import 'package:customer/service/fire_store_utils.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 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||||
import '../constant/constant.dart';
|
import '../constant/constant.dart';
|
||||||
|
|
||||||
@@ -40,24 +40,31 @@ class OnDemandHomeController extends GetxController {
|
|||||||
// Fetch provider services
|
// Fetch provider services
|
||||||
FireStoreUtils.getProviderFuture()
|
FireStoreUtils.getProviderFuture()
|
||||||
.then((providerServiceList) {
|
.then((providerServiceList) {
|
||||||
Set<String?> uniqueAuthorIds = providerServiceList.map((service) => service.author).toSet();
|
Set<String?> uniqueAuthorIds =
|
||||||
|
providerServiceList.map((service) => service.author).toSet();
|
||||||
List<String?> listOfUniqueProviders = uniqueAuthorIds.toList();
|
List<String?> listOfUniqueProviders = uniqueAuthorIds.toList();
|
||||||
|
|
||||||
List<ProviderServiceModel> filteredProviders = [];
|
List<ProviderServiceModel> filteredProviders = [];
|
||||||
|
|
||||||
for (var provider in listOfUniqueProviders) {
|
for (var provider in listOfUniqueProviders) {
|
||||||
List<ProviderServiceModel> filteredList = providerServiceList.where((service) => service.author == provider).toList();
|
List<ProviderServiceModel> filteredList =
|
||||||
|
providerServiceList
|
||||||
|
.where((service) => service.author == provider)
|
||||||
|
.toList();
|
||||||
|
|
||||||
filteredList.sort((a, b) => a.createdAt!.compareTo(b.createdAt!));
|
filteredList.sort((a, b) => a.createdAt!.compareTo(b.createdAt!));
|
||||||
|
|
||||||
for (int index = 0; index < filteredList.length; index++) {
|
for (int index = 0; index < filteredList.length; index++) {
|
||||||
final service = filteredList[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") {
|
if (service.subscriptionPlan?.itemLimit == "-1") {
|
||||||
filteredProviders.add(service);
|
filteredProviders.add(service);
|
||||||
} else {
|
} else {
|
||||||
if (index < int.parse(service.subscriptionPlan?.itemLimit ?? '0')) {
|
if (index <
|
||||||
|
int.parse(service.subscriptionPlan?.itemLimit ?? '0')) {
|
||||||
filteredProviders.add(service);
|
filteredProviders.add(service);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,7 +82,9 @@ class OnDemandHomeController extends GetxController {
|
|||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()).then((favList) {
|
FireStoreUtils.getFavouritesServiceList(
|
||||||
|
FireStoreUtils.getCurrentUid(),
|
||||||
|
).then((favList) {
|
||||||
lstFav.value = favList;
|
lstFav.value = favList;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -85,7 +94,9 @@ class OnDemandHomeController extends GetxController {
|
|||||||
if (categoryId == null || categoryId.isEmpty) return null;
|
if (categoryId == null || categoryId.isEmpty) return null;
|
||||||
|
|
||||||
// Try to find category from cached list
|
// 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
|
// If not found, fetch from Firestore
|
||||||
cat ??= await FireStoreUtils.getCategoryById(categoryId);
|
cat ??= await FireStoreUtils.getCategoryById(categoryId);
|
||||||
@@ -94,29 +105,34 @@ class OnDemandHomeController extends GetxController {
|
|||||||
return cat;
|
return cat;
|
||||||
}
|
}
|
||||||
|
|
||||||
RxList<FavouriteOndemandServiceModel> lstFav = <FavouriteOndemandServiceModel>[].obs;
|
RxList<FavouriteOndemandServiceModel> lstFav =
|
||||||
|
<FavouriteOndemandServiceModel>[].obs;
|
||||||
|
|
||||||
void toggleFavourite(ProviderServiceModel provider) {
|
void toggleFavourite(ProviderServiceModel provider) {
|
||||||
if (Constant.userModel == null) {
|
if (Constant.userModel == null) {
|
||||||
Get.to(LoginScreen());
|
Get.to(LoginScreen());
|
||||||
} else {
|
} else {
|
||||||
var contain = lstFav.where((element) => element.service_id == provider.id);
|
var contain = lstFav.where(
|
||||||
|
(element) => element.service_id == provider.id,
|
||||||
|
);
|
||||||
if (contain.isNotEmpty) {
|
if (contain.isNotEmpty) {
|
||||||
FavouriteOndemandServiceModel favouriteModel = FavouriteOndemandServiceModel(
|
FavouriteOndemandServiceModel favouriteModel =
|
||||||
section_id: provider.sectionId,
|
FavouriteOndemandServiceModel(
|
||||||
service_id: provider.id,
|
section_id: provider.sectionId,
|
||||||
user_id: FireStoreUtils.getCurrentUid(),
|
service_id: provider.id,
|
||||||
serviceAuthorId: provider.author,
|
user_id: FireStoreUtils.getCurrentUid(),
|
||||||
);
|
serviceAuthorId: provider.author,
|
||||||
|
);
|
||||||
FireStoreUtils.removeFavouriteOndemandService(favouriteModel);
|
FireStoreUtils.removeFavouriteOndemandService(favouriteModel);
|
||||||
lstFav.removeWhere((item) => item.service_id == provider.id);
|
lstFav.removeWhere((item) => item.service_id == provider.id);
|
||||||
} else {
|
} else {
|
||||||
FavouriteOndemandServiceModel favouriteModel = FavouriteOndemandServiceModel(
|
FavouriteOndemandServiceModel favouriteModel =
|
||||||
section_id: provider.sectionId,
|
FavouriteOndemandServiceModel(
|
||||||
service_id: provider.id,
|
section_id: provider.sectionId,
|
||||||
user_id: FireStoreUtils.getCurrentUid(),
|
service_id: provider.id,
|
||||||
serviceAuthorId: provider.author,
|
user_id: FireStoreUtils.getCurrentUid(),
|
||||||
);
|
serviceAuthorId: provider.author,
|
||||||
|
);
|
||||||
FireStoreUtils.setFavouriteOndemandSection(favouriteModel);
|
FireStoreUtils.setFavouriteOndemandSection(favouriteModel);
|
||||||
lstFav.add(favouriteModel);
|
lstFav.add(favouriteModel);
|
||||||
}
|
}
|
||||||
@@ -127,7 +143,13 @@ class OnDemandHomeController extends GetxController {
|
|||||||
await FireStoreUtils.getZone().then((value) {
|
await FireStoreUtils.getZone().then((value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
for (int i = 0; i < value.length; i++) {
|
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.selectedZone = value[i];
|
||||||
Constant.isZoneAvailable = true;
|
Constant.isZoneAvailable = true;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import 'package:customer/models/coupon_model.dart';
|
|||||||
import 'package:customer/models/user_model.dart';
|
import 'package:customer/models/user_model.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import '../constant/constant.dart';
|
import '../constant/constant.dart';
|
||||||
import '../models/onprovider_order_model.dart';
|
import '../models/onprovider_order_model.dart';
|
||||||
import '../models/wallet_transaction_model.dart';
|
import '../models/wallet_transaction_model.dart';
|
||||||
@@ -19,7 +19,8 @@ class OnDemandOrderDetailsController extends GetxController {
|
|||||||
Rxn<WorkerModel> worker = Rxn<WorkerModel>();
|
Rxn<WorkerModel> worker = Rxn<WorkerModel>();
|
||||||
|
|
||||||
Rx<TextEditingController> couponTextController = TextEditingController().obs;
|
Rx<TextEditingController> couponTextController = TextEditingController().obs;
|
||||||
Rx<TextEditingController> cancelBookingController = TextEditingController().obs;
|
Rx<TextEditingController> cancelBookingController =
|
||||||
|
TextEditingController().obs;
|
||||||
|
|
||||||
RxDouble subTotal = 0.0.obs;
|
RxDouble subTotal = 0.0.obs;
|
||||||
RxDouble price = 0.0.obs;
|
RxDouble price = 0.0.obs;
|
||||||
@@ -48,17 +49,22 @@ class OnDemandOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
Future<void> getData() async {
|
Future<void> getData() async {
|
||||||
try {
|
try {
|
||||||
final order = await FireStoreUtils.getProviderOrderById(onProviderOrder.value!.id);
|
final order = await FireStoreUtils.getProviderOrderById(
|
||||||
|
onProviderOrder.value!.id,
|
||||||
|
);
|
||||||
if (order != null) {
|
if (order != null) {
|
||||||
onProviderOrder.value = order;
|
onProviderOrder.value = order;
|
||||||
|
|
||||||
discountType.value = order.discountType ?? "";
|
discountType.value = order.discountType ?? "";
|
||||||
discountLabel.value = order.discountLabel ?? "";
|
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 ?? "";
|
offerCode.value = order.couponCode ?? "";
|
||||||
|
|
||||||
// Fetch provider
|
// Fetch provider
|
||||||
providerUser.value = await FireStoreUtils.getUserProfile(order.provider.author.toString());
|
providerUser.value = await FireStoreUtils.getUserProfile(
|
||||||
|
order.provider.author.toString(),
|
||||||
|
);
|
||||||
|
|
||||||
// Fetch worker (if exists)
|
// Fetch worker (if exists)
|
||||||
if (order.workerId != null && order.workerId!.isNotEmpty) {
|
if (order.workerId != null && order.workerId!.isNotEmpty) {
|
||||||
@@ -70,7 +76,9 @@ class OnDemandOrderDetailsController extends GetxController {
|
|||||||
calculatePrice();
|
calculatePrice();
|
||||||
|
|
||||||
// Load available coupons
|
// Load available coupons
|
||||||
FireStoreUtils.getProviderCouponAfterExpire(order.provider.author.toString()).then((expiredCoupons) {
|
FireStoreUtils.getProviderCouponAfterExpire(
|
||||||
|
order.provider.author.toString(),
|
||||||
|
).then((expiredCoupons) {
|
||||||
couponList.assignAll(expiredCoupons);
|
couponList.assignAll(expiredCoupons);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -90,8 +98,12 @@ class OnDemandOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
void applyCoupon(CouponModel coupon) {
|
void applyCoupon(CouponModel coupon) {
|
||||||
double discount = 0.0;
|
double discount = 0.0;
|
||||||
if (coupon.discountType == "Percentage" || coupon.discountType == "Percent") {
|
if (coupon.discountType == "Percentage" ||
|
||||||
discount = price.value * (double.tryParse(coupon.discount.toString()) ?? 0) / 100;
|
coupon.discountType == "Percent") {
|
||||||
|
discount =
|
||||||
|
price.value *
|
||||||
|
(double.tryParse(coupon.discount.toString()) ?? 0) /
|
||||||
|
100;
|
||||||
} else {
|
} else {
|
||||||
discount = double.tryParse(coupon.discount.toString()) ?? 0;
|
discount = double.tryParse(coupon.discount.toString()) ?? 0;
|
||||||
}
|
}
|
||||||
@@ -108,17 +120,29 @@ class OnDemandOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
void calculatePrice() {
|
void calculatePrice() {
|
||||||
double basePrice =
|
double basePrice =
|
||||||
(onProviderOrder.value?.provider.disPrice == "" || onProviderOrder.value?.provider.disPrice == "0")
|
(onProviderOrder.value?.provider.disPrice == "" ||
|
||||||
? double.tryParse(onProviderOrder.value?.provider.price.toString() ?? "0") ?? 0
|
onProviderOrder.value?.provider.disPrice == "0")
|
||||||
: double.tryParse(onProviderOrder.value?.provider.disPrice.toString() ?? "0") ?? 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);
|
price.value = basePrice * (onProviderOrder.value?.quantity ?? 0.0);
|
||||||
|
|
||||||
// discount
|
// discount
|
||||||
if (discountType.value == "Percentage" || discountType.value == "Percent") {
|
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 {
|
} 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;
|
subTotal.value = price.value - discountAmount.value;
|
||||||
@@ -126,7 +150,10 @@ class OnDemandOrderDetailsController extends GetxController {
|
|||||||
// tax calculation
|
// tax calculation
|
||||||
double total = subTotal.value;
|
double total = subTotal.value;
|
||||||
for (var element in Constant.taxList) {
|
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;
|
totalAmount.value = total;
|
||||||
@@ -152,22 +179,30 @@ class OnDemandOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
// Calculate total
|
// Calculate total
|
||||||
final pricePerUnit =
|
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);
|
total = pricePerUnit * (order.quantity);
|
||||||
|
|
||||||
// Add tax
|
// Add tax
|
||||||
if (Constant.taxList.isNotEmpty) {
|
if (Constant.taxList.isNotEmpty) {
|
||||||
for (var tax in Constant.taxList) {
|
for (var tax in Constant.taxList) {
|
||||||
total += Constant.getTaxValue(amount: total.toString(), taxModel: tax);
|
total += Constant.getTaxValue(
|
||||||
|
amount: total.toString(),
|
||||||
|
taxModel: tax,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Admin commission
|
// Admin commission
|
||||||
double adminComm = 0.0;
|
double adminComm = 0.0;
|
||||||
if ((order.adminCommission ?? '0') != '0' && (order.adminCommissionType ?? '').isNotEmpty) {
|
if ((order.adminCommission ?? '0') != '0' &&
|
||||||
if (order.adminCommissionType!.toLowerCase() == 'percentage' || order.adminCommissionType!.toLowerCase() == 'percent') {
|
(order.adminCommissionType ?? '').isNotEmpty) {
|
||||||
adminComm = (total * (double.tryParse(order.adminCommission!) ?? 0)) / 100;
|
if (order.adminCommissionType!.toLowerCase() == 'percentage' ||
|
||||||
|
order.adminCommissionType!.toLowerCase() == 'percent') {
|
||||||
|
adminComm =
|
||||||
|
(total * (double.tryParse(order.adminCommission!) ?? 0)) / 100;
|
||||||
} else {
|
} else {
|
||||||
adminComm = double.tryParse(order.adminCommission!) ?? 0;
|
adminComm = double.tryParse(order.adminCommission!) ?? 0;
|
||||||
}
|
}
|
||||||
@@ -237,10 +272,19 @@ class OnDemandOrderDetailsController extends GetxController {
|
|||||||
await FireStoreUtils.updateOnDemandOrder(order); // Ensure this completes
|
await FireStoreUtils.updateOnDemandOrder(order); // Ensure this completes
|
||||||
|
|
||||||
// Notify provider
|
// Notify provider
|
||||||
final provider = await FireStoreUtils.getUserProfile(order.provider.author ?? '');
|
final provider = await FireStoreUtils.getUserProfile(
|
||||||
|
order.provider.author ?? '',
|
||||||
|
);
|
||||||
if (provider != null) {
|
if (provider != null) {
|
||||||
Map<String, dynamic> payload = {"type": 'provider_order', "orderId": order.id};
|
Map<String, dynamic> payload = {
|
||||||
await SendNotification.sendFcmMessage(Constant.bookingPlaced, provider.fcmToken ?? '', payload);
|
"type": 'provider_order',
|
||||||
|
"orderId": order.id,
|
||||||
|
};
|
||||||
|
await SendNotification.sendFcmMessage(
|
||||||
|
Constant.bookingPlaced,
|
||||||
|
provider.fcmToken ?? '',
|
||||||
|
payload,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import '../constant/collection_name.dart';
|
import '../constant/collection_name.dart';
|
||||||
import '../models/onprovider_order_model.dart';
|
import '../models/onprovider_order_model.dart';
|
||||||
import '../models/provider_serivce_model.dart';
|
import '../models/provider_serivce_model.dart';
|
||||||
@@ -20,7 +20,8 @@ class OnDemandReviewController extends GetxController {
|
|||||||
final TextEditingController comment = TextEditingController();
|
final TextEditingController comment = TextEditingController();
|
||||||
|
|
||||||
final Rxn<UserModel> provider = Rxn<UserModel>();
|
final Rxn<UserModel> provider = Rxn<UserModel>();
|
||||||
final Rxn<ProviderServiceModel> providerServiceModel = Rxn<ProviderServiceModel>();
|
final Rxn<ProviderServiceModel> providerServiceModel =
|
||||||
|
Rxn<ProviderServiceModel>();
|
||||||
final Rxn<WorkerModel> workerModel = Rxn<WorkerModel>();
|
final Rxn<WorkerModel> workerModel = Rxn<WorkerModel>();
|
||||||
|
|
||||||
final RxInt providerReviewCount = 0.obs;
|
final RxInt providerReviewCount = 0.obs;
|
||||||
@@ -46,14 +47,20 @@ class OnDemandReviewController extends GetxController {
|
|||||||
void getReview() async {
|
void getReview() async {
|
||||||
// Get existing rating
|
// Get existing rating
|
||||||
if (reviewFor.value == "Provider") {
|
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) {
|
if (value != null) {
|
||||||
ratingModel.value = value;
|
ratingModel.value = value;
|
||||||
ratings.value = value.rating ?? 0.0;
|
ratings.value = value.rating ?? 0.0;
|
||||||
comment.text = value.comment ?? '';
|
comment.text = value.comment ?? '';
|
||||||
}
|
}
|
||||||
} else {
|
} 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) {
|
if (value != null) {
|
||||||
ratingModel.value = value;
|
ratingModel.value = value;
|
||||||
ratings.value = value.rating ?? 0.0;
|
ratings.value = value.rating ?? 0.0;
|
||||||
@@ -63,7 +70,9 @@ class OnDemandReviewController extends GetxController {
|
|||||||
|
|
||||||
// Worker review logic
|
// Worker review logic
|
||||||
if (reviewFor.value == "Worker") {
|
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) {
|
if (value != null) {
|
||||||
workerModel.value = value;
|
workerModel.value = value;
|
||||||
|
|
||||||
@@ -71,25 +80,35 @@ class OnDemandReviewController extends GetxController {
|
|||||||
final double existingSum = (value.reviewsSum ?? 0.0).toDouble();
|
final double existingSum = (value.reviewsSum ?? 0.0).toDouble();
|
||||||
final double oldRating = ratingModel.value?.rating ?? 0.0;
|
final double oldRating = ratingModel.value?.rating ?? 0.0;
|
||||||
|
|
||||||
workerReviewCount.value = ratingModel.value != null ? (existingCount - 1) : existingCount;
|
workerReviewCount.value =
|
||||||
workerReviewSum.value = ratingModel.value != null ? (existingSum - oldRating) : existingSum;
|
ratingModel.value != null ? (existingCount - 1) : existingCount;
|
||||||
|
workerReviewSum.value =
|
||||||
|
ratingModel.value != null ? (existingSum - oldRating) : existingSum;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Provider & service review logic
|
// Provider & service review logic
|
||||||
else {
|
else {
|
||||||
UserModel? user = await FireStoreUtils.getUserProfile(order.value!.provider.author.toString());
|
UserModel? user = await FireStoreUtils.getUserProfile(
|
||||||
|
order.value!.provider.author.toString(),
|
||||||
|
);
|
||||||
if (user != null) {
|
if (user != null) {
|
||||||
provider.value = user;
|
provider.value = user;
|
||||||
|
|
||||||
final int existingCount = int.tryParse(user.reviewsCount?.toString() ?? '0') ?? 0;
|
final int existingCount =
|
||||||
final double existingSum = double.tryParse(user.reviewsSum?.toString() ?? '0.0') ?? 0.0;
|
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;
|
final double oldRating = ratingModel.value?.rating ?? 0.0;
|
||||||
|
|
||||||
providerReviewCount.value = ratingModel.value != null ? (existingCount - 1) : existingCount;
|
providerReviewCount.value =
|
||||||
providerReviewSum.value = ratingModel.value != null ? (existingSum - oldRating) : existingSum;
|
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) {
|
if (service != null) {
|
||||||
providerServiceModel.value = service;
|
providerServiceModel.value = service;
|
||||||
|
|
||||||
@@ -97,8 +116,10 @@ class OnDemandReviewController extends GetxController {
|
|||||||
final double existingSum = (service.reviewsSum ?? 0.0).toDouble();
|
final double existingSum = (service.reviewsSum ?? 0.0).toDouble();
|
||||||
final double oldRating = ratingModel.value?.rating ?? 0.0;
|
final double oldRating = ratingModel.value?.rating ?? 0.0;
|
||||||
|
|
||||||
serviceReviewCount.value = ratingModel.value != null ? (existingCount - 1) : existingCount;
|
serviceReviewCount.value =
|
||||||
serviceReviewSum.value = ratingModel.value != null ? (existingSum - oldRating) : existingSum;
|
ratingModel.value != null ? (existingCount - 1) : existingCount;
|
||||||
|
serviceReviewSum.value =
|
||||||
|
ratingModel.value != null ? (existingSum - oldRating) : existingSum;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -114,22 +135,29 @@ class OnDemandReviewController extends GetxController {
|
|||||||
Future<void> _providerReviewSubmit() async {
|
Future<void> _providerReviewSubmit() async {
|
||||||
ShowToastDialog.showLoader("Submit in...".tr());
|
ShowToastDialog.showLoader("Submit in...".tr());
|
||||||
providerServiceModel.value!.reviewsCount = serviceReviewCount.value + 1;
|
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
|
// Convert to string only if your model field is String
|
||||||
provider.value!.reviewsCount = (providerReviewCount.value + 1).toString();
|
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(
|
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,
|
productId: ratingModel.value?.productId ?? order.value!.provider.id,
|
||||||
comment: comment.text,
|
comment: comment.text,
|
||||||
photos: ratingModel.value?.photos ?? [],
|
photos: ratingModel.value?.photos ?? [],
|
||||||
rating: ratings.value,
|
rating: ratings.value,
|
||||||
orderId: ratingModel.value?.orderId ?? order.value!.id,
|
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,
|
customerId: Constant.userModel?.id,
|
||||||
uname: '${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}',
|
uname:
|
||||||
|
'${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}',
|
||||||
profile: Constant.userModel?.profilePictureURL,
|
profile: Constant.userModel?.profilePictureURL,
|
||||||
createdAt: Timestamp.now(),
|
createdAt: Timestamp.now(),
|
||||||
);
|
);
|
||||||
@@ -148,7 +176,9 @@ class OnDemandReviewController extends GetxController {
|
|||||||
workerModel.value!.reviewsSum = workerReviewSum.value + ratings.value;
|
workerModel.value!.reviewsSum = workerReviewSum.value + ratings.value;
|
||||||
|
|
||||||
RatingModel rate = RatingModel(
|
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,
|
productId: ratingModel.value?.productId ?? order.value!.provider.id,
|
||||||
comment: comment.text,
|
comment: comment.text,
|
||||||
photos: ratingModel.value?.photos ?? [],
|
photos: ratingModel.value?.photos ?? [],
|
||||||
@@ -156,7 +186,8 @@ class OnDemandReviewController extends GetxController {
|
|||||||
orderId: ratingModel.value?.orderId ?? order.value!.id,
|
orderId: ratingModel.value?.orderId ?? order.value!.id,
|
||||||
driverId: ratingModel.value?.driverId ?? order.value!.workerId.toString(),
|
driverId: ratingModel.value?.driverId ?? order.value!.workerId.toString(),
|
||||||
customerId: Constant.userModel?.id,
|
customerId: Constant.userModel?.id,
|
||||||
uname: '${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}',
|
uname:
|
||||||
|
'${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}',
|
||||||
profile: Constant.userModel?.profilePictureURL,
|
profile: Constant.userModel?.profilePictureURL,
|
||||||
createdAt: Timestamp.now(),
|
createdAt: Timestamp.now(),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import 'package:customer/models/cart_product_model.dart';
|
|||||||
import 'package:customer/models/order_model.dart';
|
import 'package:customer/models/order_model.dart';
|
||||||
import '../service/cart_provider.dart';
|
import '../service/cart_provider.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class OrderController extends GetxController {
|
class OrderController extends GetxController {
|
||||||
RxList<OrderModel> allList = <OrderModel>[].obs;
|
RxList<OrderModel> allList = <OrderModel>[].obs;
|
||||||
@@ -26,16 +26,27 @@ class OrderController extends GetxController {
|
|||||||
await FireStoreUtils.getAllOrder().then((value) {
|
await FireStoreUtils.getAllOrder().then((value) {
|
||||||
allList.value = 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 =
|
inProgressList.value =
|
||||||
allList
|
allList
|
||||||
.where(
|
.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();
|
.toList();
|
||||||
|
|
||||||
deliveredList.value = allList.where((p0) => p0.status == Constant.orderCompleted).toList();
|
deliveredList.value =
|
||||||
cancelledList.value = allList.where((p0) => p0.status == Constant.orderCancelled).toList();
|
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();
|
final CartProvider cartProvider = CartProvider();
|
||||||
|
|
||||||
void addToCart({required CartProductModel cartProductModel}) {
|
void addToCart({required CartProductModel cartProductModel}) {
|
||||||
cartProvider.addToCart(Get.context!, cartProductModel, cartProductModel.quantity!);
|
cartProvider.addToCart(
|
||||||
|
Get.context!,
|
||||||
|
cartProductModel,
|
||||||
|
cartProductModel.quantity!,
|
||||||
|
);
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import 'package:customer/constant/constant.dart';
|
import 'package:customer/constant/constant.dart';
|
||||||
import 'package:customer/models/cart_product_model.dart';
|
import 'package:customer/models/cart_product_model.dart';
|
||||||
import 'package:customer/models/order_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';
|
import '../service/cart_provider.dart';
|
||||||
|
|
||||||
class OrderDetailsController extends GetxController {
|
class OrderDetailsController extends GetxController {
|
||||||
@@ -39,28 +38,48 @@ class OrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
for (var element in orderModel.value.products!) {
|
for (var element in orderModel.value.products!) {
|
||||||
if (double.parse(element.discountPrice.toString()) <= 0) {
|
if (double.parse(element.discountPrice.toString()) <= 0) {
|
||||||
subTotal.value = subTotal.value +
|
subTotal.value =
|
||||||
double.parse(element.price.toString()) * double.parse(element.quantity.toString()) +
|
subTotal.value +
|
||||||
(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 {
|
} else {
|
||||||
subTotal.value = subTotal.value +
|
subTotal.value =
|
||||||
double.parse(element.discountPrice.toString()) * double.parse(element.quantity.toString()) +
|
subTotal.value +
|
||||||
(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 (orderModel.value.specialDiscount != null && orderModel.value.specialDiscount!['special_discount'] != null) {
|
if (orderModel.value.specialDiscount != null &&
|
||||||
specialDiscountAmount.value = double.parse(orderModel.value.specialDiscount!['special_discount'].toString());
|
orderModel.value.specialDiscount!['special_discount'] != null) {
|
||||||
|
specialDiscountAmount.value = double.parse(
|
||||||
|
orderModel.value.specialDiscount!['special_discount'].toString(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (orderModel.value.taxSetting != null) {
|
if (orderModel.value.taxSetting != null) {
|
||||||
for (var element in orderModel.value.taxSetting!) {
|
for (var element in orderModel.value.taxSetting!) {
|
||||||
taxAmount.value = taxAmount.value +
|
taxAmount.value =
|
||||||
Constant.calculateTax(amount: (subTotal.value - double.parse(orderModel.value.discount.toString()) - specialDiscountAmount.value).toString(), taxModel: element);
|
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 +
|
taxAmount.value +
|
||||||
double.parse(orderModel.value.deliveryCharge.toString()) +
|
double.parse(orderModel.value.deliveryCharge.toString()) +
|
||||||
double.parse(orderModel.value.tipAmount.toString());
|
double.parse(orderModel.value.tipAmount.toString());
|
||||||
@@ -71,7 +90,11 @@ class OrderDetailsController extends GetxController {
|
|||||||
final CartProvider cartProvider = CartProvider();
|
final CartProvider cartProvider = CartProvider();
|
||||||
|
|
||||||
void addToCart({required CartProductModel cartProductModel}) {
|
void addToCart({required CartProductModel cartProductModel}) {
|
||||||
cartProvider.addToCart(Get.context!, cartProductModel, cartProductModel.quantity!);
|
cartProvider.addToCart(
|
||||||
|
Get.context!,
|
||||||
|
cartProductModel,
|
||||||
|
cartProductModel.quantity!,
|
||||||
|
);
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:customer/models/order_model.dart';
|
import 'package:customer/models/order_model.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import '../service/database_helper.dart';
|
import '../service/database_helper.dart';
|
||||||
|
|
||||||
class OrderPlacingController extends GetxController {
|
class OrderPlacingController extends GetxController {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'dart:developer';
|
import 'dart:developer';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_osm_plugin/flutter_osm_plugin.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';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
class OsmSearchPlaceController extends GetxController {
|
class OsmSearchPlaceController extends GetxController {
|
||||||
@@ -25,7 +25,8 @@ class OsmSearchPlaceController extends GetxController {
|
|||||||
try {
|
try {
|
||||||
String locale = 'en';
|
String locale = 'en';
|
||||||
SharedPreferences sp = await SharedPreferences.getInstance();
|
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";
|
locale = sp.getString("languageCode") ?? "en";
|
||||||
}
|
}
|
||||||
suggestionsList.value = await addressSuggestion(text, locale: locale);
|
suggestionsList.value = await addressSuggestion(text, locale: locale);
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import 'package:customer/themes/show_toast_dialog.dart';
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:firebase_auth/firebase_auth.dart';
|
import 'package:firebase_auth/firebase_auth.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import '../constant/constant.dart';
|
import '../constant/constant.dart';
|
||||||
import '../models/user_model.dart';
|
import '../models/user_model.dart';
|
||||||
import '../screen_ui/auth_screens/login_screen.dart';
|
import '../screen_ui/auth_screens/login_screen.dart';
|
||||||
@@ -63,15 +63,27 @@ class OtpVerifyController extends GetxController {
|
|||||||
try {
|
try {
|
||||||
ShowToastDialog.showLoader("Verifying OTP...".tr());
|
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 fcmToken = await NotificationService.getToken();
|
||||||
final result = await _auth.signInWithCredential(credential);
|
final result = await _auth.signInWithCredential(credential);
|
||||||
|
|
||||||
if (result.additionalUserInfo?.isNewUser == true) {
|
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();
|
ShowToastDialog.closeLoader();
|
||||||
Get.to(() => const SignUpScreen(), arguments: {'type': 'mobileNumber', 'userModel': userModel});
|
Get.to(
|
||||||
|
() => const SignUpScreen(),
|
||||||
|
arguments: {'type': 'mobileNumber', 'userModel': userModel},
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,8 +91,16 @@ class OtpVerifyController extends GetxController {
|
|||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
|
|
||||||
if (!exists) {
|
if (!exists) {
|
||||||
final userModel = UserModel(id: result.user!.uid, countryCode: countryCode.value, phoneNumber: phoneNumber.value, fcmToken: fcmToken);
|
final userModel = UserModel(
|
||||||
Get.off(() => const SignUpScreen(), arguments: {'type': 'mobileNumber', 'userModel': userModel});
|
id: result.user!.uid,
|
||||||
|
countryCode: countryCode.value,
|
||||||
|
phoneNumber: phoneNumber.value,
|
||||||
|
fcmToken: fcmToken,
|
||||||
|
);
|
||||||
|
Get.off(
|
||||||
|
() => const SignUpScreen(),
|
||||||
|
arguments: {'type': 'mobileNumber', 'userModel': userModel},
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,7 +122,10 @@ class OtpVerifyController extends GetxController {
|
|||||||
await FireStoreUtils.updateUser(userModel);
|
await FireStoreUtils.updateUser(userModel);
|
||||||
|
|
||||||
if (userModel.shippingAddress?.isNotEmpty ?? false) {
|
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;
|
Constant.selectedLocation = defaultAddress;
|
||||||
|
|
||||||
Get.offAll(() => const ServiceListScreen());
|
Get.offAll(() => const ServiceListScreen());
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
import 'package:customer/models/coupon_model.dart';
|
import 'package:customer/models/coupon_model.dart';
|
||||||
import 'package:customer/service/fire_store_utils.dart';
|
import 'package:customer/service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class ParcelCouponController extends GetxController{
|
|
||||||
|
|
||||||
|
class ParcelCouponController extends GetxController {
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
// TODO: implement onInit
|
// TODO: implement onInit
|
||||||
@@ -11,10 +10,10 @@ class ParcelCouponController extends GetxController{
|
|||||||
super.onInit();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getData() {
|
||||||
void getData(){
|
|
||||||
getCouponCode();
|
getCouponCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
RxList<CouponModel> cabCouponList = <CouponModel>[].obs;
|
RxList<CouponModel> cabCouponList = <CouponModel>[].obs;
|
||||||
|
|
||||||
@@ -26,4 +25,4 @@ class ParcelCouponController extends GetxController{
|
|||||||
print("cabCouponList ${cabCouponList.length}");
|
print("cabCouponList ${cabCouponList.length}");
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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/multi_vendor_service/wallet_screen/wallet_screen.dart';
|
||||||
import 'package:customer/screen_ui/parcel_service/home_parcel_screen.dart';
|
import 'package:customer/screen_ui/parcel_service/home_parcel_screen.dart';
|
||||||
import 'package:customer/service/fire_store_utils.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';
|
import '../screen_ui/parcel_service/my_booking_screen.dart';
|
||||||
|
|
||||||
class ParcelDashboardController extends GetxController {
|
class ParcelDashboardController extends GetxController {
|
||||||
@@ -15,15 +15,26 @@ class ParcelDashboardController extends GetxController {
|
|||||||
void onInit() {
|
void onInit() {
|
||||||
getTaxList();
|
getTaxList();
|
||||||
if (Constant.walletSetting == false) {
|
if (Constant.walletSetting == false) {
|
||||||
pageList.value = [const HomeParcelScreen(), const MyBookingScreen(), const ProfileScreen()];
|
pageList.value = [
|
||||||
|
const HomeParcelScreen(),
|
||||||
|
const MyBookingScreen(),
|
||||||
|
const ProfileScreen(),
|
||||||
|
];
|
||||||
} else {
|
} else {
|
||||||
pageList.value = [const HomeParcelScreen(), const MyBookingScreen(), const WalletScreen(), const ProfileScreen()];
|
pageList.value = [
|
||||||
|
const HomeParcelScreen(),
|
||||||
|
const MyBookingScreen(),
|
||||||
|
const WalletScreen(),
|
||||||
|
const ProfileScreen(),
|
||||||
|
];
|
||||||
}
|
}
|
||||||
super.onInit();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getTaxList() async {
|
Future<void> getTaxList() async {
|
||||||
await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) {
|
await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
Constant.taxList = value;
|
Constant.taxList = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||||
import 'package:easy_localization/easy_localization.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 'package:intl/intl.dart';
|
||||||
import '../constant/constant.dart';
|
import '../constant/constant.dart';
|
||||||
import '../models/parcel_order_model.dart';
|
import '../models/parcel_order_model.dart';
|
||||||
@@ -15,7 +15,8 @@ class ParcelMyBookingController extends GetxController {
|
|||||||
RxList<ParcelOrderModel> parcelOrder = <ParcelOrderModel>[].obs;
|
RxList<ParcelOrderModel> parcelOrder = <ParcelOrderModel>[].obs;
|
||||||
|
|
||||||
RxString selectedTab = "New".obs;
|
RxString selectedTab = "New".obs;
|
||||||
RxList<String> tabTitles = ["New", "In Transit", "Delivered", "Cancelled"].obs;
|
RxList<String> tabTitles =
|
||||||
|
["New", "In Transit", "Delivered", "Cancelled"].obs;
|
||||||
|
|
||||||
StreamSubscription<List<ParcelOrderModel>>? _parcelSubscription;
|
StreamSubscription<List<ParcelOrderModel>>? _parcelSubscription;
|
||||||
|
|
||||||
@@ -53,16 +54,38 @@ class ParcelMyBookingController extends GetxController {
|
|||||||
List<ParcelOrderModel> getOrdersForTab(String tab) {
|
List<ParcelOrderModel> getOrdersForTab(String tab) {
|
||||||
switch (tab) {
|
switch (tab) {
|
||||||
case "New":
|
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":
|
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":
|
case "Delivered":
|
||||||
return parcelOrder.where((order) => ["Order Completed"].contains(order.status)).toList();
|
return parcelOrder
|
||||||
|
.where((order) => ["Order Completed"].contains(order.status))
|
||||||
|
.toList();
|
||||||
|
|
||||||
case "Cancelled":
|
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:
|
default:
|
||||||
return [];
|
return [];
|
||||||
@@ -70,7 +93,8 @@ class ParcelMyBookingController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Old helper (optional)
|
/// Old helper (optional)
|
||||||
List<ParcelOrderModel> get filteredParcelOrders => getOrdersForTab(selectedTab.value);
|
List<ParcelOrderModel> get filteredParcelOrders =>
|
||||||
|
getOrdersForTab(selectedTab.value);
|
||||||
|
|
||||||
String formatDate(Timestamp timestamp) {
|
String formatDate(Timestamp timestamp) {
|
||||||
final dateTime = timestamp.toDate();
|
final dateTime = timestamp.toDate();
|
||||||
@@ -97,10 +121,18 @@ class ParcelMyBookingController extends GetxController {
|
|||||||
final taxSettings = order.taxSetting ?? [];
|
final taxSettings = order.taxSetting ?? [];
|
||||||
|
|
||||||
for (var element in taxSettings) {
|
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;
|
double refundAmount = subTotal + totalTax;
|
||||||
|
|
||||||
WalletTransactionModel walletTransaction = WalletTransactionModel(
|
WalletTransactionModel walletTransaction = WalletTransactionModel(
|
||||||
@@ -122,7 +154,10 @@ class ParcelMyBookingController extends GetxController {
|
|||||||
await FireStoreUtils.setWalletTransaction(walletTransaction);
|
await FireStoreUtils.setWalletTransaction(walletTransaction);
|
||||||
|
|
||||||
// Update wallet balance
|
// 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());
|
ShowToastDialog.showToast("Order cancelled successfully".tr());
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import 'package:easy_localization/easy_localization.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_paypal/flutter_paypal.dart';
|
import 'package:flutter_paypal/flutter_paypal.dart';
|
||||||
import 'package:flutter_stripe/flutter_stripe.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:http/http.dart' as http;
|
||||||
import 'package:image_picker/image_picker.dart';
|
import 'package:image_picker/image_picker.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.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/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart';
|
||||||
import 'package:customer/themes/show_toast_dialog.dart';
|
import 'package:customer/themes/show_toast_dialog.dart';
|
||||||
import 'package:easy_localization/easy_localization.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 'package:intl/intl.dart';
|
||||||
import '../constant/constant.dart';
|
import '../constant/constant.dart';
|
||||||
import '../models/parcel_category.dart';
|
import '../models/parcel_category.dart';
|
||||||
@@ -45,7 +45,12 @@ class ParcelOrderDetailsController extends GetxController {
|
|||||||
discount.value = double.parse(parcelOrder.value.discount ?? '0.0');
|
discount.value = double.parse(parcelOrder.value.discount ?? '0.0');
|
||||||
|
|
||||||
for (var element in parcelOrder.value.taxSetting!) {
|
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;
|
totalAmount.value = (subTotal.value - discount.value) + taxAmount.value;
|
||||||
@@ -54,22 +59,32 @@ class ParcelOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
Future<void> fetchDriverDetails() async {
|
Future<void> fetchDriverDetails() async {
|
||||||
if (parcelOrder.value.driverId != null) {
|
if (parcelOrder.value.driverId != null) {
|
||||||
await FireStoreUtils.getUserProfile(parcelOrder.value.driverId ?? '').then((value) {
|
await FireStoreUtils.getUserProfile(
|
||||||
|
parcelOrder.value.driverId ?? '',
|
||||||
|
).then((value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
driverUser.value = value;
|
driverUser.value = value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
await FireStoreUtils.getReviewsbyID(parcelOrder.value.id.toString()).then((value) {
|
await FireStoreUtils.getReviewsbyID(parcelOrder.value.id.toString()).then(
|
||||||
if (value != null) {
|
(value) {
|
||||||
ratingModel.value = value;
|
if (value != null) {
|
||||||
}
|
ratingModel.value = value;
|
||||||
});
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setStatusHistoryFromString(ParcelOrderModel order) {
|
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 = <ParcelStatus>[];
|
final history = <ParcelStatus>[];
|
||||||
|
|
||||||
@@ -79,7 +94,12 @@ class ParcelOrderDetailsController extends GetxController {
|
|||||||
for (int i = 0; i < steps.length; i++) {
|
for (int i = 0; i < steps.length; i++) {
|
||||||
final step = steps[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;
|
if (step == order.status) break;
|
||||||
}
|
}
|
||||||
@@ -109,7 +129,10 @@ class ParcelOrderDetailsController extends GetxController {
|
|||||||
await FireStoreUtils.setWalletTransaction(walletTransaction);
|
await FireStoreUtils.setWalletTransaction(walletTransaction);
|
||||||
|
|
||||||
// Update wallet balance
|
// 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);
|
await FireStoreUtils.parcelOrderPlace(parcelOrder.value);
|
||||||
@@ -132,7 +155,12 @@ class ParcelOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
ParcelCategory? getSelectedCategory() {
|
ParcelCategory? getSelectedCategory() {
|
||||||
try {
|
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) {
|
} catch (e) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import 'package:cloud_firestore/cloud_firestore.dart';
|
|||||||
import 'package:customer/models/parcel_order_model.dart';
|
import 'package:customer/models/parcel_order_model.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.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/rating_model.dart';
|
||||||
import '../models/user_model.dart';
|
import '../models/user_model.dart';
|
||||||
import '../service/fire_store_utils.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) {
|
if (value != null) {
|
||||||
driverUser.value = value;
|
driverUser.value = value;
|
||||||
|
|
||||||
final int userReviewsCount = int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? 0;
|
final int userReviewsCount =
|
||||||
final int userReviewsSum = int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0;
|
int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ??
|
||||||
|
0;
|
||||||
|
final int userReviewsSum =
|
||||||
|
int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0;
|
||||||
|
|
||||||
if (ratingModel.value != null) {
|
if (ratingModel.value != null) {
|
||||||
final int oldRating = ratingModel.value?.rating?.toInt() ?? 0;
|
final int oldRating = ratingModel.value?.rating?.toInt() ?? 0;
|
||||||
@@ -77,7 +82,9 @@ class ParcelReviewController extends GetxController {
|
|||||||
|
|
||||||
ShowToastDialog.showLoader("Submit in...".tr());
|
ShowToastDialog.showLoader("Submit in...".tr());
|
||||||
|
|
||||||
final user = await FireStoreUtils.getUserProfile(order.value?.driverId ?? '');
|
final user = await FireStoreUtils.getUserProfile(
|
||||||
|
order.value?.driverId ?? '',
|
||||||
|
);
|
||||||
|
|
||||||
if (user != null) {
|
if (user != null) {
|
||||||
user.reviewsCount = (futureCount.value + 1).toString();
|
user.reviewsCount = (futureCount.value + 1).toString();
|
||||||
@@ -94,7 +101,8 @@ class ParcelReviewController extends GetxController {
|
|||||||
driverId: ratingModel.value!.driverId,
|
driverId: ratingModel.value!.driverId,
|
||||||
customerId: ratingModel.value!.customerId,
|
customerId: ratingModel.value!.customerId,
|
||||||
vendorId: ratingModel.value?.vendorId,
|
vendorId: ratingModel.value?.vendorId,
|
||||||
uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}",
|
uname:
|
||||||
|
"${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}",
|
||||||
profile: Constant.userModel?.profilePictureURL,
|
profile: Constant.userModel?.profilePictureURL,
|
||||||
createdAt: Timestamp.now(),
|
createdAt: Timestamp.now(),
|
||||||
);
|
);
|
||||||
@@ -113,7 +121,8 @@ class ParcelReviewController extends GetxController {
|
|||||||
orderId: order.value?.id,
|
orderId: order.value?.id,
|
||||||
driverId: order.value?.driverId.toString(),
|
driverId: order.value?.driverId.toString(),
|
||||||
customerId: Constant.userModel?.id,
|
customerId: Constant.userModel?.id,
|
||||||
uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}",
|
uname:
|
||||||
|
"${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}",
|
||||||
profile: Constant.userModel?.profilePictureURL,
|
profile: Constant.userModel?.profilePictureURL,
|
||||||
createdAt: Timestamp.now(),
|
createdAt: Timestamp.now(),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:customer/controllers/on_demand_home_controller.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 '../models/provider_serivce_model.dart';
|
||||||
import '../models/user_model.dart';
|
import '../models/user_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
@@ -10,7 +10,8 @@ class ProviderController extends GetxController {
|
|||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
|
|
||||||
late final String providerId;
|
late final String providerId;
|
||||||
Rx<OnDemandHomeController> onDemandHomeController = Get.put(OnDemandHomeController()).obs;
|
Rx<OnDemandHomeController> onDemandHomeController =
|
||||||
|
Get.put(OnDemandHomeController()).obs;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
@@ -24,7 +25,9 @@ class ProviderController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void getProvider() async {
|
void getProvider() async {
|
||||||
FireStoreUtils.getProviderServiceByProviderId(providerId: providerId).then((catValue) {
|
FireStoreUtils.getProviderServiceByProviderId(providerId: providerId).then((
|
||||||
|
catValue,
|
||||||
|
) {
|
||||||
providerList.value = catValue;
|
providerList.value = catValue;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import '../models/review_attribute_model.dart';
|
|||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.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 'package:image_picker/image_picker.dart';
|
||||||
import '../themes/show_toast_dialog.dart';
|
import '../themes/show_toast_dialog.dart';
|
||||||
|
|
||||||
@@ -35,7 +35,8 @@ class RateProductController extends GetxController {
|
|||||||
Rx<VendorModel> vendorModel = VendorModel().obs;
|
Rx<VendorModel> vendorModel = VendorModel().obs;
|
||||||
Rx<VendorCategoryModel> vendorCategoryModel = VendorCategoryModel().obs;
|
Rx<VendorCategoryModel> vendorCategoryModel = VendorCategoryModel().obs;
|
||||||
|
|
||||||
RxList<ReviewAttributeModel> reviewAttributeList = <ReviewAttributeModel>[].obs;
|
RxList<ReviewAttributeModel> reviewAttributeList =
|
||||||
|
<ReviewAttributeModel>[].obs;
|
||||||
|
|
||||||
RxDouble ratings = 0.0.obs;
|
RxDouble ratings = 0.0.obs;
|
||||||
|
|
||||||
@@ -54,7 +55,10 @@ class RateProductController extends GetxController {
|
|||||||
orderModel.value = argumentData['orderModel'];
|
orderModel.value = argumentData['orderModel'];
|
||||||
productId.value = argumentData['productId'];
|
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) {
|
if (value != null) {
|
||||||
ratingModel.value = value;
|
ratingModel.value = value;
|
||||||
ratings.value = value.rating ?? 0.0;
|
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) {
|
if (value != null) {
|
||||||
productModel.value = value;
|
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;
|
productReviewCount.value = value.reviewsCount! - 1;
|
||||||
productReviewSum.value = value.reviewsSum! - ratings.value;
|
productReviewSum.value = value.reviewsSum! - ratings.value;
|
||||||
|
|
||||||
if (value.reviewAttributes != null) {
|
if (value.reviewAttributes != null) {
|
||||||
value.reviewAttributes!.forEach((key, value) {
|
value.reviewAttributes!.forEach((key, value) {
|
||||||
ReviewsAttribute reviewsAttributeModel = ReviewsAttribute.fromJson(value);
|
ReviewsAttribute reviewsAttributeModel =
|
||||||
reviewsAttributeModel.reviewsCount = reviewsAttributeModel.reviewsCount! - 1;
|
ReviewsAttribute.fromJson(value);
|
||||||
reviewsAttributeModel.reviewsSum = reviewsAttributeModel.reviewsSum! - reviewAttribute[key];
|
reviewsAttributeModel.reviewsCount =
|
||||||
reviewProductAttributes.addEntries([MapEntry(key, reviewsAttributeModel.toJson())]);
|
reviewsAttributeModel.reviewsCount! - 1;
|
||||||
|
reviewsAttributeModel.reviewsSum =
|
||||||
|
reviewsAttributeModel.reviewsSum! - reviewAttribute[key];
|
||||||
|
reviewProductAttributes.addEntries([
|
||||||
|
MapEntry(key, reviewsAttributeModel.toJson()),
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
productReviewCount.value = double.parse(value.reviewsCount.toString());
|
productReviewCount.value = double.parse(
|
||||||
|
value.reviewsCount.toString(),
|
||||||
|
);
|
||||||
productReviewSum.value = double.parse(value.reviewsSum.toString());
|
productReviewSum.value = double.parse(value.reviewsSum.toString());
|
||||||
if (value.reviewAttributes != null) {
|
if (value.reviewAttributes != null) {
|
||||||
reviewProductAttributes.value = value.reviewAttributes!;
|
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) {
|
if (value != null) {
|
||||||
vendorModel.value = value;
|
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;
|
vendorReviewCount.value = value.reviewsCount! - 1;
|
||||||
vendorReviewSum.value = value.reviewsSum! - ratings.value;
|
vendorReviewSum.value = value.reviewsSum! - ratings.value;
|
||||||
} else {
|
} else {
|
||||||
vendorReviewCount.value = double.parse(value.reviewsCount.toString());
|
vendorReviewCount.value = double.parse(
|
||||||
|
value.reviewsCount.toString(),
|
||||||
|
);
|
||||||
vendorReviewSum.value = double.parse(value.reviewsSum.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) {
|
if (value != null) {
|
||||||
vendorCategoryModel.value = value;
|
vendorCategoryModel.value = value;
|
||||||
for (var element in vendorCategoryModel.value.reviewAttributes!) {
|
for (var element in vendorCategoryModel.value.reviewAttributes!) {
|
||||||
await FireStoreUtils.getVendorReviewAttribute(element).then((value) {
|
await FireStoreUtils.getVendorReviewAttribute(element).then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
reviewAttributeList.add(value!);
|
reviewAttributeList.add(value!);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -129,21 +152,36 @@ class RateProductController extends GetxController {
|
|||||||
|
|
||||||
if (reviewProductAttributes.isEmpty) {
|
if (reviewProductAttributes.isEmpty) {
|
||||||
reviewAttribute.forEach((key, value) {
|
reviewAttribute.forEach((key, value) {
|
||||||
ReviewsAttribute reviewsAttributeModel = ReviewsAttribute(reviewsCount: 1, reviewsSum: value);
|
ReviewsAttribute reviewsAttributeModel = ReviewsAttribute(
|
||||||
reviewProductAttributes.addEntries([MapEntry(key, reviewsAttributeModel.toJson())]);
|
reviewsCount: 1,
|
||||||
|
reviewsSum: value,
|
||||||
|
);
|
||||||
|
reviewProductAttributes.addEntries([
|
||||||
|
MapEntry(key, reviewsAttributeModel.toJson()),
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
reviewProductAttributes.forEach((key, value) {
|
reviewProductAttributes.forEach((key, value) {
|
||||||
ReviewsAttribute reviewsAttributeModel = ReviewsAttribute.fromJson(value);
|
ReviewsAttribute reviewsAttributeModel = ReviewsAttribute.fromJson(
|
||||||
reviewsAttributeModel.reviewsCount = reviewsAttributeModel.reviewsCount! + 1;
|
value,
|
||||||
reviewsAttributeModel.reviewsSum = reviewsAttributeModel.reviewsSum! + reviewAttribute[key];
|
);
|
||||||
reviewProductAttributes.addEntries([MapEntry(key, reviewsAttributeModel.toJson())]);
|
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++) {
|
for (int i = 0; i < images.length; i++) {
|
||||||
if (images[i].runtimeType == XFile) {
|
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.removeAt(i);
|
||||||
images.insert(i, url);
|
images.insert(i, url);
|
||||||
}
|
}
|
||||||
@@ -155,7 +193,10 @@ class RateProductController extends GetxController {
|
|||||||
photos: images,
|
photos: images,
|
||||||
rating: ratings.value,
|
rating: ratings.value,
|
||||||
customerId: FireStoreUtils.getCurrentUid(),
|
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,
|
orderId: orderModel.value.id,
|
||||||
vendorId: productModel.value.vendorID,
|
vendorId: productModel.value.vendorID,
|
||||||
createdAt: Timestamp.now(),
|
createdAt: Timestamp.now(),
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class RedeemGiftCardController extends GetxController {
|
class RedeemGiftCardController extends GetxController {
|
||||||
Rx<TextEditingController> giftCodeController = TextEditingController().obs;
|
Rx<TextEditingController> giftCodeController = TextEditingController().obs;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:customer/models/referral_model.dart';
|
import 'package:customer/models/referral_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class ReferFriendController extends GetxController {
|
class ReferFriendController extends GetxController {
|
||||||
Rx<ReferralModel> referralModel = ReferralModel().obs;
|
Rx<ReferralModel> referralModel = ReferralModel().obs;
|
||||||
|
|||||||
@@ -7,8 +7,7 @@ import 'package:customer/service/fire_store_utils.dart';
|
|||||||
import 'package:customer/themes/show_toast_dialog.dart';
|
import 'package:customer/themes/show_toast_dialog.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.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 '../screen_ui/rental_service/rental_dashboard_screen.dart';
|
||||||
import 'cab_rental_dashboard_controllers.dart';
|
import 'cab_rental_dashboard_controllers.dart';
|
||||||
|
|
||||||
@@ -27,7 +26,8 @@ class RentalConformationController extends GetxController {
|
|||||||
|
|
||||||
void getArguments() {
|
void getArguments() {
|
||||||
final args = Get.arguments;
|
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;
|
rentalOrderModel.value = args['rentalOrderModel'] as RentalOrderModel;
|
||||||
calculateAmount();
|
calculateAmount();
|
||||||
} else {
|
} else {
|
||||||
@@ -48,12 +48,21 @@ class RentalConformationController extends GetxController {
|
|||||||
taxAmount.value = 0.0;
|
taxAmount.value = 0.0;
|
||||||
totalAmount.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) {
|
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 ?? []) {
|
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;
|
totalAmount.value = subTotal.value - discount.value + taxAmount.value;
|
||||||
@@ -77,12 +86,17 @@ class RentalConformationController extends GetxController {
|
|||||||
rentalOrderModel.value.couponCode = selectedCouponModel.value.code;
|
rentalOrderModel.value.couponCode = selectedCouponModel.value.code;
|
||||||
rentalOrderModel.value.couponId = selectedCouponModel.value.id;
|
rentalOrderModel.value.couponId = selectedCouponModel.value.id;
|
||||||
rentalOrderModel.value.subTotal = subTotal.value.toString();
|
rentalOrderModel.value.subTotal = subTotal.value.toString();
|
||||||
rentalOrderModel.value.otpCode = (maths.Random().nextInt(9000) + 1000).toString();
|
rentalOrderModel.value.otpCode =
|
||||||
await FireStoreUtils.rentalOrderPlace(rentalOrderModel.value).then((value) async {
|
(maths.Random().nextInt(9000) + 1000).toString();
|
||||||
|
await FireStoreUtils.rentalOrderPlace(rentalOrderModel.value).then((
|
||||||
|
value,
|
||||||
|
) async {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
ShowToastDialog.showToast("Order placed successfully".tr());
|
ShowToastDialog.showToast("Order placed successfully".tr());
|
||||||
Get.offAll(const RentalDashboardScreen());
|
Get.offAll(const RentalDashboardScreen());
|
||||||
CabRentalDashboardControllers controller = Get.put(CabRentalDashboardControllers());
|
CabRentalDashboardControllers controller = Get.put(
|
||||||
|
CabRentalDashboardControllers(),
|
||||||
|
);
|
||||||
controller.selectedIndex.value = 1;
|
controller.selectedIndex.value = 1;
|
||||||
// Get.back();
|
// Get.back();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
import 'package:customer/models/coupon_model.dart';
|
import 'package:customer/models/coupon_model.dart';
|
||||||
import 'package:customer/service/fire_store_utils.dart';
|
import 'package:customer/service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class RentalCouponController extends GetxController{
|
|
||||||
|
|
||||||
|
class RentalCouponController extends GetxController {
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
// TODO: implement onInit
|
// TODO: implement onInit
|
||||||
@@ -11,10 +10,10 @@ class RentalCouponController extends GetxController{
|
|||||||
super.onInit();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getData() {
|
||||||
void getData(){
|
|
||||||
getCouponCode();
|
getCouponCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
RxList<CouponModel> cabCouponList = <CouponModel>[].obs;
|
RxList<CouponModel> cabCouponList = <CouponModel>[].obs;
|
||||||
|
|
||||||
@@ -25,4 +24,4 @@ class RentalCouponController extends GetxController{
|
|||||||
print("cabCouponList ${cabCouponList.length}");
|
print("cabCouponList ${cabCouponList.length}");
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import 'package:customer/widget/geoflutterfire/src/geoflutterfire.dart';
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:geolocator/geolocator.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:google_maps_flutter/google_maps_flutter.dart' as latlong;
|
||||||
import '../constant/constant.dart';
|
import '../constant/constant.dart';
|
||||||
import '../models/payment_model/cod_setting_model.dart';
|
import '../models/payment_model/cod_setting_model.dart';
|
||||||
@@ -38,7 +38,8 @@ class RentalHomeController extends GetxController {
|
|||||||
RxBool isLoading = false.obs;
|
RxBool isLoading = false.obs;
|
||||||
|
|
||||||
// Location input
|
// Location input
|
||||||
final Rx<TextEditingController> sourceTextEditController = TextEditingController().obs;
|
final Rx<TextEditingController> sourceTextEditController =
|
||||||
|
TextEditingController().obs;
|
||||||
|
|
||||||
// Selected date
|
// Selected date
|
||||||
Rx<DateTime> selectedDate = DateTime.now().obs;
|
Rx<DateTime> selectedDate = DateTime.now().obs;
|
||||||
@@ -74,11 +75,20 @@ class RentalHomeController extends GetxController {
|
|||||||
Constant.currentLocation = position;
|
Constant.currentLocation = position;
|
||||||
|
|
||||||
// Set default coordinates for Google or OSM
|
// Set default coordinates for Google or OSM
|
||||||
departureLatLong.value = gmaps.LatLng(position.latitude, position.longitude);
|
departureLatLong.value = gmaps.LatLng(
|
||||||
departureLatLongOsm.value = latlong.LatLng(position.latitude, position.longitude);
|
position.latitude,
|
||||||
|
position.longitude,
|
||||||
|
);
|
||||||
|
departureLatLongOsm.value = latlong.LatLng(
|
||||||
|
position.latitude,
|
||||||
|
position.longitude,
|
||||||
|
);
|
||||||
|
|
||||||
// Get readable address
|
// 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;
|
sourceTextEditController.value.text = address;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -102,7 +112,12 @@ class RentalHomeController extends GetxController {
|
|||||||
|
|
||||||
/// Date Picker
|
/// Date Picker
|
||||||
Future<void> pickDate(BuildContext context) async {
|
Future<void> 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) {
|
if (picked != null) {
|
||||||
selectedDate.value = picked;
|
selectedDate.value = picked;
|
||||||
@@ -110,7 +125,9 @@ class RentalHomeController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getRentalPackage() async {
|
Future<void> getRentalPackage() async {
|
||||||
await FireStoreUtils.getRentalPackage(selectedVehicleType.value!.id.toString()).then((value) {
|
await FireStoreUtils.getRentalPackage(
|
||||||
|
selectedVehicleType.value!.id.toString(),
|
||||||
|
).then((value) {
|
||||||
rentalPackages.value = value;
|
rentalPackages.value = value;
|
||||||
if (rentalPackages.isNotEmpty) {
|
if (rentalPackages.isNotEmpty) {
|
||||||
selectedPackage.value = rentalPackages[0];
|
selectedPackage.value = rentalPackages[0];
|
||||||
@@ -120,8 +137,14 @@ class RentalHomeController extends GetxController {
|
|||||||
|
|
||||||
void completeOrder() {
|
void completeOrder() {
|
||||||
DestinationLocation sourceLocation = DestinationLocation(
|
DestinationLocation sourceLocation = DestinationLocation(
|
||||||
latitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.latitude : departureLatLong.value.latitude,
|
latitude:
|
||||||
longitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.longitude : departureLatLong.value.longitude,
|
Constant.selectedMapType == 'osm'
|
||||||
|
? departureLatLongOsm.value.latitude
|
||||||
|
: departureLatLong.value.latitude,
|
||||||
|
longitude:
|
||||||
|
Constant.selectedMapType == 'osm'
|
||||||
|
? departureLatLongOsm.value.longitude
|
||||||
|
: departureLatLong.value.longitude,
|
||||||
);
|
);
|
||||||
|
|
||||||
print("=====>");
|
print("=====>");
|
||||||
@@ -144,18 +167,35 @@ class RentalHomeController extends GetxController {
|
|||||||
rentalOrderModel.taxSetting = Constant.taxList;
|
rentalOrderModel.taxSetting = Constant.taxList;
|
||||||
rentalOrderModel.createdAt = Timestamp.now();
|
rentalOrderModel.createdAt = Timestamp.now();
|
||||||
rentalOrderModel.sourceLocation = sourceLocation;
|
rentalOrderModel.sourceLocation = sourceLocation;
|
||||||
rentalOrderModel.adminCommission = Constant.sectionConstantModel!.adminCommision!.amount;
|
rentalOrderModel.adminCommission =
|
||||||
rentalOrderModel.adminCommissionType = Constant.sectionConstantModel!.adminCommision!.commissionType;
|
Constant.sectionConstantModel!.adminCommision!.amount;
|
||||||
|
rentalOrderModel.adminCommissionType =
|
||||||
|
Constant.sectionConstantModel!.adminCommision!.commissionType;
|
||||||
rentalOrderModel.sourcePoint = G(
|
rentalOrderModel.sourcePoint = G(
|
||||||
geopoint: GeoPoint(sourceLocation.latitude ?? 0.0, sourceLocation.longitude ?? 0.0),
|
geopoint: GeoPoint(
|
||||||
geohash: Geoflutterfire().point(latitude: sourceLocation.latitude ?? 0.0, longitude: sourceLocation.longitude ?? 0.0).hash,
|
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());
|
log(rentalOrderModel.toJson().toString());
|
||||||
Get.back();
|
Get.back();
|
||||||
Get.back();
|
Get.back();
|
||||||
|
|
||||||
Get.to(() => RentalConformationScreen(), arguments: {"rentalOrderModel": rentalOrderModel});
|
Get.to(
|
||||||
|
() => RentalConformationScreen(),
|
||||||
|
arguments: {"rentalOrderModel": rentalOrderModel},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDepartureMarker(double lat, double lng) {
|
void setDepartureMarker(double lat, double lng) {
|
||||||
@@ -194,19 +234,45 @@ class RentalHomeController extends GetxController {
|
|||||||
|
|
||||||
Future<void> getPaymentSettings() async {
|
Future<void> getPaymentSettings() async {
|
||||||
await FireStoreUtils.getPaymentSettingsData().then((value) {
|
await FireStoreUtils.getPaymentSettingsData().then((value) {
|
||||||
stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings)));
|
stripeModel.value = StripeModel.fromJson(
|
||||||
payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings)));
|
jsonDecode(Preferences.getString(Preferences.stripeSettings)),
|
||||||
payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack)));
|
);
|
||||||
mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago)));
|
payPalModel.value = PayPalModel.fromJson(
|
||||||
flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave)));
|
jsonDecode(Preferences.getString(Preferences.paypalSettings)),
|
||||||
paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings)));
|
);
|
||||||
payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings)));
|
payStackModel.value = PayStackModel.fromJson(
|
||||||
razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings)));
|
jsonDecode(Preferences.getString(Preferences.payStack)),
|
||||||
midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings)));
|
);
|
||||||
orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)));
|
mercadoPagoModel.value = MercadoPagoModel.fromJson(
|
||||||
xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings)));
|
jsonDecode(Preferences.getString(Preferences.mercadoPago)),
|
||||||
walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings)));
|
);
|
||||||
cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings)));
|
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) {
|
if (walletSettingModel.value.isEnabled == true) {
|
||||||
selectedPaymentMethod.value = PaymentGateway.wallet.name;
|
selectedPaymentMethod.value = PaymentGateway.wallet.name;
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ import 'package:easy_localization/easy_localization.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_paypal/flutter_paypal.dart';
|
import 'package:flutter_paypal/flutter_paypal.dart';
|
||||||
import 'package:flutter_stripe/flutter_stripe.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:http/http.dart' as http;
|
||||||
import 'package:razorpay_flutter/razorpay_flutter.dart';
|
import 'package:razorpay_flutter/razorpay_flutter.dart';
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
@@ -84,13 +84,17 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
Future<void> fetchDriverDetails() async {
|
Future<void> fetchDriverDetails() async {
|
||||||
if (order.value.driverId != null) {
|
if (order.value.driverId != null) {
|
||||||
await FireStoreUtils.getUserProfile(order.value.driverId ?? '').then((value) {
|
await FireStoreUtils.getUserProfile(order.value.driverId ?? '').then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
driverUser.value = value;
|
driverUser.value = value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
await FireStoreUtils.getReviewsbyID(order.value.id.toString()).then((value) {
|
await FireStoreUtils.getReviewsbyID(order.value.id.toString()).then((
|
||||||
|
value,
|
||||||
|
) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
ratingModel.value = value;
|
ratingModel.value = value;
|
||||||
}
|
}
|
||||||
@@ -100,9 +104,15 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
String getExtraKm() {
|
String getExtraKm() {
|
||||||
try {
|
try {
|
||||||
final double start = double.tryParse(order.value.startKitoMetersReading ?? '0') ?? 0.0;
|
final double start =
|
||||||
final double end = double.tryParse(order.value.endKitoMetersReading ?? '0') ?? 0.0;
|
double.tryParse(order.value.startKitoMetersReading ?? '0') ?? 0.0;
|
||||||
final double included = double.tryParse(order.value.rentalPackageModel?.includedDistance?.toString() ?? '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
|
// Calculate extra km safely
|
||||||
final double extra = (end - start - included);
|
final double extra = (end - start - included);
|
||||||
@@ -117,8 +127,10 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
///Safe calculation after order is loaded
|
///Safe calculation after order is loaded
|
||||||
void calculateTotalAmount() {
|
void calculateTotalAmount() {
|
||||||
try {
|
try {
|
||||||
subTotal.value = double.tryParse(order.value.subTotal?.toString() ?? "0") ?? 0.0;
|
subTotal.value =
|
||||||
discount.value = double.tryParse(order.value.discount?.toString() ?? "0") ?? 0.0;
|
double.tryParse(order.value.subTotal?.toString() ?? "0") ?? 0.0;
|
||||||
|
discount.value =
|
||||||
|
double.tryParse(order.value.discount?.toString() ?? "0") ?? 0.0;
|
||||||
taxAmount.value = 0.0;
|
taxAmount.value = 0.0;
|
||||||
|
|
||||||
if (order.value.endTime != null) {
|
if (order.value.endTime != null) {
|
||||||
@@ -128,12 +140,23 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
// Total rented minutes
|
// Total rented minutes
|
||||||
int totalMinutes = end.difference(start).inMinutes;
|
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) {
|
if (totalMinutes > includedMinutes) {
|
||||||
int extraMinutes = 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;
|
extraMinutesCharge.value = extraMinutes * minuteFare;
|
||||||
} else {
|
} else {
|
||||||
@@ -141,24 +164,47 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (order.value.startKitoMetersReading != null && order.value.endKitoMetersReading != null) {
|
if (order.value.startKitoMetersReading != null &&
|
||||||
double startKm = double.tryParse(order.value.startKitoMetersReading?.toString() ?? "0") ?? 0.0;
|
order.value.endKitoMetersReading != null) {
|
||||||
double endKm = double.tryParse(order.value.endKitoMetersReading?.toString() ?? "0") ?? 0.0;
|
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) {
|
if (endKm > startKm) {
|
||||||
double totalKm = endKm - startKm;
|
double totalKm = endKm - startKm;
|
||||||
if (totalKm > double.parse(order.value.rentalPackageModel!.includedDistance!)) {
|
if (totalKm >
|
||||||
totalKm = totalKm - double.parse(order.value.rentalPackageModel!.includedDistance!);
|
double.parse(order.value.rentalPackageModel!.includedDistance!)) {
|
||||||
double extraKmRate = double.tryParse(order.value.rentalPackageModel?.extraKmFare?.toString() ?? "0") ?? 0.0;
|
totalKm =
|
||||||
|
totalKm -
|
||||||
|
double.parse(order.value.rentalPackageModel!.includedDistance!);
|
||||||
|
double extraKmRate =
|
||||||
|
double.tryParse(
|
||||||
|
order.value.rentalPackageModel?.extraKmFare?.toString() ??
|
||||||
|
"0",
|
||||||
|
) ??
|
||||||
|
0.0;
|
||||||
extraKilometerCharge.value = totalKm * extraKmRate;
|
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) {
|
if (order.value.taxSetting != null) {
|
||||||
for (var element in order.value.taxSetting!) {
|
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,
|
serviceType: Constant.parcelServiceType,
|
||||||
);
|
);
|
||||||
|
|
||||||
await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async {
|
await FireStoreUtils.setWalletTransaction(transactionModel).then((
|
||||||
|
value,
|
||||||
|
) async {
|
||||||
if (value == true) {
|
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<void> cancelRentalRequest(RentalOrderModel order, {List<TaxModel>? taxList}) async {
|
Future<void> cancelRentalRequest(
|
||||||
|
RentalOrderModel order, {
|
||||||
|
List<TaxModel>? taxList,
|
||||||
|
}) async {
|
||||||
try {
|
try {
|
||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
|
|
||||||
@@ -221,11 +275,19 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
if (taxList != null) {
|
if (taxList != null) {
|
||||||
for (var element in taxList) {
|
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;
|
double refundAmount = subTotal + totalTax;
|
||||||
|
|
||||||
WalletTransactionModel walletTransaction = WalletTransactionModel(
|
WalletTransactionModel walletTransaction = WalletTransactionModel(
|
||||||
@@ -244,7 +306,10 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
);
|
);
|
||||||
|
|
||||||
await FireStoreUtils.setWalletTransaction(walletTransaction);
|
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());
|
ShowToastDialog.showToast("Booking cancelled successfully".tr());
|
||||||
Get.back();
|
Get.back();
|
||||||
@@ -272,19 +337,45 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
Future<void> getPaymentSettings() async {
|
Future<void> getPaymentSettings() async {
|
||||||
await FireStoreUtils.getPaymentSettingsData().then((value) {
|
await FireStoreUtils.getPaymentSettingsData().then((value) {
|
||||||
stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings)));
|
stripeModel.value = StripeModel.fromJson(
|
||||||
payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings)));
|
jsonDecode(Preferences.getString(Preferences.stripeSettings)),
|
||||||
payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack)));
|
);
|
||||||
mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago)));
|
payPalModel.value = PayPalModel.fromJson(
|
||||||
flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave)));
|
jsonDecode(Preferences.getString(Preferences.paypalSettings)),
|
||||||
paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings)));
|
);
|
||||||
payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings)));
|
payStackModel.value = PayStackModel.fromJson(
|
||||||
razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings)));
|
jsonDecode(Preferences.getString(Preferences.payStack)),
|
||||||
midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings)));
|
);
|
||||||
orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)));
|
mercadoPagoModel.value = MercadoPagoModel.fromJson(
|
||||||
xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings)));
|
jsonDecode(Preferences.getString(Preferences.mercadoPago)),
|
||||||
walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings)));
|
);
|
||||||
cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings)));
|
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) {
|
if (walletSettingModel.value.isEnabled == true) {
|
||||||
selectedPaymentMethod.value = PaymentGateway.wallet.name;
|
selectedPaymentMethod.value = PaymentGateway.wallet.name;
|
||||||
@@ -326,20 +417,32 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
Future<void> stripeMakePayment({required String amount}) async {
|
Future<void> stripeMakePayment({required String amount}) async {
|
||||||
log(double.parse(amount).toStringAsFixed(0));
|
log(double.parse(amount).toStringAsFixed(0));
|
||||||
try {
|
try {
|
||||||
Map<String, dynamic>? paymentIntentData = await createStripeIntent(amount: amount);
|
Map<String, dynamic>? paymentIntentData = await createStripeIntent(
|
||||||
|
amount: amount,
|
||||||
|
);
|
||||||
log("stripe Responce====>$paymentIntentData");
|
log("stripe Responce====>$paymentIntentData");
|
||||||
if (paymentIntentData!.containsKey("error")) {
|
if (paymentIntentData!.containsKey("error")) {
|
||||||
Get.back();
|
Get.back();
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
await Stripe.instance.initPaymentSheet(
|
await Stripe.instance.initPaymentSheet(
|
||||||
paymentSheetParameters: SetupPaymentSheetParameters(
|
paymentSheetParameters: SetupPaymentSheetParameters(
|
||||||
paymentIntentClientSecret: paymentIntentData['client_secret'],
|
paymentIntentClientSecret: paymentIntentData['client_secret'],
|
||||||
allowsDelayedPaymentMethods: false,
|
allowsDelayedPaymentMethods: false,
|
||||||
googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"),
|
googlePay: const PaymentSheetGooglePay(
|
||||||
|
merchantCountryCode: 'US',
|
||||||
|
testEnv: true,
|
||||||
|
currencyCode: "USD",
|
||||||
|
),
|
||||||
customFlow: true,
|
customFlow: true,
|
||||||
style: ThemeMode.system,
|
style: ThemeMode.system,
|
||||||
appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)),
|
appearance: PaymentSheetAppearance(
|
||||||
|
colors: PaymentSheetAppearanceColors(
|
||||||
|
primary: AppThemeData.primary300,
|
||||||
|
),
|
||||||
|
),
|
||||||
merchantDisplayName: 'GoRide',
|
merchantDisplayName: 'GoRide',
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -385,7 +488,10 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
var response = await http.post(
|
var response = await http.post(
|
||||||
Uri.parse('https://api.stripe.com/v1/payment_intents'),
|
Uri.parse('https://api.stripe.com/v1/payment_intents'),
|
||||||
body: body,
|
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);
|
return jsonDecode(response.body);
|
||||||
@@ -395,8 +501,14 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//mercadoo
|
//mercadoo
|
||||||
Future<Null> mercadoPagoMakePayment({required BuildContext context, required String amount}) async {
|
Future<Null> mercadoPagoMakePayment({
|
||||||
final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'};
|
required BuildContext context,
|
||||||
|
required String amount,
|
||||||
|
}) async {
|
||||||
|
final headers = {
|
||||||
|
'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
};
|
||||||
|
|
||||||
final body = jsonEncode({
|
final body = jsonEncode({
|
||||||
"items": [
|
"items": [
|
||||||
@@ -409,12 +521,20 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
"payer": {"email": Constant.userModel!.email},
|
"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",
|
"auto_return": "approved",
|
||||||
// Automatically return after payment is 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) {
|
if (response.statusCode == 200 || response.statusCode == 201) {
|
||||||
final data = jsonDecode(response.body);
|
final data = jsonDecode(response.body);
|
||||||
@@ -497,15 +617,23 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//flutter wave Payment Method
|
//flutter wave Payment Method
|
||||||
Future<Null> flutterWaveInitiatePayment({required BuildContext context, required String amount}) async {
|
Future<Null> flutterWaveInitiatePayment({
|
||||||
|
required BuildContext context,
|
||||||
|
required String amount,
|
||||||
|
}) async {
|
||||||
final url = Uri.parse('https://api.flutterwave.com/v3/payments');
|
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({
|
final body = jsonEncode({
|
||||||
"tx_ref": _ref,
|
"tx_ref": _ref,
|
||||||
@@ -515,17 +643,23 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
"payment_options": "ussd, card, barter, payattitude",
|
"payment_options": "ussd, card, barter, payattitude",
|
||||||
"customer": {
|
"customer": {
|
||||||
"email": Constant.userModel!.email.toString(),
|
"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
|
"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);
|
final response = await http.post(url, headers: headers, body: body);
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
final data = jsonDecode(response.body);
|
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) {
|
if (value) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
completeOrder();
|
completeOrder();
|
||||||
@@ -554,8 +688,14 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
// payFast
|
// payFast
|
||||||
void payFastPayment({required BuildContext context, required String amount}) {
|
void payFastPayment({required BuildContext context, required String amount}) {
|
||||||
PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: Constant.userModel!).then((String? value) async {
|
PayStackURLGen.getPayHTML(
|
||||||
bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value));
|
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) {
|
if (isDone) {
|
||||||
Get.back();
|
Get.back();
|
||||||
ShowToastDialog.showToast("Payment successfully".tr());
|
ShowToastDialog.showToast("Payment successfully".tr());
|
||||||
@@ -594,7 +734,14 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
// });
|
// });
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async {
|
Future<void> startTransaction(
|
||||||
|
context, {
|
||||||
|
required String txnTokenBy,
|
||||||
|
required orderId,
|
||||||
|
required double amount,
|
||||||
|
required callBackURL,
|
||||||
|
required isStaging,
|
||||||
|
}) async {
|
||||||
// try {
|
// try {
|
||||||
// var response = AllInOneSdk.startTransaction(
|
// var response = AllInOneSdk.startTransaction(
|
||||||
// paytmModel.value.paytmMID.toString(),
|
// 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";
|
String getChecksum = "${Constant.globalUrl}payments/validatechecksum";
|
||||||
final response = await http.post(
|
final response = await http.post(
|
||||||
Uri.parse(getChecksum),
|
Uri.parse(getChecksum),
|
||||||
headers: {},
|
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);
|
final data = jsonDecode(response.body);
|
||||||
return data['status'];
|
return data['status'];
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<GetPaymentTxtTokenModel> initiatePayment({required double amount, required orderId}) async {
|
Future<GetPaymentTxtTokenModel> initiatePayment({
|
||||||
|
required double amount,
|
||||||
|
required orderId,
|
||||||
|
}) async {
|
||||||
String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment";
|
String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment";
|
||||||
String callback = "";
|
String callback = "";
|
||||||
if (paytmModel.value.isSandboxEnabled == true) {
|
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 {
|
} 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(
|
final response = await http.post(
|
||||||
Uri.parse(initiateURL),
|
Uri.parse(initiateURL),
|
||||||
@@ -665,9 +826,12 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
);
|
);
|
||||||
log(response.body);
|
log(response.body);
|
||||||
final data = jsonDecode(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();
|
Get.back();
|
||||||
ShowToastDialog.showToast("something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return GetPaymentTxtTokenModel.fromJson(data);
|
return GetPaymentTxtTokenModel.fromJson(data);
|
||||||
}
|
}
|
||||||
@@ -685,7 +849,10 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
'description': 'wallet Topup',
|
'description': 'wallet Topup',
|
||||||
'retry': {'enabled': true, 'max_count': 1},
|
'retry': {'enabled': true, 'max_count': 1},
|
||||||
'send_sms_hash': true,
|
'send_sms_hash': true,
|
||||||
'prefill': {'contact': Constant.userModel!.phoneNumber, 'email': Constant.userModel!.email},
|
'prefill': {
|
||||||
|
'contact': Constant.userModel!.phoneNumber,
|
||||||
|
'email': Constant.userModel!.email,
|
||||||
|
},
|
||||||
'external': {
|
'external': {
|
||||||
'wallets': ['paytm'],
|
'wallets': ['paytm'],
|
||||||
},
|
},
|
||||||
@@ -720,7 +887,10 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Midtrans payment
|
//Midtrans payment
|
||||||
Future<void> midtransMakePayment({required String amount, required BuildContext context}) async {
|
Future<void> midtransMakePayment({
|
||||||
|
required String amount,
|
||||||
|
required BuildContext context,
|
||||||
|
}) async {
|
||||||
await createPaymentLink(amount: amount).then((url) {
|
await createPaymentLink(amount: amount).then((url) {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
if (url != '') {
|
if (url != '') {
|
||||||
@@ -738,15 +908,30 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
Future<String> createPaymentLink({required var amount}) async {
|
Future<String> createPaymentLink({required var amount}) async {
|
||||||
var ordersId = const Uuid().v1();
|
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(
|
final response = await http.post(
|
||||||
url,
|
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({
|
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,
|
'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);
|
final responseData = jsonDecode(response.body);
|
||||||
return responseData['payment_url'];
|
return responseData['payment_url'];
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -771,13 +958,30 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
static String orderId = '';
|
static String orderId = '';
|
||||||
static String amount = '';
|
static String amount = '';
|
||||||
|
|
||||||
Future<void> orangeMakePayment({required String amount, required BuildContext context}) async {
|
Future<void> orangeMakePayment({
|
||||||
|
required String amount,
|
||||||
|
required BuildContext context,
|
||||||
|
}) async {
|
||||||
reset();
|
reset();
|
||||||
var id = const Uuid().v4();
|
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();
|
ShowToastDialog.closeLoader();
|
||||||
if (paymentURL.toString() != '') {
|
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) {
|
if (value == true) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
completeOrder();
|
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';
|
String apiUrl = 'https://api.orange.com/oauth/v3/token';
|
||||||
Map<String, String> requestBody = {'grant_type': 'client_credentials'};
|
Map<String, String> requestBody = {'grant_type': 'client_credentials'};
|
||||||
|
|
||||||
var response = await http.post(
|
var response = await http.post(
|
||||||
Uri.parse(apiUrl),
|
Uri.parse(apiUrl),
|
||||||
headers: <String, String>{'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'},
|
headers: <String, String>{
|
||||||
|
'Authorization': "Basic ${orangeMoneyModel.value.auth!}",
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
body: requestBody,
|
body: requestBody,
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -806,17 +1019,32 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
accessToken = responseData['access_token'];
|
accessToken = responseData['access_token'];
|
||||||
// ignore: use_build_context_synchronously
|
// 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 {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
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;
|
orderId = orderIdData;
|
||||||
amount = amountData;
|
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<String, String> requestBody = {
|
Map<String, String> requestBody = {
|
||||||
"merchant_key": orangeMoneyModel.value.merchantKey ?? '',
|
"merchant_key": orangeMoneyModel.value.merchantKey ?? '',
|
||||||
"currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency,
|
"currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency,
|
||||||
@@ -831,7 +1059,11 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
|
|
||||||
var response = await http.post(
|
var response = await http.post(
|
||||||
Uri.parse(apiUrl),
|
Uri.parse(apiUrl),
|
||||||
headers: <String, String>{'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'},
|
headers: <String, String>{
|
||||||
|
'Authorization': 'Bearer $accessToken',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
body: json.encode(requestBody),
|
body: json.encode(requestBody),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -845,7 +1077,9 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ShowToastDialog.showToast("Something went wrong, please contact admin.".tr());
|
ShowToastDialog.showToast(
|
||||||
|
"Something went wrong, please contact admin.".tr(),
|
||||||
|
);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -861,7 +1095,13 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
await createXenditInvoice(amount: amount).then((model) {
|
await createXenditInvoice(amount: amount).then((model) {
|
||||||
ShowToastDialog.closeLoader();
|
ShowToastDialog.closeLoader();
|
||||||
if (model.id != null) {
|
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) {
|
if (value == true) {
|
||||||
ShowToastDialog.showToast("Payment Successful!!".tr());
|
ShowToastDialog.showToast("Payment Successful!!".tr());
|
||||||
completeOrder();
|
completeOrder();
|
||||||
@@ -877,7 +1117,9 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
const url = 'https://api.xendit.co/v2/invoices';
|
const url = 'https://api.xendit.co/v2/invoices';
|
||||||
var headers = {
|
var headers = {
|
||||||
'Content-Type': 'application/json',
|
'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',
|
// 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ',
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -890,7 +1132,11 @@ class RentalOrderDetailsController extends GetxController {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
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) {
|
if (response.statusCode == 200 || response.statusCode == 201) {
|
||||||
XenditModel model = XenditModel.fromJson(jsonDecode(response.body));
|
XenditModel model = XenditModel.fromJson(jsonDecode(response.body));
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import '../constant/collection_name.dart';
|
import '../constant/collection_name.dart';
|
||||||
import '../models/rating_model.dart';
|
import '../models/rating_model.dart';
|
||||||
import '../models/rental_order_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) {
|
if (value != null) {
|
||||||
driverUser.value = value;
|
driverUser.value = value;
|
||||||
|
|
||||||
final int userReviewsCount = int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? 0;
|
final int userReviewsCount =
|
||||||
final int userReviewsSum = int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0;
|
int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ??
|
||||||
|
0;
|
||||||
|
final int userReviewsSum =
|
||||||
|
int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0;
|
||||||
|
|
||||||
if (ratingModel.value != null) {
|
if (ratingModel.value != null) {
|
||||||
final int oldRating = ratingModel.value?.rating?.toInt() ?? 0;
|
final int oldRating = ratingModel.value?.rating?.toInt() ?? 0;
|
||||||
@@ -78,7 +83,9 @@ class RentalReviewController extends GetxController {
|
|||||||
|
|
||||||
ShowToastDialog.showLoader("Submit in...".tr());
|
ShowToastDialog.showLoader("Submit in...".tr());
|
||||||
|
|
||||||
final user = await FireStoreUtils.getUserProfile(order.value?.driverId ?? '');
|
final user = await FireStoreUtils.getUserProfile(
|
||||||
|
order.value?.driverId ?? '',
|
||||||
|
);
|
||||||
|
|
||||||
if (user != null) {
|
if (user != null) {
|
||||||
user.reviewsCount = (futureCount.value + 1).toString();
|
user.reviewsCount = (futureCount.value + 1).toString();
|
||||||
@@ -95,7 +102,8 @@ class RentalReviewController extends GetxController {
|
|||||||
driverId: ratingModel.value!.driverId,
|
driverId: ratingModel.value!.driverId,
|
||||||
customerId: ratingModel.value!.customerId,
|
customerId: ratingModel.value!.customerId,
|
||||||
vendorId: ratingModel.value?.vendorId,
|
vendorId: ratingModel.value?.vendorId,
|
||||||
uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}",
|
uname:
|
||||||
|
"${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}",
|
||||||
profile: Constant.userModel?.profilePictureURL,
|
profile: Constant.userModel?.profilePictureURL,
|
||||||
createdAt: Timestamp.now(),
|
createdAt: Timestamp.now(),
|
||||||
);
|
);
|
||||||
@@ -106,7 +114,8 @@ class RentalReviewController extends GetxController {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/// New review
|
/// New review
|
||||||
final docRef = FireStoreUtils.fireStore.collection(CollectionName.itemsReview).doc();
|
final docRef =
|
||||||
|
FireStoreUtils.fireStore.collection(CollectionName.itemsReview).doc();
|
||||||
final newRating = RatingModel(
|
final newRating = RatingModel(
|
||||||
id: docRef.id,
|
id: docRef.id,
|
||||||
comment: comment.value.text,
|
comment: comment.value.text,
|
||||||
@@ -115,7 +124,8 @@ class RentalReviewController extends GetxController {
|
|||||||
orderId: order.value?.id,
|
orderId: order.value?.id,
|
||||||
driverId: order.value?.driverId.toString(),
|
driverId: order.value?.driverId.toString(),
|
||||||
customerId: Constant.userModel?.id,
|
customerId: Constant.userModel?.id,
|
||||||
uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}",
|
uname:
|
||||||
|
"${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}",
|
||||||
profile: Constant.userModel?.profilePictureURL,
|
profile: Constant.userModel?.profilePictureURL,
|
||||||
createdAt: Timestamp.now(),
|
createdAt: Timestamp.now(),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -13,11 +13,12 @@ import '../models/attributes_model.dart';
|
|||||||
import '../service/cart_provider.dart';
|
import '../service/cart_provider.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
|
|
||||||
class RestaurantDetailsController extends GetxController {
|
class RestaurantDetailsController extends GetxController {
|
||||||
Rx<TextEditingController> searchEditingController = TextEditingController().obs;
|
Rx<TextEditingController> searchEditingController =
|
||||||
|
TextEditingController().obs;
|
||||||
|
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
Rx<PageController> pageController = PageController().obs;
|
Rx<PageController> pageController = PageController().obs;
|
||||||
@@ -44,7 +45,8 @@ class RestaurantDetailsController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void animateSlider() {
|
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) {
|
Timer.periodic(const Duration(seconds: 2), (Timer timer) {
|
||||||
if (currentPage < vendorModel.value.photos!.length - 1) {
|
if (currentPage < vendorModel.value.photos!.length - 1) {
|
||||||
currentPage++;
|
currentPage++;
|
||||||
@@ -53,7 +55,11 @@ class RestaurantDetailsController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (pageController.value.hasClients) {
|
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<BrandsModel> brandList = <BrandsModel>[].obs;
|
RxList<BrandsModel> brandList = <BrandsModel>[].obs;
|
||||||
|
|
||||||
Future<void> getProduct() async {
|
Future<void> getProduct() async {
|
||||||
await FireStoreUtils.getProductByVendorId(vendorModel.value.id.toString()).then((value) {
|
await FireStoreUtils.getProductByVendorId(
|
||||||
if ((Constant.isSubscriptionModelApplied == true || vendorModel.value.adminCommission?.isEnabled == true) && vendorModel.value.subscriptionPlan != null) {
|
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') {
|
if (vendorModel.value.subscriptionPlan?.itemLimit == '-1') {
|
||||||
allProductList.value = value;
|
allProductList.value = value;
|
||||||
productList.value = value;
|
productList.value = value;
|
||||||
} else {
|
} else {
|
||||||
int selectedProduct =
|
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);
|
allProductList.value = value.sublist(0, selectedProduct);
|
||||||
productList.value = value.sublist(0, selectedProduct);
|
productList.value = value.sublist(0, selectedProduct);
|
||||||
}
|
}
|
||||||
@@ -104,7 +121,9 @@ class RestaurantDetailsController extends GetxController {
|
|||||||
});
|
});
|
||||||
|
|
||||||
for (var element in productList) {
|
for (var element in productList) {
|
||||||
await FireStoreUtils.getVendorCategoryById(element.categoryID.toString()).then((value) {
|
await FireStoreUtils.getVendorCategoryById(
|
||||||
|
element.categoryID.toString(),
|
||||||
|
).then((value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
vendorCategoryList.add(value);
|
vendorCategoryList.add(value);
|
||||||
}
|
}
|
||||||
@@ -116,7 +135,10 @@ class RestaurantDetailsController extends GetxController {
|
|||||||
});
|
});
|
||||||
|
|
||||||
var seen = <String>{};
|
var seen = <String>{};
|
||||||
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) {
|
void searchProduct(String name) {
|
||||||
@@ -126,25 +148,42 @@ class RestaurantDetailsController extends GetxController {
|
|||||||
} else {
|
} else {
|
||||||
isVag.value = false;
|
isVag.value = false;
|
||||||
isNonVag.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();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void filterRecord() {
|
void filterRecord() {
|
||||||
if (isVag.value == true && isNonVag.value == true) {
|
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) {
|
} 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) {
|
} 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) {
|
} 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<List<ProductModel>> getProductByCategory(VendorCategoryModel vendorCategoryModel) async {
|
Future<List<ProductModel>> getProductByCategory(
|
||||||
return productList.where((p0) => p0.categoryID == vendorCategoryModel.id).toList();
|
VendorCategoryModel vendorCategoryModel,
|
||||||
|
) async {
|
||||||
|
return productList
|
||||||
|
.where((p0) => p0.categoryID == vendorCategoryModel.id)
|
||||||
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> getFavouriteList() async {
|
Future<void> getFavouriteList() async {
|
||||||
@@ -157,7 +196,9 @@ class RestaurantDetailsController extends GetxController {
|
|||||||
favouriteItemList.value = value;
|
favouriteItemList.value = value;
|
||||||
});
|
});
|
||||||
|
|
||||||
await FireStoreUtils.getOfferByVendorId(vendorModel.value.id.toString()).then((value) {
|
await FireStoreUtils.getOfferByVendorId(
|
||||||
|
vendorModel.value.id.toString(),
|
||||||
|
).then((value) {
|
||||||
couponList.value = value;
|
couponList.value = value;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -175,8 +216,12 @@ class RestaurantDetailsController extends GetxController {
|
|||||||
if (day == element.day.toString()) {
|
if (day == element.day.toString()) {
|
||||||
if (element.timeslot!.isNotEmpty) {
|
if (element.timeslot!.isNotEmpty) {
|
||||||
for (var element in element.timeslot!) {
|
for (var element in element.timeslot!) {
|
||||||
var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}");
|
var start = DateFormat(
|
||||||
var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}");
|
"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)) {
|
if (isCurrentDateInRange(start, end)) {
|
||||||
isOpen.value = true;
|
isOpen.value = true;
|
||||||
}
|
}
|
||||||
@@ -219,15 +264,33 @@ class RestaurantDetailsController extends GetxController {
|
|||||||
String adOnsPrice = "0";
|
String adOnsPrice = "0";
|
||||||
|
|
||||||
if (productModel.itemAttribute != null) {
|
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(
|
variantPrice = Constant.productCommissionPrice(
|
||||||
vendorModel.value,
|
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 {
|
} else {
|
||||||
String price = Constant.productCommissionPrice(vendorModel.value, productModel.price.toString());
|
String price = Constant.productCommissionPrice(
|
||||||
String disPrice = double.parse(productModel.disPrice.toString()) <= 0 ? "0" : Constant.productCommissionPrice(vendorModel.value, productModel.disPrice.toString());
|
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) {
|
if (double.parse(disPrice) <= 0) {
|
||||||
variantPrice = price;
|
variantPrice = price;
|
||||||
} else {
|
} else {
|
||||||
@@ -237,11 +300,23 @@ class RestaurantDetailsController extends GetxController {
|
|||||||
|
|
||||||
for (int i = 0; i < productModel.addOnsPrice!.length; i++) {
|
for (int i = 0; i < productModel.addOnsPrice!.length; i++) {
|
||||||
if (selectedAddOns.contains(productModel.addOnsTitle![i]) == true) {
|
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();
|
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;
|
return mainPrice;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,18 +328,35 @@ class RestaurantDetailsController extends GetxController {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> addToCart({required ProductModel productModel, required String price, required String discountPrice, required bool isIncrement, required int quantity, VariantInfo? variantInfo}) async {
|
Future<void> addToCart({
|
||||||
|
required ProductModel productModel,
|
||||||
|
required String price,
|
||||||
|
required String discountPrice,
|
||||||
|
required bool isIncrement,
|
||||||
|
required int quantity,
|
||||||
|
VariantInfo? variantInfo,
|
||||||
|
}) async {
|
||||||
CartProductModel cartProductModel = CartProductModel();
|
CartProductModel cartProductModel = CartProductModel();
|
||||||
|
|
||||||
String adOnsPrice = "0";
|
String adOnsPrice = "0";
|
||||||
for (int i = 0; i < productModel.addOnsPrice!.length; i++) {
|
for (int i = 0; i < productModel.addOnsPrice!.length; i++) {
|
||||||
if (selectedAddOns.contains(productModel.addOnsTitle![i]) == true && productModel.addOnsPrice![i] != '0') {
|
if (selectedAddOns.contains(productModel.addOnsTitle![i]) == true &&
|
||||||
adOnsPrice = (double.parse(adOnsPrice.toString()) + double.parse(Constant.productCommissionPrice(vendorModel.value, productModel.addOnsPrice![i].toString()))).toString();
|
productModel.addOnsPrice![i] != '0') {
|
||||||
|
adOnsPrice =
|
||||||
|
(double.parse(adOnsPrice.toString()) +
|
||||||
|
double.parse(
|
||||||
|
Constant.productCommissionPrice(
|
||||||
|
vendorModel.value,
|
||||||
|
productModel.addOnsPrice![i].toString(),
|
||||||
|
),
|
||||||
|
))
|
||||||
|
.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (variantInfo != null) {
|
if (variantInfo != null) {
|
||||||
cartProductModel.id = "${productModel.id!}~${variantInfo.variantId.toString()}";
|
cartProductModel.id =
|
||||||
|
"${productModel.id!}~${variantInfo.variantId.toString()}";
|
||||||
cartProductModel.name = productModel.name!;
|
cartProductModel.name = productModel.name!;
|
||||||
cartProductModel.photo = productModel.photo!;
|
cartProductModel.photo = productModel.photo!;
|
||||||
cartProductModel.categoryId = productModel.categoryID!;
|
cartProductModel.categoryId = productModel.categoryID!;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart';
|
|||||||
import 'package:customer/models/favourite_model.dart';
|
import 'package:customer/models/favourite_model.dart';
|
||||||
import 'package:customer/models/vendor_model.dart';
|
import 'package:customer/models/vendor_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class RestaurantListController extends GetxController {
|
class RestaurantListController extends GetxController {
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:customer/models/rating_model.dart';
|
import 'package:customer/models/rating_model.dart';
|
||||||
import 'package:customer/models/vendor_model.dart';
|
import 'package:customer/models/vendor_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class ReviewListController extends GetxController {
|
class ReviewListController extends GetxController {
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:customer/models/vendor_model.dart';
|
import 'package:customer/models/vendor_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class ScanQrCodeController extends GetxController {
|
class ScanQrCodeController extends GetxController {
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart';
|
|||||||
import 'package:customer/models/product_model.dart';
|
import 'package:customer/models/product_model.dart';
|
||||||
import 'package:customer/models/vendor_model.dart';
|
import 'package:customer/models/vendor_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class SearchScreenController extends GetxController {
|
class SearchScreenController extends GetxController {
|
||||||
@override
|
@override
|
||||||
@@ -28,13 +28,20 @@ class SearchScreenController extends GetxController {
|
|||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
|
|
||||||
for (var element in vendorList) {
|
for (var element in vendorList) {
|
||||||
await FireStoreUtils.getProductByVendorId(element.id.toString()).then((value) {
|
await FireStoreUtils.getProductByVendorId(element.id.toString()).then((
|
||||||
if ((Constant.isSubscriptionModelApplied == true || element.adminCommission?.isEnabled == true) && element.subscriptionPlan != null) {
|
value,
|
||||||
|
) {
|
||||||
|
if ((Constant.isSubscriptionModelApplied == true ||
|
||||||
|
element.adminCommission?.isEnabled == true) &&
|
||||||
|
element.subscriptionPlan != null) {
|
||||||
if (element.subscriptionPlan?.itemLimit == '-1') {
|
if (element.subscriptionPlan?.itemLimit == '-1') {
|
||||||
productList.addAll(value);
|
productList.addAll(value);
|
||||||
} else {
|
} else {
|
||||||
int selectedProduct =
|
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));
|
productList.addAll(value.sublist(0, selectedProduct));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import 'package:easy_localization/easy_localization.dart';
|
|||||||
import 'package:firebase_auth/firebase_auth.dart' as auth;
|
import 'package:firebase_auth/firebase_auth.dart' as auth;
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.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/auth_screens/login_screen.dart';
|
||||||
import '../screen_ui/multi_vendor_service/dash_board_screens/dash_board_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';
|
import '../screen_ui/on_demand_service/on_demand_dashboard_screen.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:customer/screen_ui/location_enable_screens/location_permission_screen.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.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 'package:firebase_auth/firebase_auth.dart' as auth;
|
||||||
import '../constant/constant.dart';
|
import '../constant/constant.dart';
|
||||||
import '../models/referral_model.dart';
|
import '../models/referral_model.dart';
|
||||||
@@ -17,9 +17,11 @@ class SignUpController extends GetxController {
|
|||||||
Rx<TextEditingController> lastNameController = TextEditingController().obs;
|
Rx<TextEditingController> lastNameController = TextEditingController().obs;
|
||||||
Rx<TextEditingController> emailController = TextEditingController().obs;
|
Rx<TextEditingController> emailController = TextEditingController().obs;
|
||||||
Rx<TextEditingController> mobileController = TextEditingController().obs;
|
Rx<TextEditingController> mobileController = TextEditingController().obs;
|
||||||
Rx<TextEditingController> countryCodeController = TextEditingController(text: Constant.defaultCountryCode).obs;
|
Rx<TextEditingController> countryCodeController =
|
||||||
|
TextEditingController(text: Constant.defaultCountryCode).obs;
|
||||||
Rx<TextEditingController> passwordController = TextEditingController().obs;
|
Rx<TextEditingController> passwordController = TextEditingController().obs;
|
||||||
Rx<TextEditingController> confirmPasswordController = TextEditingController().obs;
|
Rx<TextEditingController> confirmPasswordController =
|
||||||
|
TextEditingController().obs;
|
||||||
Rx<TextEditingController> referralController = TextEditingController().obs;
|
Rx<TextEditingController> referralController = TextEditingController().obs;
|
||||||
|
|
||||||
final FocusNode emailFocusNode = FocusNode();
|
final FocusNode emailFocusNode = FocusNode();
|
||||||
@@ -90,7 +92,8 @@ class SignUpController extends GetxController {
|
|||||||
} else if (lastNameController.value.text.isEmpty) {
|
} else if (lastNameController.value.text.isEmpty) {
|
||||||
ShowToastDialog.showToast("Please enter last name".tr());
|
ShowToastDialog.showToast("Please enter last name".tr());
|
||||||
return false;
|
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());
|
ShowToastDialog.showToast("Please enter a valid email address".tr());
|
||||||
return false;
|
return false;
|
||||||
} else if (mobileController.value.text.isEmpty) {
|
} else if (mobileController.value.text.isEmpty) {
|
||||||
@@ -99,8 +102,11 @@ class SignUpController extends GetxController {
|
|||||||
} else if (passwordController.value.text.length < 6) {
|
} else if (passwordController.value.text.length < 6) {
|
||||||
ShowToastDialog.showToast("Password must be at least 6 characters".tr());
|
ShowToastDialog.showToast("Password must be at least 6 characters".tr());
|
||||||
return false;
|
return false;
|
||||||
} else if (passwordController.value.text != confirmPasswordController.value.text) {
|
} else if (passwordController.value.text !=
|
||||||
ShowToastDialog.showToast("Password and Confirm password do not match".tr());
|
confirmPasswordController.value.text) {
|
||||||
|
ShowToastDialog.showToast(
|
||||||
|
"Password and Confirm password do not match".tr(),
|
||||||
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -109,7 +115,10 @@ class SignUpController extends GetxController {
|
|||||||
/// Email Sign-up Flow
|
/// Email Sign-up Flow
|
||||||
Future<void> _signUpWithEmail() async {
|
Future<void> _signUpWithEmail() async {
|
||||||
try {
|
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) {
|
if (credential.user != null) {
|
||||||
final newUser = await _buildUserModel(credential.user?.uid ?? '');
|
final newUser = await _buildUserModel(credential.user?.uid ?? '');
|
||||||
@@ -119,7 +128,9 @@ class SignUpController extends GetxController {
|
|||||||
_navigateBasedOnAddress(newUser);
|
_navigateBasedOnAddress(newUser);
|
||||||
}
|
}
|
||||||
} on auth.FirebaseAuthException catch (e) {
|
} 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') {
|
if (e.code == 'email-already-in-use') {
|
||||||
ShowToastDialog.showToast("Email already in use".tr());
|
ShowToastDialog.showToast("Email already in use".tr());
|
||||||
} else if (e.code == 'weak-password') {
|
} else if (e.code == 'weak-password') {
|
||||||
@@ -131,7 +142,9 @@ class SignUpController extends GetxController {
|
|||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
debugPrint("Something went wrong: ${e.toString()}");
|
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
|
/// Handle Referral Logic
|
||||||
Future<void> _handleReferral(String userId) async {
|
Future<void> _handleReferral(String userId) async {
|
||||||
final referralCode = referralController.value.text.trim();
|
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);
|
await FireStoreUtils.referralAdd(referral);
|
||||||
}
|
}
|
||||||
@@ -183,7 +204,10 @@ class SignUpController extends GetxController {
|
|||||||
/// Navigate Based on Shipping Address
|
/// Navigate Based on Shipping Address
|
||||||
void _navigateBasedOnAddress(UserModel user) {
|
void _navigateBasedOnAddress(UserModel user) {
|
||||||
if (user.shippingAddress?.isNotEmpty == true) {
|
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
|
/// Save the default address to global constant
|
||||||
Constant.selectedLocation = defaultAddress;
|
Constant.selectedLocation = defaultAddress;
|
||||||
|
|||||||
@@ -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/notification_service.dart';
|
||||||
import 'package:customer/utils/preferences.dart';
|
import 'package:customer/utils/preferences.dart';
|
||||||
import 'package:firebase_auth/firebase_auth.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/auth_screens/login_screen.dart';
|
||||||
import '../screen_ui/location_enable_screens/location_permission_screen.dart';
|
import '../screen_ui/location_enable_screens/location_permission_screen.dart';
|
||||||
import '../screen_ui/on_boarding_screen/on_boarding_screen.dart';
|
import '../screen_ui/on_boarding_screen/on_boarding_screen.dart';
|
||||||
@@ -30,7 +30,9 @@ class SplashController extends GetxController {
|
|||||||
} else {
|
} else {
|
||||||
bool isLogin = await FireStoreUtils.isLogin();
|
bool isLogin = await FireStoreUtils.isLogin();
|
||||||
if (isLogin == true) {
|
if (isLogin == true) {
|
||||||
await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) async {
|
await FireStoreUtils.getUserProfile(
|
||||||
|
FireStoreUtils.getCurrentUid(),
|
||||||
|
).then((value) async {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
UserModel userModel = value;
|
UserModel userModel = value;
|
||||||
log(userModel.toJson().toString());
|
log(userModel.toJson().toString());
|
||||||
@@ -38,11 +40,18 @@ class SplashController extends GetxController {
|
|||||||
if (userModel.active == true) {
|
if (userModel.active == true) {
|
||||||
userModel.fcmToken = await NotificationService.getToken();
|
userModel.fcmToken = await NotificationService.getToken();
|
||||||
await FireStoreUtils.updateUser(userModel);
|
await FireStoreUtils.updateUser(userModel);
|
||||||
if (userModel.shippingAddress != null && userModel.shippingAddress!.isNotEmpty) {
|
if (userModel.shippingAddress != null &&
|
||||||
if (userModel.shippingAddress!.where((element) => element.isDefault == true).isNotEmpty) {
|
userModel.shippingAddress!.isNotEmpty) {
|
||||||
Constant.selectedLocation = userModel.shippingAddress!.where((element) => element.isDefault == true).single;
|
if (userModel.shippingAddress!
|
||||||
|
.where((element) => element.isDefault == true)
|
||||||
|
.isNotEmpty) {
|
||||||
|
Constant.selectedLocation =
|
||||||
|
userModel.shippingAddress!
|
||||||
|
.where((element) => element.isDefault == true)
|
||||||
|
.single;
|
||||||
} else {
|
} else {
|
||||||
Constant.selectedLocation = userModel.shippingAddress!.first;
|
Constant.selectedLocation =
|
||||||
|
userModel.shippingAddress!.first;
|
||||||
}
|
}
|
||||||
Get.offAll(const ServiceListScreen());
|
Get.offAll(const ServiceListScreen());
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
import '../utils/preferences.dart';
|
import '../utils/preferences.dart';
|
||||||
|
|
||||||
class ThemeController extends GetxController {
|
class ThemeController extends GetxController {
|
||||||
@@ -23,5 +23,3 @@ class ThemeController extends GetxController {
|
|||||||
|
|
||||||
ThemeMode get themeMode => isDark.value ? ThemeMode.dark : ThemeMode.light;
|
ThemeMode get themeMode => isDark.value ? ThemeMode.dark : ThemeMode.light;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:customer/constant/constant.dart';
|
import 'package:customer/constant/constant.dart';
|
||||||
import 'package:customer/models/vendor_category_model.dart';
|
import 'package:customer/models/vendor_category_model.dart';
|
||||||
import '../service/fire_store_utils.dart';
|
import '../service/fire_store_utils.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart' hide Trans;
|
||||||
|
|
||||||
class ViewAllCategoryController extends GetxController {
|
class ViewAllCategoryController extends GetxController {
|
||||||
RxBool isLoading = true.obs;
|
RxBool isLoading = true.obs;
|
||||||
@@ -18,12 +18,19 @@ class ViewAllCategoryController extends GetxController {
|
|||||||
Future<void> getCategoryData() async {
|
Future<void> getCategoryData() async {
|
||||||
await FireStoreUtils.getVendorCategory().then((value) {
|
await FireStoreUtils.getVendorCategory().then((value) {
|
||||||
vendorCategoryModel.value = value;
|
vendorCategoryModel.value = value;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (Constant.restaurantList != null) {
|
if (Constant.restaurantList != null) {
|
||||||
List<String> usedCategoryIds = Constant.restaurantList!.expand((vendor) => vendor.categoryID ?? []).whereType<String>().toSet().toList();
|
List<String> usedCategoryIds =
|
||||||
vendorCategoryModel.value = vendorCategoryModel.where((category) => usedCategoryIds.contains(category.id)).toList();
|
Constant.restaurantList!
|
||||||
|
.expand((vendor) => vendor.categoryID ?? [])
|
||||||
|
.whereType<String>()
|
||||||
|
.toSet()
|
||||||
|
.toList();
|
||||||
|
vendorCategoryModel.value =
|
||||||
|
vendorCategoryModel
|
||||||
|
.where((category) => usedCategoryIds.contains(category.id))
|
||||||
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user