[d7b7f00] | 1 | import React, { useContext, useState } from 'react';
|
---|
| 2 | import { FaTrashAlt, FaUtensils, FaArrowLeft } from "react-icons/fa";
|
---|
| 3 | import { CartContext } from './CartContext';
|
---|
| 4 | import { OrderContext } from './OrderContext';
|
---|
| 5 | import { useNavigate } from 'react-router-dom';
|
---|
| 6 | import styles from '../../css/ShoppingCartCss/checkout-style.module.css';
|
---|
| 7 |
|
---|
| 8 | const Checkout = () => {
|
---|
| 9 | const { cart, removeFromCart } = useContext(CartContext);
|
---|
| 10 | const { isOrderInProgress } = useContext(OrderContext);
|
---|
| 11 | const navigate = useNavigate();
|
---|
| 12 |
|
---|
| 13 | const [quantities, setQuantities] = useState(() => {
|
---|
| 14 | const savedCart = localStorage.getItem('cart');
|
---|
| 15 | return savedCart ? JSON.parse(savedCart) : cart.map(item => ({ id: item.id, grams: "" }));
|
---|
| 16 | });
|
---|
| 17 |
|
---|
| 18 | const cartLength = cart?.length || 0;
|
---|
| 19 |
|
---|
| 20 | const handleBackClick = () => {
|
---|
| 21 | navigate(-1);
|
---|
| 22 | };
|
---|
| 23 |
|
---|
| 24 | const roundToNearest50 = (value) => {
|
---|
| 25 | let rounded = Math.round(value / 50) * 50;
|
---|
| 26 | return Math.max(50, Math.min(rounded, 2000));
|
---|
| 27 | };
|
---|
| 28 |
|
---|
| 29 | const updateLocalStorageCart = (updatedCart) => {
|
---|
| 30 | localStorage.setItem('cart', JSON.stringify(updatedCart));
|
---|
| 31 | };
|
---|
| 32 |
|
---|
| 33 | const handleQuantityChange = (id, newGrams) => {
|
---|
| 34 | const updatedQuantities = quantities.map(q => q.id === id ? { ...q, grams: newGrams } : q);
|
---|
| 35 | setQuantities(updatedQuantities);
|
---|
| 36 | updateLocalStorageCart(updatedQuantities);
|
---|
| 37 | };
|
---|
| 38 |
|
---|
| 39 | const handleQuantityBlur = (id, newGrams) => {
|
---|
| 40 | const roundedGrams = roundToNearest50(newGrams);
|
---|
| 41 | const updatedQuantities = quantities.map(q => q.id === id ? { ...q, grams: roundedGrams } : q);
|
---|
| 42 | setQuantities(updatedQuantities);
|
---|
| 43 | updateLocalStorageCart(updatedQuantities);
|
---|
| 44 | };
|
---|
| 45 |
|
---|
| 46 | const handleRemoveFromCart = (item) => {
|
---|
| 47 | removeFromCart(item);
|
---|
| 48 | const updatedQuantities = quantities.filter(q => q.id !== item.id);
|
---|
| 49 | setQuantities(updatedQuantities);
|
---|
| 50 | updateLocalStorageCart(updatedQuantities);
|
---|
| 51 | };
|
---|
| 52 |
|
---|
| 53 | const allInputsFilled = quantities.every(q => q.grams >= 50 && q.grams <= 2000);
|
---|
| 54 |
|
---|
| 55 | const handleProceed = () => {
|
---|
| 56 | if (!isOrderInProgress) {
|
---|
| 57 | const itemsWithQuantities = cart.map((item) => ({
|
---|
| 58 | id: item.id,
|
---|
| 59 | name: item.name,
|
---|
| 60 | measurement: item.measurement,
|
---|
| 61 | grams: quantities.find(q => q.id === item.id)?.grams || 0
|
---|
| 62 | }));
|
---|
| 63 | navigate('/delivery-details', { state: { itemsWithQuantities } });
|
---|
| 64 | }
|
---|
| 65 | };
|
---|
| 66 |
|
---|
| 67 | return (
|
---|
| 68 | <div className={styles.checkoutContainer}>
|
---|
| 69 | <div className={styles.checkoutCard}>
|
---|
| 70 | <h2 className={styles.checkoutTitle}>Checkout</h2>
|
---|
| 71 | <div className={styles.backArrow} onClick={handleBackClick}>
|
---|
| 72 | <FaArrowLeft />
|
---|
| 73 | </div>
|
---|
| 74 | {cartLength === 0 ? (
|
---|
| 75 | <p>Your cart is empty</p>
|
---|
| 76 | ) : (
|
---|
| 77 | <div className={styles.cartItems}>
|
---|
| 78 | <p>You have {cartLength} items in your cart:</p>
|
---|
| 79 | <p>Enter the amount of grams needed for each ingredient:</p>
|
---|
| 80 | <ul className={styles.itemList}>
|
---|
| 81 | {cart.map((item, index) => {
|
---|
| 82 | const currentQuantity = quantities.find(q => q.id === item.id)?.grams || "";
|
---|
| 83 | return (
|
---|
| 84 | <li key={index} className={styles.cartItem}>
|
---|
| 85 | <FaUtensils className={styles.cartItemIcon} />
|
---|
| 86 | <div className={styles.itemDetails}>
|
---|
| 87 | <p className={styles.itemLabel}>{item.name}</p>
|
---|
| 88 | <p className={styles.quantityLabel}>In Recipe: {item.measurement}</p>
|
---|
| 89 | </div>
|
---|
| 90 | <input
|
---|
| 91 | type="number"
|
---|
| 92 | min="50"
|
---|
| 93 | max="2000"
|
---|
| 94 | step="50"
|
---|
| 95 | value={currentQuantity}
|
---|
| 96 | onChange={(e) => handleQuantityChange(item.id, e.target.value)}
|
---|
| 97 | onBlur={(e) => handleQuantityBlur(item.id, e.target.value)}
|
---|
| 98 | className={styles.quantityInput}
|
---|
| 99 | placeholder="Enter grams"
|
---|
| 100 | disabled={isOrderInProgress}
|
---|
| 101 | />
|
---|
| 102 | <p className={styles.gramsInfo}>50g - 2000g</p>
|
---|
| 103 | <button
|
---|
| 104 | className={styles.removeButton}
|
---|
| 105 | onClick={() => handleRemoveFromCart(item)}
|
---|
| 106 | disabled={isOrderInProgress}
|
---|
| 107 | >
|
---|
| 108 | <FaTrashAlt />
|
---|
| 109 | </button>
|
---|
| 110 | </li>
|
---|
| 111 | );
|
---|
| 112 | })}
|
---|
| 113 | </ul>
|
---|
| 114 | </div>
|
---|
| 115 | )}
|
---|
| 116 | <button
|
---|
| 117 | className={cartLength > 0 && allInputsFilled ? styles.proceedButton : styles.disabledButton}
|
---|
| 118 | disabled={cartLength === 0 || !allInputsFilled || isOrderInProgress}
|
---|
| 119 | onClick={handleProceed}
|
---|
| 120 | >
|
---|
| 121 | Get Items Delivered
|
---|
| 122 | </button>
|
---|
| 123 | </div>
|
---|
| 124 | </div>
|
---|
| 125 | );
|
---|
| 126 | };
|
---|
| 127 |
|
---|
| 128 | export default Checkout;
|
---|