Files
grocery_user_app-frontend/lib/src/logic/provider/addTocart_provider.dart
2025-02-13 17:26:07 +05:30

588 lines
15 KiB
Dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
import 'package:grocery_app/src/core/network_services/service_locator.dart';
import 'package:grocery_app/src/core/routes/routes.dart';
import 'package:grocery_app/src/data/address.dart';
import 'package:grocery_app/src/data/all_cart_items.dart';
import 'package:grocery_app/src/data/coupon_model.dart';
import 'package:grocery_app/src/data/coupon_response.dart';
import 'package:grocery_app/src/logic/repo/product_repo.dart';
import 'package:grocery_app/src/ui/payment/payment_webView.dart';
import 'package:grocery_app/utils/extensions/extensions.dart';
import 'package:http/http.dart' as http;
class AddtocartProvider extends ChangeNotifier {
String _pinCode = "Fetching...";
bool _isLoading = false;
bool _isDeliverable = false;
String get pinCode => _pinCode;
bool get isLoading => _isLoading;
bool get isDeliverable => _isDeliverable;
TextEditingController checkPinCode = TextEditingController();
Future<void> getCurrentLocation(BuildContext context) async {
_isLoading = true;
notifyListeners();
try {
bool serviceEnabled = await Geolocator.isLocationServiceEnabled();
if (!serviceEnabled) {
_isLoading = false;
notifyListeners();
return;
}
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high,
);
print("Location fetched: ${position.latitude}, ${position.longitude}");
List<Placemark> placemarks = await placemarkFromCoordinates(
position.latitude,
position.longitude,
);
if (placemarks.isNotEmpty) {
_pinCode = placemarks.first.postalCode ?? "Unknown";
checkPinCode.text = _pinCode;
print("Pincode found: $_pinCode");
// Now check if this pin code is deliverable
await checkPin(context, _pinCode);
} else {
_pinCode = "";
print("Error: No placemarks found.");
}
} catch (e) {
_pinCode = "";
print("Error: ${e.toString()}");
}
_pinCode = "";
_isLoading = false;
notifyListeners();
}
bool ischeckpin = false;
Future<void> checkPin(BuildContext context, pin) async {
ischeckpin = true;
_pinCode = pin;
notifyListeners();
var data = {};
try {
var result = await _homeRepo.checkPin(data, pin);
return result.fold(
(error) {
ischeckpin = false;
_isDeliverable = false;
isLoaddcartItem = false;
notifyListeners();
},
(response) {
if (response.isDeliverable!) {
_isDeliverable = true;
}
ischeckpin = false;
isLoaddcartItem = false;
notifyListeners();
},
);
} catch (e) {
ischeckpin = false;
_isDeliverable = false;
isLoaddcartItem = false;
notifyListeners();
}
}
Map<String, bool> isRemoveItem = {};
Future<void> deleteItem(BuildContext context, id) async {
isRemoveItem[id] = true;
notifyListeners();
var data = {};
try {
var result = await _homeRepo.deleteItem(data, id);
return result.fold(
(error) {
isRemoveItem[id] = false;
notifyListeners();
},
(response) {
getItemCards(context);
isRemoveItem[id] = false;
notifyListeners();
},
);
} catch (e) {
isRemoveItem[id] = false;
notifyListeners();
}
}
double _totalPrice = 0.0;
double _grandPrice = 0.0;
double _discount = 0.0;
double get totalPrice => _totalPrice;
double get grandPrice => _grandPrice;
double get discount => _discount;
final _homeRepo = getIt<ProductRepo>();
AllCartItems allitem = AllCartItems();
bool isLoaddcartItem = true;
Future<void> getItemCards(BuildContext context) async {
isLoaddcartItem = true;
notifyListeners();
var data = {};
try {
var result = await _homeRepo.getItemCards(data);
return result.fold(
(error) {
isLoaddcartItem = false;
notifyListeners();
},
(response) {
allitem = response!;
_discount = 0.0;
_totalPrice = double.parse(response.subtotal.toString());
_grandPrice = double.parse(response.subtotal.toString());
isLoaddcartItem = false;
notifyListeners();
},
);
} catch (e) {
print("sfddsfdfff");
isLoaddcartItem = false;
notifyListeners();
}
}
//////////////////////////////////// coupon ////////////////////////////
bool iscouponLoading = true;
CouponDataModel couponDataModel = CouponDataModel();
Future<void> offerCoupon(BuildContext context) async {
iscouponLoading = true;
notifyListeners();
var data = {};
try {
var result = await _homeRepo.offerCoupon(data);
return result.fold(
(error) {
iscouponLoading = false;
notifyListeners();
},
(response) {
couponDataModel = response!;
iscouponLoading = false;
notifyListeners();
},
);
} catch (e) {
iscouponLoading = false;
notifyListeners();
}
}
bool isCouponApply = false;
CouponResponse couponResponse = CouponResponse();
String _couponId = '';
String get couponId => _couponId;
Future<bool> applyCoupon(
BuildContext context, String cartId, String couponscode, id) async {
context.showLoader(show: true);
isCouponApply = true;
notifyListeners();
var data = {"couponCode": couponscode, "cartId": cartId};
try {
var result = await _homeRepo.applyCoupon(data);
return result.fold(
(error) {
context.showLoader(show: false);
isCouponApply = false;
Fluttertoast.showToast(
msg: "Coupon Code invalid!",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.red,
textColor: Colors.white,
fontSize: 14.0,
);
notifyListeners();
return false;
},
(response) {
if (response != null) {
couponResponse = response;
_couponId = id;
_grandPrice = double.parse(response.finalPrice.toString());
_discount = double.parse(response.discountAmount.toString());
context.showLoader(show: false);
isCouponApply = false;
notifyListeners();
return true;
} else {
context.showLoader(show: false);
isCouponApply = false;
notifyListeners();
return false;
}
},
);
} catch (e) {
context.showLoader(show: false);
Fluttertoast.showToast(
msg: "Coupon Code invalid!",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.red,
textColor: Colors.white,
fontSize: 14.0,
);
isCouponApply = false;
notifyListeners();
return false; // Return false on exception
}
}
///////////////////////////////////orderPaymnet///////////////////////////
bool ispaymentLoader = false;
Future<void> orderPaymnet(
BuildContext context,
double originalAmount,
String cartId,
String addressId,
String couponId,
) async {
ispaymentLoader = true;
notifyListeners();
var data;
if (couponId.isEmpty) {
data = {
"amount": originalAmount,
"addressId": addressId,
"cartId": cartId,
};
} else {
data = {
"amount": originalAmount,
"addressId": addressId,
"cartId": cartId,
"couponId": couponId
};
}
print("ksdjfkgjlhdfkg ${data}");
try {
var result = await _homeRepo.paymentOrder(data);
return result.fold(
(error) {
ispaymentLoader = false;
notifyListeners();
},
(response) {
if (response.data!.instrumentResponse!.redirectInfo != null &&
response.data!.instrumentResponse!.redirectInfo != '') {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PaymentWebView(
paymentUrl:
response.data!.instrumentResponse!.redirectInfo!.url),
),
);
}
ispaymentLoader = false;
notifyListeners();
},
);
} catch (e) {
ispaymentLoader = false;
notifyListeners();
}
}
////////////////////////////COD ////////////
Future<void> paymentCODOrder(
BuildContext context,
double subtotal,
double deliverCharge,
String couponId,
String addressId,
) async {
ispaymentLoader = true;
notifyListeners();
var data;
if (couponId.isNotEmpty) {
data = {
"addressId": addressId,
"paymentMethod": "COD",
"paymentStatus": "PENDING",
"orderStatus": "PENDING",
"subtotal": subtotal,
"deliveryCharge": deliverCharge,
"transactionId": "phonepe_transaction_123",
"couponId": couponId
};
} else {
data = {
"addressId": addressId,
"paymentMethod": "COD",
"paymentStatus": "PENDING",
"orderStatus": "PENDING",
"subtotal": subtotal,
"deliveryCharge": deliverCharge,
};
}
print("kjfhxgkljfhg ${data}");
try {
var result = await _homeRepo.paymentCODOrder(data);
return result.fold(
(error) {
Fluttertoast.showToast(
msg: "${error.message}",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.green,
textColor: Colors.white,
fontSize: 14.0,
);
ispaymentLoader = false;
notifyListeners();
},
(response) {
context.clearAndPush(routePath: MyRoutes.SUCCESSPAYMENT);
ispaymentLoader = false;
notifyListeners();
},
);
} catch (e) {
ispaymentLoader = false;
Fluttertoast.showToast(
msg: "${e}",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.green,
textColor: Colors.white,
fontSize: 14.0,
);
notifyListeners();
}
}
///////////////////////////////// address/////////////////////////
List<Datum> addresslist = [];
Future<void> getAddress(BuildContext context) async {
var data = {};
try {
var result = await _homeRepo.getAddress(data);
return result.fold(
(error) {
print("dsjfgkjhkdfgdkjfhg");
notifyListeners();
},
(response) {
addresslist = response.data!;
if (response.data!.isNotEmpty) {
_selectedAddress = addresslist.first.id ?? "";
_selecteUserName = addresslist.first.name ?? "";
_selecteUserPhone = addresslist.first.phoneNumber ?? "";
_selecteEmail = addresslist.first.user!.email ?? "";
} else {
_selectedAddress = "";
}
notifyListeners();
},
);
} catch (e) {
print("sfddsfdfff");
notifyListeners();
}
}
String _selectedAddress = "";
String _selecteUserName = "";
String _selecteUserPhone = "";
String _selecteEmail = "";
String get selectedAddress => _selectedAddress;
String get selecteUserName => _selecteUserName;
String get selecteUserPhone => _selecteUserPhone;
String get selecteEmail => _selecteEmail;
void bydefaultSetAddress(phoneNumber, name, email) {
_selecteUserName = name;
_selecteUserPhone = phoneNumber;
_selecteEmail = email;
notifyListeners();
}
void selectAddress(String address, phoneNumber, name, email) {
_selectedAddress = address;
_selecteUserName = name;
_selecteUserPhone = phoneNumber;
_selecteEmail = email;
notifyListeners();
}
Set<String> cartItems = {};
Map<String, bool> isLoadings = {};
bool isLoadingCart = false;
bool iscardAdded = false;
Future<void> addToCart(
BuildContext context, String productId, int quantity) async {
context.showLoader(show: true);
isLoadingCart = true;
isLoadings[productId] = true;
notifyListeners();
var data = {"productId": productId, "quantity": quantity};
try {
var result = await _homeRepo.addToCart(data);
context.showLoader(
show: false,
);
result.fold(
(error) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(error.message),
backgroundColor: Colors.red,
),
);
},
(response) async {
await getItemCards(context);
cartItems.add(productId); // Add product to cart
// Fluttertoast.showToast(
// msg: "Added to cart successfully!",
// toastLength: Toast.LENGTH_SHORT,
// gravity: ToastGravity.BOTTOM,
// backgroundColor: Colors.green,
// textColor: Colors.white,
// fontSize: 14.0,
// );
iscardAdded = true;
notifyListeners(); // Update UI after adding to cart
},
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text("Something went wrong"),
backgroundColor: Colors.red,
),
);
} finally {
isLoadingCart = false;
isLoadings[productId] = false;
notifyListeners(); // Ensure UI updates after operation
}
}
Future<void> decreaseCartQuantity(
BuildContext context, String itemId, int quantity) async {
context.showLoader(show: true);
isLoadingCart = true;
notifyListeners();
// var data = {"productId": productId, "quantity": quantity};
final Map<String, dynamic> cartData = {
"items": [
{"itemId": itemId, "quantity": quantity}
]
};
try {
var result = await _homeRepo.decreaseQuantity(cartData);
context.showLoader(
show: false,
);
result.fold(
(error) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(error.message),
backgroundColor: Colors.red,
),
);
},
(response) async {
await getItemCards(context);
// Fluttertoast.showToast(
// msg: "Added to cart successfully!",
// toastLength: Toast.LENGTH_SHORT,
// gravity: ToastGravity.BOTTOM,
// backgroundColor: Colors.green,
// textColor: Colors.white,
// fontSize: 14.0,
// );
iscardAdded = true;
notifyListeners(); // Update UI after adding to cart
},
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text("Something went wrong"),
backgroundColor: Colors.red,
),
);
} finally {
isLoadingCart = false;
notifyListeners(); // Ensure UI updates after operation
}
}
String _selectedPaymentMethod = "Online"; // Default selection
String get selectedPaymentMethod => _selectedPaymentMethod;
void selectPaymentMethod(String method) {
_selectedPaymentMethod = method;
notifyListeners();
}
}