import React, { useEffect, useState } from "react"; import { ActivityIndicator, Dimensions, RefreshControl, StyleSheet, Text, TouchableOpacity, View, } from "react-native"; import MasonryList from "@react-native-seoul/masonry-list"; import CartCard from "../../components/cart/CartCard"; import Checkbox from "expo-checkbox"; import { FontAwesomeIcon } from "@fortawesome/react-native-fontawesome"; import { faArrowLeft, faDeleteLeft, faTrash, } from "@fortawesome/free-solid-svg-icons"; import DeleteConfirmationModal from "../../components/DeleteConfirmationModal"; // import { cart } from "../../constants/cart"; import { useIsFocused, useNavigation } from "@react-navigation/native"; import { delete_order, get_order, get_orders_by_customer, } from "../../services/api/controllers/order"; // import { user } from "../../constants/user"; import { ScrollView } from "react-native-gesture-handler"; import AsyncStorage from "@react-native-async-storage/async-storage"; const width = Dimensions.get("window").width; const height = Dimensions.get("window").height; const Cart = ({ cartList, refresh }) => { const [cartSort, setcartSort] = useState([]); const [all, setall] = useState(false); const [shopSelected, setshopSelected] = useState([]); const [quantityChange, setquantityChange] = useState([]); const [load, setload] = useState(false); const [cart, setcart] = useState([]); const [totalPrice, settotalPrice] = useState(0); const [error, setError] = useState(false); const [checkoutItems, setCheckOutItems] = useState([]); const [isModalVisible, setModalVisible] = useState(false); const navigation = useNavigation(); const [refreshing, setRefreshing] = useState(true); const [user, setuser] = useState([]); const isFocused = useIsFocused(); useEffect(() => { /* ---------------Check for the user saved email--------------- */ AsyncStorage.getItem("userData") .then((pass) => { if (pass !== null) { const userDataArray = JSON.parse(pass); setuser(userDataArray); console.log(userDataArray[0]?._id); get_orders_by_customer({ id: userDataArray[0]?._id, }) .then((result) => { if (result.error) { setError(result.error); } else { setcart(result.data ?? []); } }) .catch((error) => { setError(error.message); setcart([]); }) .finally(() => { // setprodIsLoading(false); // Set loading to false when done loading }); console.log(pass); } }) .catch((error) => { console.log(error + "weeewwww"); }); }, []); useEffect(() => { // Simulate a delay for the purpose of this example setload(true); setTimeout(() => { // After the refresh logic is complete, set refreshing state to false setload(false); }, 200); // 2000 milliseconds (2 seconds) delay for demonstration }, []); useEffect(() => { if (quantityChange) { setload(true); get_orders_by_customer({ id: user[0]?._id, }) .then((result) => { // console.log("result" + result); if (result.error) { setError(result.error); } else { setcart(result.data); setload(false); } }) .catch((error) => { setError(error.message); }) .finally(() => { // setprodIsLoading(false); // Set loading to false when done loading }); } }, [quantityChange]); useEffect(() => { console.log("focused on cart"); // setRefreshing(false); if (isFocused) { setload(true); AsyncStorage.getItem("userData") .then((pass) => { if (pass !== null) { const userDataArray = JSON.parse(pass); setuser(userDataArray); console.log(userDataArray[0]?._id); get_orders_by_customer({ id: userDataArray[0]?._id, }) .then((result) => { if (result.error) { // setRefreshing(true); setload(false); setError(result.error); } else { setcart(result.data ?? []); setload(false); } }) .catch((error) => { setError(error.message); setcart([]); }) .finally(() => { // setprodIsLoading(false); // Set loading to false when done loading }); console.log(pass); } else { setcart([]); setload(false); } }) .catch((error) => { console.log(error + "weeewwww"); }); } }, [isFocused]); const handleRefresh = () => { setRefreshing(true); setload(true); console.log("refreshing"); // Simulate a delay for the purpose of this example setTimeout(() => { // After the refresh logic is complete, set refreshing state to false setRefreshing(false); setload(false); }, 2000); // 2000 milliseconds (2 seconds) delay for demonstration }; const toggleModal = () => { setModalVisible(!isModalVisible); }; console.log(cartSort); // useEffect(() => { // setcartSort(cartSort) // }, [cartSort]) useEffect(() => { // Fetch vendors and update the state }, []); useEffect(() => { // Fetch vendors and update the state if (refreshing) { setload(true); get_orders_by_customer({ id: user[0]?._id, }) .then((result) => { // console.log("result" + result); if (result.error) { setError(result.error); } else { setcart(result.data); setload(false); } }) .catch((error) => { setError(error.message); }) .finally(() => { // setprodIsLoading(false); // Set loading to false when done loading }); } }, [refreshing]); const selectAll = () => { setcartSort((prevCartList) => { // Create a copy of the cartList to avoid mutating the original state const newCartList = [...prevCartList]; // Set 'selected' property to true for all shops and products newCartList.forEach((shop) => { shop.selected = all; shop.cartItems.forEach((product) => { product.selected = all; }); }); return newCartList; }); }; // state variable 'all' triggers the useEffect useEffect(() => { selectAll(); }, [all]); const shopLiked = (shopIndex) => { setcartSort((prevCartList) => { // copy of the cartList to avoid mutating the original state const newCartList = [...prevCartList]; // Toggle the 'selected' property of the shop newCartList[shopIndex].selected = !newCartList[shopIndex].selected; // Toggle the 'selected' property of all products in the shop newCartList[shopIndex].cartItems.forEach((product) => { product.selected = newCartList[shopIndex].selected; }); return newCartList; }); }; const shopProdLike = (shopIndex, prodIndex) => { setcartSort((prevCartList) => { // Create a copy of the cartList to avoid mutating the original state const newCartList = [...prevCartList]; // Toggle the 'selected' property of the product at the specified shopIndex and prodIndex newCartList[shopIndex].cartItems[prodIndex].selected = !newCartList[shopIndex].cartItems[prodIndex].selected; // Set the shop's 'selected' property to false newCartList[shopIndex].selected = false; return newCartList; }); }; const checkOut = () => { // Create a new array 'checkOutItems' by filtering the cartSort const checkOutItems = cartSort ?.map((shop) => { const filteredCartItems = shop.cartItems.filter( (item) => item.selected ); return { ...shop, cartItems: filteredCartItems }; }) .filter((shop) => shop?.cartItems?.length > 0); // Set the new state for 'checkOutItems' setCheckOutItems(checkOutItems); // Navigate only if there are items in the shops if (checkOutItems?.length > 0) { navigation.navigate("CheckOutMultiple", { product: checkOutItems, // orderId: result.data._id, }); } console.log(checkOutItems); }; useEffect(() => { //---------- CREATE A CART LIST CATEGORIZED BY SHOP ANME -------------// const cartSorted = cart?.reverse()?.reduce((acc, item) => { const shopId = item.items[0].vendor_id; const shopName = item.items[0].vendor_name; const existingShop = acc.find((shop) => shop.shopId === shopId); console.log("shop: " + shopName); if (item.status === "CART") { if (existingShop) { // Shop already exists, add the item to its cartItems array existingShop.cartItems.push({ ...item, selected: false }); // Initialize selected to false } else { // Shop doesn't exist, create a new shop object with selected:false acc.push({ shopname: shopName, shopId: shopId, cartItems: [{ ...item, selected: false }], selected: false, shippingFee: 0, }); // Initialize selected to false } } return acc; }, []); setcartSort(cartSorted); }, [cart]); const calculateTotalPrice = () => { let total = 0; // Iterate through the cartSort to calculate the total price cartSort?.forEach((shop) => { let shopHasSelectedProducts = false; // Flag to check if the shop has selected products shop.cartItems.forEach((product) => { if (product.selected) { // Calculate the total price for the selected product let productTotal = 0; if (product.promo > 0) { // Apply promo discount if promo is greater than 0 productTotal = product.regular_price * (1 - product.promo / 100) * product.quantity; // Assuming promo is in percentage (e.g., 30%) } else { // Otherwise, calculate total without promo discount productTotal = product.items[0].price * parseInt(product.items[0].quantity, 10); } // Add the product total to the overall total total += productTotal; // Set the flag to true if at least one product is selected in the shop shopHasSelectedProducts = true; } }); if (shopHasSelectedProducts) { // Add the shipping fee for the shop if it has selected products total += shop.shippingFee; } }); return parseFloat(total)?.toLocaleString("en-US"); }; // const quantityChange = (shopIndex, prodIndex, qty) => { // setcartSort((prevCartList) => { // // Create a copy of the cartSort to avoid mutating the original state // const newCartList = [...prevCartList]; // // Update the quantity of the product at the specified shopIndex and prodIndex // newCartList[shopIndex].cartItems[prodIndex].quantity = qty; // return newCartList; // }); // }; const deleteItems = () => { // setload(true); setRefreshing(false); toggleModal(); // setcartSort((prevCartList) => { // // Filter out selected shops // const newCartList = prevCartList.filter((shop) => !shop.selected); // // Update cartItems for shops that are not selected // newCartList.forEach((shop) => { // shop.cartItems = shop.cartItems.filter((product) => !product.selected); // }); // // Remove shops with no cartItems // const finalCartList = newCartList.filter( // (shop) => shop?.cartItems?.length > 0 // ); // return finalCartList; // }); const deletePromises = []; const newCartList = cartSort; // Update cartItems for shops that are not selected newCartList?.forEach((shop) => { shop.cartItems = shop.cartItems.filter((product) => product.selected); }); // Remove shops with no cartItems // const finalCartList = newCartList.filter( // (shop) => shop?.cartItems?.length > 0 // ); if (newCartList) { newCartList.forEach((order) => { // Loop through the items in each order's 'cartItems' order.cartItems.forEach((cartItem) => { // Construct the 'body' object for updating the order console.log( "I am here and the order cart items to delete is " + order.cartItems ); // setload(true); const orderId = cartItem._id; // const orderName = cartItem.items[0].name; const deletePromise = delete_order({ id: orderId, }); deletePromises.push(deletePromise); }); }); Promise.all(deletePromises) .then((results) => { // Handle results of updating orders results.forEach((updateResult, index) => { if (updateResult.status === 200) { console.log( // `Order update id: ${updateResult.data} orderName: ${product[index].cartItems[0].items[0].name} orderId: ${product[index].cartItems[0]._id} amount: ${result.data.attributes.amount}` "deleted" ); // setload(false); // setamount(result.data.attributes.amount); // setpaymessage(result.data.attributes.description); // setModalVisible(!modalVisible); } else { // console.log("Update order failed for order with ID:", product[index].cartItems[0]._id); ("failed"); } }); }) .catch((err) => { console.error(err); }) .finally(() => { // setprodIsLoading(false); // Set loading to false when done loading console.log("heyyyy finally"); setRefreshing(true); // setload(true); // setload(false); }); } console.log(cartSort); }; return ( CART setall((prev) => !prev)} /> Select All { toggleModal(); }} > {!load ? ( item.id} style={styles.list} numColumns={1} showsVerticalScrollIndicator={false} onRefresh={() => handleRefresh()} // Add this line // refreshing={refreshing} // Add this line renderItem={({ item, i }) => ( )} containerStyle={styles.container1} contentContainerStyle={styles.content} onEndReachedThreshold={0.1} /> ) : ( )} Total Price : {" "} ₱{calculateTotalPrice()} checkOut()}> CHECKOUT ); }; const styles = StyleSheet.create({ container: { backgroundColor: "#ffffff", paddingTop: 10, height: "100%", width: width, // height:height -70 }, header: { width: "100%", top: 0, height: 40, marginLeft: 15, }, container1: { width: "100%", }, actions: { flexDirection: "row", justifyContent: "space-between", alignItems: "center", padding: 10, paddingTop: 0, }, content: { width: "100%", alignItems: "center", justifyContent: "center", }, list: { width: "100%", }, headerText: { textAlign: "left", width: "100%", fontWeight: "600", fontSize: 16, }, footer: { bottom: 0, width: "100%", }, wrapper: { width: "100%", height: "90%", // justifyContent: "center", // alignItems: "center", padding: 5, paddingBottom: 60, }, list: { width: "100%", height: "90%", // justifyContent: "center", // alignItems: "center", }, card: { width: "100%", borderWidth: 1, borderColor: "#dddd", justifyContent: "center", padding: 15, paddingVertical: 10, borderRadius: 10, marginVertical: 2, }, title: { fontSize: 16, fontWeight: "600", }, body: { fontSize: 16, // fontWeight: "600", marginTop: 5, }, date: { fontSize: 12, // fontWeight: "600", color: "#797979", marginTop: 10, }, bottom: { position: "absolute", bottom: 0, backgroundColor: "#fff", width: "100%", justifyContent: "space-between", alignItems: "center", flexDirection: "row", borderTopWidth: 1, borderColor: "#dddd", }, details: { padding: 10, }, detailsTop: { // padding:10, flexDirection: "row", }, detailsTopText: { color: "#363636", fontWeight: "600", fontSize: 14, letterSpacing: 0.5, }, detailsTopTextPrice: { color: "#ffaa00", fontWeight: "600", fontSize: 16, letterSpacing: 0.5, }, checkout: { backgroundColor: "#ffaa00", width: 150, justifyContent: "center", alignItems: "center", padding: 15, }, checkoutText: { color: "#fff", fontWeight: "600", fontSize: 16, letterSpacing: 0.7, }, }); export default Cart;