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;
|
---|